初识Linux · 线程概念

前言:

linux的学习从开始到现在,我们已经经历了许多大boss,从一开始的熟悉指令,到第一次在gcc环境下编译c语言的代码,到理解文件系统,比如理解了文件的权限,万物皆文件的概念,此时,是我们经历的第一次大boss,文件系统。

之后,我们从shell开始慢慢理解Linux的系统内核部分,最典型的是我们慢慢开始理解了什么是进程,从pcb->task_struct到mm_struct地址空间,到页表部分,最后我们从物理内存出发,一步一步的理解了程序的地址,之后,我们学习了进程的状态,学习了进程的控制,学习了进程等待,学习了进程终止,以及进程的各种信息,比如Pid,这是第二次大boss。

今天,我们学习的是Linux中的第3个大boss,线程。线程我们同样,从概念入手,再到线程的控制,线程同步,线程互斥等,和前两个一样,都是需要我们反反复复学习的知识点。

那么,话不多说,本文作为线程的概念篇,主要是解释线程中的概念,并且结合少许的代码。

进入第一个主题吧!线程的概念。

线程的背景

介绍线程概念我们打算从地址空间入手,在地址空间篇章,我们就提及到过,地址空间我们是要多次介绍的,一共要介绍4次左右,今天就是第四次。

我们知道,之前对于地址空间的理解就是:

初识Linux · 线程概念

这个图我们已经十分熟络了,通过页表和MMU可以将虚拟内存和物理内存建立某种联系。可是,今天我们对于页表要理解的更深层一点。

假设在磁盘中有一个hello.o,它是文件吧?那么既然他是文件,它就应该有自己的inode,它也应该存在于物理内存中。既然是和物理内存挂钩,在前文介绍的磁盘管理中,分为扇区等区域,并且是以4kb的大小进行管理。此时,真实的数据块加载到了物理内存里面,通过某种方式,和虚拟内存建立了联系。

那么,我们不妨来解析一下虚拟内存,我们将虚拟内存分为三部分:0000 0000 00,前10位是第一部分,00 0000 0000,中间10位,是第二部分,0000 0000 0000是第三部分。

好吧,在此之前我们其实还是应该再深度解析一下物理内存。

磁盘中的文件的数据是以4kb的方式存在的,我们将每个物理内存叫做页框,每个文件的数据块叫做页帧,其实现在操作系统的书已经没有区分的那么多了。

对于IO来说,IO的基本单位是4kb,OS要进行内存管理的话,不是以字节的方式管理的,而是以内存块的方式管理的,所以文件的数据块,物理内存的页框都是内存管理的对象。

那么OS应该如何管理页框页帧呢?

当然是先描述再组织。在Linux中有一种结构体是struct page,里面存的就是页框的信息。

在Linux的源码里应该如何管理呢?已经描述好了,那么使用一个数组就管理起来了。

现在我们在来刨析虚拟内存,前10个比特位,其实是指向的页目录,我们是拿32位机器举例,所以页目录实际上是由1024个,那么一个一个的页目录,指向了一个一个的页表,对于虚拟地址的中间10位,指向的就是页表,对于后12位的虚拟地址,就是先定位到了页目录之后,才好定位到页框的位置,这样,就能通过虚拟地址找到物理内存了。

那么,什么是函数呢?或者说,虚拟地址的本质是什么呢?

其实在mm_struct中,正文的代码本来就是由一个一个的地址构成的,对于函数来说,不过是一连串的地址而已。所以对于代码数据划分的本质,不过是一种对于资源的划分!

线程的概念和Linux中的线程实现

上面其实是对于页表的一种重新理解,可能有人觉得和今天的主题线程没有关系,实则不然,因为今天实际上会对之前进程的理解有一个颠覆性的理解。

在深入了解操作系统这本书里面说的好,进程是一种抽象。我们之前认为的进程是task_struct + mm_struct + 页表集合等。认为进程 = 内核数据结构 + 自己的代码和数据。

可是,在内核的观点里面,认为进程实际上是承担分配系统资源的基本实体。

今天就不讲故事了,我们直接说,以前认为task_struct就是进程,认为cpu调度的时候就是调度的task_strcut。

实际上不是的,一个进程可以存在多个task_struct,而对于task_struct就是Linux中的线程,为什么说是Linux中的线程呢?因为对于windows来说,windows也有自己的线程标准。

