多进程图像
2022/4/5 7:20:09
本文主要是介绍多进程图像,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
目录- 多进程图像定义
- 多进程图像存在于计算机使用始终
- 多进程图像
- 多进程的组织: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+状态+队列
进程的五状态模型
多进程图像的灵魂:进程交替
- 以磁盘读写为例子
- pCur即当前执行进程的PCB,当其启动磁盘读写时,将PCB放到DiskWaitQueue,即磁盘等待队列,此时进程pCur进入阻塞态
- 执行schedule()函数,执行进程切换
- schedule()函数首先从就绪队列ReadyQueue中进行取出下一个需要执行的进程,这一过程(getNext)即进程调度
- schedule()中先保存当前进程的的相关状态信息,然后开始执行新的进程
- 进程交替三个部分:队列操作+进程调度+切换
- 进程调度内容很多,经典方法比如FIFO和优先级队列等。
- 进程切换主要内容两部分,一是保存当前cpu的状态,二是切换下一个进程。这一块需要用汇编实现,因为涉及到各个寄存器的精确控制,C语言无法实现精确控制。
多进程之间相互影响
- 为了实现多进程图像,很多个进程的PCB必须都放到内存中,因为只有在内存中才能实现取指执行,但是如果都在内存中的话,当前进程的代码可能会访问其他进程的代码或数据所在的段,那么就可能破坏其他进程,为了解决这个问题,就需要多进程的地址空间分离,这是内存管理的主要内容。
- 通过映射表实现进程隔离
- 主要思想是每个进程都有自己的映射表,当进程1和进程2同时访问地址100时,实际上通过各自的映射表映射到的物理地址是不同的,这样就不会相互影响。
多进程之间的合作
- 典型问题如生产者-消费者问题,生产者进程往一块内存空间中扔数据,消费者进程从中取数据
- 之所以需要进程合作,是因为cpu的时间片轮转是不确定的,即可能生产者的程序还没执行完就进行了进程调度,切换到了消费者进程,然后导致各种混乱。
- 解决方式是使用锁,生产者进程对共享资源上锁,直到程序执行完再解锁,如果在生产者程序执行完之前就切换到了消费者进程,由于锁的存在,消费者进程是没法取数据的,必须等待生产者进程先执行完。
- 为什么需要多进程之间的合作呢?本质原因是因为cpu对于多进程是无序推进的,而由于某些合作进程必须是有序的,因此要采取上锁等措施使得多进程之间有序推进。
这篇关于多进程图像的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-01后台管理开发学习:新手入门指南
- 2024-11-01后台管理系统开发学习:新手入门教程
- 2024-11-01后台开发学习:从入门到实践的简单教程
- 2024-11-01后台综合解决方案学习:从入门到初级实战教程
- 2024-11-01接口模块封装学习入门教程
- 2024-11-01请求动作封装学习:新手入门教程
- 2024-11-01登录鉴权入门:新手必读指南
- 2024-11-01动态面包屑入门:轻松掌握导航设计技巧
- 2024-11-01动态权限入门:新手必读指南
- 2024-11-01动态主题处理入门:新手必读指南