写在前面html
面试的时候必定不要疲劳战,好比上午面了一个,而后中午不休息直接赶到另一个相距比较远的公司,影响状态。linux
面试的时候必定没关系张,无论对方有几我的,总之面试的时候作好充分准备,休息好,放松心态。web
好了,言归正传,开始总结。面试
进程间通讯又称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下的进程包含如下几个关键要素:
有一段可执行程序;
有专用的系统堆栈空间;
内核中有它的控制块(进程控制块),描述进程所占用的资源,这样,进程才能接受内核的调度;
具备独立的存储空间
线程间的通讯目的主要是用于线程同步,因此线程没有像进程通讯中的用于数据交换的通讯机制。
① 锁机制
互斥锁、条件变量、读写锁和自旋锁。
互斥锁
确保同一时间只能有一个线程访问共享资源。当锁被占用时试图对其加锁的线程都进入阻塞状态(释放CPU资源使其由运行状态进入等待状态)。当锁释放时哪一个等待线程能得到该锁取决于内核的调度。
读写锁
当以写模式加锁而处于写状态时任何试图加锁的线程(不管是读或写)都阻塞,当以读状态模式加锁而处于读状态时“读”线程不阻塞,“写”线程阻塞。读模式共享,写模式互斥。
条件变量
能够以原子的方式阻塞进程,直到某个特定条件为真为止。对条件的测试是在互斥锁的保护下进行的。条件变量始终与互斥锁一块儿使用。
自旋锁
上锁受阻时线程不阻塞而是在循环中轮询查看可否得到该锁,没有线程的切换于是没有切换开销,不过对CPU的霸占会致使CPU资源的浪费。 因此自旋锁适用于并行结构(多个处理器)或者适用于锁被持有时间短而不但愿在线程切换产生开销的状况。
② 信号量机制(Semaphore)
包括无名线程信号量和命名线程信号量。线程的信号和进程的信号量相似,使用线程的信号量能够高效地完成基于线程的资源计数。信号量其实是一个非负的整数计数器,用来实现对公共资源的控制。在公共资源增长的时候,信号量就增长;公共资源减小的时候,信号量就减小;只有当信号量的值大于0的时候,才能访问信号量所表明的公共资源。
③ 信号机制(Signal)
相似进程间的信号处理。
④ violate全局变量-共享内存
关于violate能够参考博文:多线程并发之volatile的底层实现原理
⑤ wait/notify
阻塞/唤醒,关于这个参考博文:Thread入门与线程方法详解及多线程安全。
参考博文:
线程间的通讯与进程间通讯方式
进程间通讯(IPC)介绍