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 ...
随机推荐
- IDEA如何自动导入依赖的jar包
前言 我们在使用IDEA开发时,会引入第三方的jar包,这些第三方的jar包使我们可以快速的使用别人开发好的功能,而不用重复造轮子了. 这大大提高了我们的开发效率. 但是,有时候我们一下子需要导入太多 ...
- ShiftAddAug:基于乘法算子训练的最新无乘法网络方案 | CVPR'24
不包含乘法的运算符,如移位和加法,因其与硬件的兼容性而日益受到重视.然而,采用这些运算符的神经网络(NNs)通常表现出比具有相同结构的传统NNs更低的准确性.ShiftAddAug利用成本较高的乘法来 ...
- MYSQL存储过程-练习4 loop循环
MYSQL存储过程-练习4 loop循环 创建存储过程 1 DELIMITER $$ 2 3 CREATE PROCEDURE `sp_loop`() 4 BEGIN 5 DECLARE i INT; ...
- 2.flask 源码解析:应用启动流程
目录 一.flask 源码解析:应用启动流程 1.1 WSGI 1.2 启动流程 Flask 源码分析完整教程目录:https://www.cnblogs.com/nickchen121/p/1476 ...
- CEOI2022
Day1 T1 Abracadabra 题意:给你一个 \(1 \sim n\) 的排列 \(p\),保证 \(n\) 为偶数,我们对它进行足够多次数的洗牌操作,定义一次洗牌为: 考虑取出 \(p_{ ...
- KubeSphere 网关的设计与实现(解读)
作者:泓舟子,KubeSphere 后端研发工程师,云原生爱好者,现专注于云原生微服务方向. KubeSphere 中为什么需要网关? 如果需要将 K8s 集群内的服务暴露到外部访问有那些方式呢?可以 ...
- Ubuntu 22.04 安装 Nvidia 驱动最方便安全的方式
刚安装好的 Ubuntu 22.04 没有 N 卡驱动,输入 nvidia-smi,提示没有此程序并推荐到 apt 安装. 但是,使用 apt 安装 nvidia 驱动会有极大概率出现启动黑屏和闪屏问 ...
- HTB打靶记录-Infiltrator
nmap scan nmap -A 10.10.11.31 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-10-15 13:18 CST Nma ...
- .NET使用Moq开源模拟库简化单元测试
前言 今天大姚给大家推荐一个.NET开源.流行.使用简单的.NET模拟库:Moq. Moq类库介绍 Moq是一个.NET开源.流行.使用简单的 .NET 模拟库,充分利用了.NET 的 Linq 表达 ...
- AI绘画漫谈——从AI网页生成说起
1. 又说"前端已死" 为什么说"又"呢?因为前两年我在一些博客网站三天两头就能看到这个标题,虽然今年好像换话题了,但感觉前端每年都要死个七八次,当然这里面还是 ...