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 ...
随机推荐
- RSA 对称加密,对称解密----公钥私钥加密解密过程
RSA 对称加密,对称解密----公钥私钥加密解密过程(Java) 公司说不能传铭文密码,所以只能加密,再解密:麻烦事,其实这在需求文档没有,开发时间点也没有,浪费了了一上午的时间,还占用了公司给的开 ...
- Listener——监听器
Listener
- Nuxt.js 应用中的 app:redirected 钩子详解
title: Nuxt.js 应用中的 app:redirected 钩子详解 date: 2024/10/3 updated: 2024/10/3 author: cmdragon excerpt: ...
- `std::packaged_task`、`std::thread` 和 `std::async` 的区别与联系
std::packaged_task.std::thread 和 std::async 的区别与联系 std::packaged_task.std::thread 和 std::async 都是 C+ ...
- qemu的使用
一.QEMU的运行模式 直接摘抄自己<揭秘家用路由器0day漏洞挖掘技术>,网上查了一下也没有找到令人满意的QEMU的使用说明,就采用这本书上的介绍.如果后期能够找到比较满意的QEMU的使 ...
- 数据库运维实操优质文章分享(含Oracle、MySQL等) | 2024年7月刊
本文为大家整理了墨天轮数据社区2024年7月发布的优质技术文章/文档,主题涵盖Oracle.MySQL.PostgreSQL等主流数据库系统以及国产数据库的深度教程和实用指南.从基础的安装配置到复杂的 ...
- 默认nginx.conf
user nginx; worker_processes auto; error_log /var/log/nginx/error.log notice; pid /var/run/nginx.pid ...
- spring boot 与spring boot admin整合问题处理
1.在整合springboot admin server时,发现admin client无法注册到admin server上 查找原因后发现代码中报错:HttpMediaTypeNotAcceptab ...
- 云原生爱好者周刊:目前 WebAssembly 的最佳应用场景有哪些?
云原生一周动态要闻: Istio 1.11 发布 Facebook.Google.Isovalent.微软和 Netflix 宣布成立 eBPF 基金会 GitHub 工程团队将开发环境迁移到 Cod ...
- awk 处理 Git 提交信息生成 Release Note
发布软件时通常都会写 Release Note,但每次从头手打也有点累,可以考虑从 Git 的提交历史中自动生成. Git 提交信息一般是三段式结构,段落之间使用空行隔开: <subject&g ...