Linux进程探讨系列之一

进程是多道操作系统中最基本的概念,是运行中的程序,也是内核分配软硬件资源的基本单位。我们通常又将其称为任务。

一:进程描述符

进程描述符(task_struct),是由内核对进程的一种控制手段。往往判断该进程的运行状态、所占物理内存位置、占用I/O情况等。
task_struct是一种结构体类型,主要包括以下属性列:进程的基本信息、指向内存区描述符的指针,与进程相关的tty
,当前目录,指向文件描述符的指针,所接收的信号等。内核对进程的引用操作是依赖于进程描述符指针进行的。

二:进程状态

进程的状态是task_struct中的一个属性,由state字段描述。进程的状态根据不同时刻的物理资源与CPU得失不断地切
换,其各种状态之间是互斥的。
进程状态转换图


三:标识一个进程

在操作系统中,每一个进程都是独一无二的,因此就需要有唯一身份标识让内核去识别进程。内核通过进程标识符(PID)去识别进程。内核通过管理一个pidmap-array位图来表示自己当前已分配的PID号和闲置的PID号,在Linux中我们可以从/proc/sys/kernel/pid_max来查看PID的上限值。
内核需要同时处理多个进程,而内核态的内存区很小,因此进程描述符通常是分配在动态内存区中。对于任意一个进程来说,内核都给它分配一个内核态的进程堆栈(占8140个字节)和一个线程描述符(占52个字节)。这一段区域通常是两个连续的页框。
esp寄存器是CPU的栈指针,用来存放栈顶单元的地址。内核很容易从esp寄存器的值来获取当前CPU上正在运行的进程的线程描述符。这项工作是由current_thread_info()函数来完成的。
在操作系统中,所有进程的进程描述符靠进程链表连接起来,这是一个双向链表,其中每个task_struct类型包含一个prev字段和一个next字段。进程链表的头是0号进程,交换进程。
当内核需要寻找一个新的进程在CPU上运行时,只需要考虑处于就绪态的进程,因此内核需要为每一个CPU维持
一个进程运行队列,在该队列中依据进程的优先级进行排序,进程优先级的取值范围为0到139,因此为了更加快速地
切换进程,运行队列被拆分成140个不同优先级的队列。

四:进程间关系

一个新建的进程总有自己的父进程,而内核规定在子进程运行结束之后,其所占的所有资源都由父进程回收,因
此断定进程间关系尤为重要。在操作系统中0号和1号进程是由内核创建的,是伴随着系统启动到系统中止整个过程的
守护进程。1号进程是所有用户态进程的祖先进程。
进程间的关系分为亲属关系与非亲属关系,这一点在进程间通信是再做阐述。

五:如何组织进程

运行队列把所有处于可运行状态的进行组织在一起,而等待队列又是把所有的处于阻塞态的进程组织在一起,这
些进程都是处于睡眠状态。一般情况下,等待队列同样是由双向链表实现的。有时候,多个处于阻塞中的进程需要同
一种资源,当该资源抵达内核就绪时,会导致内核唤醒多个进程,但是只有一个进程可以拥有该资源并重新进入可运
行状态,因此这种一个资源唤醒多个进程的现象叫做惊群现象。操作系统把睡眠进程分为两种:互斥进程与非互斥进
程。
每个进程都占有一定的资源,内核规定资源的是否就绪决定了进程所处的状态。在一个进程中所需要的资源往往
包括:进程地址空间最大数,内存信息转储文件的大小,进程使用CPU的时间,堆大小的最大值,文件大小的最大值,
文件锁的最大值,非交换内存的最大值,POSIX消息队列的最大字节数,打开文件描述符的最大数,用户能拥有的最
大进程数,进程所拥有的页框最大数,进程挂起信号的最大数,栈大小的最大值等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值