进程间通信IPC

进程间通信的目的是实现进程间数据的共享。

 

为什么进程空间是完全独立的? 防止你去害别人也防止别人害你。

如何实现?使用虚拟地址空间

 

原理:尽管进程空间是各自独立,但它们共享OS,所以OS作为所有进程共享的第三方,会提供相关机制,来实现进程间数据的转发,达到数据共享的目的。

方式:

1.信号

2.管道  无名管道和有名管道

 管道其实就是内核自己所在的物理内存空间中开辟的一段缓存空间,比如char buf[1024],

用文件的方式来读写管道。 无名管道只能用于亲缘进程之间,因为无名管道没有文件名,进程就没办法用open打开管道文件来得到文件描述符,所以只能通过父进程先调用pipe创建出管道,并且得到读写管道的文件描述符,然后再fork出子进程,让子进程与父进程共享此文件描述符,从而父子进程能操作同一个管道。

进程间通信IPC_第1张图片

 

只能实现单向通信,如果父进程的读端读走了数据的话,子进程就读不到了。 要实现双向通信的话,需要建立两个管道。 

 

 

3.消息队列

由内核创建的用于存放消息的链表。 链表的节点就是存放一个结构体消息,包含消息编号和正文。

消息队列有点像信息公告牌,发送信息的人将某编号的消息挂到公告牌上,接受消息的人去公告牌上取对应编号的消息。使用消息队列可以实现网状交叉通信。

4.共享内存

映射一段能被其他进程所访问的内存。直接使用地址来读写缓存,对于大数据量的通信效率高,而且快,因为不像消息队列一样经过API封装,需要重重的OS函数调用后才通过地址去读写。

5.信号量  (一个计数器)

当多进程/线程进行共享操作时,用于资源保护,防止出现互相干扰的情况。 作用就是资源的保护。

资源保护操作:互斥和同步。(加锁机制)

 

6.套接字

可以实现不同计算机上进程间通信。

你可能感兴趣的:(操作系统)