多进程图像定义
- 启动了的程序就是进程,一次可以启动多个程序,即多个进程交替推进
- 每启动一个进程,操作系统就会用一个专门的结构体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+状态+队列
进程的五状态模型
多进程图像的灵魂:进程交替
- 以磁盘读写为例子
- pCur即当前执行进程的PCB,当其启动磁盘读写时,将PCB放到DiskWaitQueue,即磁盘等待队列,此时进程pCur进入阻塞态
- 执行schedule()函数,执行进程切换
- schedule()函数首先从就绪队列ReadyQueue中进行取出下一个需要执行的进程,这一过程(getNext)即进程调度
- schedule()中先保存当前进程的的相关状态信息,然后开始执行新的进程
- 进程交替三个部分:队列操作+进程调度+切换
- 进程调度内容很多,经典方法比如FIFO和优先级队列等。
- 进程切换主要内容两部分,一是保存当前cpu的状态,二是切换下一个进程。这一块需要用汇编实现,因为涉及到各个寄存器的精确控制,C语言无法实现精确控制。
多进程之间相互影响
- 为了实现多进程图像,很多个进程的PCB必须都放到内存中,因为只有在内存中才能实现取指执行,但是如果都在内存中的话,当前进程的代码可能会访问其他进程的代码或数据所在的段,那么就可能破坏其他进程,为了解决这个问题,就需要多进程的地址空间分离,这是内存管理的主要内容。
- 通过映射表实现进程隔离
- 主要思想是每个进程都有自己的映射表,当进程1和进程2同时访问地址100时,实际上通过各自的映射表映射到的物理地址是不同的,这样就不会相互影响。
多进程之间的合作
- 典型问题如生产者-消费者问题,生产者进程往一块内存空间中扔数据,消费者进程从中取数据
- 之所以需要进程合作,是因为cpu的时间片轮转是不确定的,即可能生产者的程序还没执行完就进行了进程调度,切换到了消费者进程,然后导致各种混乱。
- 解决方式是使用锁,生产者进程对共享资源上锁,直到程序执行完再解锁,如果在生产者程序执行完之前就切换到了消费者进程,由于锁的存在,消费者进程是没法取数据的,必须等待生产者进程先执行完。
- 为什么需要多进程之间的合作呢?本质原因是因为cpu对于多进程是无序推进的,而由于某些合作进程必须是有序的,因此要采取上锁等措施使得多进程之间有序推进。
标签:队列,PCB,内存,图像,进程,执行 来源: https://www.cnblogs.com/chkplusplus/p/16098493.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。