加入收藏 | 设为首页 | 会员中心 | 我要投稿 威海站长网 (https://www.0631zz.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

一文搞懂Linux内核线程的基本概念(含源代码)

发布时间:2022-11-16 18:33:48 所属栏目:Linux 来源:网络
导读: 一,线程的引入
我们以软件生活中,常见的应用为例,我们要编写一个MP4的播放软件,其核心功能模块有以下三个:

对于目前采用进程的方法,我们可以采取两种方案:
方案一:单进程的实现方

一,线程的引入

我们以软件生活中,常见的应用为例,我们要编写一个MP4的播放软件,其核心功能模块有以下三个:

linux telnetd密钥处理缓冲区溢出漏洞_linux处理器_linux 内存内容查看器

对于目前采用进程的方法,我们可以采取两种方案:

方案一:单进程的实现方式

linux telnetd密钥处理缓冲区溢出漏洞_linux处理器_linux 内存内容查看器

方案存在的问题:

方案二:多进程的实现:

方案二:多进程的实现:

linux 内存内容查看器_linux telnetd密钥处理缓冲区溢出漏洞_linux处理器

linux处理器_linux telnetd密钥处理缓冲区溢出漏洞_linux 内存内容查看器

更多Linux内核视频教程文档资料免费领取后台私信【内核】自行获取。

linux 内存内容查看器_linux telnetd密钥处理缓冲区溢出漏洞_linux处理器

存在的问题:

对于这三个进程,都是为了完成该软件的某一部分功能,但是功能与功能之间必须并发的执行,当切换进程,需要保存/恢复进程运行环境,还需要切换内存的地址空间,更新块表等开销,所以在进程内部增加了一类实体,这个实体就是线程(Thread),满足以下特性

我们再回过头去看刚才的例子,其处理过程如下图所示:

linux处理器_linux telnetd密钥处理缓冲区溢出漏洞_linux 内存内容查看器

所以针对以下问题linux处理器,就需要引入新线程的概念:

二,线程的概念

从上面可以看出,线程是进程的一部分,描述指令流执行状态,它是进程中的指令执行流的最小单元,是CPU调度的基本单位。

进程的资源分配:进程是由一组相关资源构成,包括地址空间(代码段、数据段)、打开的文件等各种资源

线程的处理机调度角色: 线程描述在进程资源环境中的指令流执行状态:

linux 内存内容查看器_linux telnetd密钥处理缓冲区溢出漏洞_linux处理器

从上图可以看出,所以线程 = 进程 - 共享资源

线程的优点

线程的缺点:

linux telnetd密钥处理缓冲区溢出漏洞_linux 内存内容查看器_linux处理器

线程能减小并发执行时间和空间开销:

三,线程的三种实现方式3.1 用户线程

用户线程是完全建立在用户空间的线程库,用户线程的创建、调度、同步和销毁全文库函数在用户空间完成,不需要内核的帮助。因此这种线程是极其低消耗和高效的。

由于早期的操作系统(如早期的unix)只支持进程,不支持线程,但是的线程是由线程库实现的,我们还是以我们上面的播放软件为例:

linux telnetd密钥处理缓冲区溢出漏洞_linux 内存内容查看器_linux处理器

从代码的角度,线程其实就是一段代码逻辑,上述三段代码逻辑可以看成三个“线程”。while循环就是一个最弱的“线程库”,线程库完成了对于线程管理工作。很多 编程语言提供了强大的线程库,可以实现线程的创建,调度,销毁等功能。

对于用户线程我们需要解释以下问题:

首先我们来看看用户线程的概念:

用户线程是由应用程序通过线程库实现的,所有的线程管理工作都是由应用程序负责,包括线程的切换工作,也就是说

下面我们来看看用户线程的特征

不依赖于操作系统的内核,内核不了解用户线程的存在,可用于不支持线程的多进程操作系统

在用户空间实现的线程机制,每个进程有私有的线程控制块TBC,并且由线程库维护

同一进程内的用户线程切换速度快,无需用户态/内核态切换,线程管理系统的开销小,效率比较高

允许每个进程拥有自己的线程调度算法

用户线程的不足:

线程发起系统调用而阻塞时,则整个进程等待,并发度并不高,多个线程不可在多核处理器上并行运行

不支持基于线程的处理机抢占,除非当前运行线程主动放弃,它所在进程的其他线程无法抢占CPU

只能按进程分配CPU时间片,多个线程进程,每个线程的时间片较少

3.2 内核线程

由内核通过系统调用实现的线程机制,由内核完成线程的创建、终止和管理

linux 内存内容查看器_linux处理器_linux telnetd密钥处理缓冲区溢出漏洞

内核级线程的管理工作由操作系统内核完成;线程调度、切换等工作都有内核负责,因此内核级线程的切换必须要在内核下才能完成;操作系统会为每个内核级线程建立相应的TCB(Thread Control Block,线程控制块),通过TCB对线程进行管理,内核级线程就是从操作系统内核视角看到的线程。

linux telnetd密钥处理缓冲区溢出漏洞_linux处理器_linux 内存内容查看器

3.3 轻量级进程

它是内核支持的用户线程,一个进程可有一个或多个轻量级进程,每个轻量级进程由一个单独的内核线程来支持(Solaris和Linux)

四,多线程模型

在支持内核级线程的系统上,根据用户级线程和内核级线程的映射关系,可以划为为以下几种多线程模型

一对一模型:

一个用户级线程映射到一个内核级线程,每个用户进程有与用户线程同数据的内核线程

linux 内存内容查看器_linux处理器_linux telnetd密钥处理缓冲区溢出漏洞

linux处理器_linux telnetd密钥处理缓冲区溢出漏洞_linux 内存内容查看器

多对一模型:

多个用户级线程映射到一个内核级线程,且一个进程只被分配一个内核级线程

linux 内存内容查看器_linux telnetd密钥处理缓冲区溢出漏洞_linux处理器

linux 内存内容查看器_linux处理器_linux telnetd密钥处理缓冲区溢出漏洞

多对多模型:

n个用户级线程映射到m个内核级线程(n >= m),每个用户进程对应m个内核级线程,这种方式克服了多对一模型并发度不高的缺点(一个阻塞全体阻塞),又克服了一对一模型中一个用户进程占用太多内核级线程,开销太大的缺点:

内核级线程中可以运行任意一个有映射关系的用户级线程代码,只有两个内核级线程中正在运行的代码逻辑都被阻塞了,这个进程才会被阻塞。

五,总结

本章分析了为什么需要线程,其主要包括,同时也介绍了线程的基本概念和分类

(编辑:威海站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!