操作系统导论-第4章-抽象:进程
时分共享(time sharing):[[操作系统导论 第2章 操作系统介绍#2.1 虚拟化CPU|将单个CPU(或其中一小部分)转化为看似无限数量的CPU,从而让许多程序看似同时运行。]]
4.1 抽象:进程概念
操作系统为正在运行的程序提供的抽象,就是作为的进程(progress)。
进程的机器状态(machine state):
- 它能访问的内存(称为[[操作系统导论 第2章 操作系统介绍#^6644e1|地址空间]],address space);
- 寄存器,包括一些非常特殊的寄存器,如
- 程序计数器(Program Counter, PC)(或指令指针,Instruction Pointer, IP),告诉程序执行哪个指令;
- 栈指针(stack pointer),相关的帧指针(frame pointer),用于管理函数参数栈、局部变量和返回地址;
4.2 进程API
- 创建(create):创建新进程,运行指定程序;
- 销毁(destroy):强制销毁进程,防止程序不退出;
- 等待(wait):等待进程停止运行;
- 其他控制(miscellaneous control):如暂停进程,然后恢复;
- [[操作系统导论 第4章 抽象:进程#4.4 进程状态|状态]](status):获得进程的状态信息;
4.3 进程创建:更多细节
- 操作系统运行程序的第一件事:将代码和所有静态数据(如初始化变量)加载(load)到内存中,加载到进程的[[操作系统导论 第2章 操作系统介绍#^6644e1|地址空间]]中。
早期(或简单的)操作系统中,加载过程尽早(eagerly)完成,即在运行程序之前全部完成。现代操作系统惰性(lazily)执行该过程,即仅在程序执行期间需要加载的代码或数据片段,才会被加载。 - 操作系统为程序的运行时栈(runtime stack,stack)分配内存;
- 操作系统为程序的堆(heap)分配内存;
- 操作系统执行一些其他的初始化任务,特别时与输入/输出(I/O)相关的任务。
- 最后一项任务:起动程序,在入口处运行,即
main()
。通过跳转到main()
例程([[操作系统导论 第5章 插叙:进程API]]),OS将CPU的控制权转移到新创建的进程中,从而程序开始执行。
4.4 进程状态
进程可以处在一下三钟状态之一:
- 运行(running):进程正在处理器上运行,正在执行指令。
- 就绪(ready):程序已准备好运行,但由于某种原因,操作系统选择不在此时运行。
- 阻塞(blocked):一个进程执行了某种操作,直到发生其他事件时才会准备运行。
![[图4.2 进程:状态转换.png]]
4.5 数据结构
对于停止的进程,寄存器上下文将保存其寄存器的内容。当一个进程停止时,它的寄存器将被保存到这个内存位置。通过恢复这些寄存器(将它们的值放回实际的物理寄存器中),操作系统可以恢复运行该进程。[[操作系统导论 第6章 机制:受限直接执行#保存和恢复上下文|上下文切换(context switch)]]。
有时系统会有一个初始(initial)状态,表示进程在创建是处于的状态。另外,一个进程可以处于已退出但尚未清理的最终(final)状态(UNIX中称为僵尸状态),它允许其他进程(通常是其父进程)检查进程的返回代码,并查看刚刚完成的进程是否执行。完成后,父进程将执行最后一次调用(例如,[[操作系统导论 第5章 插叙:进程API#5.2 wait()
系统调用|wait()]]),已等待子进程的完成,并告诉操作系统它可以清理这个正在结束的进程所有相关的数据结构。