OS之《进程管理》
进程同步
同步实际上是指:将多个进程,按照顺序,有序执行。
让进程有序进行的场景有很多。比如:一个进程依赖另外一个进程的计算结果;一个进程等待另外一个对临界资源的访问;还有像生产者消费者模型中的相互配合等等。
进程同步应该遵循以下原则
1.空闲让进:有效利用临界资源
2.忙着等待:保持对临界资源的互斥访问
3.有限等待:不能死等
4.让权等待:当持有一个资源去等待另外一个资源的时候,等了一段时间后,就应该释放资源,避免忙等
利用硬件资源实现同步
1.关中断:不适用多核cpu;关中断时间长,会影响效率;
2.Test And Set 指令:会导致CPU空转,一直处于忙碌状态
3.SWAP指令:还是导致CPU空转,一直处于忙碌状态
软件实现同步
1.整型信号量:用一个整数表示资源的数目;当可用资源小于0时,就不断的重试,直到其他进程释放占用的资源;会引起忙等现象
2.记录型信号量:当进程发现没有可用资源时,会进入等待队列,解决了忙等问题。所有的登录对应用一个链表进行连接。
3.AND型信号量:解决一个进程要获取多个不同类型的资源。
4.信号量集:解决一个进程要获取多个不同类型的资源,同时每次获取不止一个资源的问题。
*
如果设置型号量大小为1,则可以实现互斥访问。
管程机制:手动实现PV操作进行控制是非常麻烦,繁琐的。这里引入管程是将PV操作分装在一个数据结构中,提供对外的一个接口即可。例如java里面的synchronized 关键字控制进程同步问题。***
进程同步经典模型
1.生产者消费者模型
2.吸烟者模型(1:N)
3.读写模型
4.哲学家就餐问题
5.水果模型(N:N)
进程通信
就是进程之间的信息交换。
进程互斥和同步,在使用的信号量也属于进程之间的通信的。但,这种属于低级的方式。有以下两点:
1.效率低:不论是哪种信号量,缓存区每次只能是一个或者几个消息。
2.通信对用户不透明:信号量的设置、PV操作都要程序员手动去操作的。
存在的问题:当进程之间的通信需要大量的数据交换时,这种低效的方式显然不行。
解决思路:
应该使用OS自带的高级的通信工具,有以下特点:
1.使用方便。不用关心的实现细节,直接使用原语操作命名就行。
2.高效的完成大数据量的传输。
高级的通信机制归类有以下四种类型:
1.共享存储器
2.管道通信机制
3.消息传递机制
4.客户端-服务器机制
共享存储器系统,也分为两种:
1.基于数据结构的通信方式:公用一个数据结构,实现信息交换。这种传输的数据量太小
2.基于共享存储区方式:这种是在内存中申请一块空间作为共享数据区域,对该区域的读写操作,都是有进程自己来完成的。所以,进程要对该内存区域手动控制,而不是OS来完成的。
管道通信机制:
管道实际上是一个共享文件。用于连接一个读进程和一个写进程。保证管道能正确使用,需要具备一下特点:
1.互斥:一个写,一个读,不能同时使用。一个写的时候,另外一个就不能读。要想实现全双工,就要搞两个管道。
2.同步:一个写完了,要通知到读。读完了要通知到写。比如我们指定缓冲区大小为4K。每次传输数据大小就为4k
3.确保对方进程是否存在:只有对方的进程存在了,才能进行通信
消息传递机制:
将要发送的消息封装成指定数据格式,然后调用OS的操作原语命令,直接讲消息投递给对方进程即可。这种方式隐藏了中间的细节,他是怎么实现的我们不用关心。完全做到了对用户透明,这不就是我们程序员想要的方式嘛。主要它还支持多处处理机。这种方式也很符合网络中消息传递的方式。
具体实现方式也有两种:
1.直接传递方式:用OS操作原语直接将A进程的消息发送给B进程。没有中间缓存区。
2.简介传递方式:是指收发进程共享一个中间实体,类是一个邮箱的概念。实际上就是一个缓冲区。
有缓冲和没有缓冲的优缺点也是很明显的。没有缓冲的效率低,容错率低,信息交换的慢。有缓冲的效率高,在实现上麻烦些。
客户端-服务器机制
前面三种都是在同一台机器上的进程之间的通信,但是这种能实现跨计算机不同进程之间的信息交换。
最早socket也是解决进程之间的网状的通信问题。ABC三个进程他们之间可能都存在信息交换。
一个socket的数据结构包含通信的目的地址,端口,使用的协议,自己所在网络ID和进程端口等。
socket包含两种类型的:
1.基于文件类型:原理类似管道
2.基于网络类型:客户端发出连接请求时,会自动创建一个socket ,并给该进程分配一个端口号,并与该socket绑定,这样就完成了客户端的socket创建。接受进程拥有全局公认的套接字和指定的端口,通过监听端口,等待客户端连接。
RPC调用:
PRC是一种通信协议。这种协议实现了本地能无感知的调用远程的机器进程的执行方法。实现方式由一对进程对应的守护进程(stubborn)。结合java里面的RPC就是远端接口的一个代理实现类。
OS之《进程管理》的更多相关文章
- 《Tsinghua os mooc》第17~20讲 同步互斥、信号量、管程、死锁
第十七讲 同步互斥 进程并发执行 好处1:共享资源.比如:多个用户使用同一台计算机. 好处2:加速.I/O操作和CPU计算可以重叠(并行). 好处3:模块化. 将大程序分解成小程序.以编译为例,gcc ...
- OS之进程管理 --- 死锁
什么是死锁 在正常操作模式下,进程按如下顺序来使用资源: 申请:进程请求资源 使用:进程对资源进行操作 释放:进程释放资源 当一组进程中的每一个进程度在等待一个事件,而这事件只能有一组进程的另一个进程 ...
- [OS] 死锁相关知识点以及银行家算法详解
因此我们先来介绍一下死锁: 死锁特征 当出现死锁时,进程永远不能完成,并且系统资源被阻碍使用,阻止了其他作业开始执行.在讨论处理死锁问题的各种方法之前,先深入讨论一下死锁的特征. ·必要条件 (1)互 ...
- OS | 死锁
死锁的四个条件 互斥 占用等待 非剥夺 循环等待 死锁的解决方案 死锁预防 间接预防:防止前三个条件中的任何一个的发生 直接预防:防止循环等待的发生 死锁避免 进程启动拒绝:不启动任何一个可能发生死锁 ...
- 查看w3wp进程占用的内存及.NET内存泄露,死锁分析
一 基础知识 在分析之前,先上一张图: 从上面可以看到,这个w3wp进程占用了376M内存,启动了54个线程. 在使用windbg查看之前,看到的进程含有 *32 字样,意思是在64位机器上已32位方 ...
- java 利用ManagementFactory获取jvm,os的一些信息--转
原文地址:http://blog.csdn.net/dream_broken/article/details/49759043 想了解下某个Java项目的运行时jvm的情况,可以使用一些监控工具,比如 ...
- Oracle死锁
当两个或多个用户相互等待锁定的数据时就会发生死锁,这时这些用户被卡在不能继续处理业务,oracle可以自动检测死锁并解决他们,通过回滚一个死锁中的语句,释放锁定的数据,回滚的话会遇到ora-00060 ...
- 正尝试在 OS 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码,这样...
出错提示: 正尝试在 OS 加载程序锁内执行托管代码.不要尝试在 DllMain 或映像初始化函数内运行托管代码,这样做会导致应用程序挂起. 原因分析: .NET2.0中增加了42种非常强大的调试助手 ...
- 查找原始MySQL死锁ID
转载地址:http://yueliangdao0608.blog.51cto.com/397025/1180917 如果遇到死锁了,怎么解决呢?找到原始的锁ID,然后KILL掉一直持有的那个线程就可以 ...
- mysql 5.6 read-committed隔离级别下并发插入唯一索引导致死锁一例
今天,某个环境又发生了死锁,如下: *** (1) TRANSACTION:TRANSACTION 735307073, ACTIVE 0 sec insertingmysql tables in u ...
随机推荐
- SpringBoot——更换Tomcat服务器为 Jetty 服务器
Jetty服务器(可能会用到) Jetty 比 Tomcat更轻量级,可拓展性更强(相较于Tomcat),谷歌应用引擎(GAE)已经全面切换为Jetty 首先要启动Jetty服务器 --> ...
- 痞子衡嵌入式:MCUBootUtility v6.3发布,支持获取与解析启动日志
-- 痞子衡维护的 NXP-MCUBootUtility 工具距离上一个大版本(v5.3.0)发布过去一年了,期间痞子衡也做过三个版本更新,但不足以单独介绍.这一次痞子衡为大家带来了全新重要版本v6. ...
- Python 潮流周刊#70:微软 Excel 中的 Python 正式发布!(摘要)
本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...
- SpringBoot.3中的aot.factories到底有什么用?和以前的spring.factories一样吗?
首先,我们来澄清一下 aot.factories 和 spring.factories 之间的区别.这两个文件不仅名称不同,而且在功能上也存在显著差异.接下来,我们将深入探讨这两个文件的具体作用以及它 ...
- Math 数学库
Math.random() 随机数字 Math.PI 圆周率
- Linux 系统常见 的命令
uname -a 查看linux 的版本信息 : pwd :打印当前的工作目录 ,print work directory: cd 改变目录 ,change directory : cd . 当前目 ...
- Nuxt.js 应用中的 kit:compatibility 事件钩子详解
title: Nuxt.js 应用中的 kit:compatibility 事件钩子详解 date: 2024/10/11 updated: 2024/10/11 author: cmdragon e ...
- docker对的tomcat、mysql、redis、nginx的安装
本章篇章主要讲解了docker对常用软件的安装说明 总体步骤:搜索镜像.拉取镜像.查看镜像.启动镜像.停止容器.移除容器 tomcat docker seacher tomcat//也可以在docke ...
- HttpUtils 详解
一.详解 1.1 介绍 现如今的 Web 项目,由服务端向外发起网络请求的场景,基本上随处可见! 传统情况下,在服务端代码里访问 http 服务时,一般会使用 JDK 的 HttpURLConnect ...
- KubeSphere 在 vsleem 的落地实践
作者:方忠,苏州威视通智能科技有限公司技术经理,开源技术爱好者,长期活跃于 dromara 开源社区并参与贡献. 公司介绍 公司简介 苏州威视通智能科技有限公司,是一家全球领先的全景 AI 平台提供商 ...