OS_process_communication

进程之间的通信

何为进程通信?
进程之间的信息交换
进程是分配系统资源的单位(包括内存地址空间),因此各进程拥有的内存地址空间相互独立
为了安全,一个进程不能直接访问另一个进程的地址空间
但是进程间的信息交换必须实现,为了保证进程之间安全通信,OS提供了一些方法。

  • 共享存储
    拥有共享空间,两个进程对共享空间的访问必须是互斥的(互斥访问通过OS提供的工具实现)
    OS只负责提供共享空间和同步互斥工具(如P、V操作)
    • 基于数据结构的共享存储
      • 必然共享空间只能存放一个长度为10的数组。这种共享方式速度慢、限制多,是一种低级通信方式
    • 基于存储区的共享
      • 内存中划出一块共享存储区,数据的形势、存放位置由进程控制,而不是OS。相比之下,这种共享方式速度快,是一种高级通信方式
  • 消息传递
    进程间的数据交换以格式化的消息(Message)为单位。进程通过OS提供的“发送消息/接收消息”两个原语进行数据交换。
    消息:
    - 消息头
    - 发送进程ID、接收进程ID、消息类型、消息长度等格式化的信息(计算机网络中发送的“报文”其实就是一种格式化消息)
    - 消息体
    • 直接通信方式
      • 消息直接挂到接收进程的消息缓冲队列上
    • 间接通信方式
      • 消息要先发送到中间实体(信箱)中,因此也称“信箱通信方式”,Eg:计网中的电子邮件系统
  • 管道通信
    • 管道
      • 用于连接读写进程的一个共享文件,又名pipe文件,其实就是在内存中开辟一个大小固定的缓冲区
    • 管道只能采用半双工通信,某一时间段内只能实现单向传输。如果要实现双向同时通信,则需要设置两个管道
    • 各进程要互斥的访问管道
    • 数据以字符流的形势写入管道,当管道写满时,写进程的write()系统调用将被阻塞,等待读数据将进程取走。全部取走后,管道变空,此时读进程的read()系统调用将被阻塞
    • 数据一旦被读出,就从管道中被抛弃,这就意味着读进程最多只能有一个,否则可能会有读错数据的情况

在这里插入图片描述

线程的概念与多线程模型

  • 线程、多线程模型
    • 什么是线程,为什么要引入线程
      • 有的进程可能需要“同时”做多件事,传统进程只能串行执行。因此,引入"线程",增加并发度。
      • 可以把线程理解为“轻量级进程”,线程是一个基本的CPU执行单元,也是程序执行流的最小单位。引入线程后,不仅进程间可并发,进程内各线程也可并发,从而进一步提升了体系的并发度
      • 引入后进程只作为除CPU之外的系统资源的分配单位(如打印机、内存地址空间等都是分配给进程的)。
        • 线程则作为处理机的分配单元
    • 引入线程机制后,有什么变化
      • 资源分配、调度
        • 传统的进程是程序执行流的最小单位,引入线程后,线程成为了程序执行流的最小单位
      • 并发性
        • 引入前,只能进程间并发
        • 引入后,各线程也能并发,提升了并发度
      • 系统开销
        • 传统进程并发,需要切换进程的运行环境,系统开销很大
        • 线程并发,如果是同一进程内切换,则开销小
    • 线程有哪些重要属性
      • 线程是CPU调度的单位
      • 多CPU计算机中,各个线程可占用不同的CPU
      • 每个线程都有一个线程ID、线程控制块(TCB)
      • 线程也有就绪、阻塞、运行三种基本状态
      • 线程几乎不拥有系统资源
      • 同一进程不同线程共享进程资源
      • 由于共享内存地址空间,同一进程内的线程间通信甚至无需系统干涉
      • 同一进程的线程切换,不会引起进程切换
      • 不同进程的线程切换,会引起进程切换
      • 切换同进程内的线程,系统开销小
      • 切换进程,系统开销大
    • 线程的实现方式
      • 用户级线程(User-Level Thread, ULT)
        • 用户级线程由应用程序通过线程库实现。所有的线程管理工作都由应用程序负责(包括线程切换)
        • 用户级线程中,线程切换可以在用户态下完成,无需OS干预
        • 在用户看来,是有多个线程,但是OS内核看来,并意识不到线程的存在。(用户级线程对用户不透明,对OS透明)
        • 理解:
          • 用户级线程就是从用户视角能看到的线程
      • 内核级线程(Kernel-Level Thread, KLT,又称"内核级支持的线程 ")
        • 内核级线程的管理工作OS内核完成。线程调度、切换等工作都由内核负责,因此内核级线程的切换必须在核心态下才能完成
        • 理解:内核级线程就是从OS内核视角能看到的线程
      • 在同时支持多用户级线程和内核级线程中,可采用二者组合的方式:将n个用户级线程映射到m个内核级线程上(n>=m)
        重点真是重点
        • OS只“看得见”内核级线程,因此只有内核级线程才是处理机分配的单位
        • eg:有一个三个用户级线程两个内核级线程,在用户看来,有三个线程。但即使该进程在一个4核处理机的计算机上运行,也最多只能被分配到两个核,最多只能有两个用户线程并行执行
    • 多线程模型
      • 在同时支持用户级线程和内核级线程的系统中,由多个用户级线程映射到多个内核级线程的问题引出了“多线程模型”
      • 多对一模型
        • 多个用户级线程映射到一个内核级线程。每个用户进程只对应一个内核级线程
        • 优点:用户级线程的切换在用户空间既可完成,不需要切换到核心态,线程管理的系统开销小,效率高
        • 缺点:当一个用户级线程被阻塞后,整个进程都会被阻塞,并发度不高,多个线程不可再多核处理机上并发运行
      • 一对一模型
        • 在同时支持用户级线程和内核级线程的系统中,由多个用户级线程映射到多个内核级线程的问题引出来
        • 一个用户级线程映射到一个内核级线程。每个用户进程有于多用户线程同数量的内核级线程
        • 优点:当一个进程被阻塞后,别的线程还可以继续执行,并发能力强。多线程可在多核处理机上并行执行
        • 缺点:一个用户进程会占有多个内核级线程,线程切换由OS内核完成,需要切换到核心态,因此线程管理成本高,开销大
      • 多对多模型
        • n用户记线程映射到m个内核级线程(n>=m)。每个用户进程对应m各内核级线程
          克服了多对一模型并发度不高的缺点,也克服了一对一模型中一个用户占用太多内核级线程,开销大的缺点。

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值