【OS】第七部分:进程与线程

【OS】第七部分:进程与线程
视频:B站清华大学 向勇、陈渝老师
链接: https://www.bilibili.com/video/BV1js411b7vg?p=11

7.1进程的定义

OS系统从只能跑一个程序到能跑多个。一个程序能运行多份,程序的概念用来表示OS中运行的程序就不合适了。
进程:一个具有一定独立功能的程序在一个数据集合上的一次动态执行过程。
只有当一个程序被OS加载到内存中,cpu对其动态地执行时,才称为进程。
在这里插入图片描述

7.2 进程的组成

(1)一个进程应该包括
程序的代码
程序处理的数据
程序计数器的值,指示下一条将运行的指令
一组通用的寄存器的当前值,堆,栈
一组系统资源(如打开的文件) 内存资源 文件系统 网络
总之,进程包含了正在运行的一个程序的所有状态信息。

(2)进程与程序的联系
程序是产生进程的基础
程序的每次运行构成不同的进程(多次执行程序 数据可能不同进而导致产生的行为不同)
进程是程序功能的体现
通过多次执行,一个程序可对应多个进程;
通过调用关系,一个进程可包括多个程序。(多个程序合在一起来完成一个更大的功能的体现 ,一个程序可能不能解决一个进程所要完成的功能)。
二者是一个多对多的映射关系。

(3)进程与程序的区别
-进程是动态的执行过程,程序是静态的(代码):程序是有序代码的集合;进程是程序的执行,进程有核心态/用户态
核心态在OS中运行(进程完成某些特定的功能,只有OS才能提供 eg.读文件 和硬盘之间的操作)
-进程是暂时的,程序是永久的:进程是一个状态变化的过程,程序可长久保存
-进程与程序的组成不同:进程的组成包括程序,数据和进程控制块(进程的状态信息)
在这里插入图片描述

7.3 进程的特点

动态性:可动态地创建,结束进程
并发:在一段时间内有多个进程在运行 时间如果很短就会给人错觉是在一起执行
并行:在同一个时刻有多个进程在运行(只有多个CPU才满足)。
并发性:进程可以被独立调度并占用处理机运行
独立性:不同进程的工作不互相影响
页表是保证进程独立性的重要机制,操作系统可以给不同的进程分配不同的页表,每个进程在独 立的一段空间运行保证独立性、正确性。
制约性:因访问共享数据/资源或进程间同步而产生制约,要同步互斥。
动态性、独立性、制约性
在这里插入图片描述

程序 = 算法 + 数据结构
进程控制块(process control block, PCB): 描述进程的数据结构,操作系统管理控制进程运行所用的信息集合。
操作系统为每个进程都维护了一个PCB,用来保存与该进程有关的各种状态信息,PCB是进程存在的唯一标识。

7.4 进程控制块PCB结构

进程控制块:操作系统管理控制进程运行所用的信息集合。
操作系统用PCB来描述进程的基本情况以及运行变化的过程,PCB是进程存在的唯一标志。

使用进程控制块
进程的创建:为该进程生成一个PCB;
进程的终止:回收它的PCB;
进程的组织管理:通过对PCB的组织管理来实现;

PCB含有以下三大类信息:
(一)进程标识信息。如本进程的标识,本进程的产生者标识(父进程标识); 用户标识。
***(二)处理机状态信息保存区。保存进程的运行现场信息: ***
用户可见寄存器,用户程序可以使用的数据,地址等寄存器。
控制和状态寄存器,如程序计数器(PC),程序状态字(PSW)。
栈指针,过程调用/系统调用/中断处理和返回时需要用到它。
(三)进程的控制信息
调度和状态信息:用于操作系统调度进程并占用处理机使用;
进程间通信信息:为支持进程间的与通信相关的各种标识,信号,信件等,这些信息存在接收方的PCB中;
存储管理信息:包含有指向本进程映像存储空间的数据结构;(代码数据都在内存中 怎么管理?)
进程所用资源:说明由进程打开,使用的系统资源,如打开的文件等;
有关数据结构等连接信息:进程可以连接到一个进程队列中,或连接到相关的其它进程的PCB。(父子进程)

