深入探究Linux内核:线程创建的神奇机制 (linux 内核 线程 创建)

Linux操作系统的内核是一个非常复杂的软件系统,它承担了整个操作系统的核心任务。线程是Linux操作系统中非常常见的概念,线程的创建机制也是Linux内核中非常重要的一部分。本文将深入探究Linux内核中线程创建的神奇机制。

一、线程的定义

线程是一种轻量级的进程,也可以称为轻量级进程,是程序执行流的最小单位。一个进程可以包含多个线程,线程之间共享进程所拥有的资源。线程与进程的主要区别在于,进程是一个拥有资源的独立单位,而线程则是由进程创建,它与创建它的进程共享资源。

二、线程创建的过程

在Linux操作系统中,线程的创建主要包括以下四个步骤:

1. 分配线程所需要的栈空间

线程使用栈存储函数调用过程中的本地变量和函数返回地址。栈空间是在线程创建时分配的,Linux内核为每个线程分配一个栈空间,栈的大小可以通过参数来进行设置。

2. 创建线程的task_struct结构体

线程的task_struct结构体是Linux内核中表示进程/线程的数据结构,每个线程在创建时都会分配一个对应的task_struct结构体。该结构体内包含了线程的各种属性,例如线程ID、进程ID、调度实体、状态、栈等信息。

3. 设置线程的属性

创建线程后,需要设置线程的一些属性,例如线程的优先级、调度策略、信号屏蔽、栈指针等。这些属性设置完成后,线程就可以被调度器进行调度了。

4. 把线程添加到进程的线程链表中

新创建的线程需要添加到进程的线程链表中,这样才能被进程管理。在Linux内核中,每个进程都会维护一个线程链表,所有的线程都被添加到该链表中。线程创建完成后,就可以通过调度器进行调度了。

三、线程调度的机制

在Linux操作系统中,线程的调度是由调度器进行管理的。调度器负责把CPU的使用权分配给不同的线程,以实现多任务并发执行。线程被调度时,调度器会按照其优先级和调度策略来进行调度,使得优先级较高的线程优先被执行。

Linux内核中有多种调度策略,包括实时调度策略和普通调度策略。实时调度策略是一种优先级调度策略,适用于对响应时间要求较高的应用场景,例如实时音视频应用。普通调度策略采用抢占式调度策略,适用于对响应时间要求不太高的应用场景,例如桌面应用、服务器应用等。

四、线程创建的时序图

下图是关于Linux内核中线程创建的时序图,从中可以清晰地了解到线程创建的过程和机制。

图1:Linux内核中线程创建的时序图。

(图片来源:https://elixir.bootlin.com/linux/latest/source/kernel/fork.c#L1552)

五、

本文从线程的定义、线程创建的过程、线程调度的机制、线程创建的时序图等多个方面深入探究了Linux内核中线程创建的神奇机制。线程是Linux操作系统中非常重要的概念,对于使用Linux的开发者来说,深入了解线程的创建机制可以更好地理解Linux内核的运作原理,也可以更好地进行Linux应用程序的开发。

相关问题拓展阅读:

linux进程、线程及调度算法(二)

执行一个 copy,但是只要任何修改,都造成分裂如,修改了chroot,写memory,mmap,sigaction 等。

p1 是一个 task_struct, p2 也是一个 task_struct. linux内核的调度器只认得task_struck (不管你是进程还是线程), 对其进行调度。

p2 的task_struck 被创建出来后,也有一份自己的资源。但是这些资源会短暂的与p1 相同。

进程是区分资源的单位,你的资源是我的资源,那从概念上将就不叫进程。

其他资源都好分配,唯一比较难的是内存资源的重新分配。

非常简单的程序,但是可以充分说明 COW。

结果:10 -> 20 -> 10

COW 是严重依赖于CPU中的MMU。CPU如果没有 MMU,fork 是不能工作的。

在没有mmu的CPU中,不可能执行COW 的,所以只有vfork

vfork与fork相比的不同

P2没有自己的 task_struct, 也就是说P1 的内存资源 就是 P2的内存资源。

结果 10,20,20

vfork:腔宽者

vfork 执行上述流程,P2也只是指向了P1的mm,那么将这个vfork 放大,其巧旅余的也全部clone,共同指向P1,那么就是线程的属性了。

phtread_create -> Clone()

P1 P2 在内核中都是 task_struct. 都可以被调度。共享资源可调度,即线程。

这就是线程为什么也叫做轻量级进程

不需要太纠结线程和进程的区别。

4651 : TGID

, 4653 tid 内核中 task_struct 真正的pid

linux 总是白发人 送 黑发人。如果父进程在子进程推出前挂掉了。那么子进程应该怎么办?

p3 -> init, p5 -> subreaper

每一个孤儿都会找最近的火葬场

可以设置进程的属性,将其变为subreaper,会像1号进程那样收养孤儿进程。

linux的进程睡眠依靠等待队列,这样的机制类似与涉及模式中的订阅与发布。

睡眠,分两种

每一个进程都是创建出来的,那么之一个进程是谁创建的呢?

init 进程是被linux的

0 进程

创建出来的。开机创建。

父进程就是 0 号进程,但在pstree,是看不到0进程的。因为0进程创建子进程后,就退化成了idle进程。

idle进程是 linux内核里,特殊调伍薯度类。

所有进程都睡眠停止

,则调度idle进程,进入到 wait for interrupte 等中断。此时 cpu及其省电,除非来一个中断,才能再次被唤醒。

唤醒后的任何进程,从调度的角度上说,都比idle进程地位高。idle是调度级别最更低的进程。

0 进程 一跑,则进入等中断。一旦其他进程被唤醒,就轮不到 0进程了。

所有进程都睡了,0就上来,则cpu需要进入省电模式

在linux编为什么要创建线程

也可以不用创建线程啊

如果你的程序单个进程可以源早指完成需求,那么就不用创建线程。

当你的需求需要多个任务进行协雹配同处理时,那么需要你创建多个线程或者进程来进行处理。

举个简单的例子,如果公路上有很多车,你现在是一车道,那么你有1俩车,这条公路就能满足现在的需求。

但是如果你现在又1W辆车,那么你需要4车道或者8车道来运行,才能满足1W辆车睁肢的需求。

linux 内核 线程 创建的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于linux 内核 线程 创建,深入探究Linux内核:线程创建的神奇机制,linux进程、线程及调度算法(二),在linux编为什么要创建线程的信息别忘了在本站进行查找喔。


数据运维技术 » 深入探究Linux内核:线程创建的神奇机制 (linux 内核 线程 创建)