学习过操作系统的人应该都对于进程这两个不会陌生,当然没学过操作系统的人应该也听过进程这个词,但是进程是什么呢?接下来,就来学习一下进程的相关信息。从用户角度看:进程是程序的一次动态执行过程,也就是说,只有当一段程序执行起来,它才能称为进程。从操作系统角度看:进程是操作系统分配系统资源(CPU时间,内存)的基本单元,也是最小单元。 进程需要相关的数据结构管理,PCB进程控制块,操作系统通过PCB来感知一个进程的存在。也可以说,PCB就是一个进程存在的唯一标示。 既然程序不等于进程,那程序和进程到底有什么区别呢?
- 存储位置不同,程序在硬盘上,进程在内存里;
- 进程不仅仅是由程序组成,进程的描述还有PCB(进程控制块),以及一些描述进程状态的结构体;
- 进程具有动态属性,即为可以有多种状态
- 程序没有堆栈因为程序被加载到内存中才会分配堆栈
- 进程的生命周期短暂,程序永久
- 一个进程只能对应一个程序,而一个程序可以对应多个进程
一个进程一直只有一个状态吗?答案肯定不是的。一个进程可以有多种状态。
在Linux中,Linux内核通过一个被称为进程描述符的task_struct结构体来管理进程,这个结构体包含了一个进程所需的所有信息。接下来就来看看这个结构体。
当然我们知道,在Linux环境下,描述进程当然少不了PCB,而PCB有如何理解呢? 进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。而在Linux操作系统下的PCB是:task_struct。task_struct中都有什么内容呢?
- 标识符:描述本进程的唯一标示符,用来区别其他进程;
- 状态:任务状态,退出代码,退出信号等;
- 优先级:相对于其他进程的优先级;
- 程序计算器:程序中即将被执行的下一条指令的地址;
- 内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针;
- 上下文数据:进程执行时处理器的寄存器中的数据;
- I/O状态信息:包括现实的I/o请求,分配给进程的I/O设备和被进程使用的文件列表;
- 记账信息:可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号;
- 其他
由此,所有运行在系统里的进程都以task_struct链表的形式存在内核了里。