为什么需要通信机制
1.信号量及管程的不足(只能传递少量数据)
2.不适用多处理器情况
进程通信机制
1.消息传递
1. send & receive原语
2.适用于分布式系统基于共享内存的多处理机系统,单处理机系统,可以解决进程间的同步,通信问题
基本通信方式
1.消息传递
2.共享内存
3.管道
4.套接字
5.远程过程调用
消息传递
发送进程S 接收进程R
send(des,msg) -os消息缓冲区-> receive(src,msg)
msg(text,size) msg(text,size)
1.send()陷入内核,内核复制消息到消息缓冲区
2.receivee()取出消息入队到PCB中消息队列
用P,V操作实现SEND原语
Send(des,msg)
{
根据des找接收进程,如果未找到,出错返回
申请空缓冲区P(buf-empty)
P(mutex1)
取出空缓冲区
V(mutex1);
把消息从message处复制到空缓冲区
P(mutex2)
把消息缓冲区挂到接收进程的消息队列
V(mutex2)
V(buf-full)
}
信号量:
buf-empty 初值为N
buf-full 初值为0
mutex1 初值为1
mutex2 初值为1
共享内存
1.物理内存内建立共享内存,将共享内存映射到各个进程中
2.读过解决读写者问题,解决共享内存中进程写入互斥问题
进程1 - 共享内存 - 进程2
管道通信方式PIPE
1.利用一个缓冲传输介质,--内存或文件连接两个相互通信的进程
写,发送进程 -管道-> 读接收进程
2.问题:
1.字符流方式写入读出
2.先进先出顺序
3.管道通信机制必须提供的协调能力
1.互斥,同步,判断对方进程是否存在
典型操作系统IPC机制
Linux进程通信机制
UNIX
AT&T BSD
System V IPC 基于套接字的IPC
Linux IPC
^
|
POSIX IPC
Linux继承的IPC通信机制
Linux中用户能够通过API使用的进程同步机制:
管道,消息队列,共享队列,信号量,共享内存。
信号,套接字
内核同步机制:原子操作,自旋锁,读写锁,信号量,屏障
原子操作
1.不可分割,在执行完之前不会被其他任务或事件中断
2.常用于实现资源的引用计数
3.atomic_t
typedef struct {volatile int counter;} atomic_t;
原子操作API包括:
atomic_read(atomic_t*v)
atomic_set(atomic_t*v,int i)
void atomic_add(int i, atomic_t*v)
int atomic_sub_and_test(int i,atomic_t*v)
void atomic_inc(atomic_t*v)
int auomic_add_return(int i,atomic_t*v)
atomic_t v = atomic_init[0];
atomic_set(&v,4)
atomic_add(2,&v)
atomic_inc(&v)
printk('%d\n',atomic_read(&v);
int atomic_dec_and_test(atomic_t*v)
屏障(BARRIER)
1.一种同步机制(又称栅栏,关卡)
2.用于对一组线程进行协调
3.应用场景
1.一组线程协同完成一项任务,需要所有线程都到达一个汇合点后在一起向前推进