进程间通信

Source

1.基本概念

进程间的通信主要解决三个问题:

  • 一个进程如何把信息传递给另一个进程。

  • 进程之间对共享数据的获取问题

  • 进程之间执行顺序问题

后两个问题同样适用于线程(传递信息对于线程之间比较容易实现,因为共享一个地址空间)

1.1竞争条件

概念:即两个或多个进程读写某些共享数据时,最后结果取决于进程运行的精确时序,成为竞争条件


1.2 互斥与同步

1.2.1 互斥
  • 概念:阻止多个进程同时读写共享的内存

  • 互斥是一种制约关系,当一个进程或者多个进程进入临界区后会进行加锁操作,此时其他进程(线程)无法进入临界区,只有当该进程(线程)使用后进行解锁其他人才可以使用,这种技术往往是通过阻塞完成。

1.2.2 同步
  • 同步是一种合作关系,为完成某种任务而建立的多个进程或者线程之间的协调调用,次序等待,传递消息告知资源占用情况。
1.2.3 区别

互斥

  • 两个线程之间不可以同时运行,他们会相互排斥,必须等待一个线程运行完毕,另一个才能运行。

同步

  • 两个线程之间也不可以同时运行,但他是必须要按照某种次序来运行相应的线程(也是一种互斥)!
    所以说:同步是一种更为复杂的互斥,而互斥是一种特殊的同步。

1.3 临界区域

对共享内存进行访问的程序片段称为临界区

当我们使两个进程不同时位于临界区中时,这样就能避免竞争条件。但是还不能保证使用共享数据的并发进程能够正确的和高效的进行协作

解决方案:

  • 任何两个进程不能同时处于临界区

  • 不应对cpu速度和数量进行假设

  • 临界区外运行的进程不能阻塞其他进程

  • 不能使进程无限期等待进入临界区


1.4 信号量与互斥信号量

1.4.1 信号量

信号量是一个计数器,用于多进程对共享数据的访问,信号量的意图在于进程间同步

信号量只有两个原语操作:

  • down/P(sv):如果sv的值大于零,就给它减1;如果它的值为零,就挂起该进程的执行

  • up/V(sv):如果有其他进程因等待sv而被挂起,就让它恢复运行,如果没有进程因等待sv而挂起,就给它加1

信号量的值为正的时候,说明它空闲。所测试的线程可以锁定而使用它。若为0,说明它被占用,测试的线程要进入睡眠队列中,等待被唤醒。


1.4.2 互斥信号量

互斥信号量用于线程的互斥,仅表示两个状态:加锁,解锁。0表示加锁,其他值表示解锁。

1.4.3 互斥量与信号量之间的区别

  • 互斥量用于线程的互斥,信号量用于线程的同步

  • 互斥量值只能为0/1,信号量值可以为非负整数。
    也就是说,一个互斥量只能用于一个资源的互斥访问,它不能实现多个资源的多线程互斥问题。信号量可以实现多个同类资源的多线程互斥和同步。当信号量为单值信号量是,也可以完成一个资源的互斥访问。

  • 互斥量的加锁和解锁必须由同一线程分别对应使用,信号量可以由一个线程释放,另一个线程得到


1.4.4 管程

一种高级同步原语,是由过程,变量,及数据结构组成,具有任意时刻内管程中只有一个活跃的进程的特性。

  • 引入管程的原因
    信号量机制的缺点:进程自备同步操作,P(S)和V(S)操作大量分散在各个进程中,不易管理,易发生死锁。
  • 管程特点:管程封装了同步操作,对进程隐蔽了同步细节,简化了同步功能的调用界面。

java中Synchronized就是管程的实现,具有原子性,可见性 但是不能防止处理器优化后的指令重排。

2 进程间通信

2.1 信号量

信号量是一个计数器,用于多进程对共享数据的访问,信号量的意图在于进程间同步。

2.2 管道

linux 中 | 命令

  • 管道是半双工,只能单方向流动,需要通信时,需要建立起两个管道。

管道的实质:

  • 管道的实质是一个内核缓冲区,进程以先进先出的方式从缓冲区存取数据,管道一端的进程顺序的将数据写入缓冲区,另一端的进程则顺序的读出数据。
  • 该缓冲区可以看做是一个循环队列,读和写的位置都是自动增长的,不能随意改变,一个数据只能被读一次,读出来以后在缓冲区就不复存在了。
  • 当缓冲区读空或者写满时,有一定的规则控制相应的读进程或者写进程进入等待队列,当空的缓冲区有新数据写入或者满的缓冲区有数据读出来时,就唤醒等待队列中的进程继续读写。

2.3 共享内存

  • 使多个进程可以直接读写同一块内存空间,最快的方式。

  • 由于多个进程共享一段内存,因此需要依靠某种同步机制(如信号量)来达到进程间的同步及互斥。

2.4 套接字

  • 套接字是一种通信机制,凭借这种机制,客户/服务器(即要进行通信的进程)系统的开发工作既可以在本地单机上进行,也可以跨网络进行。也就是说它可以让不在同一台计算机但通过网络连接计算机上的进程进行通信。
  • 套接字特性
    套接字的特性由3个属性确定,它们分别是:域、端口号、协议类型。

2.5 信号

信号是软件层次上对中断机制的一种模拟,是一种异步通信方式,,信号可以在用户空间进程和内核之间直接交互,内核可以利用信号来通知用户空间的进程发生了哪些系统事件,信号事件主要有两个来源:

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

2.6 消息队列

内核寻址空间内的内部链接列表。

友情链接:https://www.jianshu.com/p/c1015f5ffa74