操作系统 进程与线程------进程间通信方式

目录

1. 共享文件

2. 共享内存

3. 管道

4. 消息队列

5. 套接字

6. 信号

总结

 

IPC(Inter-Process Communication,进程间通信)是指进程之间的信息交换。由于进程的互斥与同步,需要在进程间交换一定的信息,对于同一个进程的线程我们可以通过之间共享内存来通信,但对于进程来说,默认情况下是不能共享内存的,所以有了下面的这些进程间通信方法。

1. 共享文件

相信大家对文件的操作已经很熟悉了,考虑一下下面这样一个相对简单的例子,其中一个进程(生产者 producer)创建和写入一个文件,然后另一个进程(消费者 consumer)从这个相同的文件中进行读取,这样就实现了进程间的通信。

共享文件可能是最为基础的 IPC 机制。在使用这个 IPC 机制时竞争条件可能会发生,如:生产者和消费者同时访问该文件,从而使得输出不确定。

为了避免竞争条件的发生,我们可以在生产者写文件时获得一个写锁,该锁最多只能有一个进程持有;

消费者读取时获取一个读锁,多个读取者可同时获取读锁,但读写锁互斥。

读锁可以提升效率。假如一个进程只是读入一个文件的内容,而不去改变它的内容,可以允许其它进程同时读取。但如果需要写入内容,则很显然需要文件有写锁。

 

2. 共享内存

该方法通过在内存中划出一块共享存储的区域,进程可以通过对该共享区的读或写来交换信息,实现通信。

但内存共享同样会有竞争条件的风险,我们可以引入信号量来实现对共享内存的同步协调获取。

 

3. 管道

管道(pipe)是连接需要通信的进程之间半双工的通道。在内核中申请一块固定大小的缓冲区,程序拥有写入和读取的权利,管道拥有一个写端用于写入字节数据,还有一个读端用于按照先入先出(FIFO)的顺序读入这些字节数据。

管道有两种类型,无名管道命名管道

无名管道没有备份文件,系统将维持一个内存缓存来将字节数据从写方传给读方。一旦写方和读方终止,这个缓存将会被回收,进而无名管道消失。

而命名管道有备份文件和一个不同的 API。

 

4. 消息队列

消息队列是消息的链接表,它可以做出和管道相同的表现,但它又足够灵活,可以实现随机查询,使得字节块可以不以先入先出的次序来接收。

 

5. 套接字

套接字(Scoket)是 UNIX 操作系统下的网络通信接口,一开始套接字被设计用在同一主机上多个应用程序间的通信(即进程间通信),主要为了解决多对进程同时通信时端口和物理线路的多路复用问题。

套接字的优势在于,其不仅适用于同主机下的进程通信,也适用于网络环境中不同计算机间的进程通信

 

6. 信号

进程与进程之间还可以通过信号来通信,如用户可以通过 Ctrl + C 来终止一个从命令行中启动的程序,其中Ctrl + C 就是产生了一个 SIGTERM(终止) 信号,然后对应进程收到该信号就会做出相应的处理。

 

总结

这个内容光看没什么感觉,就是概念,得自己去敲一遍,实现以上各种模型来学习,下面的网站有对应的模型代码,可以试着敲一遍。

https://linux.cn/article-10826-1.html  共享存储

https://linux.cn/article-10845-1.html  管道和消息队列

https://linux.cn/article-10930-1-rel.html  套接字和信号

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值