Linux内核笔记——进程管理之执行体

内核版本:linux-2.6.11


在Linux中,有多种执行体(指令流、执行单位),它们是CPU调度和分配资源的基本单位,它们是内核态可见的,即内核态下,每一种执行体都有对应的唯一数据结构task_struct来存储它的执行上下文。

它们分别是进程、轻量级进程、内核线程,创建一个执行体的方法是基于调用clone()函数并指定flags参数来完成。
通过指定不同的flags参数,可以规定新建的执行体的共享资源量、执行状态等,也正是于此来区分不同的执行体并控制不同执行体的运行开销、切换开销。

  • task_struct

    在task_struct里使用一个thread_struct结构存储硬件上下文,使用mm_struct存储内存区,使用files_struct存储文件描述符,使用signal_struct存储信号。
    因此在Linux里,task_struct是一个CPU调度的基本单位也是分配资源的基本单位。

    进程、轻量级进程、内核线程都是通过一个叫clone的函数创建,任何一个新的进程、轻量级进程或内核线程都拥有自己的task_struct。

在现在的Linux里,用户态线程跟内核线程是一对一的,也就是说,每个使用pthread库产生的线程都是对应了一个task_struct的。
现如今些新兴的语言对M:N这种多线程模型提供了语言级的支持(如golang的goroutine),它对用户透明了内核线程的产生和销毁,用户可以肆无忌惮的使用用户级多线程,因为在用户态的切换开销仅仅是一个跳转指令。

  • 进程

    正常进程与父进程完全独立,但由于写时复制技术,仅在两个进程中的任何一个对独立区进行修改时,才进行独立资源的复制,
    即延迟且竟可能避免了额外的复制开销(可以避免是因为如果新建子进程一开始就直接执行exec那么之前对独立区的复制将做无用功)。

  • 轻量级进程和内核线程

    之所以把轻量级进程和内核线程放在一起是因为内核线程本质上就是一个轻量级进程。
    轻量级父子进程共享一些指定的资源,如地址空间、文件描述符等,根据需要通过设置不同的flags参数来规定。

    内核线程与普通轻量级进程的区别在于,内核线程只运行在内核态,任何一个内核线程的寻址范围都只会在3G~4G(线性地址)之间,它是专门为内核服务的,它存在的目的就是在对内核代码绝对信任的前提下,竟可能减少开销。


个人理解,错误难免,望能指出,万分感谢

原文地址:https://www.cnblogs.com/JaSonS-toy/p/4836605.html