进程与task_struct
发布日期:2021-05-06 19:40:58 浏览次数:23 分类:精选文章

本文共 1875 字,大约阅读时间需要 6 分钟。

进程的定义:

从用户的角度来解读,进程是一个正在执行的程序,是程序的一个实例,它包括可执行程序以及与其相关的系统资源,比如打开的文件、挂起的信号、内核内部数据、处理器状态、内存地址空间及包含全局变量的数据段等。
如果从内核的角度看的话:进程是分配系统资源的基本单位,进程的目的是担当分配系统资源(CPU时间,内存等)的实体。
从操作系统角度: 进程是一个术语,在UNIX、Linux和其他一些操作系统中,当程序启动时(由用户输入shell命令或由另一程序启动),进程开始。每个进程的描述都是一个结构体的统称及进程控制块(PCB),linux下称为task_struct。

每个进程都有自己的状态。

每个进程都有自己的虚拟地址空间。
进程是操作系统分配资源的基本单位。

当一个程序被加载到内存,并且操作系统为其成功分配一个PCB(进程控制块)后,此时程序就可以称为进程。

进程的组成:

在Linux系统下,进程由三部分组成:PCB(进程控制块)、数据段、正文段。
在Linux中PCB是一个叫做task_struct的结构体,称为“进程描述符”,里面存储了进程执行的所有信息,所以当CPU对task_struct进行管理时,就相当于在对进程进行管理。为了节省进程控制块所占的内存空间,Linux系统将每个进程的进程控制块分为两部分,常驻内存和非常驻内存。所谓常驻内存,就是不管进程是否正在占用处理器执行,系统都会对这部分内容进行查询和处理。常驻内存中存储着处理器进行调度时必须使用的一些重要信息,如进程的状态、优先数、进程特征、数据段的起始地址、等待原因和队列指针等。而非常驻内存就是当进程不占用处理器时,系统不会对该部分内容进行查询和处理,因此该部分内容可以存放在磁盘的对换区中,随用户的程序和数据部分换进或换出内存。
Linux系统把进程的数据段划分为三部分:用户栈区(供用户程序使用的信息区)、用户数据区(包括用户工作数据和非可重入的程序段)、系统数据区(包括系统变量和对换信息)。
正文段是可重入的程序,能被若干进程共享。为了管理可共享的正文段,Linux系统设置了一张正文表,每个正文段都占用一个表目,用来指出该正文段在内存和磁盘上的位置、正文段的大小以及调用该段的进程数等情况。

进程描述符:

进程描述符之于进程就像身份证之于人一样,进程描述符用来唯一标识一个进程。当程序要运行时,首先将磁盘中的相应的可执行文件加载到内存中,然后根据内存指针找到程序相应的代码及代码依赖的数据,此时程序就可正常执行了。内存指针是用来指向程序的代码及相应的数据的指针。
由于一般中央处理器的个数有限,因此同时能处理的进程数也是有限的,而通常情况下等待处理的进程也不是只有一个,要想保证众多进程的顺利处理及实现,就需要有一个进程间执行的先后顺序,称为优先级。有了进程执行的优先级之后,众多等待执行的进程就显得有序且整齐了。
但是CPU并不是一个接一个进程执行的,而是在一个程序执行一段时间后再执行下一个进程,当下一个进程执行一段时间之后接着执行后续进程。此时,为了保证一个未执行完的程序能够在下次接着之前的地方执行,我们采用“上下文”来保护现场,从而保证程序完整执行。既然CPU执行一个进程一段时间后去执行另一个进程,那么这个“一段时间”是多长时间呢?我们用“记账信息”来记录这个时间。
此外,进程在执行过程中又会出现许多状态,如就绪状态、可中断睡眠状态、不可中断睡眠状态等等,还有I/O状态信息,即标准输入、标准输出和标准错误输出。

在Linux中,每个进程都有一个进程描述符,这个“进程描述符”其实是一个叫做task_struct的结构体,在它里面保存着许多关于进程控制的信息。task_struct会被装载到RAM里并包含进程的信息,每个进程都会把它的信息放在task_struct这个数据结构里面。于是,这个数据结构包含的主要信息就有:

进程状态:记录进程在等待、运行或死锁

调度信息:记录进程由哪个调度函数调度,怎样调度等
优先级:相对于其他进程的优先级
程序计数器:程序中即将被执行的下一条指令的地址
内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
上下文数据:进程执行时处理器的寄存器中的数据
I/O状态信息:包括显示的I/O请求,分配给进程的I/O设备和正在被进程使用的文件列表
标识符:决定该进程归属,描述该进程的唯一标识符,用来区别其它进程
记账信息:包括处理器时间总和,使用的时钟总数,时间限制,记账号等信息

上一篇:字节序转换函数与地址转换函数
下一篇:ipcs命令与ipcrm命令

发表评论

最新留言

关注你微信了!
[***.104.42.241]2025年04月08日 12时15分19秒