Android架构基本知识 中文WORD版 Android架构基本知识 中文WORD版

本文档主要讲述的是Android架构基本知识;Android依赖Linux内核2.6来提供核心服务,比如进程管理、网络协议栈、硬件驱动。在这里,Linux内核作为硬件层和系统软件栈层之间的一个抽象层。这个操作系统并非类GNU/Linux的,因为其系统库,系统初始化和编程接口都和标准的Linux系统是有所不同的。 Android 包含一些C/C++库、媒体库、数据库引擎库等等,这些库能被Android系统中不同的组件使用,通过 Android 应用程序框架为开发者提供服务。希望本文档会给有需要的朋友带来帮助

Android架构基本知识 中文WORD版 0 查看详情 Android架构基本知识 中文WORD版

我们这样理解吧,对于国家来说,分配资源的实体是一个一个的家庭,家庭中的许多成员就是一个一个的线程。

那么windows对于线程是提供了真实线程控制块,对于Linux来说,是直接复用的内核代码,不然单独创建线程控制块,增加管理成本,源码还要多写很多很多行。

所以Linux中的线程实际上是集成在进程里面的。所以之前理解的进程实际上是只有一个线程的进程,我们之后要学习的就是一个进程含有多个线程。

那么对于cpu来说,是否要区分什么是线程,什么是进程呢?因为task_strcut理解存放的是进程的信息,但是实际上进程执行任务的时候使用的是线程。

cpu是不用区分的,因为cpu看到的执行流

那么既然有了多进程,为什么还要多线程呢?

因为cpu内部调度的时候,时间片一到,进程切换需要存上下文吧?地址空间,页表全部都要切换吧?那么这个成本是不是十分高了就?如果使用的是多线程,线程之间共享的是地址空间,页表,切换的时候成本就很低了。所以这是多线程的优势。

但是就和家庭一样,一个线程如果奔溃了,其他线程也都是会崩溃的。

线程杂谈

说了那么多,我们总的看看吧?

初识Linux · 线程概念

使用函数我们可以创建线程,其实第一个参数不解释了,第二个参数我们设置为nullptr即可,对于第三个参数就是函数指针,信号那里我们也见过,第四个参数是线程的名字。

我们直接来一份代码:

代码语言:javascript代码运行次数:0运行复制

