您当前的位置:首页 > 电脑百科 > 软件技术 > 操作系统 > 百科

Linux和Windows两种风格的操作系统,创建线程的方式有何不同?

时间:2020-09-21 15:51:15  来源:  作者:

上一节从C语言源代码层面较为详细的讨论了linux创建进程的过程,其实就是创建进程运行所需的内存空间,填充描述进程的 task_struct 结构体,以及加载进程的程序而已。

Linux是如何创建线程的呢?

Linux 内核并无专门创建线程的机制

我们之前提到,Linux并不特殊对待线程,在Linux看来,线程不过就是一种特殊的进程而已。那么,Linux是如何创建线程的呢?

线程机制是大多数现代编程语言都会提供的机制,该机制允许在同一进程的共享内存地址空间运行一组“特殊的进程(即线程)”。这些线程不仅共享同一段内存空间,还可以共享已经打开的文件,统计量等其他资源。线程机制支持程序并发运行,在多处理器核心的系统上,该并发机制能够实现多条线程同时运行。

Linux 管理线程的方式不同于其他一些经典操作系统,Linux 并没有线程的概念,它把线程当作进程的一个子集来管理。因此,Linux 内核并未为线程提供额外调度算法,也没有提供额外的数据结构用于描述和存储线程。

Linux和Windows两种风格的操作系统,创建线程的方式有何不同?

Linux 并没有线程的概念

就像进程一样,Linux 使用 task_struct 结构体描述和记录线程,每个线程都有唯一属于自己的 task_struct 结构。从这个角度来看,线程就是一个普通的进程,只不过线程可能和其他进程共享一些资源而已。

windows 为代表的一些操作系统提供了专门用于创建线程的机制,在这些系统中,线程常常被称作“轻量级进程”,因为相对于进程而言,线程耗费的资源较少,能够较为迅速的创建和投入运行。

但是对于 Linux 而言,线程不过是进程之间共享资源的一种手段罢了。那么是不是 Linux 中的线程比 Windows 中的线程更加“重量级”呢?也不是,因为 Linux 中的进程本身就很轻量级,Linux 创建进程所需时间,并不比 Windows 创建线程所需时间多多少。

从C语言代码层面来看,假设某个进程包含 4 个线程,以 Windows 为代表的一些操作系统一般会有一个包含指向 4 个不同线程的指针的进程描述符,负责描述地址空间、打开的文件等共享资源,而线程本身再去描述自己独占的资源。

Linux 的做法很高雅

与之对应的,Linux 的做法很高雅,它仅需为这 4 个线程创建 4 个 task_struct 结构体,然后在 task_struct 中指定它们共享的资源就可以了。

创建线程

看了我最近几篇文章的读者应该已经明白,Linux 内核中的线程其实就是进程,因此线程的创建与进程的创建过程是类似的,从C语言源代码层面看,基本上也是通过 fork() 函数和 exec() 函数族实现的。只不过在调用 clone() 函数时需要传递一个参数用于描述共享资源,例如:

clone(CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND, 0);

上面这行C语言代码和调用 fork() 函数的结果差不多,只不过输入的几个参数标志位说明了子进程与父进程共享一些资源:地址空间、文件系统、打开的文件、信号处理程序。

Linux 内核线程

对比一下,fork() 基本上就相当于 clone(SIGCHLD, 0),这也是 fork() 函数创建的子进程之后不再与父进程共享资源的原因。

关于 clone() 函数的参数标志位,可以在Linux中输入 man 命令查看。

Linux 内核线程

就像用户空间的C语言程序开发一样,Linux 内核也经常需要在后台处理数据,这时就需要借助内核线程了。Linux 的内核线程一般不会独立的地址空间,它们只在内核空间运行,不会切换到用户空间。不过调度是和普通进程一样的,可以被调度和抢占。

Linux 创建内核线程由 kthread_create() 函数实现,它的C语言源代码如下,请看:

Linux和Windows两种风格的操作系统,创建线程的方式有何不同?

kthread_create() 函数的C语言源代码

可见,kthread_create() 函数的C语言代码并不长,而且也可以看出,Linux 内核线程是通过 kthread_create_info 结构体描述的,它的定义C语言代码如下,可见,内核线程的描述和存储也是包含 task_struct 结构体的:

Linux和Windows两种风格的操作系统,创建线程的方式有何不同?

包含 task_struct 结构体

kthread_create() 函数创建名为 namefmt 的线程,不过线程被创建后是处于不可运行状态的,我们可以通过 wake_up_process() 函数唤醒它。当然,也可以通过 kthread_run() 方法实现这一过程,相关的C语言代码如下,请看:

