前言:
复制粘贴快捷键,对很多人来说,再熟悉不过了,连小孩子都会用。那么,大家都在用,怎么样才能体现出我们骄傲的身份“程序员”的独特之处呢?如果有人说:“计算机也不过如此,几个简单的快捷键就够用了”,那么你可以问他:“你知道复制粘贴的原理吗?我知道”,然后高傲的离开,留下他一人独自在风中凌乱......
那么,一起来看看本片博客,想要了解简单的复制粘贴的原理,我们就要来看看——进程之间的通信。
为什么要说进程之间的通信呢,假如我现在打开了一个记事本,又打开了一个word文档,然后我要将记事本里面的内容复制,然后粘贴到word中。我们抽象认为记事本是一个任务,一个进程,然后word文档也是一个任务,一个进程,现在它们之间就是在进行通信,所以我们就来了解进程通信,然后最后你就会理解赋值粘贴的大概原理了。
一、进程通信的类型
1. 低级通信和高级通信
低级通信:
只能传递状态和整数值(控制信息),包括进程互斥和同步所采用的信号量和管程机制。
优点的速度快。
缺点是: 传送信息量小:效率低,每次通信传递的信息量固定,若传递较多信息则需要进行多次通信。
编程复杂:用户直接实现通信的细节,编程复杂,容易出错。
高级通信:
能够传送任意数量的数据,包括三类:共享存储区、管道、消息。
高级通信的特征:
通信链路(communication link):
点对点/多点/广播 单向/双向 有容量(链路带缓冲区)/无容量(发送方和接收方需自备缓冲区)
数据格式:
字节流(byte stream):各次发送之间的分界,在接收时不被保留,没有格式; 报文(datagram/message):各次发送之间的分界,在接收时被保留,通常有格式(如表示类型),定长/不定长报文,可靠报文/不可靠报文。
收发操作的同步方式
发送阻塞(直到被链路容量或接收方所接受)和不阻塞(失败时立即返回) 接收阻塞(直到有数据可读)和不阻塞(无数据时立即返回) 由事件驱动收发:在允许发送或有数据可读时,才做发送和接收操作
如何区分:
举个例子:低级通信就像之前我们不做人系列里面的信号量呀之类的,而高级通信比如缓冲区,这个会在不做人系列3中提到。
2. 直接通信和间接通信
直接通信:
信息直接传递给接收方,如管道。 在发送时,指定接收方的地址或标识,也可以指定多个接收方或广播式地址; 在接收时,允许接收来自任意发送方的消息,并在读出消息的同时获取发送方的地址。
间接通信:
借助于收发双方进程之外的共享数据结构作为通信中转,如消息队列。通常收方和发方的数目可以是任意的。
如何区分:
区分的唯一点就是在通信的时候双方的生命状态是否有要求,比如直接通信要求双方都要存在,比如打电话,只有两个人同时在线,才可以交流接通;而间接通信比如发短信,发的时候接受的一方不一定要在线。
二、共享存储区
相当于内存,可以任意读写和使用任意数据结构(当然,对指针要注意),需要进程互斥和同步的辅助来确保数据一致性,不要求数据的移动。这里画一个图来看看:
看,生动形象呀,这样的话再进行通信的时候果然方便多了。
三、管道
管道通信方式 Pipe,也称共享文件方式,基于文件系统,利用一个打开的共享文件连接两个相互通信的进程,文件作为缓冲传输介质。上图:
此处一看就知道是直接通信了。
四、消息
与窗口系统中的“消息”不同。通常是不定长数据块。消息的发送不需要接收方准备好,随时可发送
消息缓冲:在内存中开设缓冲区,发送进程将消息送入缓冲区,接收进程接收传递来的缓冲区
直接方式:
发送进程发消息时要指定接收进程的名字, 反过来,接收时要指明发送进程的名字 Send(receiver,message) Receiver(sender,message) * 对称形式:一对一 * 非对称形式:多对一 (顾客/服务员) 有缓冲(有界,无界),无缓冲
间接方式:
发送进程发消息时不指定接收进程的名字,而是指定一个中间媒介,即信箱。进程间通过信箱实现通信 发送原语:send(MB,Message) 接收原语:receive(MB,Message)
我们这里用消息队列来理解一下:
我们将详细放到队列中,然后一一的取出,这里可以看到这个是间接通信,而我们的复制粘贴,是不是像极了这个过程?
五、套接字
双向的,数据格式为字节流(一对一)或报文(多对一,一对多);主要用于网络通信; 支持client-server模式和peer-to-peer模式,本机或网络中的两个或多个进程进行交互。提供TCP/IP协议支持 UNIX套接字(基于TCP/IP):send, sendto, recv, recvfrom; 在Windows NT中的规范称为"Winsock"(与协议独立,或支持多种协议):WSASend, WSASendto, WSARecv, WSARecvfrom;
上面的都是一个主机之间的通信,如果要主机与主机之间通信,那么就要用到套接字。
后记:
收获:我们知道了通信的类型,知道了共享存储区,管道,消息,套接字。