【操作系统】进程间通信

  多个进程可以共享系统中的各种资源,但其中许多资源一次只能为一个进程使用,我们把一次仅允许一个进程使用的资源成为临界资源。许多物理设备都属于临界资源,如打印机等。

  对临界资源的访问,必须互斥的进行在,在每个进程中,访问临界资源的那段代码成为临界区(critical section)。

  进程间通信和同步有如下目的:

  1) 数据传输:一个进程需要将它的数据发送给另一个进程。

  2) 共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到:

  3)通知事件:一个进程需要向另一个或另一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)

  4)资源共享:多个进程之间共享相同的资源。为了做到这一点,需要内核提供锁和同步机制;

  5)进程控制;有些进程希望完全控制另一个进程的执行(如Degbug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态变化;

Linux下进程间通信的几种主要手段:

  1. 信号量(semaphore) :主要作为进程间以及同一进程不同线程之间的同步手段。

  2. 共享内存:使得多个进程可以访问同一块内存空间,是最快的IPC形式。是针对其他通信机制运行效率低而设计的。往往与其他通信机制,如信号量结合使用,来达到进程间的同步与互斥。

  3. Message(消息队列):消息队列是消息的链表,包括Posix消息队列System V消息队列。有足够权限的进程可以向消息队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息少,管道承载无格式字节流以及缓冲区大小受限等缺点。

  4. 管道(pipe)与有名管道(named pipe):管道只能在具有公共祖先的两个进程间使用。有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。

  5. 信号(signal):信号时比较复杂的通信方式,用于通知接受进程有关某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身。

  6. 套接字(Socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信.起初是由UNIX系统的BSD分支开发出来的,但现在一般可以移植到其他类unix系统上:Linux和System V的变种都支持套接字。

Linux线程间通信;

  1.信号量

  2.互斥量

    信号量有计数能力,互斥量是信号量的一个简化版本。互斥量是一个处于两个状态之一的变量:解锁和枷锁。这样,只需要一个二进制位表示它,不过实际上,常常使用一个整形量,0表示解锁,而其他所有的值则表示加锁。互斥量使用两个过程。当一个线程(或进程)需要访问临界区时,它调用mutex_lock。如果互斥量当前是解锁的(即临界区可用)。此调用成功,调用线程可以进入该临界区。

  另一方面,如果该互斥量已经加锁,调用线程被阻塞,直到在临界区中的线程完成并调用mutex_unlock。如果多个线程被阻塞在互斥量上,将随机选择一个线程并允许它获得锁。

  一个线程如果想要进入临界区,它首先尝试锁住相关的互斥量。如果互斥量没有加锁,那么这个进程可以立即进入,并且该互斥量被自动锁住以防止其他线程进入。如果互斥量已经被加锁,则调用线程被阻塞,直到该互斥量被解锁。如果多个线程在等待同一个互斥量,当它被解锁时,这些等待的线程中只有一个被允许运行并将互斥量重新锁定。这些互斥量不是强制的,而是由程序员来保证线程正确地使用它们。

  3. 条件变量

    条件变量允许一个进程在需要的条件未达到时阻塞自己并在以后被唤醒。POSIX中与条件变量相关的最重要的两个操作是pthread_cond_wait和pthread_cond_signal。前者阻塞调用线程知道另一其他线程向它发信号(使用后一个调用)。当然,阻塞与等待的原因不是等待与发信号协议的一部分。被阻塞的线程经常是在等待发信号的线程去做某些工作、释放某些资源或是进行其他的一些活动。只有完成后被阻塞的线程才可以继续运行。条件变量允许这种等待与阻塞原子性地进行。

  互斥量和条件变量经常一起使用。这种模式用于让一个线程锁住一个互斥量,然后当它不能获得它期待的结果时等待一个条件变量。最后另一个线程会向他发信号,使它可以继续运行。

Windows进程间通信:管道,共享内存,消息队列,信号量,socket

Windows线程间通信:临界区(Critical Section)、互斥量(Mutex)、信号量(信号灯)(Semaphore)、事件(Event)。

参考资料:

  1. 《王道程序员求职宝典》

  2. 《现代操作系统》(原书第三版)

  3. 《UNIX环境高级编程》(第三版)

 

原文地址:https://www.cnblogs.com/vincently/p/4449013.html