通信与同步

167 阅读3分钟

二者的区别

同步就是协同步调,按预定的先后次序进行运行。

通信与同步是一个递进关系同步的前提是先需要实现通信

进程间由于属于不同用户空间,所以难点在于通信。

而线程间都属于同一进程空间,所以难点在于同步。

线程间的通信与同步:

由于多线程共享地址空间和数据空间,所以多个线程间的通信是一个线程的数据可以直接提供给其他线程使用,而不必通过操作系统(也就是内核的调度)。严格讲线程之间通信是不需要程序员干预的,程序员需要干预的是线程之间的同步

进程间的通信与同步:

每个进程有自己的地址空间和数据空间。两个进程中的地址即使值相同,实际指向的位置也不同。进程间通信一般通过操作系统的公共区进行。以前进程间的通信只能是单机版的,现在操作系统都继承了基于套接字(socket)的进程间的通信机制。这样进程间的通信就不局限于单台计算机了,实现了网络通信。

进程间的通信

进程间的通信,必须需要借助内核的对象。

对象不同,通信方法也就不同。

每一种通信方式都是基于文件IO的思想:

  1. Open功能:创建或打开进程通信对象
  2. Write功能:向进程通信对象中写入内容
  3. Read功能:从进程通信对象中读取内容
  4. Close功能:关闭或删除进程通信对象

管道

image.png 管道文件是一个特殊的文件,是由队列来实现的。

无名管道

有名管道

信号通信

共享内存(System V IPC)

什么是System V IPC

IPC(Inter-Process Communication)是指多个进程之间相互通信,交换信息的方法,System V 是 Unix 操作系统最早的商业发行版,由 AT&T(American Telephone & Telegraph)开发。System V IPC 是指 Linux 引入自 System V 的进程通信机制,一共有三种:

  • 信号量,用来管理对共享资源的访问;
  • 共享内存,用来高效地实现进程间的数据共享;
  • 消息队列,用来实现进程间数据的传递。

这三种统称 IPC 资源,每个 IPC 资源都是请求时动态创建的,都是永驻内存,除非被进程显示释放,都是可以被任一进程使用。每个 IPC 资源都使用一个 32 位的 IPC 关键字和 32 位的 IPC 标识符,前者类似文件系统中的路径名,由程序自由定制,后者类似打开文件的文件描述符,由内核统一分配,在系统内部是唯一的,当多个进程使用同一个IPC资源通信时需要该资源的 IPC 标识符。     

创建新的 IPC 资源时需要指定 IPC 关键字,如果没有与之关联的 IPC 资源,则创建一个新的 IPC 资源;如果已经存在,则判断当前进程是否具有访问权限,是否超过资源使用限制等,如果符合条件则返回该资源的 IPC 标识符。为了避免两个不同的 IPC 资源使用相同的 IPC 关键字,创建时可以指定IPC关键字为 IPC_PRIVATE,由内核负责生成一个唯一的关键字。   

创建新的 IPC 资源时最后一个参数可以包括三个标志,PC_CREAT 说明如果IPC资源不存在则必须创建它,IPC_EXCL 说明如果资源已经存在且设置了 PC_CREAT 标志则创建失败,IPC_NOWAIT 说明访问 IPC 资源时进程从不阻塞。

消息队列(System V IPC)

信号量(System V IPC)

信号量是进程同步与互斥的常用方法,也可以作为低级的进程通信方法,用于传递控制信号。

进程间的同步

临界区

互斥区

事件

信号量(System V IPC)