PCB的组织方式
链表:统一状态的进程其PCB成一链表,多个状态对应多个不同的链表,各状态的进程形成不同的链表,例如就绪链表和阻塞链表(动态插入和删除 应用链表能更好的完成)
索引表:同一状态的进程归入一个index表(由index指向PCB),多个状态对应多个不同的index,各状态的进程形成不同的索引表,例如就绪索引表,阻塞索引表。(索引 数组的形式 开销大 但如果进程个数固定 没有频繁的创建删除 也不错)
在这里插入图片描述

7.5 进程的生命周期管理

进程创建-进程运行-进程等待-进程唤醒-进程结束

(1)进程创建
引起进程创建的三个主要事件:
系统初始化
用户请求创建一个新进程
正在运行的进程执行了创建进程的系统调用
(系统初始化时,创建INIT进程,INIT再负责创建其他进程;用户请求创建一个NEW PROCESS,正在运行的进程执行了创建进程的系统调用。 )
运行:内核选择一个就绪的进程,让它占用处理机(cpu)并执行
在这里插入图片描述
(2)进程等待
在以下情况中,进程等待(阻塞)
->请求并等待系统服务,无法马上完成;
->启动某种操作,无法马上完成;(和其他进程协调工作,由于其他进程无法立即运行)
->需要的数据没有到达。
在这里插入图片描述
(3)进程唤醒
唤醒进程的原因如下:
->被阻塞进程需要的资源可被满足;
->被阻塞进程等待的事件到达;
->将该进程的PCB插入到就绪队列中。
在这里插入图片描述
(4)进程结束
包括以下四种情形:
->正常退出(自愿)
->错误推出(自愿)
->致命错误(强制性)
->被其它进程所杀(强制性)
在这里插入图片描述

7.6 进程的状态变化模型

进程的三种基本状态:
进程在生命结束前处于且仅处于三种基本状态之一,不用系统设置的进程状态数目不同。

->运行状态(running):当一个进程正在处理机上运行时;
->就绪状态(ready):一个进程获得了除处理机之外的一切所需资源,一旦得到处理机即可运行;
->等待状态(或阻塞状态blocked):一个进程正在等待某一事件而暂停运行时的状态,如等待资源,等待I/O完成。
在这里插入图片描述
进程还有其它的基本状态,包括,

->创建状态(new),一个进程正在被创建,还没被转到就绪状态之前的状态。
->结束状态(exit),一个进程正在从系统中消失时的状态,这是因为进程结束或由于其它原因所导致。
在这里插入图片描述
可能的状态变化如下:
NULL→New: 一个新进程被产生出来执行一个程序。
New→Ready:当进程被创建完成并初始化后,一切就绪准备运行时,变为就绪状态。(是否会持续很久?不会 这是一个很快的过程)
Ready→Running:处于就绪状态的进程被进程调度程序选中后,就分配到处理机上来运行。.
Running→Exit: 当进程表示它已经完成或者因出错,当前运行进程会由操作系统作结束处理。
Running→Ready: 处于运行状态的进程在其运行过程中,由于分配给它的处理机时间片用完而让出处理机。(谁完成? OS)
Runing→Blocked:当进程请求某样东西且必须等待时。(例如?定时器等)
Blocked→Ready:当进程要等待某事件到来时,它从阻塞状态变到就绪状态。

7.7 进程挂起suspend

进程挂起是一种合理且充分地利用系统资源的方式。挂起时,进程没有占用内存空间,处于挂起状态的吧进程映像在磁盘上。
在这里插入图片描述
挂起就是把一个进程从内存转到外存。

挂起状态
阻塞挂起状态(blocked-suspend):进程在外存并等待某事件的出现
就绪挂起状态(ready-suspend):进程在外存,但只要进入内存,即可运行

