进程间通信

为什么需要通信机制

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.一组线程协同完成一项任务,需要所有线程都到达一个汇合点后在一起向前推进
posted @ 2018-12-06 22:00  pluscat  阅读(222)  评论(0编辑  收藏  举报