@[TOC]
1. 什么是进程通信?
:star:进程通信:进程通信就是指进程之间的信息交流。进程时分配系统资源的单位(包括内存地址空间),因此各进程拥有的内存地址空间相互独立。
:microphone:每个进程都是独立的,不可能让进程之间随意就可以读取信息(乱闯民宅是犯法的),如果随机读取了那还得了,你的信息都要被泄露。所以为了保证安全,一个进程不能直接访问另一个进程的内存地址空间。但是进程直接交换信息也是必要的(比如用QQ音乐的登录时,如果你已经登录了qq,那么就会获取到你的QQ信息,就可以直接点击登录了)。
2.共享存储
:star: 共享空间:为了实现两个进程之间的通信,操作系统会在内存中开辟一块内存空间供两个进程共同使用。但是两个进程对共享空间的访问必须是互斥的(我这边还在更改信息,你那边就要读信息,拿到的肯定是错误的信息啊,所以为了正确性,必须要保证互斥)
- 基于数据结构的共享:比如共享空间里只能放一个长度为10的数字,这种共享方式速度慢,限制多,是一种低级通信方式。
- 基于存储区的共享:在内存中开辟一块共享存储区,数据的形式、存放位置都由进程控制,而不是操作系统,这种方式速度快,是一种高级通信方式。(没有了限制,当然快啦)
3.管道通信
:star: 管道:是指用于连接读写进程的一个共享文件,其实就是在内存重开辟了一个大小固定的缓冲区。
- 管道只能采用半双工通信,某一时间段内只能实现单向的传输,如果要实现双向同时通信,则需要设置两个管道。
- 各进程要互斥地访问管道
- 数据以字符流地形式写入管道,当管道写满时,写进程地
write()
系统调用就被阻塞,等待读进程将数据取走,当取完时,管道变空,此时都进程的read()
系统调用将被阻塞。(写完了才能读,读完了才能写) - 管道中的数据一旦被读出就无法挽回,所以读进程只能有一个,否则可能会有读错数据的情况。
4. 消息传递
:star: 消息:消息包括消息头和消息体(信件一样),消息头包括了发送进程ID(发送方),接受线程ID(接收方),消息类型,消息长度等格式化信息。消息体包含要发送的信息。
- 直接通信方式:消息直接挂到接收进程的消息缓冲队列(每个进程都有一个接收消息的消息缓冲队列,每次取消息就从缓冲队列中取)当中去。
- 间接通信方式:消息发到邮箱中,接收方道邮箱中取消息。
总结