int gval = 100;void *threadStart(void *args){    while (true)    {        sleep(1);        std::cout << "new thread running..." << ", pid: " << getpid() << std::endl;        // std::cout << "new thread running..." << ", pid: " << getpid()        //           << ", gval: " << gval << ", &gval: " << &gval << std::endl;    }}int main(){    srand(time(nullptr));    pthread_t tid1;    pthread_create(&tid1, nullptr, threadStart, (void *)"thread-new");    // pthread_t tid2;    // pthread_create(&tid2, nullptr, threadStart, (void *)"thread-new");    // pthread_t tid3;    // pthread_create(&tid3, nullptr, threadStart, (void *)"thread-new");        // 主线程    while (true)    {                std::cout << "main thread running..." << ", pid: " << getpid() << std::endl;        // gval++;        sleep(1);    }    return 0;}

按照平常,我们直接g++是编译不过去的,因为它需要链接库,没想到到,重制版介绍为什么。

所以需要在Makefile文件里面加-lpthread

按照常理来说,两个死循环是不会同时打印的,可是一个进程使用两个线程调用不同的任务,就可以同时打印了:

初识Linux · 线程概念

像这样。

那么我们定义一个全局变量,看看g_val的变化:

初识Linux · 线程概念

发现线程是共享数据的,也就是地址空间都是同一份,这个我们也成功验证了。

初识Linux · 线程概念

当我们输入ps -aL指令,我们能查看线程的部分信息,可以发现和进程Pid相等的线程实际上是主线程,其他的是非主线程了,那么提问了,对于cpu来说,调度的时候看的是pid还是lwp呢?

当然是lwp了,毕竟是线程来执行的任务。

这里提及一个非常重要的点:

线程虽然共享了许多资源,但是线程私有的部分有一组寄存器,栈。前者要存储硬件的上下文,后者是线程运行的时候会形成各种临时变量,肯定都会被自己的线程保存在自己的栈区里。

本文不过是对线程的非常粗略的概念理解,请各位佬不要介意没有解释清楚大部分知识,重制版一定非常清晰的介绍清楚了。

感谢阅读!

以上就是初识Linux · 线程概念的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/820084.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
哪些情况会导致闭包引起的内存泄漏
上一篇 2025年11月27日 02:58:40
数据库行高设置方法
下一篇 2025年11月27日 02:58:46

相关推荐

  • 疑似一加Ace 6配置曝光:骁龙8至尊版+7800mAh电池

    疑似一加Ace 6配置曝光:骁龙8至尊版+7800mAh电池疑似一加Ace 6配置曝光:骁龙8至尊版+7800mAh电池疑似一加Ace 6配置曝光:骁龙8至尊版+7800mAh电池疑似一加Ace 6配置曝光:骁龙8至尊版+7800mAh电池

    近日,一款新机的详细配置被数码博主曝光。该机型将搭载骁龙8至尊版移动平台,提供五种存储组合,包括12GB+256GB、12GB+512GB、16GB+256GB、16GB+512GB以及16GB+1TB版本。内置高达7800mAh的大容量电池,并支持120W超级快充技术。 屏幕方面,新机配备一块1.…

    2026年9月24日 用户投稿
    000
  • sublime的session文件是做什么用的_sublime会话文件作用与恢复机制

    sublime的session文件是做什么用的_sublime会话文件作用与恢复机制sublime的session文件是做什么用的_sublime会话文件作用与恢复机制sublime的session文件是做什么用的_sublime会话文件作用与恢复机制sublime的session文件是做什么用的_sublime会话文件作用与恢复机制

    Sublime Text的session文件记录了打开的文件、光标位置、代码折叠状态、窗口布局及未保存内容等信息,位于系统特定目录下的Local文件夹中,以JSON格式存储,通过自动保存机制在重启后恢复编辑状态。 Sublime Text 的 session 文件主要用于保存用户当前编辑环境的状态信…

    2026年9月24日 用户投稿
    000
  • windows10的gpedit.msc组策略打不开_windows10组策略编辑器打不开修复方法

    windows10的gpedit.msc组策略打不开_windows10组策略编辑器打不开修复方法windows10的gpedit.msc组策略打不开_windows10组策略编辑器打不开修复方法windows10的gpedit.msc组策略打不开_windows10组策略编辑器打不开修复方法windows10的gpedit.msc组策略打不开_windows10组策略编辑器打不开修复方法

    首先检查系统文件完整性,运行sfc /scannow修复损坏文件;若为家庭版系统,使用DISM命令安装组策略组件;接着通过注册表编辑器修改MMC相关限制策略;最后尝试直接从System32目录运行gpedit.msc文件。 如果您尝试通过运行命令打开Windows 10的组策略编辑器(gpedit.…

    2026年9月24日 用户投稿
    000
  • windows11便笺功能在哪里_windows11自带便笺打开方法

    windows11便笺功能在哪里_windows11自带便笺打开方法windows11便笺功能在哪里_windows11自带便笺打开方法windows11便笺功能在哪里_windows11自带便笺打开方法windows11便笺功能在哪里_windows11自带便笺打开方法

    Windows 11便笺可通过开始菜单、搜索、固定任务栏、开机自启和桌面嵌入五种方式打开。首先点击开始菜单在S分类下找到便笺应用;或使用Win+S搜索“便笺”快速启动;右键便笺图标可固定到任务栏实现一键访问;通过运行shell:startup并创建快捷方式设置开机自启;最后在设置中登录Microso…

    2026年9月24日 用户投稿
    300
  • 荣耀V系列手机微信收款语音怎么设置?快速配置支付播报指南

    答案:设置微信收款语音播报需先在微信“收付款”中开启“收款到账语音提醒”,再确保荣耀V系列手机的媒体音量正常、通知权限开启、关闭勿扰模式、允许微信后台运行,并检查通知通道和网络连接,才能保障语音提醒正常播放。 荣耀V系列手机设置微信收款语音播报,核心在于微信应用内部的“收款到账语音提醒”功能,并确保…

    2026年9月24日
    200
  • LINUX怎么统计一个文件夹下文件的数量_LINUX文件数量统计命令

    使用find命令统计文件数量最准确,如find /path/to/directory -type f | wc -l可递归统计所有普通文件,包含隐藏文件,推荐用于复杂场景。 要统计 Linux 系统中一个文件夹下文件的数量,可以使用多种命令组合来实现。最常用的方法是结合 find、ls 和 wc 命…

    2026年9月24日
    600
  • 如何通过BIOS调整CPU电压实现节能?

    答案:CPU降压通过BIOS调整Vcore电压,采用Offset模式在保证稳定前提下降低功耗与温度,提升能效;需结合HWiNFO64等工具监控温度、功耗,并用Prime95等压力测试验证稳定性,避免蓝屏或崩溃,合理设置可使CPU在更低温度下维持更高睿频,实现节能且不牺牲性能。 通过BIOS调整CPU…

    2026年9月24日
    700
  • 为什么GPU显存带宽比容量更重要?

    显存带宽比容量更重要,因其直接决定数据传输速度,影响GPU计算单元的利用率。在AI训练和高分辨率渲染中,高带宽可避免“数据饥饿”,确保海量数据高效流转,而HBM技术凭借3D堆叠和宽接口提供远超GDDR的带宽,成为高性能计算的关键。 GPU显存带宽比容量更重要,核心在于现代GPU的工作模式和其处理的数…

    2026年9月24日
    100
  • iPhone14微信收款语音播报怎么设置?详细教程助你配置语音功能

    iPhone14微信收款语音播报怎么设置?详细教程助你配置语音功能iPhone14微信收款语音播报怎么设置?详细教程助你配置语音功能iPhone14微信收款语音播报怎么设置?详细教程助你配置语音功能iPhone14微信收款语音播报怎么设置?详细教程助你配置语音功能

    要让iPhone 14微信收款语音播报正常工作,需确保微信内开启“收款到账语音提醒”,同时在系统设置中允许微信通知并开启声音,检查手机未处于静音或勿扰模式,保持微信更新并重启设备以排除缓存问题。 要在iPhone 14上设置微信收款语音播报,最关键的其实是确保微信应用内部的通知设置和手机系统层面的通…

    2026年9月24日 用户投稿
    600
  • VSCode如何实现代码热重载 VSCode实时预览开发的高效配置方案

    使用live server扩展实现静态文件的实时预览,保存后浏览器自动刷新;2. 利用现代前端框架(如react、vue)内置的开发服务器(如vite、webpack dev server)实现hmr热模块替换,修改代码后仅更新变动模块而不刷新页面;3. 结合browsersync等工具实现多设备同…

    2026年9月24日
    000
  • 外媒测试《消逝的光芒:困兽》PC性能:运行表现相当优秀

    外媒测试《消逝的光芒:困兽》PC性能:运行表现相当优秀外媒测试《消逝的光芒:困兽》PC性能:运行表现相当优秀外媒测试《消逝的光芒:困兽》PC性能:运行表现相当优秀外媒测试《消逝的光芒:困兽》PC性能:运行表现相当优秀

    来入手《消逝的光芒:困兽》吧!现享金币优惠叠加专属优惠券折上折,标准版仅需200.9元(共节省47.1元);豪华版233.2元(总计立减54.8元)。 由Techland打造的《消逝的光芒》系列新作《消逝的光芒:困兽》已正式上线。本作背景设定在曾经风景如画、如今却尸横遍野的河狸谷。玩家将在此组建临时…

    2026年9月24日 用户投稿
    000
  • 为什么要4k对齐

    早期硬盘的每个扇区以512字节为标准,而新一代硬盘的扇区容量则为4096个字节,即所谓的4k扇区。虽然硬盘标准已经更新,但操作系统仍然使用512字节扇区的标准。为了确保兼容性,硬盘制造商将4k扇区模拟成了512字节扇区。文件系统的块(簇)通常是512字节的倍数,而新系统大多设定为4k的倍数,例如li…

    2026年9月24日
    000
  • google浏览器怎么把网页保存为PDF_google浏览器网页保存为PDF方法

    使用Chrome将网页保存为PDF,首先按Ctrl+P进入打印界面,选择“另存为PDF”并调整设置后保存;也可通过F12打开开发者工具,截取指定元素或完整页面截图后转为PDF;还可安装“Save as PDF”等扩展程序实现更高质量的导出。 如果您希望将当前浏览的网页完整保存以便离线查看或分享,Go…

    2026年9月24日
    000
  • windows怎么关闭cortana进程_彻底关闭小娜(cortana)后台进程的方法

    1、可通过任务管理器结束Cortana进程并禁用其启动项;2、修改注册表或组策略可永久关闭;3、重命名系统目录文件夹可阻止其运行。 如果您发现Windows系统中Cortana(小娜)后台进程占用资源或影响系统性能,可能是该服务在后台持续运行。以下是彻底关闭Cortana进程的操作步骤: 本文运行环…

    2026年9月24日
    800
  • 苹果过时产品名单更新,M5 iPad Pro 开箱视频流出

    苹果过时产品名单更新,M5 iPad Pro 开箱视频流出苹果过时产品名单更新,M5 iPad Pro 开箱视频流出苹果过时产品名单更新,M5 iPad Pro 开箱视频流出苹果过时产品名单更新,M5 iPad Pro 开箱视频流出

    日前,苹果已将 iphone 11 pro max 和 apple watch series 3 的所有型号列入“过时产品”(vintage product)行列。 根据苹果的规定,一款产品在停止销售满 5 年后,可能会被归为“过时产品”。不过,这一分类并不会显著影响售后服务——苹果仍会继续为这些设…

    2026年9月24日 用户投稿
    600
  • VSCode如何实现AI版本迁移辅助 VSCode跨版本升级的智能建议

    vscode的“ai版本迁移辅助”并非独立功能,而是通过扩展兼容性检查、设置同步、lsp/dap协议支持及社区资源等生态能力协同实现;2. 升级后扩展无法工作时,应检查更新日志、尝试降级或重新安装扩展、禁用冲突扩展、查看控制台错误信息并向作者报告问题;3. 备份设置和扩展列表可通过启用设置同步、手动…

    2026年9月24日
    1000
  • Ubunt16.04 搭建 GPU 显卡驱动 + CUDA9.0 + cuDNN7 详细教程

    Ubunt16.04 搭建 GPU 显卡驱动 + CUDA9.0 + cuDNN7 详细教程Ubunt16.04 搭建 GPU 显卡驱动 + CUDA9.0 + cuDNN7 详细教程Ubunt16.04 搭建 GPU 显卡驱动 + CUDA9.0 + cuDNN7 详细教程Ubunt16.04 搭建 GPU 显卡驱动 + CUDA9.0 + cuDNN7 详细教程

    如果你的电脑运行着 ubuntu16.04,并且配备了一块 nvidia geforce gpu 显卡,那么不利用它来运行深度学习模型就太浪费了!虽然网上关于这方面的教程有很多,但质量参差不齐。本文将详细指导你如何安装 gpu 显卡驱动、cuda9.0 和 cudnn7,助你一步步搭建好环境,值得一…

    2026年9月24日 用户投稿
    600
  • win8键盘部分按键失灵_Win8键盘按键修复

    win8键盘部分按键失灵_Win8键盘按键修复win8键盘部分按键失灵_Win8键盘按键修复win8键盘部分按键失灵_Win8键盘按键修复win8键盘部分按键失灵_Win8键盘按键修复

    首先尝试重启键盘驱动,通过组合键或设备管理器更新/回滚驱动,检查并关闭筛选键设置,最后重启电脑以解决Windows 8键盘部分按键失灵问题。 如果您在使用Windows 8系统时遇到键盘部分按键无法输入的情况,可能是由于驱动异常、系统设置冲突或临时软件故障导致。以下是多种恢复键盘正常功能的方法。 本…

    2026年9月24日 用户投稿
    600
  • 抖音怎么投屏到电视上?抖音如何TV投屏

    智能电视已经成为了家庭娱乐的核心设备。在享受高清晰度大屏幕带来的视觉震撼的同时,抖音这款广受欢迎的短视频应用也吸引了众多用户。如何将抖音中的精彩内容传输到电视屏幕上,与家人和朋友一同分享呢?本文将详细介绍几种简单有效的方法,帮助您轻松实现抖音投屏到电视。 一、方法一:利用电视内置投屏功能 1. 内置…

    2026年9月24日
    000
  • APM开发阅读

    APM开发阅读APM开发阅读APM开发阅读APM开发阅读

    我阅读apm的源码有两个主要目的:一是学习,了解飞控系统和大型项目的组织结构;二是为了移植的需要,满足项目需求。近年来,少儿编程市场非常火热,许多厂商推出了相关的产品,但这些产品大多使用空心杯电机,导致动力不足,且扩展性有限。许多任务需要io或图像识别的支持。 因此,我在考虑使用APM裁剪版的飞控系…

    2026年9月24日 用户投稿
    1600

发表回复

登录后才能评论
关注微信