进程通信方式总述

  1. 无名管道
  2. 有名管道
  3. 消息队列
  4. 共享内存

无名管道 pipe

  • 要求两个进程之间有血缘关系,比如 fork 出来的父子进程
    • fork, 共享代码空间,但是有各自的数据空间,只不过 fork 出来的子进程的数据空间是赋值父进程的数据空间
  • 管道是一个固定大小(4kb)的缓冲区,进程一个堵塞写,一个堵塞读,即数据是单向的

有名管道 fifo

  • 无名管道要求父子关系的进程才能使用,局限性有点大
  • 有名管道,相当于是一个有名字的文件,所以没有血缘关系的进程可以通过有名管道来通信
    • 名字在文件系统上
    • 数据在内存中
  • 也是堵塞写,堵塞读,单向

消息队列

  • linux 的消息队列可以看成一个链表结构
    • msgque 链表,节点指针指向 msgid_ds 结构
  • 每个消息可以指定类型,消费的时候可以消费指定类型的结构

共享内存

  • 一块物理内存映射到两个进程的进程地址空间,进程之间可以立刻看到对方在内存空间做出的修改
  • 需要锁保证同步

信号量

  • TODO

线程上下文切换

  • 一个进程的多个线程间切换涉及到上下文切换。

    简单说法

  • 有个时间片轮询算法,cpu 给每个线程一个时间片执行

  • 一个时间片执行结束后,对应的线程的状态会被保存,然后下一个时间片切换另一个线程执行。
  • 当若干个时间片后,切换回第一个线程时,就将该线程的状态进行恢复。