Linux和Windows两种风格的操作系统,创建线程的方式有何不同?

相关的C语言代码

其实就是将 kthread_create() 函数和 wake_up_process() 函数组合到一起而已。Linux 的内核线程被启动后,会一直运行到调用 do_exit() 退出。我们也可以调用 kthread_stop() 函数提前结束它,相关的C语言代码如下,请看:

Linux和Windows两种风格的操作系统,创建线程的方式有何不同?

kthread_stop() 函数

kthread_stop() 函数接收的参数为 kthread_create() 函数创建的结构体的 task_struct 成员。从C语言代码可以看出,kthread_stop() 其实也是会调用 wake_up_process() 函数唤醒线程的,它在唤醒线程后,会等待线程函数退出,并不会调用 threadfn() 函数。

这里需要注意,如果创建的线程函数 threadfn() 调用了 do_exit() 函数,最好就不要再调用 kthread_stop() 函数了。

kthread_stop() 函数等待线程退出是通过 wait_for_completion() 函数实现的,相关的C语言代码如下,请看:

Linux和Windows两种风格的操作系统,创建线程的方式有何不同?

wait_for_completion() 函数

稍稍跟踪一下C语言代码,发现其实这一等待过程是由 do_wait_for_common()函数实现的,它的C语言代码如下,请看:

Linux和Windows两种风格的操作系统,创建线程的方式有何不同?

do_wait_for_common()函数

还是比较清晰的,这里就不再赘述了。至此,我们就了解了Linux内核是如何创建线程并投入运行,以及如何结束内核线程的了。

小结

本节主要讨论了 Linux 内核中的线程的创建,应该能够看出,其实核心还是围绕对 task_struct 结构的管理,这与管理进程并无过多区别。因此,说Linux中的线程只是一种特殊的进程,一点也不为过。

欢迎在评论区一起讨论,质疑。文章都是手打原创,每天最浅显的介绍C语言、linux等嵌入式开发,喜欢我的文章就关注一波吧,可以看到最新更新和之前的文章哦(最近发现有些帐号搬运我的文章并且标上原创标签,有些可耻,请注明出处!!)。



