多进程和多进程间通信

来源:互联网 发布:王者荣耀自慰软件 编辑:程序博客网 时间:2024/05/21 10:40
一、进程空间和多进程父子关系:
进程是分配资源的最小单位(进程内存空间)fork后,子进程会复制父进程的task_struct结构;并为子进程的堆栈分配物理页(开始只是标记为只读的),延迟到当父或子线程尝试写这些区域,内核才为需要修改的那片内存拷贝副本

二、进程间通信方式:
1. 共享内存(share memory), 信号量(semaphore/sɛməˌfɔr/)
2. 消息队列(message queue),信号(signal)。
3.文件(file), 匿名管道(pipe)/命名管道(name pipe),套接字(socket)。

说到子进程只是一个额外的流程,那他跟父进程的联系和区别是什么呢?

我很想建议你看看linux内核的注解(有兴趣可以看看,那里才有本质上的了解),总之,fork后,子进程会复制父进程的task_struct结构,并为子进程的堆栈分配物理页。理论上来说,子进程应该完整地复制父进程的堆,栈以及数据空间,但是2者共享正文段。

关于写时复制:由于一般 fork后面都接着exec,所以,现在的 fork都在用写时复制的技术,顾名思意,就是,数据段,堆,栈,一开始并不复制,由父,子进程共享,并将这些内存设置为只读。直到父,子进程一方尝试写这些区域,则内核才为需要修改的那片内存拷贝副本。这样做可以提高 fork的效率。



由于多进程要并发协调工作,进程间的同步,通信是在所难免的。

稍微列举一下linux常见的IPC.

linux下进程间通信的几种主要手段简介:

  1. 管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信
  2. 信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程 本身;linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于 BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数);
  3. 报文(Message)队列(消息队列):消息队列是消息的链接表,包括Posix消息队列system V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字 节流以及缓冲区大小受限等缺点。
  4. 共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥
  5. 信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。
  6. 套接口(Socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类Unix系统上:Linux和System V的变种都支持套接字。

或许你会有疑问,那多线程间要通信,应该怎么做?前面已经说了,多数的多线程都是在同一个进程下的,它们共享该进程的全局变量,我们可以通过全局变量来实现线程间通信。如果是不同的进程下的2个线程间通信,直接参考进程间通信。


进程间通信IPCInter-Process Communication),指至少两个进程线程间传送数据或信号的一些技术或方法。进程是计算机系统分配资源的最小单位。每个进程都有自己的一部分独立的系统资源,彼此是隔离的。为了能使不同的进程互相访问资源并进行协调工作,才有了进程间通信。这些进程可以运行在同一计算机上或网络连接的不同计算机上。

进程间通信技术包括消息传递、同步、共享内存和远程过程调用。IPC是一种标准的Unix通信机制。

使用IPC 的理由:

  • 信息共享
  • 加速;
  • 模块化;
  • 方便以及
  • 私有权分离.

主要的 IPC 方法

方法

提供方(操作系统或其他环境)

文件

多数操作系统

信号

多数操作系统

Socket

多数操作系统

消息队列(en:Message queue)

多数操作系统

管道(en:Pipe)

所有的 POSIX systems, Windows.

具名管道(en:Named Pipe)

所有的 POSIX 系统, Windows.

信号量(en:Semaphore)

所有的 POSIX 系统, Windows.

共享内存

所有的 POSIX 系统, Windows.

Message passing(en:Message passing)
(
不共享)

用于 MPI规范,Java RMI, CORBA, MSMQ, MailSlot 以及其他.

Memory-mapped file(en:Memory-mapped file)



0 0