用了这么多年Ctrl+C和Ctrl+V的复制粘贴,你知道简单的原理吗?

前言:

     复制粘贴快捷键,对很多人来说,再熟悉不过了,连小孩子都会用。那么,大家都在用,怎么样才能体现出我们骄傲的身份“程序员”的独特之处呢?如果有人说:“计算机也不过如此,几个简单的快捷键就够用了”,那么你可以问他:“你知道复制粘贴的原理吗?我知道”,然后高傲的离开,留下他一人独自在风中凌乱......

    那么,一起来看看本片博客,想要了解简单的复制粘贴的原理,我们就要来看看——进程之间的通信

     为什么要说进程之间的通信呢,假如我现在打开了一个记事本,又打开了一个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;

     上面的都是一个主机之间的通信,如果要主机与主机之间通信,那么就要用到套接字。

后记:

       收获:我们知道了通信的类型,知道了共享存储区管道消息套接字

     所以有人问你复制粘贴的原理是什么?

     你就告诉它,这涉及到进程之间的通信,通过消息队列实现通信过程,是间接通信(在Windows中如果复制之后没有执行粘贴操作,会一直存在,就相当于放在了存储空间中,当关机的时候就消失了)。说完,丢给他一丢概念,然后潇洒的离开。

发布了123 篇原创文章 · 获赞 234 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_43919400/article/details/105583799