Tags:操作系统   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
一、背景介绍永恒之蓝是指2017年4月14日晚,黑客团体Shadow Brokers(影子经纪人)公布一大批网络攻击工具,其中包含“永恒之蓝”工具,“永恒之蓝”利用Windows系统的SMB漏洞可以获...【详细内容】
2021-12-27  Tags: 操作系统  点击:(3)  评论:(0)  加入收藏
一、背景介绍作为一名渗透测试工作人员(或者小白),在我们的日常工作或者学习中,我们不可能时时刻刻将自己的个人电脑(安装好Kali Linux的个人主机)带在身边,当我们没有带自己的个人...【详细内容】
2021-12-27  Tags: 操作系统  点击:(3)  评论:(0)  加入收藏
Windows操作系统和Linux操作系统有何区别?Windows操作系统:需支付版权费用,(华为云已购买正版版权,在华为云购买云服务器的用户安装系统时无需额外付费),界面化的操作系统对用户使...【详细内容】
2021-12-21  Tags: 操作系统  点击:(6)  评论:(0)  加入收藏
之前几期内容都围绕windows系统展开唠叨了自己的一些看法和经验,这一次我们从深度系统安装开始,写一些我对深度系统的感受。说到深度系统,玩机的朋友都知道,从winxp开始深度科技...【详细内容】
2021-12-10  Tags: 操作系统  点击:(19)  评论:(0)  加入收藏
账户安全(1)更名administrator本地用户并禁用guest账户步骤:点击“开始”,找到“管理工具”,点击里面的“计算机管理”,找到“本地用户和组” (2)设定账户锁定策略尝试5次失败...【详细内容】
2021-10-12  Tags: 操作系统  点击:(62)  评论:(0)  加入收藏
很多朋友经常问我这个问题,总是主观地认为64位操作系统就是要比32位的操作系统高端,高级、快等等的,现用我个人的观点和大家科普一下两者的区别。1、对于电脑硬件配置的要求不...【详细内容】
2021-09-07  Tags: 操作系统  点击:(82)  评论:(0)  加入收藏
微软已经悄悄发布了Windows Server 2022的RTM稳定版,用户可以立即下载并安装新的Windows Server 2022。版本号是:Windows Server 2022.20348.169。与Windows Server 2019相比,...【详细内容】
2021-08-31  Tags: 操作系统  点击:(161)  评论:(0)  加入收藏
开源最前线(ID:OpenSourceTop) 猿妹编译链接:https://github.com/FavioVazquez/ds-cheatsheets 一位来自瑞典的程序员Andreas Kling,前不久他发表了一篇《I quit my job to focus...【详细内容】
2021-08-25  Tags: 操作系统  点击:(99)  评论:(0)  加入收藏
根据华为鸿蒙的时间推进表,2021年6月2日,华为将举办鸿蒙操作系统及华为全场景新品发布会。根据华为此前的介绍,相对于鸿蒙 OS 1.0 来说,鸿蒙 OS 2.0 可登录更多智能终端设备,在功...【详细内容】
2021-06-02  Tags: 操作系统  点击:(443)  评论:(0)  加入收藏
环境相关文件/etc/profile 全局变量设置,但是需要用户登录才能生效,如果使用切换例如sudo su xx可能就不生效/etc/bash.bashrc 全局变量设置,切换账户可以生效/xxx/.bashrc 针...【详细内容】
2021-05-24  Tags: 操作系统  点击:(296)  评论:(0)  加入收藏
▌简易百科推荐
详细说明及例子 :对一组文件中的每一个文件执行某个特定命令普通格式:FOR %variable IN (set) DO command [command-parameters] %variable 指定一个单一字母可替换的参数。 ...【详细内容】
2021-12-27  中微中科技    Tags:DOS   点击:(3)  评论:(0)  加入收藏
Windows11都出来了,XP和Windows7真的被淘汰了吗,很显然并不会,系统有很多分类就不一一介绍了,以Windows系列系统举例,最初XP系统也是分代的,后来WIN7出现在了大众的视线,因为普遍的...【详细内容】
2021-12-09  WHW与某人    Tags:Windows7   点击:(19)  评论:(0)  加入收藏
Unix与Linux均是是多用户、多任务的操作系统,也有多种版本。Unix诞生于20世纪70年代初,而Linux发明于20世纪90年代初;可以说Unix之于Linux属于承上启下的关系。Unix诞生于贝尔...【详细内容】
2021-10-11  小扇子的笔记    Tags:Unix   点击:(85)  评论:(0)  加入收藏
很多朋友经常问我这个问题,总是主观地认为64位操作系统就是要比32位的操作系统高端,高级、快等等的,现用我个人的观点和大家科普一下两者的区别。1、对于电脑硬件配置的要求不...【详细内容】
2021-09-07  一个人6639    Tags:操作系统   点击:(82)  评论:(0)  加入收藏
它看起来像复古计算,但它是一个现代的操作系统,你可以用它来完成任务。在整个 1980 年代和 1990 年代,我主要是一个 DOS 用户。我喜欢 DOS 提供的命令行环境,它随着每一个连续的...【详细内容】
2021-06-17  Jim Hall  Linux中国  Tags:FreeDOS   点击:(170)  评论:(0)  加入收藏
开源操作系统 FreeDOS是一个久经考验的项目,可帮助用户玩复古游戏、更新固件、运行过时但受欢迎的应用以及研究操作系统设计。FreeDOS 提供了有关个人计算历史的见解(因为它实...【详细内容】
2021-03-16      Tags:FreeDOS   点击:(252)  评论:(0)  加入收藏
现代计算机之父冯诺伊曼最先提出程序存储的思想,并成功将其运用在计算机的设计之中,该思想约定了用二进制进行计算和存储,还定义计算机基本结构为 5 个部分,分别是中央处理器(CPU)、内存、输入设备、输出设备、总线。...【详细内容】
2021-03-04      Tags:操作系统   点击:(212)  评论:(0)  加入收藏
初学操作系统的时候,我就一直懵逼,为啥进程同步与互斥机制里有信号量机制,进程通信里又有信号量机制,然后你再看网络上的各种面试题汇总或者博客,你会发现很多都是千篇一律的进程...【详细内容】
2021-03-01      Tags:通信机制   点击:(184)  评论:(0)  加入收藏
Unix很美。 请允许我为您画一些快乐的小树。 我不会解释很多命令,这很无聊,网络上已经有上百万的教程可以做到这一点。我将让您能够对系统进行推理。您想做的每件奇特的事都...【详细内容】
2021-02-26      Tags:Unix   点击:(209)  评论:(0)  加入收藏
微软倾力打造的Windows 10X系统已经完全泄露,但镜像仅支持Surface Pro 7。不过,大神Albacore(thebookisclosed)制作了非官方的镜像打包工具(Mega网盘),可以提取本地驱动和配置文...【详细内容】
2021-02-03      Tags:Win10X   点击:(189)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条