【Linux】Linux进程通信

1. 编写课堂代码,实现pipe/msgqueue/sems/shm相关代码,并总结 

进程间通信我们一共了解过四种,分别是:管道,消息队列,信号量和共享内存

首先我们来介绍一下什么是进程间通信:

进程间通信的目的一共有四种:

数据传输:一个进程需要将它的数据发送给另一个进程
资源共享:多个进程之间共享同样的资源。
通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。
进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知
道它的状态改变。

我们都知道对于进程而言,一般情况下都是并发性的,即系统将一段时间间隔分成若干个细小的时间片,并将这些时间片分给每个进程,在这个时间片之内进程享有所有资源,多进程的运行实际进行的操作是,对一个进程先运行一段时间然后切换到另一个进程,执行另一个进程,每次都不是一次性将该进程运行完,只是执行一段就切到另一个进程,但是由于计算机的速度是非常快的,而人眼的辨识度是有限的,所以人们看到的是计算机在同时运行多个进程。

所以进程具有独立性,为了使进程之间有一定的联系所以引入了进程间通信的概念。

进程间通信的本质是,使两个进程看到一份公共的资源。

以下对我们所了解的进程间通信进行一一介绍:

Linux进程间通信之管道

Linux进程间通信之消息队列

Linux进程间通信之共享内存

Linux进程间通信之信号量

2. 练习ipcs -q/m/s于ipcrm -q/m/s的使用,并总结 

ipcs -q 列出所有的消息队列

ipcs -m列出所有的共享内存

ipcs -s列出所有的信号量

ipcrm -q 删除指定的消息队列

ipcrm -m删除指定的共享内存

ipcrm -s删除指定的信号量


3. 将二元信号量P/V操作,封装成动态/静态库,并分别使用并测试 

静态库:

【Linux】Linux进程通信

动态库:

【Linux】Linux进程通信

4. 调研同步与互斥概念原理,了解生产者消费者原理。 

互斥:由于各进程要求共享资源,而且有些资源需要互斥使用,因此各进程间竞争使用这些资源,进程的这种关系为进程的互斥,理解起来就是一个用这份资源的话另一个就不能用,这两者之间就是互斥关系

同步:指的是多个进程协同完成同一项任务

生产者消费者问题:

也叫缓存绑定问题,是一个经典的多进程同步问题

分为单生产者单消费者和多生产者多消费者两种情况,

生产者顾名思义,是一个产生数据的进程,而消费者是一个读出数据的进程,

对于单生产者单消费者模式,生产者产生一块数据后,放进缓冲池中,这时消费者看到缓冲池中有数据就可以来拿,如果生产者生产比消费者消费的快,消费者拿完缓冲池中所有数据之后就应该开始等待,等到有数据之后消费者才来消费,如果生产者生产比消费者消费的快,很快就将缓冲池装满了,生产者这时就不再产生数据,等消费者消费一块数据然后生产者再向里面装一块数据。

对于多生产者多消费者问题,就是在生产者之间和消费者之间添加互斥关系,其它和单生产者单消费者相同。

或许概念理解起来比较抽象,不过我们可以类比:

我们将缓冲池类比成超市,而超市的供货商就是生产者,而我们这些买东西的人就是消费者,

单消费者单生产者问题就可以类比为,这家超市只卖一种东西,这里就假设是方便面吧,这家超市小了一点只有一个货架,而且老板脾气比较古怪,只卖一种口味的,而这家超市是方圆百里唯一一家卖东西的,而只有一个人买东西哎,当供货商没有往货架上放方便面的时候即使我们再想吃也没办法,我们只能等,而货架的大小是固定的,供货商如果一次性发货太多了,只能把货架塞满,剩下的只能别人买走一包,然后往货架上再新添一包。

多生产者多消费者问题就可以类比为,有多个供货商不过还是这家超市,货架还是那么大,多个供货商都往货架上放方便面,但是货架的空间用一个就少一个意味着一个供销商在这个位置放了,另一个供销商就不能往这个位置放了,只能考虑下一个位置是不是空的,是空的即可以放,不是空的就继续考虑下一个位置,如果放满了就等待,等到有人买走了再次有空位置了才可以放,对于每一个位置,各个供销商之间的关系就是一种互斥关系,而这时买东西的人也不是一个了,有很多个,但对于每个位置,你拿了别人就不能拿了,因为那个位置已经空了,只能看看下个位置有没有你要的方便面,没有的话再向后找,如果找到头也没有就只能等着有某一家供销商放上去了然后你才能拿。对于我们这些消费者针对于每一个位置上的方便面,我们之间存在的也是互斥关系。