进程间通讯和线程间通讯总结

写在前面html

面试的时候必定不要疲劳战,好比上午面了一个,而后中午不休息直接赶到另一个相距比较远的公司,影响状态。linux

面试的时候必定没关系张,无论对方有几我的,总之面试的时候作好充分准备,休息好,放松心态。web

好了,言归正传,开始总结。面试

【1】进程间通讯方式

进程间通讯又称IPC(Inter-Process Communication),指多个进程之间相互通讯,交换信息的方法。根据进程通讯时信息量大小的不一样,能够将进程通讯划分为两大类型:安全

  • 低级通讯,控制信息的通讯(主要用于进程之间的同步,互斥,终止和挂起等等控制信息的传递)
  • 高级通讯,大批数据信息的通讯(主要用于进程间数据块数据的交换和共享,常见的高级通讯有管道,消息队列,共享内存等)。

IPC的方式一般有管道(包括无名管道和命名管道)、消息队列、信号量、共享存储、Socket、Streams等。其中 Socket和Streams支持不一样主机上的两个进程IPC。多线程

① 管道(Pipe)及有名管道(named pipe)并发

管道一般指无名管道,是 UNIX 系统IPC最古老的形式,是一种半双工的通讯方式,数据只能单向流动,并且只能在具备亲缘关系的进程间使用。进程的亲缘关系一般是指父子进程关系。svg

它能够当作是一种特殊的文件,对于它的读写也可使用普通的read、write 等函数。可是它不是普通的文件,并不属于其余任何文件系统,而且只存在于内存中。函数

当一个管道创建时,它会建立两个文件描述符:fd[0]为读而打开,fd[1]为写而打开。以下图:
在这里插入图片描述
要关闭管道只需将这两个文件描述符关闭便可。测试

单个进程中的管道几乎没有任何用处。因此,一般调用 pipe 的进程接着调用 fork,这样就建立了父进程与子进程之间的 IPC 通道。以下图所示:
在这里插入图片描述
若要数据流从父进程流向子进程,则关闭父进程的读端(fd[0])与子进程的写端(fd[1]);反之,则可使数据流从子进程流向父进程。

FIFO,也称为命名管道,它是一种文件类型。

FIFO能够在无关的进程之间交换数据,与无名管道不一样。FIFO有路径名与之相关联,它以一种特殊设备文件形式存在于文件系统中。

管道可用于具备亲缘关系进程间的通讯,有名管道克服了管道没有名字的限制,所以,除具备管道所具备的功能外,它还容许无亲缘关系进程间的通讯。


② 报文(Message)队列(消息队列)

消息队列是消息的连接表,包括Posix消息队列system V消息队列,存放在内核中并由消息队列标识符(即队列ID)标识。有足够权限的进程能够向队列中添加消息,被赋予读权限的进程则能够读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点

特色以下:

  • 消息队列是面向记录的,其中的消息具备特定的格式以及特定的优先级。
  • 消息队列独立于发送与接收进程。进程终止时,消息队列及其内容并不会被删除。
  • 消息队列能够实现消息的随机查询,消息不必定要以先进先出的次序读取,也能够按消息的类型读取。

③ 共享内存

共享内存就是映射一段能被其余进程所访问的内存,这段共享内存由一个进程建立,但多个进程均可以访问。共享内存是最快的 IPC 方式,它是针对其余进程间通讯方式运行效率低而专门设计的。它每每与其余通讯机制,如信号两,配合使用,来实现进程间的同步和通讯。

④ 信号(Signal)

信号是比较复杂的通讯方式,用于通知接受进程有某种事件发生,除了用于进程间通讯外,进程还能够发送信号给进程自己。linux除了支持Unix早期信号语义函数signal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又可以统一对外接口,用sigaction函数从新实现了signal函数)。

⑤ 信号量(semaphore)

信号量是一个计数器,能够用来控制多个进程对共享资源的访问。不是用于交换大批数据,而用于多线程之间的同步。常做为一种锁机制,防止某进程在访问资源时其它进程也访问该资源。所以,主要做为进程间以及同一进程内不一样线程之间的同步手段。

⑥ 套接口(Socket)

更为通常的进程间通讯机制,可用于不一样机器之间的进程间通讯。起初是由Unix系统的BSD分支开发出来的,但如今通常能够移植到其它类Unix系统上,Linux和System V的变种都支持套接字。

通常来讲,linux下的进程包含如下几个关键要素:

  • 有一段可执行程序;

  • 有专用的系统堆栈空间;

  • 内核中有它的控制块(进程控制块),描述进程所占用的资源,这样,进程才能接受内核的调度;

  • 具备独立的存储空间


【2】线程间通讯

线程间的通讯目的主要是用于线程同步,因此线程没有像进程通讯中的用于数据交换的通讯机制。

① 锁机制

互斥锁、条件变量、读写锁和自旋锁。

  • 互斥锁确保同一时间只能有一个线程访问共享资源。当锁被占用时试图对其加锁的线程都进入阻塞状态(释放CPU资源使其由运行状态进入等待状态)。当锁释放时哪一个等待线程能得到该锁取决于内核的调度。

  • 读写锁当以写模式加锁而处于写状态时任何试图加锁的线程(不管是读或写)都阻塞,当以读状态模式加锁而处于读状态时“读”线程不阻塞,“写”线程阻塞。读模式共享,写模式互斥。

  • 条件变量能够以原子的方式阻塞进程,直到某个特定条件为真为止。对条件的测试是在互斥锁的保护下进行的。条件变量始终与互斥锁一块儿使用。

  • 自旋锁上锁受阻时线程不阻塞而是在循环中轮询查看可否得到该锁,没有线程的切换于是没有切换开销,不过对CPU的霸占会致使CPU资源的浪费。 因此自旋锁适用于并行结构(多个处理器)或者适用于锁被持有时间短而不但愿在线程切换产生开销的状况。


② 信号量机制(Semaphore)

包括无名线程信号量和命名线程信号量。线程的信号和进程的信号量相似,使用线程的信号量能够高效地完成基于线程的资源计数。信号量其实是一个非负的整数计数器,用来实现对公共资源的控制。在公共资源增长的时候,信号量就增长;公共资源减小的时候,信号量就减小;只有当信号量的值大于0的时候,才能访问信号量所表明的公共资源。

参考博文:多线程并发之Semaphore(信号量)使用详解

③ 信号机制(Signal)

相似进程间的信号处理。


④ violate全局变量-共享内存

关于violate能够参考博文:多线程并发之volatile的底层实现原理


⑤ wait/notify

阻塞/唤醒,关于这个参考博文:Thread入门与线程方法详解及多线程安全

参考博文:
线程间的通讯与进程间通讯方式
进程间通讯(IPC)介绍