我们每天使用互联网,你是否想过,它是如何实现的?
全世界几十亿台电脑,连接在一起,两两通信。上海的某一块网卡送出信号,洛杉矶的另一块网卡居然就收到了,两者实际上根本不知道对方的物理位置,你不觉得这是很神奇的事情吗?
互联网的核心是一系列协议,总称为"互联网协议"(Internet Protocol Suite
)。它们对电脑如何连接和组网,做出了详尽的规定。理解了这些协议,就理解了互联网的原理。
为了让互联网安全且可靠,人们发明了著名的OSI七层模型、TCP/IP四(五)层模型和种类繁杂的加解密算法,但这些均不是本次要介绍的内容。我们这次要聊的是进程数据通信。
进程间的通讯机制有如下6种方式,其它哪些属于主机间进程通信,哪些属于同主机上的进程间通信呢。我们分别来看。
pwd|ls
如上大家经常用到的命令就使用管道。
管道这种通讯方式有两种限制:
流管道s_pipe ,去除了第一种限制,可以双向传输。命名管道:name_pipe,克服了管道没有名字的限制,因此,即具有管道所具有的功能外,它还允许无亲缘关系进程间的通信;
信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;
linux
除了支持Unix
早期信号语义函数sigal
外,还支持语义符合Posix.1
标准的信号函数sigaction
(实际上,该函数是基于BSD
的,BSD
为了实现可靠信号机制,又能够统一对外接口,用sigaction
函数重新实现了signal
函数);
消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。
共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。
**使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。**是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。
信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
套接字也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信。
更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix
系统的BSD
分支开发出来的,但现在一般可以移植到其它类Unix
系统上:Linux
和System V
的变种都支持套接字。
效率比较
各种通信方式的比较和优缺点
每个网络应用都是基于Client/Server
架构。这种模型下,一个应用是由一个服务器进程和一个或多个客户端进程组成。服务器管理某种资源,并且通过操作这些资源为客户端提供服务。
那Client
和Server
之间是如何通信呢?对的,Socket
。只有这种方式,且前提是通信主机提前知道服务器端的监听端口。即Server
监听DIP+DPORT,Client
发起SIP+SPORT
。
DPORT
必须始终处于监听状态,随时供Client
来连接。这里延伸两个知道点,始终监听有2种方式:瞬时Daemon
和长驻Daemon
进程。如ftp
就是瞬间Daemon
进程,在CentOS6
中由xinetd
统一维护,在CentOS7
中由systemd
统一管理。
端口如何让别人知道呢,由互联网机构统一管理,为某些众所周知的应用分配好一些固定的端口,这些特定应用只能使用这些端口,通过这些默认端口访问是无需单独跟上端口号,如http
可通过协议来判断端口号。如非要指定其它端口,则需额外指定。
这些端口是独占模式,在使用的过程,其它服务是不可使用的。
进程间通信