Java教程

多进程图像

本文主要是介绍多进程图像,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

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

多进程图像定义

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

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

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

多进程图像

  • 首先每个进程在内存中的实体就是PCB,Process Control Block,进程控制块,这是一个C语言结构体
  • 一个进程正在执行时,其对应的PCB实时记录该进程的有关信息
  • 内存中特定位置存放着一个就绪队列,队列中的的元素是各个进程的PCB结构体,CPU按照就绪队列中PCB对应的位置来执行相应进程
  • 在内存特定位置还有等待队列,这些队列中的PCB对应进程因为还在等待某个硬件设备而没法执行,等获得该设备之后会进入到就绪队列中,等待磁盘的就是磁盘等待队列,等待打印机应该有打印机等待队列,等待队列有很多个

多进程的组织:PCB+状态+队列

进程的五状态模型

多进程图像的灵魂:进程交替

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

多进程之间相互影响

  • 为了实现多进程图像,很多个进程的PCB必须都放到内存中,因为只有在内存中才能实现取指执行,但是如果都在内存中的话,当前进程的代码可能会访问其他进程的代码或数据所在的段,那么就可能破坏其他进程,为了解决这个问题,就需要多进程的地址空间分离,这是内存管理的主要内容。
  • 通过映射表实现进程隔离
    • 主要思想是每个进程都有自己的映射表,当进程1和进程2同时访问地址100时,实际上通过各自的映射表映射到的物理地址是不同的,这样就不会相互影响。

多进程之间的合作

  • 典型问题如生产者-消费者问题,生产者进程往一块内存空间中扔数据,消费者进程从中取数据
    • 之所以需要进程合作,是因为cpu的时间片轮转是不确定的,即可能生产者的程序还没执行完就进行了进程调度,切换到了消费者进程,然后导致各种混乱。
    • 解决方式是使用锁,生产者进程对共享资源上锁,直到程序执行完再解锁,如果在生产者程序执行完之前就切换到了消费者进程,由于锁的存在,消费者进程是没法取数据的,必须等待生产者进程先执行完。
  • 为什么需要多进程之间的合作呢?本质原因是因为cpu对于多进程是无序推进的,而由于某些合作进程必须是有序的,因此要采取上锁等措施使得多进程之间有序推进。
这篇关于多进程图像的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!