进程通信
背景:进程只能访问自己的内存空间,不允许访问其余地址空间。
- 共享存储:为两个进程开辟一个共享存储区,两个进程可以访问相同的地址空间。可以通过添加页表项来实现。但是访问相同的地址空间可能会有访问冲突,需要PV操作等来实现互斥访问。按照访问的形式可以分为高级通信方式与低级通信方式
高级通信方式:对于共享区内部数据访问由双方进程自行控制
低级通信方式:对于共享区访问的结构由操作系统决定,比如必须按照int数组访问等。 - 消息传递:进程之间的数据以格式化消息进行交换。
直接通信方式:发送进程指明接收进程。需要使用发送原语与接收原语。
间接通信方式:不指明接受进程。需要构建一个信箱,指明放入某个信箱即可。 - 管道通信:管道通信使用的是特殊的管道文件。本质上为大小固定的内存缓冲区。管道只能FIFO,且只能单向传输。某个时间段只能A放B收或者B放A收。只能半双工。
线程
引入目的:一个进程可能需要同时做很多事情,需要加入线程来提高并发度。
引入线程之后的变化
- 线程为CPU调度单位。但进程依旧是资源分配单位。
- 提高并发度
- 进程之间的切换需要切换进程的运行环境,但如果是同一进程下的不同线程,这两个线程所使用的系统资源相同,切换开销小
多线程模型
- 用户级线程
由应用程序实现多线程。线程的管理由应用程序管理,线程切换不需要CPU变态,内核程序不知道线程的存在。开销小效率高,但一个线程阻塞,其余线程全阻塞,并发度不高。 - 内核级线程
操作系统可见线程。管理工作由操作系统完成,线程切换需要将用户态转变为内核态。并发度高,多处理机上并行,但开销较大(因为需要变态)。
三种模型:
- 一对一模型:一个内核级线程对应一个用户级线程
- 多对一模型:一个内核级线程对应多个用户级线程,相当于用户级线程
- 多对多线程:n个用户级线程映射到m个内核级线程上(n>=m)