操作系统-------进程间通信的方法

本文详细介绍了进程通信的五种主要方式:管道(包括无名管道和有名管道FIFO)、共享内存(强调同步与互斥的重要性)、信号量(作为控制进程访问的计数器)、消息队列(提供异步处理和消息类型的筛选能力)以及Socket(用于跨网络的进程通信)。每种通信方式的特点、优缺点以及应用场景均有阐述。
摘要由CSDN通过智能技术生成

 

目录

一,管道

二、共享内存

三、信号量

四、消息队列

五、socket


进程通信:指进程间的信息交换,由于一个进程是不能直接访问其他进程的空间的,所以进程间的通信都要按照某些规则,这些规则就是进程的通信方式。

一,管道

管道本质:其实就是在磁盘中开辟的一段大小固定的缓冲区。管道是文件,读写需要调用I/O。

访问方式:各进程要互斥地访问管道,即同一时间不能有两个进程对管理进行访问。所以管道是半双工通信的,某一时间段只能实现单向的传输,如果要实现双向传输,就需要设置多一个管道。

管道在读、写数据时的表现:管道如果正在被写入数据,则要等待管道被写满才能被读,同理,如果管道正在被读,则需要管道内的数据被读完才能往里面写,管道的数据一旦被读出,就马上从管道中被抛弃。当管道写满时,写进程若继续写(调用系统调用write()),那么自己就会发生阻塞,同理,若管道为空,读进程想读(调用系统调用read()),也会发生阻塞

管道分类:(管道分为有名管道和无名管道)

1.无名管道(pipe):这是UNIX通信最古老的方式。无名管道只能由父子进程或兄弟进程使用。

2.有名管道(FIFO):不相关的进程也能通过有名管道交换数据。

 

二、共享内存

在Linux中,每个进程都有属于它自己的PCB(进程控制块)和地址空间(逻辑地址),并且都有一个与之对应的页表,页表把进程的逻辑地址映射到内存的物理地址中。两个进程不同的虚拟地址映射到物理空间的同一片地址,那么这片地址就是这两个进程的共享内存。如下图:

按理说,拥有共享内存的两个或多个进程应该可以想往共享内存写就写,读就读啊,理论上确实可以,但是这种确实是不合理的。所有共享内存都要引入同步机制,来控制同一个时间,只能有一个进程操作这段共享内存。要确保一个进程在写的时候不能被读,因此我们使用信号量来实现同步与互斥。

实现细节:共享内存会维护一个计数器,当进程脱离这片共享内存时,计算器会减一,反之,如果新增一个进程挂接到这片共享内存的话,计数器会加一。当计算器为0时,这片共享内存才能被删除。

优点和缺点:

优点:共享内存是速度最快的进程通信方法。因为不同于管道和消息队列都是内核对象,共享内存是属于挂接到它的进程的一部分,可以直接访问。进行访问共享内存区域和访问进程独有的内存区域一样快,并不需要通过系统调用或者其它需要切入内核的过程来完成。

缺点:缺乏同步机制。

 

三、信号量

信号量的本质就是一个计数器,用来实现进程之间的互斥与同步。例如信号量的初始值是 1,然后 a 进程来访问内存1的时候,我们就把信号量的值设为 0,然后进程b 也要来访问内存1的时候,看到信号量的值为 0 就知道已经有进程在访问内存1了,这个时候进程 b 就会访问不了内存1。所以说,信号量也是进程之间的一种通信方式。

四、消息队列

消息队列与有名管道类似,但少了打开管道和关闭管道这些复杂操作,且进程把数据放在某个内存位置(消息队列缓冲区)之后就马上返回,无需等待其他进程来取。进程间对消息队列通过操作系统提供的“发送消息”/“接收消息”两个原语进行数据交换。

不同于管道,消息队列是独立于发送进程和接受进程的,任何进程都可以往消息队列里放数据,任何进程都可以从消息队列里读数据。而且发送的消息是以“消息块”来发送的,多个消息块连在一起就成了消息队列,“消息块”里还会包含消息类型,接受进程可以通过消息类型来判断当前信息要不要接收,而且消息队列允许不同进程以消息队列的形式发送给任意的进程。(下图是一个消息块的结构体)

优点:很多时候,你不想也不需要立即处理消息。消息队列提供了异步处理机制,允许你把一个消息放入队列,但并不立即处理它。你想向队列中放入多少消息就放多少,然后在你乐意的时候再去处理它们。(更详细的优点:https://blog.csdn.net/vcctor/article/details/50701344

缺点:消息队列也是有大小限制的,如果A进程要发送的信息太大,或者说A,B进程之间通信频繁,那么就会造成用户态和内核态的频繁切换,耗费系统资源。

五、socket

上面我们说的共享内存、管道、信号量、消息队列,他们都是多个进程在一台主机之间的通信,那两个相隔几千里的进程能够进行通信就需要用到socket,socket也是网络编程的一部分。这里不展开讲socket,网络编程的时候再讲。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值