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+状态+队列
进程的五状态模型
多进程图像的灵魂:进程交替
以磁盘读写为例子
pCur即当前执行进程的PCB,当其启动磁盘读写时,将PCB放到DiskWaitQueue,即磁盘等待队列,此时进程pCur进入阻塞态
执行schedule()函数,执行进程切换
schedule()函数首先从就绪队列ReadyQueue中进行取出下一个需要执行的进程,这一过程(getNext)即进程调度
schedule()中先保存当前进程的的相关状态信息,然后开始执行新的进程
进程交替三个部分:队列操作+进程调度+切换
进程调度内容很多,经典方法比如FIFO和优先级队列等。
进程切换主要内容两部分,一是保存当前cpu的状态,二是切换下一个进程。这一块需要用汇编实现,因为涉及到各个寄存器的精确控制,C语言无法实现精确控制。
多进程之间相互影响
为了实现多进程图像,很多个进程的PCB必须都放到内存中,因为只有在内存中才能实现取指执行,但是如果都在内存中的话,当前进程的代码可能会访问其他进程的代码或数据所在的段,那么就可能破坏其他进程,为了解决这个问题,就需要
多进程的地址空间分离
,这是内存管理的主要内容。
通过映射表实现进程隔离
主要思想是每个进程都有自己的映射表,当进程1和进程2同时访问地址100时,实际上通过各自的映射表映射到的物理地址是不同的,这样就不会相互影响。
多进程之间的合作
典型问题如生产者-消费者问题,生产者进程往一块内存空间中扔数据,消费者进程从中取数据
之所以需要进程合作,是因为cpu的时间片轮转是不确定的,即可能生产者的程序还没执行完就进行了进程调度,切换到了消费者进程,然后导致各种混乱。
解决方式是使用锁,生产者进程对共享资源上锁,直到程序执行完再解锁,如果在生产者程序执行完之前就切换到了消费者进程,由于锁的存在,消费者进程是没法取数据的,必须等待生产者进程先执行完。
为什么需要多进程之间的合作呢?本质原因是因为cpu对于多进程是无序推进的,而由于某些合作进程必须是有序的,因此要采取上锁等措施使得多进程之间有序推进。
这篇关于多进程图像的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
您可能喜欢
后台管理开发学习:新手入门指南
11-01
后台管理系统开发学习:新手入门教程
11-01
后台开发学习:从入门到实践的简单教程
11-01
后台综合解决方案学习:从入门到初级实战教程
11-01
接口模块封装学习入门教程
11-01
请求动作封装学习:新手入门教程
11-01
登录鉴权入门:新手必读指南
11-01
动态面包屑入门:轻松掌握导航设计技巧
11-01
动态权限入门:新手必读指南
11-01
动态主题处理入门:新手必读指南
11-01
富文本编辑器入门:新手必读指南
11-01
功能权限入门:新手必读指南
11-01
国际化处理入门:新手必读指南
11-01
后台管理开发入门:从零开始的全面指南
11-01
后台管理系统开发入门:新手必读教程
11-01
栏目导航
前端开发
HTML5教程
CSS教程
Javascript
jQuery教程
AJAX教程
Node.js教程
XML教程
正则表达式
后端开发
Go教程
C/C++教程
消息队列MQ
Net Core教程
Asp.net教程
Java教程
PHP教程
移动端开发
微信公众号开发
小程序开发
Swift教程
IOS教程
Kotlin教程
Android开发
数据库
Redis教程
MongoDB教程
PostgreSQL教程
Oracle教程
MariaDB教程
SqLite教程
MySql教程
SqlServer教程
服务器运维
Kubernetes
Docker容器
linux shell
Nginx教程
网站安全
PowerShell教程
Linux教程
人工智能
TensorFlow教程
Python教程
机器学习
人工智能学习
区块链
区块链技术
游戏开发
游戏编程
Unity3D教程
网站运营
网站策划
网站优化
建站知识
大数据/云计算
云计算
Hadoop教程
软件工程
软件/开发工具使用
Git教程
资讯