zoukankan      html  css  js  c++  java
  • 进程间通信

    为什么需要通信机制

    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
    ',atomic_read(&v);
    
    int atomic_dec_and_test(atomic_t*v)
    

    屏障(BARRIER)

    1.一种同步机制(又称栅栏,关卡)
    2.用于对一组线程进行协调
    3.应用场景
      1.一组线程协同完成一项任务,需要所有线程都到达一个汇合点后在一起向前推进
    
  • 相关阅读:
    CodingSouls团队项目冲刺(4)-个人概况
    第八周周总结
    CodingSouls团队项目冲刺(3)-个人概况
    CodingSouls团队项目冲刺(2)-个人概况
    线程中的join使用
    向线程传递数据的三种方法
    Java collections使用介绍
    Guava Collections使用介绍[超级强大]
    重构改善既有代码的设计--重新组织数据
    重构改善既有代码的设计--在对象之间搬移特性
  • 原文地址:https://www.cnblogs.com/pluslius/p/10079878.html
Copyright © 2011-2022 走看看