cmd 找到8080对应进程_多进程概括

多进程图像

操作系统记录进程,并按照合理的次序交替推进(分配资源,不断调度),提高CPU利用率和程序执行速度,这就是操作系统的多进程图像。

当操作系统启动时,多进程图像就出现了。 在linux内核源码main.c文件中,对操作系统初始化时,通过fork()系统调用启动了1号进程,进行初始化,再启动shell。 在shell中,我们输入命令时,会再调用fork()启动其他进程。

// main.c
if (!fork()) {init();
}// shell
while(1) {scanf("%s", cmd);if (!fork()) {exce(cmd);}wait();
}

在windows中我们可以通过任务管理器看到所有进程,Linux可以通过输入topps命令查看进程,这就实现了进程的可视化。

2b75d9267b9ad43b2e89cdba09b4e8f9.png

组织调度交替执行进程

进程队列

操作系统会将进程划分成不同的队列,并用PCB来记录进程信息。

比如有的进程正在执行的队列,有的进程在等待被执行的队列,有的进程在等待硬盘读取结果的队列,还有的进程在已经执行结束的队列。

其实跟我们在食堂排队一样,一条队伍排队等着打饭,一条队伍排队等着打菜,一条队伍排队等着打汤。

7aaa90bc489572304629c7e3231e6ea2.png

进程状态

操作系统通过进程的状态来划分不同的队列。

新建态,刚刚被创建,分配资源。

就绪态,进程已经可以被执行了,等待CPU中。

运行态,进程正在被CPU执行。

阻塞态,进程正在等待,磁盘等IO操作完成返回结果。

终止态,进程执行结束。

操作系统对通过状态的不同管理进程,将相同状态的进程连接成一个队列,通过调度算法不断交替执行进程,改变进程状态,从而推进多个进程不断向前推进。

2c402cdb39c9382236633feaa827122c.png

进程的管理和我们现实生活中处理方式一样,比如我们去政府大厅办事,不同窗口的工作人员就是CPU。 在机器正在扫码领取排队号的人就处于新建态,正在办理业务的人就处于运行态,坐在椅子上等的人就处于就绪态,而办理业务的时候发现身份证没带,去一边等朋友送身份证的人就是阻塞态,办理完了的人就处于终止态了。

调度算法

进程数量远大于CPU数量,操作系统就要对进程进行调度,如果调度不合理也会导致效率低的问题,极端情况下CPU无事可干,再比如有的进程比较重要需要优先执行完,操作系统还需要将CPU资源优先分配给这类进程。

总之一个好的调度算法非常重要,这也是很多计算机科学家在不断研究推进的一个课题。

最简单的调度算法就是FIFO+优先级。 FIFO就是先进先出算法,高优先级的先被执行,相同优先级下,先进入队列的先被执行,后进入队列的后执行。

其他调度算法有兴趣可以慢慢研究。

进程切换

进程切换首先修改PCB中的状态值,并插入到对应的状态队列中。

调用schedule()模块进行切换,getNext()可以理解成内部实现了一个调度算法,从就绪队列中取出下一个可被执行的进程。

e3280a27d22cb0ca35dac5347afef671.png

PCB信息切换,switch_to()就先保存被切换的进程信息,再初始化或恢复即将执行的进程信息。

代码只是简单描述,实际工作非常复杂。

其实对照我们上面的描述,先将资源,比如寄存器中的值保存到当前进程的PCB中。然后将即将执行的进程信息从PCB中恢复或初始化,比如PCB中保存的寄存器值赋值给寄存器。

33b16afe39a7074330a2c625e72f1d99.png

多进程的内存隔离

多进程执行过程可能遇到下图这个问题。

当进程1使用数据的内存地址是进程2代码的指令地址。 当进程1执行的过程中,有可能在0x100地址写入新值,导致进程2被破坏无法执行。

5c8c210735834c79bd04b9c208ccd67b.png

这个问题解决的办法就是将不同进程使用的内存进行空间分离。

因此需要有个中间带进行隔离,在进程和物理内存之间引入映射表。 进程使用的内存地址,通过映射表转换成物理内存地址,从而使不同进程的内存地址进行分离。

如下图所示,虽然进程1和进程2都使用了内存地址0x100,但是通过映射表获取的物理地址分别是0x7800x1260

32594686c71cb6523f87bb94436f2830.png

操作系统为每个进程的设置的映射表,是按照一定映射规则来的,具体细节不去研究,但是可以保证内存地址空间分离,每个进程都在自己的一亩三分地里面执行。

