进程间通讯与线程间通讯

         之前一直想找个机会总结一下进程和线程的通讯机制,但因为技术和平台的局限性,一直没有找准切入点。因为立刻要毕业了,对本身技术的总结和梳理的前提下写了本篇文章,若有错误之处,敬请拍砖和指教。linux

         操做系统的主要任务是管理计算机的软件、硬件资源。现代操做系统的主要特色是多用户和多任务,也就是程序的并行执行,windows如此linux也是如此。因此操做系统就借助于进程来管理计算机的软、硬件资源,支持多任务的并行执行。要并行执行就须要多进程、多线程。所以多进程和多线程间为了完成必定的任务,就须要进行必定的通讯。而线程间通讯又和进程间的通讯不一样。因为进程的数据空间相对独立而线程是共享数据空间的,彼此通讯机制也很不一样。编程

         线程间通讯:因为多线程共享地址空间和数据空间,因此多个线程间的通讯是一个线程的数据能够直接提供给其余线程使用,而没必要经过操做系统(也就是内核的调度)。windows

         进程间的通讯则不一样,它的数据空间的独立性决定了它的通讯相对比较复杂,须要经过操做系统。之前进程间的通讯只能是单机版的,如今操做系统都继承了基于套接字(socket)的进程间的通讯机制。这样进程间的通讯就不局限于单台计算机了,实现了网络通讯。网络

        进程的通讯机制主要有:管道、有名管道、消息队列、信号量、共享空间、信号、套接字。数据结构

        管道:它传递数据是单向性的,只能从一方流向另外一方,也就是一种半双工的通讯方式;只用于有亲缘关系的进程间的通讯,亲缘关系也就是父子进程或兄弟进程;没有名字而且大小受限,传输的是无格式的流,因此两进程通讯时必须约定好数据通讯的格式。管道它就像一个特殊的文件,但这个文件之存在于内存中,在建立管道时,系统为管道分配了一个页面做为数据缓冲区,进程对这个数据缓冲区进行读写,以此来完成通讯。其中一个进程只能读一个只能写,因此叫半双工通讯,为何一个只能读一个只能写呢?由于写进程是在缓冲区的末尾写入,读进程是在缓冲区的头部读取,他们各自 的数据结构不一样,因此功能不一样。多线程

        有名管道:看见这个名字就能知道个大概了,它于管道的不一样的是它有名字了。这就不一样与管道只能在具备亲缘关系的进程间通讯了。它提供了一个路径名与之关联,有了本身的传输格式。有名管道和管道的不一样之处还有一点是,有名管道是个设备文件,存储在文件系统中,没有亲缘关系的进程也能够访问,可是它要按照先进先出的原则读取数据。一样也是单双工的。并发

        消息队列:是存放在内核中的消息链表,每一个消息队列由消息队列标识符标识,于管道不一样的是,消息队列存放在内核中,只有在内核重启时才能删除一个消息队列,内核重启也就是系统重启,一样消息队列的大小也是受限制的。异步

        信号量:也能够说是一个计数器,经常使用来处理进程或线程同步的问题,特别是对临界资源的访问同步问题。临界资源:为某一时刻只能由一个进程或线程操做的资源,当信号量的值大于或等于0时,表示能够供并发进程访问的临界资源数,当小于0时,表示正在等待使用临界资源的进程数。更重要的是,信号量的值仅能由PV操做来改变。socket

        共享内存:就是分配一块能被其余进程访问的内存。共享内存能够说是最有用的进程间通讯方式,也是最快的IPC形式。首先说下在使用共享内存区前,必须经过系统函数将其附加到进程的地址空间或说为映射到进程空间。两个不一样进程A、B共享内存的意思是,同一块物理内存被映射到 进程A、B各自的进程地址空间。进程A能够即时看到进程B对共享内存中数据的更新,反之亦然。因为多个进程共享同一块内存区域,必然须要某种同步机制,互 斥锁和信号量均可以。采用共享内存通讯的一个显而易 见的好处是效率高,由于进程能够直接读写内存,而不须要任何数据的拷贝。对于像管道和消息队列等通讯方式,则须要在内核和用户空间进行四次的数据拷贝,而 共享内存则只拷贝两次数据[1]:一次从输入文件到共享内存区,另外一次从共享内存区到输出文件。实际上,进程之间在共享内存时,并不老是读写少许数据后就 解除映射,有新的通讯时,再从新创建共享内存区域。而是保持共享区域,直到通讯完毕为止,这样,数据内容一直保存在共享内存中,并无写回文件。共享内存 中的内容每每是在解除映射时才写回文件的。所以,采用共享内存的通讯方式效率是很是高的。函数

         信号:信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求能够说是同样的。信号是异步的,一个进程没必要经过任何操做来等待信号的到达,事实上,进程也不知道信号到底何时到达。信号是进程间通讯机制中惟一的异步通讯机制,能够看做是异步通知,通知接收信号的进程有哪些事情发生了。信号机制通过POSIX实时扩展后,功能更增强大,除了基本通知功能外,还能够传递附加信息。信号事件的发生有两个来源:硬件来源(好比咱们按下了键盘或者其它硬件故障);软件来源。信号分为可靠信号和不可靠信号,实时信号和非实时信号。进程有三种方式响应信号1.忽略信号2.捕捉信号3.执行缺省操做。

        套接字:这一块在网络编程那一块讲的 不少,在此就不在说拉。

 对于进程的学习只是皮毛,望高手指点!