与挂起相关的状态转换
●挂起(Suspend) :把一个进程从内存转到外存;可能有以下几种情况:
阻塞到阻塞挂起:没有进程处于就绪状态或就绪进程要求更多内存资源时,会进行这种转换,以提交新进程或运行就绪进程;
就绪到就绪挂起:当有高优先级阻塞(系统认为会很快就绪的)进程和低优先就绪进程时,系统会选择挂起低优先级就绪进程;
运行到就绪挂起:对抢先式分时系统,当有高优先级阻塞挂起进程因事件出现而进入就绪挂起时,系统可能会把运行进程转到就绪挂起状态;
●在外存时的状态转换: .
●阻塞挂起到就绪挂起:当有阻塞挂起进程因相关事件出现时,系统会把阻塞挂起进程转换为就绪挂起进程。

解挂/激活(activate):外存->内存
包括
就绪挂起->就绪:现在没有就绪进程;当前的 就绪挂起进程 的优先级高于 就绪进程;
阻塞挂起->阻塞:当一个进程释放足够的内存时,系统会把一个高优先级的 阻塞挂起进程(系统认为会很快出现所等待的事件发生) 转为阻塞进程。

从进程角度看待OS
用进程的观点来看待OS,OS包括 用户进程,磁盘管理进程,终端进程等;在这里插入图片描述
状态队列
由操作系统来维护-一组队列,用来表示系统当中所有进程的当前状态;
■不同的状态分别用不同的队列来表示(就绪队列、各种类型的阻塞队列) ;
■每个进程的PCB都根据它的状态加入到相应的队列当中,当一个进程的状态发生变化时,它的PCB从一个状态队列中脱离出来,加入到另外一个队列。
在这里插入图片描述

7.8 为什么使用线程

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如果CPU能力不够强,排在前面的函数太慢,各个函数之间不能并发,影响实现效率。
在这里插入图片描述
需要提出一种新的实体,满足以下特性:
(1)实体之间可以并发地执行;
(2)实体之间共享相同的地址空间:
就是线程 不像进程,需要OS帮助通信和交换信息。

7.9 线程的定义

在这里插入图片描述
执行功能交给了线程
线程=进程 - 共享资源
线程的优点:

–一个进程中可以同时存在多个线程;
–各个线程之间可以并发地执行 ;
–各个线程之间可以共享 地址空间和文件等资源。
线程的缺点:
–一个线程崩溃, 会导致其所属进程的所有线程崩溃。
在这里插入图片描述
在这里插入图片描述
线程与进程的比较
●进程是资源分配单位,线程是CPU调度单位:
●进程拥有一个完整的资源平台。 而线程只独享必不可少的资源。如寄存器和栈;
●线程同样具有就绪、阻塞和执行三种基本状态,同样具有状态之间的转换关系;
●线程能减少并发执行的时间和空间开销:
-线程的创建时间比进程短:
-线程的终止时间比进程短: .
-同一进程内的线程切换时间比进程短:
-由于同一进程的各线程间共事内存和文件资源, 可直接进行不通过内核的通信;(页表不需要切换 是共享的)

有适用性问题 什么时候适合用进程 什么时候适合用线程?
高性能 线程 互联网服务 进程 注重安全性 某一个网页崩溃不会影响其他的

7.10 线程的实现

有三种线程实现的方法,
用户线程:在用户空间实现,例如POSIX Pthreads, Mach C-threads, Solaris threads。
内核线程:在内核中实现,例如Windows, Solaris, Linux。
轻量级线程:在内核中实现,支持用户线程,例如Solaris。
在这里插入图片描述
(1)用户线程
在用户空间实现的线程机制,它不依赖于操作系统的内核,由一组用户级的线程库函数来完成线程的管理,包括进程的创建、终止、同步和调度等。
–由于用户线程的维护由相应进程来完成(通过线程库函数) .不需要操作系统内核了解用户线程的存在。可用于不支持线程技术的多进程操作系统:
–每个进程都需要它自己私有的线程控制块(TCB) 列表,用来跟踪记录它的各个线程的状态信息(PC.栈指针。寄存器),TCB由线程库函数来维护:
–用户线程的切换也是由线程库函数来完成,无需用户态/核心态切换,所以速度特别快;
–允评每个进程拥有自定义的线程调度算法。

