1_1-虚拟化-抽象-进程
进程:一个正在执行的程序
-
程序本身是“lifeless” - 在磁盘上的一堆指令/数据
-
OS为正在运行的程序提供的抽象,可以通过不同的数据结构和其使用的系统资源表征一个进程
-
进程的主要构成:
- PCB(进程控制块)
- 程序计数器Program Counter:程序当前正在执行哪个指令
- 寄存器信息
- 栈指针Stack pointer;Frame pointer:管理函数参数栈、局部变量和返回地址
- I/O信息(打开文件列表)
- 进程标识信息(进程ID、父进程ID、用户ID等)
- 调度信息
- 程序代码
- 数据
- PCB(进程控制块)
-
为什么进程被暂停后还能恢复到原来位置?
- 下一条要执行的指令位置
- 当时各个寄存器里的值
- 程序运行时的数据状态
原因:
- 暂停时,保存CPU现场到该进程的PCB等数据结构中
- 恢复时,把该进程原来的现场重新装入CPU
进程:创建
- 将程序代码/静态数据载入内存,进入进程的地址空间
- 程序最初在磁盘中,可执行格式(ELF-linux,PE-windows)
- OS载入进程(lazily)
- 仅当程序执行需要时载入代码或数据【分页和交换】
- 为程序运行时栈(stack)分配内存
- 使用栈存放:local variables,function parameters, return address
- 使用参数初始化栈:main()函数中的argc, argv
- 为程序堆(heap)分配内存(lazily)
- C程序中堆用与显式请求的动态分配数据
- 程序通过调用malloc()请求此空间,并通过调用free()释放该空间
- 数据结构(如链表、散列表、树和其他数据结构)需要堆
- OS做了一些其他的初始化任务
- I/O设置
- UNIX系统中,每个进程默认有三个打开的文件描述符
- 标准输入(STDIN = 0),标准输出(STDOUT = 1),标准错误(STDERR = 2)
- 最后从main()函数启动程序运行
- 操作系统将CPU控制权转交给新创建的进程
进程:状态
- 一个进程可以处于三种状态之一
- 运行(Running)
- 进程正在处理器上运行,这意味着它正在执行指令
- 就绪(Ready)
- 进程已准备好运行,但由于某种原因,操作系统选择不在此时运行
- 阻塞(Blocked)
- 一个进程执行了某种操作,并且在等待结果
- 例子:当进程向磁盘发起I/O请求时,它会被阻塞,因此其他进程可以使用处理器
- 运行(Running)
- 还有其他一些进程可以处于的状态
- 初始状态(initial):表示进程在创建时处于的状态
- 最终状态(final):可以处于已退出但尚未清理的最终状态
进程状态转换

- 从就绪到运行意味着该进程已经被调度(scheduled)
- 从运行到就绪意味着该进程已经取消调度(descheduled)
- 一旦进程被阻塞(例如通过发起I/O操作),OS将保持进程的这种状态,直到法案生某种事件(例如,I/O完成)
进程管理中的关键数据结构
- 进程控制块(Process Control Block, PCB):存储关于进程的信息
- 进程状态;程序计数器,堆栈指针、内存信息等;调度信息
- 进程/任务列表
- 就绪队列
- 阻塞队列
- 当前运行进程
- 上下文切换(context-switch):依赖PCB保存和恢复现场
- 当一个进程停止时,它的寄存器将被保存到这个内存位置
- 通过恢复这些寄存器(将它们的值放回实际的物理寄存器中),操作系统可以恢复运行该进程

浙公网安备 33010602011771号