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 ...
随机推荐
- Nuxt Kit 组件管理:注册与自动导入
title: Nuxt Kit 组件管理:注册与自动导入 date: 2024/9/15 updated: 2024/9/15 author: cmdragon excerpt: Nuxt Kit 为 ...
- 【渗透测试】ATT&CK靶场一,phpmyadmin,域渗透,内网横向移动攻略
前言 VulnStack,作为红日安全团队匠心打造的知识平台,其独特优势在于全面模拟了国内企业的实际业务场景,涵盖了CMS.漏洞管理及域管理等核心要素.这一设计理念源于红日安全团队对ATT&C ...
- 《Vue.js 设计与实现》读书笔记 - 第 4 章、响应系统的作用与实现
第 4 章.响应系统的作用与实现 4.1 响应式数据与副作用 副作用函数就是会对外部造成影响的函数,比如修改了全局变量. 响应式:修改了某个值的时候,某个会读取该值的副作用函数能够自动重新执行. 4. ...
- 常用的linux命令 docker常用命令
mkdir 新建目录 rmdir 删除目录 rm只能删除文件,不能删除目录 cp test.txt Documents 进入容器的目录 docker exec -it <container_id ...
- 06 Word2Vec模型(第一个专门做词向量的模型,CBOW和Skip-gram)
博客配套视频链接: https://space.bilibili.com/383551518?spm_id_from=333.1007.0.0 b 站直接看 配套 github 链接:https:// ...
- 时隔半年 DotNetGuide 已突破了 6.6K + Star,持续更新,欢迎更多小伙伴PR投稿!
前言 记得今年5月份的时候 DotNetGuide GitHub才突破5k Star,经过持续不断地输出时隔半年 DotNetGuide 已突破了 6.6K + Star!并且由我创建的DotNetG ...
- SQLServer数据库事务级别
EFCore自动创建的数据库在SQLSERVER时是READ_COMMITTED_SNAPSHOT,SQLSERVER创建数据库默认是READ_COMMITTED. 因此记录一下查看和修改的方法,以便 ...
- JVM栈帧
Java 的源码文件经过编译器编译后会生成字节码文件,然后由 JVM 的类加载器进行加载,再交给执行引擎执行.在执行过程中,JVM 会划出一块内存空间来存储程序执行期间所需要用到的数据,这块空间一般被 ...
- Springboot异步事件配置和使用
Spring中提供了完整的事件处理机制,本身底层内置实现了一些事件和监听,同时支持开发者扩展自己的事件和监听实现. 一般这种基于事件的实现在项目实际开发中我们主要用来解耦,和做异步处理(默认是同步), ...
- Web渗透09_文件包含漏洞
1 文件包含漏洞描述 开发人员编写代码时独立性好是一个很重要的要求,这边一个数据库类,那边一个模型类.几百行的整体代码,在整合时两行行代码就可以包含进来使用.文件包含有助于独立的代码之间的配合!有时引 ...