1_1-虚拟化-抽象-进程

进程:一个正在执行的程序

  1. 程序本身是“lifeless” - 在磁盘上的一堆指令/数据

  2. OS为正在运行的程序提供的抽象,可以通过不同的数据结构和其使用的系统资源表征一个进程

  3. 进程的主要构成:

    • PCB(进程控制块)
      • 程序计数器Program Counter:程序当前正在执行哪个指令
      • 寄存器信息
      • 栈指针Stack pointer;Frame pointer:管理函数参数栈、局部变量和返回地址
      • I/O信息(打开文件列表)
      • 进程标识信息(进程ID、父进程ID、用户ID等)
      • 调度信息
    • 程序代码
    • 数据
  4. 为什么进程被暂停后还能恢复到原来位置?

    • 下一条要执行的指令位置
    • 当时各个寄存器里的值
    • 程序运行时的数据状态

    原因:

    • 暂停时,保存CPU现场到该进程的PCB等数据结构中
    • 恢复时,把该进程原来的现场重新装入CPU

进程:创建

  1. 将程序代码/静态数据载入内存,进入进程的地址空间
    • 程序最初在磁盘中,可执行格式(ELF-linux,PE-windows)
    • OS载入进程(lazily)
      • 仅当程序执行需要时载入代码或数据【分页和交换】
  2. 为程序运行时栈(stack)分配内存
    • 使用栈存放:local variables,function parameters, return address
    • 使用参数初始化栈:main()函数中的argc, argv
  3. 为程序堆(heap)分配内存(lazily)
    • C程序中堆用与显式请求的动态分配数据
    • 程序通过调用malloc()请求此空间,并通过调用free()释放该空间
    • 数据结构(如链表、散列表、树和其他数据结构)需要堆
  4. OS做了一些其他的初始化任务
    • I/O设置
    • UNIX系统中,每个进程默认有三个打开的文件描述符
    • 标准输入(STDIN = 0),标准输出(STDOUT = 1),标准错误(STDERR = 2)
  5. 最后从main()函数启动程序运行
    • 操作系统将CPU控制权转交给新创建的进程

进程:状态

  1. 一个进程可以处于三种状态之一
    • 运行(Running)
      • 进程正在处理器上运行,这意味着它正在执行指令
    • 就绪(Ready)
      • 进程已准备好运行,但由于某种原因,操作系统选择不在此时运行
    • 阻塞(Blocked)
      • 一个进程执行了某种操作,并且在等待结果
      • 例子:当进程向磁盘发起I/O请求时,它会被阻塞,因此其他进程可以使用处理器
  2. 还有其他一些进程可以处于的状态
    • 初始状态(initial):表示进程在创建时处于的状态
    • 最终状态(final):可以处于已退出但尚未清理的最终状态

进程状态转换

进程状态转换

  • 从就绪到运行意味着该进程已经被调度(scheduled)
  • 从运行到就绪意味着该进程已经取消调度(descheduled)
  • 一旦进程被阻塞(例如通过发起I/O操作),OS将保持进程的这种状态,直到法案生某种事件(例如,I/O完成)

进程管理中的关键数据结构

  • 进程控制块(Process Control Block, PCB):存储关于进程的信息
    • 进程状态;程序计数器,堆栈指针、内存信息等;调度信息
  • 进程/任务列表
    • 就绪队列
    • 阻塞队列
    • 当前运行进程
  • 上下文切换(context-switch):依赖PCB保存和恢复现场
    • 当一个进程停止时,它的寄存器将被保存到这个内存位置
    • 通过恢复这些寄存器(将它们的值放回实际的物理寄存器中),操作系统可以恢复运行该进程
posted @ 2026-03-31 14:32  Y27zy  阅读(2)  评论(0)    收藏  举报