进程间通信

进程是程序在某个数据集合上的一次运行活动,线程是进程的一个执行路径;
进程是资源分配的单位,线程是系统调度的单位;
进程之间不能共享资源,线程共享所在进程的资源和地址空间,同时线程有自己的堆栈和局部变量;
线程必须依赖进程。
进程是系统资源分配和调度的一个独立单元,线程是CPU调度和分派的基本单位。

进程间通信:

1.共享内存

C++:

mmap:进程间通过映射同一普通文件实现内存共享。普通文件映射到进程地址空间后,进程可以像访问普通内存一样访问文件,不需要调用read()、write()。

open文件后调用mmap,写完后mummap解除映射关系。

POSIX共享内存:shm_open打开POSIX共享对象(必须在/dev/shm下)

System V共享内存

2.管道:一个管道中的数据只能单向流动

//打开一个管道,2个int的数组fildes分别存储读端和写端的FD

Int pipe(int fildes[2]);

//管道读

ssize_t read(int fd, void* buf, size_t count);

//管道写

ssize_t write(int fd, const void* buf, size_t count);

命名管道在文件系统中以文件的形式存在。

3.消息队列:不随进程生命周期,随内核自举。其中的数据有优先级。

mq_open 创建mq

mq_send 发送信息

mq_receive 接收信息

4.信号:SIGXXX

5.信号量(信号灯):用于多进程、多线程同步共享资源

使用信号灯加锁更新文件:sem_open、sem_wait、sem_post

// 获得信号灯,得不到就阻塞;如果获得信号灯,信号灯数量减1

int sem_wait(sem_t *sem);

// 尝试获得,得不到返回失败,errno设置为EAGAIN

int sem_trywait(sem_t *sem);

// sem_getvalue返回指定信号灯的当前值,如果该信号灯已上锁,那么返回或为0,或为某个负数,其绝对值就是等待该信号灯解锁的线程数。

int sem_getvalue(sem_t *sem, int *sval);

// 释放信号灯,信号数量加1

int sem_post(sem_t *sem);

POSIX信号灯:在sem_init函数中,如果shared0,那么待初始化的信号灯是在同一进程的各个线程间共享的,否则该信号灯是在进程间共享的。当shared0时,该信号灯必须存放在即将使用他的所有进程都能访问的某种类型的共享内存区中。

基于内存的信号灯,如果是线程间则声明一个全局变量sem_t,如果是进程间同步则使用共享内存。

http://www.cnblogs.com/linuxbug/p/4863692.html

Linux进程间通信

Ø 管道与消息队列

ü  匿名管道,命名管道

ü  消息队列

Ø 信号

ü  信号基础

ü  信号应用

Ø 锁与信号灯

ü  记录锁

ü  有名信号灯

ü  无名信号灯(基于内存的信号灯)

Ø 共享内存

ü  共享内存介绍

ü  文件映射内存方式

ü  共享内存对象方式

为什么需要进程间通信

Ø 数据传输代表:管道 FIFO 消息队列 SOCKET

Ø 事件通知代表:信号

Ø 分工协作代表:锁和信号灯

Ø 高效数据共享代表:共享内存

进程间通信主要分支及演进

816350-20151009132140190-1529462680

comments powered by Disqus