就好比南京和福州都有鼓楼区,虽然名字一样,但是南京和福州空间已经分离了,所以各地的人说到鼓楼区并不会冲突。

多进程合作

进程也可以相互合作,但是如果两个进程共同修改使用相同的数据,可能会导致数据错乱的问题。

比如一个传统模型-生产者消费者模型。

生产者进程负责生成数据,消费者进程负责使用数据。

如下图所示,生产者进程,生产一个数据count++,当count=10时,停止生产数据。消费者进程,消费一个数据count--,当count=0,停止消费数据。

消费者进程和生产者进程共享了count

395691403b48ae0589c827bcd342816d.png

由于进程是交替执行,有可能生产者进程生产了数据,但是count还没有+1,就切换到了消费者进程,导致消费者进程使用的count的值是错误的,从而导致合作结果产生错误。

c7d27812349237072fb73c59f403c4d5.png

如果要解决这个问题,就需要保证当一个进程正在使用count时,其他进程不会使用。 其他进程只有等到count被释放时,才能使用。

这就是多进程的锁机制,实现进程同步,后面会详细说。

7c838a5e8ff7f19db50e3f9541668962.png

总结

操作系统通过PCB保存进程信息。

操作系统根据进程的执行情况设置不同的状态,并划分到相应的状态队列中,通过调度算法交替切换执行进程。

每个进程通过映射表访问物理内存地址,实现了不同进程之间的空间隔离。

多进程合作共享数据会可能导致数据不一致等问题,通过锁机制实现进程同步,合理推进进程顺序。

PS: 以上图片来自MOOC的哈工大李老师的操作系统课程,李老师的课讲的非常好,推荐大家观看学习,如果文章有错误之处,欢迎指正,目前还处于学习阶段。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/454276.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习接口和代码之 KNN

官网地址:https://scikit-learn.org/stable/modules/classes.html#module-sklearn.neighbors class sklearn.neighbors.KNeighborsClassifier(n_neighbors5, weights’uniform’, algorithm’auto’, leaf_size30, p2, metric’minkowski’, metric_paramsNone, n…

Eclipse中安装Ext插件(Spket IDE)

