目录
介绍
进程:PCB(process control block)(内核数据结构)+ 代码和数据
进程创建:操作系统将其相关属性信息为基,创建PCB结点,放到进程双链表中,存在内存里。
以下都以linux为例
PCB(进程控制块)
linux中描述PCB的结构体叫做task_struct,task_struct是PCB的一种。
task_struct :linux内核的一种数据结构类型,它会被装载到内存(RAM)里并包含进程信息。
task_struct
主要内容:
CPU中有许多寄存器,用户无法直接使用,其对task_struct进行调度时,会将要执行的指令地址存到寄存器里,每次执行进程CPU就从寄存器中取地址。
有一种PC指针存程序计数器。
进程在寄存器中存的内容叫该进程的上下文数据。
标识符等会在后面介绍。
查看、创建进程
程序中使用
头文件为<unistd.h>
getpid() 得到进程标识符
fork() 创建子进程
fork() 给父进程返回子进程pid,给子进程返回0;
getppid() 得到父进程标识符
例:
proc目录中以文件形式存了正在运行的进程信息,在根目录下。
1.进程创建时,出了系统都有父进程,linux系统是通过父进程创建子进程来增加进程的。
2.在命令行中启动命令/程序都会成为新增进程,这些进程的父进程都是bash(外壳程序)
3.创建子进程,子进程的task_struct也要被初始化,以父进程为模版,并且默认子进程共享父进程的代码和数据。
进程状态
进程状态决定了进程接下来要进行的工作。
对于所有操作系统的进程状态来说,都以下图为基础
就绪状态(新建状态):进程被创建处在全局链表(task_struct的链表)中。
运行状态:进程的PCB处在调度队列中。
阻塞状态:将进程改为阻塞状态并将PCB从调度队列中放到某种设备的等待队列中,等待设备就绪。
挂起状态:当检测到内存资源严重不足时, 某些进程的代码和数据就被放到磁盘的一个swap区中,只留下PCB在内存区中。
1.就绪挂起:将未在调度的运行状态的进程挂起,等需要调度再拿回来调度。
2.阻塞挂起:将处于阻塞状态的进程挂起。
注:挂起的进程可以激活到原状态。
进程需要竞争的资源:
1.CPU资源
2.外设资源(输入输出等)
进程又分为:计算密集型:算法数据结构等(主要用CPU资源)、IO密集型(外设资源)
因为资源有限,所以在部分进程享有资源的同时,部分进程就不能享有。
在linux系统中
有如下状态:
S:浅度休眠(阻塞状态):可以响应外部时间,操作系统可以干掉。
D:深度休眠(磁盘休眠):不对外部时间响应,操作系统不能干掉,重启也没用,只能拔电源。 一般出现较长时间D状态,说明磁盘快挂掉了,系统也快挂了。
注:IO时一般有短暂D状态。
T:暂停状态:如果进程访问非法,操作系统将会将其暂停。暂停后变为后台进程
t:追踪状态:gdb调试时会创建新的子进程,让子进程运行代码到断点,因为断点停下来就是追踪状态。
Z:僵尸状态:进程结束时先处于一种僵尸状态,代码和数据释放掉,PCB暂时保留,记录进程退出信息(方便父进程读取,获得进程执行结果)。
1.如果父进程不处理,僵尸进程会一直存在。
2.如果父进程先退出,子进程会被1号进程(系统)托管,叫孤儿进程(成为后台程序,需要用kill命令处理)
X:结束状态:僵尸进程被父进程处理后,就由Z变X,操作系统瞬间回收。
1.进程状态带+号表示前台进程,前台进程可以用ctrl+c终止,后台进程不可以 。
2.在进行访问外设有关进程时,操作系统大部分时间用于将PCB结点在调度队列和外设的等待队列之间移动,状态会在R和S之间移动
小知识
1.系统中,会同时存在大量进程。
2.对于进程、软件、硬件等,管理的本质都是先描述,再组织。