ipc


进程通信。Inter Process Communication.

管道 Pipe

实质:内核缓冲区。

进程以先进先出的方式从缓冲区存取数据,管道一端的进程顺序的将数据写入缓冲区,另一端的进程则顺序的读出数据。

当缓冲区读空或者写满时,有一定的规则控制相应的读进程或者写进程进入等待队列,
当空的缓冲区有新数据写入或者满的缓冲区有数据读出来时,就唤醒等待队列中的进程继续读写。

优点:

  1. 简单
  2. 确保数据被其他进程拿走

缺点:

  1. 单向传播
  2. 效率低下
  3. 只能传送无格式字节流,要求传输双方事先约定格式
  4. 不能进行定位读写
  5. 大小受到限制

匿名管道

使用”|”。只能是有亲缘关系的进程之间进行通信。

命名管道

有名管道的名字存在于文件系统中,内容存放在内存中。

mkfifo pip
echo "context hello world" > pip  # write
cat < pip  # read 

等到管道内容被读取,写命令才结束。

信号 Signal

异步通信方式。主要是用于异常情况的通信。进程有三种方式响应:执行默认操作,捕捉信号,忽略信号。

Linux系统中常用信号:
(1)SIGHUP:用户从终端注销,所有已启动进程都将收到该进程。系统缺省状态下对该信号的处理是终止进程。
(2)SIGINT:程序终止信号。程序运行过程中,按Ctrl+C键将产生该信号。
(3)SIGQUIT:程序退出信号。程序运行过程中,按Ctrl+\键将产生该信号。
(4)SIGBUS和SIGSEGV:进程访问非法地址。
(5)SIGFPE:运算中出现致命错误,如除零操作、数据溢出等。
(6)SIGKILL:用户终止进程执行信号。shell下执行kill -9发送该信号。
(7)SIGTERM:结束进程信号。shell下执行kill 进程pid发送该信号。
(8)SIGALRM:定时器信号。
(9)SIGCLD:子进程退出信号。如果其父进程没有忽略该信号也没有处理该信号,则子进程退出后将形成僵尸进程。

信号来源:

  • 硬件来源:用户按键输入Ctrl+C退出、硬件异常如无效的存储访问等。
  • 软件终止:终止进程信号、其他进程调用kill函数、软件异常产生信号。

优点:

  1. 信号可以在任何时候发给某一进程,而无需知道该进程的状态。

消息队列 Message Queue

存放在内核(匿名管道是存放在内存)中的消息链表,每个消息队列由消息队列标识符表示。

生产者、消费者。

两种类型的消息队列:POSIX消息队列以及System V消息队列。

优点:

  1. 解耦:生产者只负责写数据,谁来取不需要关心
  2. 异步:无需等待其他进程读取马上返回
  3. 限流:避免系统因为请求高并发崩溃
  4. 实现消息的随机查询

缺点:

  1. 发送消息太慢(进行拷贝)
  2. 难以保证高可用
  3. 数据存储问题
  4. 消息的重复消费

共享内存 Share Memory

两个进程的虚拟内存映射到相同物理内存实现。

优点:

  1. 解决拷贝所消耗的时间

缺点:

  1. 多进程竞争内存造成数据错乱

信号量 Semaphore

优点:

  1. 解决了线程安全问题,实现多个同类资源的多线程互斥和同步(有序访问)

套接字 Socket

支持TCP/IP的网络通信的基本操作单元,可以看做是不同主机之间的进程进行双向通信的端点,
简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程。

特性

(1)域
指定套接字通信中使用的网络介质。
最常见的套接字域有两种:
一是AF_INET,它指的是Internet网络。当客户使用套接字进行跨网络的连接时,
它就需要用到服务器计算机的IP地址和端口来指定一台联网机器上的某个特定服务,
所以在使用socket作为通信的终点,服务器应用程序必须在开始通信之前绑定一个端口,服务器在指定的端口等待客户的连接。
另一个域AF_UNIX,表示UNIX文件系统,它就是文件输入/输出,而它的地址就是文件名。

(2)端口号
每一个基于TCP/IP网络通讯的程序(进程)都被赋予了唯一的端口和端口号,
端口是一个信息缓冲区,用于保留Socket中的输入/输出信息,
端口号是一个16位无符号整数,范围是0-65535,
以区别主机上的每一个程序(端口号就像房屋中的房间号),
低于256的端口号保留给标准应用程序,比如pop3的端口号就是110,
每一个套接字都组合进了IP地址、端口,这样形成的整体就可以区别每一个套接字。

(3)套接字协议类型
因特网提供三种通信机制:
一是流套接字,流套接字在域中通过TCP/IP连接实现,
同时也是AF_UNIX中常用的套接字类型。
流套接字提供的是一个有序、可靠、双向字节流的连接,
因此发送的数据可以确保不会丢失、重复或乱序到达,而且它还有一定的出错后重新发送的机制。
二个是数据报套接字,它不需要建立连接和维持一个连接,
它们在域中通常是通过UDP/IP协议实现的。它对可以发送的数据的长度有限制,
数据报作为一个单独的网络消息被传输,它可能会丢失、复制或错乱到达,
UDP不是一个可靠的协议,但是它的速度比较高,因为它并一需要总是要建立和维持一个连接。
三是原始套接字,原始套接字允许对较低层次的协议直接访问,比如IP、 ICMP协议,它常用于检验新的协议实现,或者访问现有服务中配置的新设备,因为RAW SOCKET可以自如地控制Windows下的多种协议,能够对网络底层的传输机制进行控制,所以可以应用原始套接字来操纵网络层和传输层应用。
比如,我们可以通过RAW SOCKET来接收发向本机的ICMP、IGMP协议包,
或者接收TCP/IP栈不能够处理的IP包,也可以用来发送一些自定包头或自定协议的IP包。
网络监听技术很大程度上依赖于SOCKET_RAW。

优点:

  1. 解决了进程远距离通信(非同一台主机)的问题

Reference


Author: csy99
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source csy99 !
评论
 Previous
nlp industrial application nlp industrial application
Brief HistoryNNLMneural network probabilistic language model. Bengio, 2003. 简介:三层神经网络模型。用前n-1个词来预测当前词。该模型会学习到(1)词汇的分布式表
2020-08-16
Next 
hashmap hashmap
hashmap数据结构和构造在jdk1.8之前是数组加链表,之后是数组加链表加红黑树。 数组中存放对象Node,包含key, value, hash value, next指针。 参数DEFAULT_INITIAL_CAPACITY=16,
2020-08-13
  TOC