进程同步

同步实际上是指:将多个进程,按照顺序,有序执行。

让进程有序进行的场景有很多。比如:一个进程依赖另外一个进程的计算结果;一个进程等待另外一个对临界资源的访问;还有像生产者消费者模型中的相互配合等等。

进程同步应该遵循以下原则

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之《进程管理》的更多相关文章

  1. 《Tsinghua os mooc》第17~20讲 同步互斥、信号量、管程、死锁

    第十七讲 同步互斥 进程并发执行 好处1:共享资源.比如:多个用户使用同一台计算机. 好处2:加速.I/O操作和CPU计算可以重叠(并行). 好处3:模块化. 将大程序分解成小程序.以编译为例,gcc ...

  2. OS之进程管理 --- 死锁

    什么是死锁 在正常操作模式下,进程按如下顺序来使用资源: 申请:进程请求资源 使用:进程对资源进行操作 释放:进程释放资源 当一组进程中的每一个进程度在等待一个事件,而这事件只能有一组进程的另一个进程 ...

  3. [OS] 死锁相关知识点以及银行家算法详解

    因此我们先来介绍一下死锁: 死锁特征 当出现死锁时,进程永远不能完成,并且系统资源被阻碍使用,阻止了其他作业开始执行.在讨论处理死锁问题的各种方法之前,先深入讨论一下死锁的特征. ·必要条件 (1)互 ...

  4. OS | 死锁

    死锁的四个条件 互斥 占用等待 非剥夺 循环等待 死锁的解决方案 死锁预防 间接预防:防止前三个条件中的任何一个的发生 直接预防:防止循环等待的发生 死锁避免 进程启动拒绝:不启动任何一个可能发生死锁 ...

  5. 查看w3wp进程占用的内存及.NET内存泄露,死锁分析

    一 基础知识 在分析之前,先上一张图: 从上面可以看到,这个w3wp进程占用了376M内存,启动了54个线程. 在使用windbg查看之前,看到的进程含有 *32 字样,意思是在64位机器上已32位方 ...

  6. java 利用ManagementFactory获取jvm,os的一些信息--转

    原文地址:http://blog.csdn.net/dream_broken/article/details/49759043 想了解下某个Java项目的运行时jvm的情况,可以使用一些监控工具,比如 ...

  7. Oracle死锁

    当两个或多个用户相互等待锁定的数据时就会发生死锁,这时这些用户被卡在不能继续处理业务,oracle可以自动检测死锁并解决他们,通过回滚一个死锁中的语句,释放锁定的数据,回滚的话会遇到ora-00060 ...

  8. 正尝试在 OS 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码,这样...

    出错提示: 正尝试在 OS 加载程序锁内执行托管代码.不要尝试在 DllMain 或映像初始化函数内运行托管代码,这样做会导致应用程序挂起. 原因分析: .NET2.0中增加了42种非常强大的调试助手 ...

  9. 查找原始MySQL死锁ID

    转载地址:http://yueliangdao0608.blog.51cto.com/397025/1180917 如果遇到死锁了,怎么解决呢?找到原始的锁ID,然后KILL掉一直持有的那个线程就可以 ...

  10. mysql 5.6 read-committed隔离级别下并发插入唯一索引导致死锁一例

    今天,某个环境又发生了死锁,如下: *** (1) TRANSACTION:TRANSACTION 735307073, ACTIVE 0 sec insertingmysql tables in u ...

随机推荐

  1. Nuxt Kit 组件管理:注册与自动导入

    title: Nuxt Kit 组件管理:注册与自动导入 date: 2024/9/15 updated: 2024/9/15 author: cmdragon excerpt: Nuxt Kit 为 ...

  2. 【渗透测试】ATT&CK靶场一,phpmyadmin,域渗透,内网横向移动攻略

    前言 VulnStack,作为红日安全团队匠心打造的知识平台,其独特优势在于全面模拟了国内企业的实际业务场景,涵盖了CMS.漏洞管理及域管理等核心要素.这一设计理念源于红日安全团队对ATT&C ...

  3. 《Vue.js 设计与实现》读书笔记 - 第 4 章、响应系统的作用与实现

    第 4 章.响应系统的作用与实现 4.1 响应式数据与副作用 副作用函数就是会对外部造成影响的函数,比如修改了全局变量. 响应式:修改了某个值的时候,某个会读取该值的副作用函数能够自动重新执行. 4. ...

  4. 常用的linux命令 docker常用命令

    mkdir 新建目录 rmdir 删除目录 rm只能删除文件,不能删除目录 cp test.txt Documents 进入容器的目录 docker exec -it <container_id ...

  5. 06 Word2Vec模型(第一个专门做词向量的模型,CBOW和Skip-gram)

    博客配套视频链接: https://space.bilibili.com/383551518?spm_id_from=333.1007.0.0 b 站直接看 配套 github 链接:https:// ...

  6. 时隔半年 DotNetGuide 已突破了 6.6K + Star,持续更新,欢迎更多小伙伴PR投稿!

    前言 记得今年5月份的时候 DotNetGuide GitHub才突破5k Star,经过持续不断地输出时隔半年 DotNetGuide 已突破了 6.6K + Star!并且由我创建的DotNetG ...

  7. SQLServer数据库事务级别

    EFCore自动创建的数据库在SQLSERVER时是READ_COMMITTED_SNAPSHOT,SQLSERVER创建数据库默认是READ_COMMITTED. 因此记录一下查看和修改的方法,以便 ...

  8. JVM栈帧

    Java 的源码文件经过编译器编译后会生成字节码文件,然后由 JVM 的类加载器进行加载,再交给执行引擎执行.在执行过程中,JVM 会划出一块内存空间来存储程序执行期间所需要用到的数据,这块空间一般被 ...

  9. Springboot异步事件配置和使用

    Spring中提供了完整的事件处理机制,本身底层内置实现了一些事件和监听,同时支持开发者扩展自己的事件和监听实现. 一般这种基于事件的实现在项目实际开发中我们主要用来解耦,和做异步处理(默认是同步), ...

  10. Web渗透09_文件包含漏洞

    1 文件包含漏洞描述 开发人员编写代码时独立性好是一个很重要的要求,这边一个数据库类,那边一个模型类.几百行的整体代码,在整合时两行行代码就可以包含进来使用.文件包含有助于独立的代码之间的配合!有时引 ...