缺点:

->如果一个线程发起系统调用而阻塞,则整个进程都在等待;(看不到用户线程 只能看到进程 所以线程阻塞 进程就阻塞)
->如果一个线程开始运行,除非它主动交出CPU,否则该线程所在进程的其它线程都无法运行;(主动交出使用权:用户态的线程库没办法主动打断用户线程的执行 但是操作系统有 操作系统会管理中断 时钟中断)
->由于时间片分配给的是进程,所以与其它进程相比,在多线程执行时,每个线程得到的时间片较少,执行会较慢。

在这里插入图片描述
(2)内核线程

是指在操作系统的内核当中实现的一种线程机制,由操作系统的内核来完成线程的创建、终止和管理。
●在支持内核线程的操作系统中,由内核来维护进程和线程的上下交信息(PCDHOTCB) ;
●线程的创建。终止和切换都是通过系统调用/内核函数的万式来进行。由内核来完成,因此系统开销较大;
●在一个进程当中,如果某个内核线程发起系统调用而被阻塞,并不会影响其他内核线程的运行;
●时间片分配给线程,多城程的进程获得更多CPU时间;
●Windowrs NT和Windors 200/P支持内核线程。
在这里插入图片描述
(3)轻量级进程(lightweight process)
他是内核支持的用户线程。一个进程可以有一个或多个轻量级进程,每个轻量级进程由一个单独的内核线程来支持(Solaris/Linux)。在这里插入图片描述

7.11 上下文切换

进程共享CPU,停止当前进程,并调度其他进程的切换叫做上下文切换。
上下文切换上停止当前运行的进程(从运行态改变成其它状态)并且调度其它进程(转变成运行态)。

->必须在切换之前储存许多部分的进程上下文;
->必须能够在之后恢复他们,所以进程不能显示它曾经被暂停过;
->必须快速(因为上下文切换非常频繁)。

上下文切换需要储存的内容:
->例如寄存器(PC/SP/…),CPU状态,…
->一些时候可能会费时,所以需要尽量避免。

进程执行中要关注寄存器,PC(进程执行到了什么地方),栈指针(调用关系,相应的局部变量位置)等。
这些信息要被保存到PCB中,进程挂起时要把PCB的这些值重置,恢复到寄存器中去,使接下来进程可以继续在CPU上执行。

上下文切换的开销越小越好,且所有信息都与硬件紧密相连,所以OS中实现是用汇编代码。

在这里插入图片描述
在这里插入图片描述
操作系统为活跃进程准备了进程控制块(PCB)
操作系统将进程控制块(PCB) 放置在一个合适的队列里
➢就绪队列.
➢等待I/0队列(每个设备的队列).
➢僵尸队列.

在这里插入图片描述
在这里插入图片描述

7.12.13创建加载执行进程

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
执行fork后将父进程的地址空间完全复制一份到子程序中 这是一个大量的拷贝,但在执行exec时之前的所有拷贝都没有用了,因为要去加载新的程序。
copy on write技术时仅复制了页表
当父进程或者子进程对某一个地址单元进行写操作时候会触发一个异常 是的将这个页复制成两份,进而使得二者有不同的地址了,实现了按需写的复制。

7.14等待和终止进程

在这里插入图片描述
父进程创建子进程之后 必须要等待子进程执行结束
程序退出后资源时被操作系统回收了,可操作系统还在完成推出的相关操作,PCB的回收很难完成。自身很难完成的可以交给父进程完成
在这里插入图片描述
exit执行完毕到wait执行完毕这段区间 叫僵尸状态
祖宗进程会定期的扫描 如发现僵尸进程 则代替其父进程将其清理
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值