进程与线程

2.1 进程与线程
2.1.1 进程的概念和特征
程序与进程的区别
程序:【静态的】,存放在磁盘里的可执行文件,是一系列指令的集合
进程:【动态的】,是程序的一次执行过程(同一个程序多次执行会对应多个进程)
进程映像(进程实体):程序段,相关数据段和PCB构成 反应了进程在【某一时刻】的状态
进程是进程实体的运行过程,是系统进行资源分配的一个独立单位(线程是独立调度的单位,没有涉及线程,进程也可以说是)
进程映像是静态的,进程是动态的
进程的特征(了解即可)
动态性
最基本的特征,是动态产生,变化和消亡的
并发性
多个进程实体同时存于内存中,在一段时间内同时运行
独立性
进程实体是一个能独立运行,独立获得资源和独立接受调度的基本单位
异步性
进程按照各自独立的、不可预知的速度向前推进
所谓创建进程就是创建进程映像中的PCB,撤销进程就是撤销进程的PCB 【PCB是进程存在的唯一标志】
2.1.2 进程的组成(进程实体的组成)
进程控制块PCB
进程描述信息:进程标识符PID,用户标识符UID
进程控制和管理信息
进程当前状态
进程优先级
处理机占用时间等
资源分配清单
内存地址空间或虚拟地址空间
打开文件的列表
使用的输入输出设备
处理机相关信息:【处理机中各寄存器的值PSW】(现场信息)
进程各种队列的连接指针和反映进程之间的隶属关系的信息
可重入代码(Reentry code)也叫纯代码(Pure code)是一种允许多个进程同时访问的代码。 为了使各进程所执行的代码完全相同,故不允许任何进程对其进行修改。(不属于临界资源)
程序段:能被【进程调度程序】调度到CPU执行的程序代码段
程序可以被多个进程共享,多个进程可以运行同一个程序
数据段:进程加工处理的原始数据,产生的中间和最终结果
组织方式
线性方式:所有的PCB放在一张线形表中
链接方式:把具有【相同状态】进程的PCB分别通过PCB中的链接字链接成一个队列
索引方式:根据进程状态的不同,建立几张索引表
进程自己使用 与PCB对应的其它存储数据结构:【共享正文段】存放代码和数据段,【数据堆段】存放动态分配的存储区,【数据栈段】存放临时使用的变量
操作系统使用
2.1.2 进程的状态与转换
状态
运行态
每时刻单CPU一个进程处于运行态,多CPU多个进程处于运行态
就绪态
获得了除处理机外的一切资源
阻塞态(等待态)
进程正在等待某一事件而暂停运行
创建态
申请空白PCB,填写信息,系统分配资源
结束态
进程从系统中消失(正常结束或中断运行)
就绪挂起
可以由创建态,就绪态,运行态,阻塞挂起转换;激活后变成就绪态
阻塞挂起
可以由就绪挂起,阻塞转换;激活后变成阻塞
放入外存中
相互转换
就绪态->运行态
运行态->就绪态:可能因为优先级抢占,时间片轮转等原因
运行态->阻塞态(进程主动的行为)
阻塞态->就绪态(进程被动的行为)
2.1.3 进程控制(内核态下)
进程控制用的程序段称为【原语】,执行期间不可被中断
进程的创建
允许一个进程创建另一个进程,父进程和子进程
引发的事件
用户登陆
作业调度
系统提供服务
用户程序的应用请求
【创建原语】过程
申请空白PCB
为进程分配资源
初始化PCB
若就绪队列可以容纳,插入就绪队列
设备分配只是在对应的PCB中增加相关信息,并没有创建
父进程和子进程并发执行;而主程序调用子程序,主程序暂停在调用点,子程序才开始执行
进程的终止
结束分类
正常结束
异常结束
外界干预
【撤销原语】过程
根据PID,检索PCB,从中读出进程的状态
若处于执行态,终止运行,将处理机分配给其它进程
若有子孙进程,所有子孙进程都应该被终止
将该进程的全部资源,归还给操作系统或父进程
从队列中删除PCB
进程的阻塞与唤醒
【阻塞原语】(主动行为)
根据PID找到PCB
保护现场信息至PCB,状态转为阻塞态,停止运行
将该PCB插入等待队列,处理机资源分配给其它进程
【唤醒原语】(被动行为)
根据PID找到PCB
从队列中移除,状态转为就绪态
插入就绪队列
由何阻塞,由何唤醒
进程切换
保护处理机上下文(PC,PSW)
更新PCB信息
将进程PCB移入相应的队列
选择另一个进程执行,更新PCB
更新内存管理的数据结构
恢复处理机上下文
区分“调度”与“切换” 调度是决策行为,切换是执行行为
成对使用
2.1.5 进程通信(操作系统底层支持) 通过同步互斥工具来实现
进程是分配系统资源的单位(包括内存地址空间),各进程拥有的内存空间相互【独立】
为了保证安全,一个进程是不能直接访问另一个进程的地址空间;需要操作系统的介入; 但是进程内的【线程】是自然【共享】进程空间的
共享存储
基于数据结构的共享(【低级通信】):通信进程按照一定的数据结构存取
基于存储区的共享(【高级通信】):数据的形式,存放位置由通信进程自己控制
消息传递
进程间的数据交换以【格式化】的消息为单位,有【发送原语】和【接受原语】
直接通信:发送进程在消息体中指明接受进程,并将其挂在【操作系统内核地址空间PCB】中的消息缓冲队列中,接受进程从消息缓冲队列中取得消息
间接通信:操作系统内核地址空间中开辟一个“信箱”,发送进程发给该信箱,接受进程从其中读取
可以多个进程往一个信箱发送信息,也可以多个进程读信箱
管道通信【共享文件】
pipe文件,类似循环队列,以【字符流】的形式将大量的数据写入管道,接受进程从管道中读取数据
当管道满时,写进程write将被阻塞
当管道空时,读进程read将被阻塞
特点
互斥,同步,确定对方存在
管道是一个【固定大小】的内存缓冲区
从管道中读数据是【一次性】操作,读完就被抛弃
408:允许多个写进程,一个读进程
LINUX:允许多个写进程,多个读进程
半双工通信,单向传输
管道没被写满,只要不空,就可以读; 管道没被读空,只要不满,就可以写
LINUX中4KB
操作系统只负责为通信进程提供可共享使用的存储空间和【同步互斥工具】 数据交换则是由用户自己安排去读/写指令完成
⚠️:需要操作系统内核介入的原因,利用【硬件地址机制】对地址空间进行了严格的保护
2.1.6 线程概念和多线程模型
引入进程的目的是更好地使程序并发执行,【提高资源利用率】和【系统吞吐量】
引入线程的目的是减小程序在并发执行时所付出的【时空开销】,提高系统性能的并发性能
【进程】只作为除CPU外的系统【资源】的分配单元 【线程】作为处理机的分配单元
进程与线程的比较
调度
线程是独立调度的基本单位;进程是拥有资源的基本单位
拥有资源
线程只有一点必不可少的资源,不拥有系统资源
并发性
进程可以并发执行,线程也可以并发执行,进程可以创建进程,线程可以创建线程
但是线程不能创建进程
系统开销
同一进程的线程切换比进程切换开销小
地址空间和其它资源
进程的地址空间相互独立,同一进程的线程共享资源,共享地址空间
通信方面
进程通信需要同步和互斥手段的辅助,线程之间可以直接读/写【进程数据段】进行通信
同一进程,线程的切换不会导致进程的切换,不同进程的线程切换会引起进程的切换
线程属性
不拥有系统资源,拥有唯一标识符和线程控制块TCB
不同的线程可以执行相同的程序,同一个服务程序被不同用户调用时,操作系统为其创建不同线程
同一进程的各个线程共享该进程的全部资源
线程是处理机调度的独立单位
线程也有生命周期,阻塞,就绪和运行
多CPU计算机,线程可以占用不同的CPU
切换同进程的线程,开销小;切换进程,开销大
线程的通信无需操作系统的干预
共享进程的地址空间
线程的实现方式
用户级线程
是在用户空间由【线程库】实现的,【与内核无关】,内核不知道线程的存在,调度仍然是以进程为单位
优点:线程切换不需要切换到内核空间,系统开销小,与OS平台无关
缺点:当一个用户进程被阻塞,整个进程都会被阻塞,并发度不高,该进程的多个线程不可以在多核CPU上并行运行
以进程为单位意味着可能该计算机没有内核级线程的功能
内核级线程
线程管理的所有工作都是由内核完成的
优点:多处理器系统中,同一个进程的不同线程可以并行执行;如果进程中一个线程被阻塞,可以调度该进程中的其它线程
缺点:对于用户的线程切换来说,需要从用户态切换到核心态,系统开销大
多线程模型
多对一
多个用户级线程映射到一个内核级线程,线程管理在用户空间
优点:线程管理在用户空间进行,效率比较高
缺点:一个线程阻塞导致整个进程阻塞,多个线程不能运行在多个处理机上(因为是以内核级线程为分配单位)
一对一
一个用户级线程映射到一个内核级线程
优点:并发能力强
缺点:创建线程开销大,影响应用程序的性能
多对多
多个用户级线程映射到多个内核线程上
集两者只所长(比如开销大的给它分配一个独立的内核级线程?)
用户级线程是代码逻辑的载体 内核级线程是运行机会的载体 代码逻辑只有得到运行机会才能被执行
多任务是针对操作系统而言的,代表操作系统可以同时执行的程序个数 多线程是针对一个程序而言的,代表一个程序可以同时执行的线程个数
posted @ 2025-07-26 13:52  Jfang0007  阅读(12)  评论(0)    收藏  举报