多进程图像


目录
  • 多进程图像定义
  • 多进程图像存在于计算机使用始终
  • 多进程图像
  • 多进程的组织:PCB+状态+队列
    • 进程的五状态模型
    • 多进程图像的灵魂:进程交替
  • 多进程之间相互影响
  • 多进程之间的合作

多进程图像定义

  • 启动了的程序就是进程,一次可以启动多个程序,即多个进程交替推进
  • 每启动一个进程,操作系统就会用一个专门的结构体PCB来实时记录这个进程,并按照合理的顺序推进进程(分配资源、进行调度)
  • 以上即多进程图像

多进程图像存在于计算机使用始终

  • 计算机启动过程中,最后是执行main.c函数进行一系列的初始化,并最后有一条指令if(!fork()){init();}创建了第一个进程(某种意义上是第二个,main.c是第一个吧),即启动了shell,shell本身也是个进程。在windows中是启动桌面。当然现在很多的linux系统也是有桌面的。
  • 通过shell进程再启动其他进程
  • 计算机使用过程中,shell是始终存在的,因此多进程图像始终存在。

多进程图像

  • 首先每个进程在内存中的实体就是PCB,Process Control Block,进程控制块,这是一个C语言结构体
  • 一个进程正在执行时,其对应的PCB实时记录该进程的有关信息
  • 内存中特定位置存放着一个就绪队列,队列中的的元素是各个进程的PCB结构体,CPU按照就绪队列中PCB对应的位置来执行相应进程
    1. pCur即当前执行进程的PCB,当其启动磁盘读写时,将PCB放到DiskWaitQueue,即磁盘等待队列,此时进程pCur进入阻塞态
    2. 执行schedule()函数,执行进程切换
    3. schedule()函数首先从就绪队列ReadyQueue中进行取出下一个需要执行的进程,这一过程(getNext)即进程调度
    4. schedule()中先保存当前进程的的相关状态信息,然后开始执行新的进程
  • 进程交替三个部分:队列操作+进程调度+切换
    • 进程调度内容很多,经典方法比如FIFO和优先级队列等。
    • 进程切换主要内容两部分,一是保存当前cpu的状态,二是切换下一个进程。这一块需要用汇编实现,因为涉及到各个寄存器的精确控制,C语言无法实现精确控制。

多进程之间相互影响

  • 为了实现多进程图像,很多个进程的PCB必须都放到内存中,因为只有在内存中才能实现取指执行,但是如果都在内存中的话,当前进程的代码可能会访问其他进程的代码或数据所在的段,那么就可能破坏其他进程,为了解决这个问题,就需要多进程的地址空间分离,这是内存管理的主要内容。
  • 通过映射表实现进程隔离
    • 之所以需要进程合作,是因为cpu的时间片轮转是不确定的,即可能生产者的程序还没执行完就进行了进程调度,切换到了消费者进程,然后导致各种混乱。
    • 解决方式是使用锁,生产者进程对共享资源上锁,直到程序执行完再解锁,如果在生产者程序执行完之前就切换到了消费者进程,由于锁的存在,消费者进程是没法取数据的,必须等待生产者进程先执行完。
  • 为什么需要多进程之间的合作呢?本质原因是因为cpu对于多进程是无序推进的,而由于某些合作进程必须是有序的,因此要采取上锁等措施使得多进程之间有序推进。