3 抽象:进程
进程:就是运行中的程序。程序本身没有生命周期,是操作系统让这些字节运行起来。
人们常常希望同时运行多个程序。通过虚拟化CPU来提供这种假象。通过让一个进程只运行一个时间片,然后切换到其他进程(时分共享CPU技术)。
低级机制(如上下文切换)和高级智能(调度策略,做出某种决定的算法)
3.1 抽象:进程概念
操作系统为正在运行的程序提供的抽象,就是所谓的进程(process)
进程的机器状态:内存、寄存器
程序计数器(PC)告诉我们程序即将执行哪个指令
栈指针和相关的帧指针用于管理函数参数栈、局部变量和返回地址
分离策略和机制:将高级策略和其低级机制分开,通用的软件设计原则
机制:为系统的“如何(how)”问题提供答案。如操作系统如何进行上下文切换
策略:“哪个(which)”问题提供答案。如操作系统现在应该运行哪个进程
将两者分开可以轻松地改变策略,而不必重新考虑机制
3.2 进程API
- 创建(create)
- 销毁(destroy)
- 等待(wait)
- 其他控制(miscellaneous control):如暂停
- 状态(status)
3.3 进程创建:更多细节
操作系统如何启动并运行一个程序?进程创建实际如何进行?
1、操作系统运行程序第一件事就是将代码和所有静态数据(例如初始化变量)加载到内存中,加载到进程的地址空间中
现代操作系统惰性(lazily)执行该过程,即仅在程序执行期间需要加载的代码或数据片段,才会加载
2、接着,操作系统必须为程序的运行时栈(stack)分配一些内存,也可能为程序的堆(heap)分配一些内存(通过调用malloc()显示请求)。数据结构需要堆
3、操作系统还将执行一些输入/输出(I/O)相关的任务
3.4 进程状态
进程可以处于以下3种状态之一:
- 运行(running)
- 就绪(ready)
- 阻塞(blocked)
3.5 数据结构
为了跟踪每个进程的状态,操作系统可能会为所有就绪的进程保留某种进程列表(process list),以及跟踪当前正在运行的进程的一些附加信息。操作系统还必须以某种方式跟踪被阻塞的进程。
已退出但尚未清理的最终状态:僵尸状态。这个状态允许其他进程(通常是创建进程的父进程)检查进程的返回代码,并查看刚刚完成的进程是否成功执行