
进程与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设备和正在被进程使用的文件列表 标识符:决定该进程归属,描述该进程的唯一标识符,用来区别其它进程 记账信息:包括处理器时间总和,使用的时钟总数,时间限制,记账号等信息发表评论
最新留言
关注你微信了!
[***.104.42.241]2025年04月08日 12时15分19秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
springboot swagger2
2019-03-05
shell(十)case的几个典型应用
2019-03-05
Linux环境变量配置错误导致命令不能使用(杂谈)
2019-03-05
openstack安装(六)镜像glance服务安装
2019-03-05
openstack安装(九)网络服务的安装--控制节点
2019-03-05
shell编程(六)语言编码规范之(变量)
2019-03-05
vim杂谈(三)之配色方案
2019-03-05
vim杂谈(五)之vim不加载~/.vimrc
2019-03-05
Linux杂谈之终端快捷键
2019-03-05
vimscript学习笔记(二)预备知识
2019-03-05
vimscript学习笔记(三)信息打印
2019-03-05
awk杂谈之数组习题
2019-03-05
Linux网络属性配置详解
2019-03-05
Python(三十)类的理解
2019-03-05
Extjs布局详解
2019-03-05
Android数据库
2019-03-05
HTML基础,块级元素/行内元素/行内块元素辨析【2分钟掌握】
2019-03-05
keil左侧文件调整方法
2019-03-05
本地分支关联远程分支
2019-03-05