OS(五):进程管理之 进程的通信
进程通信即进程间的信息交换。
进程是资源分配的基本单位,各进程内存空间彼此独立,一个进程不能随意访问其它进程的地址空间。
1、进程通信的类型
1.1、共享存储
在共享存储(Shared-memory),相互通信的进程共享某些数据结构或共享存储区,进程之间能够通过这些空间进行通信。
1.1.1、基于共享数据结构的通信方式
多个进程共用某些数据结构,实现诸进程间的信息交换
由用户(程序员)负责同步处理,OS提供共享存储器
低级通信:可以传递少量数据,效率低
1.1.2、基于共享存储区的通信方式
多个进程共用内存中的一块存储区域;由进程控制数据的形式和方式;高级通信:可以传递大量数据,效率高。
诸进程可通过对共享存储区中的数据读或写来实现通信。
进程在通信前,先向系统申请获得共享存储区的一个分区,并指定该分区的关键字;若系统已经给其他进程分配了这样的分区,则将该分区的描述符返回给申请者,由申请者把获取的共享存储区连接到本进程上。
1.1.3、共享存储的缺点
数据的发送方不关心数据由谁接收,数据的接收方也不关心数据是由谁发送的,存在安全隐患。
1.2、消息传递
1.2.1、消息传递
消息传递系统是进程间通信的通信机制之一,通过发消息 send 和收消息 receive 两个原语,实现数据的传递,在该机制中,进程间数据交换是以为格式化消息(message)为单位的,在计算机网络中,message被称为报文。
1.2.2、消息传递的方式
2.1、直接通信
发送进程利用OS提供的发送命令,直接把消息发送给目标进程。
直接通信 - 点到点发送;发送和接收时指明双方进程的ID;发送进程直接发消息到接收进程的消息缓冲队列上,接收进程从自己的消息缓冲队列上读取消息。
2.2、简接通信
简接通信方式指进程之间的通信需要通过作为共享数据结构的实体。该实体用来暂存发送进程发送给目标进程消息;接收进程则从实体中取出对方发送给自己的消息。通常把这种实体称为信箱。
间接通信:以信箱为媒介进行传递,可以广播;发送进程直接发消息到中间实体(信箱)上,接收进程从中间实体上读取消息;很容易建立双向通讯链。
1.2.3、消息缓冲队列通信机制
发送进程利用 Send 原语 将消息发送到接收进程;
接收进程利用 Receive原语 接收消息。
3.1、数据结构
3.1.1、消息缓冲区
息缓冲队列通信机制中,主要利用的数据结构是消息缓冲区。
3.1.2、PCB中有关通信的数据项
消息缓冲队列通信机制中,除了为进程设置消息缓冲队列外,还应在进程的PCB中国增加消息队列队首指针,用于消息队列进行操作,实现同的的互斥信号量 mutex 和资源信号量 sm 。
3.2、发送原语
发送进程在 send 消息之前,现在自己的内存空间设置一发送去a。将待发送的消息正文、发送进程标识符、消息长度等信息填入其中,调用 send,将消息发送给目标进程。
3.3、接收原语
接收进程调用 receive,从自己的消息缓冲队列mq中获取第一个消息,并将其中的数据复制到b为首址的指定消息接收区内。
1.3、管道通信
管道通过系统调用read(), write()函数进行读写操作。
管道基于文件系统和缓冲思想实现的一种通信方式,以先进先出(FIFO)方式组织数据传输,是一个单向通信信道,如果进程间要进行双向通信,通常需要定义两个管道。
管道:用于连接一个读进程和一个写进程以实现它们之间通信的一个共享文件,也叫pipe文件,本质是内存中固定大小的缓冲区。缓冲区未满不读,已满不写,未空不写,已空不读,读后删除。
向管道提供输入的发送进程,即写进程,以字符流形式将数据送入管道;接收管道输出的接收进程,即读金层,从管道中接收数据。
发送进程和接收进程基于管道进行通信,这种通信方式又叫管道通信。
2、线程
2.1、线程的基本概念
线程是一个轻型实体,是一个独立调度和分派的基本单位。线程可并发执行,并且共享所在进程资源。
同一进程中各线程共享所在进程资源是因为所有线程都具有相同的地址空间。
2.2、线程的结构
线程拥有独立运行的资源,大体结构如下
2.2.1、TCB
控制线程运行的线程控制块 TCB。
2.2.2、PC
指示被执行指令序列的程序计数器。
2.2.3、寄存器和堆栈
寄存器:包括程序技术器PC和堆栈指针中的内容。
堆栈:保留局部变量、返回地址。
2.3、线程的状态
同进程一样,线程具有 就绪、执行、阻塞 三种基本状态。
就绪状态:线程已具备各种执行条件,一旦获得CPU便可执行;
执行状态:线程正获得处理机而运行;
阻塞状态:线程在执行中因某事件而受阻,处于暂停执行的状态;
2.4、线程的同步与通信
OS中提供多种线程同步机制,如互斥锁、条件变量、计数信号量等。
2.4.1、互斥锁(mutex)
互斥锁用于实现线程间对资源互斥访问的机制。互斥锁有两种状态,开锁(unlock)和关锁(lock),lock操作用于将mutex关上,unlock操作用于将mutex打开。
2.4.2、条件变量(condition)
条件变量常与互斥锁一起使用,用于线程的长期等待,直至所等待的资源成为可用资源后,唤醒等待的线程。
2.5、线程的实现方式
2.5.1、用户级线程(User-Level Thread, ULT)
线程管理工作由应用程序完成;内核感受不到用户线程的存在;在应用程序中通过线程库创建新的线程。
2.5.2、内核级线程(Kernel-Level Thread,KLT)
线程管理工作由内核完成,由内核的内部需求进行创建和撤销;
应用程序可以通过一个内核级线程的编程接口访问内核线程;内核为进程及其内部线程维护上下文信息,需要内核的参与来完成线程的调度。
2.5.3、用户级线程与内核级线程的连接模式
5.3.1、一对一模型
每个用户级线程 -> 一个内核级线程;并发能力较强,一个线程阻塞不影响其它线程;内核线程创建较多,影响性能。
5.3.2、多对一模型
多个用户级线程 -> 一个内核级线程;线程管理在用户空间进行,高效;若一个用户线程使用内核服务时阻塞,则整个进程阻塞
5.3.3、多对多模型
n个用户级线程 -> m个内核级线程,m <= n;克服了多对一模型并发度不高的缺点;克服了一对一模型内核级线程开销太大的缺点。
3、进程与线程
在多线程OS中,进程作为系统资源分配的单位,可包含多个线程;进程不再是一个可执行实体,线程作为独立运行的基本单位。
3.1、进程与线程解决的问题
操作系统引入进程:使多个程序能并发执行,以提高资源利用率和系统吞吐量。
操作系统引入线程:为了减少程序在并发执行时所付出的时空开销。
3.2、进程与线程的比较
3.2.1、调度
在多线程OS中,线程是独立调度的基本单位,进程是资源分配的基本单位;同一进程中切换线程,不会引起进程切换。
3.2.2、并发性
在多线程OS中,进程可以并发执行,在同一进程中线程也可以并发执行,使OS具有更好的并发性,提高系统资源的利用率和系统的吞吐量。
3.2.3、拥有资源
进程拥有资源,而线程(一般)不拥有资源,这样做是为了减少切换线程的开销;同一个进程中的多个线程共享该进程的资源。
进程间的地址空间相互独立;同一进程的线程间共享进程资源,进程间的线程彼此不可见。
3.2.4、通信
进程通信需要同步或互斥手段的辅助;
线程间可以直接读写数据段(如全局变量)来通信;同一进程内的线程共享该进程资源,同步和通信都更容易实现。
线程相对于进程,大大降低了创建、撤销和切换可执行实体的成本和难度。
3.2.5、系统开销
创建和撤销进程,需要分配和回收相关资源,开销较大;切换进程的成本较高;
相对而言,创建和切换线程的成本较低,只需要保存少量寄存器内容,开销小。
3.2.6、总结
进程:作为系统『资源分配』的基本单位 ;可包括多个线程,至少有一个线程 ;进程不是一个可执行的实体,真正执行的是线程。
线程:是独立运行和独立调度的基本单位。
引入进程的目的在于,使多道程序并发执行,提高系统的资源利用率和吞吐量;而引入线程,是为了减少程序在并发时的时空开销,提高系统的并发性,线程相对于进程,大大降低了创建、撤销和切换可执行实体的成本和难度。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)