在网上找了很多资料,这里重新整理一下。 Spket IDE是目前支持Ext 2.0最为出色的IDE。 它采用.jsb project file 文件并将继承于基类和所有文档的内容嵌入到生成代码提示的. doc中。由于Spket只是一个单纯的编辑器,没有其它格式的支持(如CSS&a…

职业程序员培养之道

作者:粘新育 任甲林 来源:希赛网  http://www.csai.cn 2004年06月28日软件开发是以人为核心的过程,对人的依赖性远高于传统的硬件生产企业,为了保持开发能力的稳定性,一方面需要定义软件过程,以过程为枢纽…

MongoDB启动

详细见大神链接 链接: https://blog.csdn.net/chenpuzhen/article/details/90642147.

Go 语言编程规范

1. gofmt 命令 大部分的格式问题可以通过 gofmt 来解决,gofmt 自动格式化代码,保证所有的 go 代码与官方推荐的格式保持一致,所有格式有关问题,都以gofmt的结果为准。所以,建议在提交代码库之前先运行一下这个命令。 2…

python去噪音_python中的噪声是什么意思

你的序列均值为零吗? 方差随时间变化吗? 值与延迟值相关吗? 你可以用一些工具来检查你的时间序列是否为白噪音: 创建一个折线图。检查总体特征,如变化的平均值,方差或延迟变量之间的明显关系。 计算汇总统计。对照序列中有意义的连续块的均值和方差&a…

pycharm 离线安装插件

插件离线下载地址: http://plugins.jetbrains.com/ 1、下载插件:http://plugins.jetbrains.com/ 2、安装插件: settings -> plugins -> install plugin from disk,然后重启IDEA即可。

为机器学习占地16

是将若干个学习器(分类器&回归器)组合之后产生一个新学习器。弱分类器(weak learner)指那些分类准确率只稍微好于随机猜测的分类器(errorrate < 0.5)。 集成算法的成功在于保证弱分类器的多样性(Diversity)。而且集成不稳定的算法也能够得到一个比较明显的性能提升。 …

VC DLL学习

1 用VC创建DLL动态链接库1.1 创建dll项目1.2 为dll项目编写源文件头文件dllDemo.hextern"C"_declspec(dllexport) intSum(inta,intb);//加法函数。extern"C"_declspec(dllexport) intMax(inta, intb);//取较大值函数extern"C"_declspec(dllexpor…

mciSendString 多线程播放多首音乐 注意事项

昨天晚上遇到一个问题&#xff1a; 使用 mciSendString 控制播放多首音乐的时候&#xff0c;出现最后一次播放的音乐无法通过 mciSendString ("close mp3") 关闭音乐的播放。 mciSendString 在多个线程中调用。 到23点&#xff0c;问题依然没解决&#xff0c;只好先…

python代码比例_Python如何输出百分比

Python 输出百分比的两种方式 注&#xff1a; 在python3环境下测试。 方式1&#xff1a;直接使用参数格式化&#xff1a;{:.2%} {:.2%}&#xff1a; 显示小数点后2位 显示小数点后2位&#xff1a; >>> print(percent: {:.2%}.format(42/50)) percent: 84.00% 不显示小…

为机器学习占地15

是将若干个学习器(分类器&回归器)组合之后产生一个新学习器。弱分类器(weak learner)指那些分类准确率只稍微好于随机猜测的分类器(errorrat弱分类器的多样性(Diversity)。而且集成不稳定的算法也能够得到一个比较明显的性能提升。 常见的集成学习思想有&#xff1a;Baggi…

编写一个项目开发文档

项目开发过程中为了增加程序的可读性和程序的健壮性&#xff0c; 方便后期程序的调试和维护&#xff0c;所以需要在开发过程中统一技术规范&#xff0c;一般会在项目初期确定好相关文档作为这一统一的规范。不同公司会对文档做不同要求&#xff0c;划不同的分类&#xff0c;但一…

乐在其中设计模式(C#) - 原型模式(Prototype Pattern)

[索引页][源码下载]乐在其中设计模式(C#) - 原型模式(Prototype Pattern)作者&#xff1a;webabcd介绍用原型实例指定创建对象的种类&#xff0c;并且通过拷贝这个原型来创建新的对象。示例有一个Message实体类&#xff0c;现在要克隆它。MessageModelusing System; using Syst…

python123添加列表元素_Python之列表

Python变量没有数据类型&#xff0c;所以Python没有数组。 整数&#xff1b;浮点数&#xff1b;字符串&#xff1b;对象 创建一个列表&#xff1a; 1.member[大鱼,123,3.14,[1,2,3]] 2.empty[] 向列表添加元素&#xff1a; append&#xff08;&#xff09;&#xff1a; member[…

为机器学习占地14

是将若干个学习器(分类器&回归器)组合之后产生一个新学习器。弱分类器(weak learner)指那些分类准确率只稍微好于随机猜测的分类器(errorrate <。 集成算法的成功在于保证弱分类器的多样性(Diversity)。而且集成不稳定的算法也能够得到一个比较明显的性能提升。 常见的…

优秀程序员 分析提高能力 程序进阶

我出生在南方的一个农村。还记得小时候家里是很穷的&#xff0c;那时候上学也很便宜&#xff0c;我已记不清初中以前的学费是多少了。反正从小在家里玩泥巴&#xff0c;有一日村里两个女孩去上学&#xff0c;看到我就说一起去上学吧。当时一想&#xff0c;玩泥巴也厌烦了&#…

html中通过点击button标签实现页面跳转的三种方法

方法1&#xff1a;使用onclick事件 <input type"button" value"按钮"onclick"javascrtpt:window.location.hrefhttp://www.baidu.com/" />或者直接使用button标签 <button onclick"window.location.href https://www.baidu.com…

mybatis调用存储过程

直接贴代码吧 注解式可以调用 但是不能返回结果 所有我就贴配置式的 有知道注解怎么返回结果的请评论 数据库代码 #表 DROP TABLE IF EXISTS p_user; CREATE TABLE p_user (id int(11) NOT NULL AUTO_INCREMENT,name varchar(10) DEFAULT NULL,sex char(2) DEFAULT NULL,PRIMAR…

java dump分析工具_Java 性能分析工具 (2):Java 内置监控工具

引言本文为 Java 性能分析工具系列文章第二篇&#xff0c;第一篇&#xff1a;操作系统工具。在本文中将介绍如何使用 Java 内置监控工具更加深入的了解 Java 应用程序和 JVM 本身。在 JDK 中有许多内置的工具&#xff0c;其中包括&#xff1a;jcmd&#xff1a;打印一个 Java 进…