进程与线程

进程

进程的组成

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

进程与程序的联系

  • 程序是产生进程的基础
  • 程序的每次运行构成不同的进程(因为参数等的不不同)
  • 进程是程序功能的体现
  • 通过多次1运行,一个程序可对应多个进程;通过调用关系,一个进程可包括多个程序。

进程与程序的区别

  • 进程是动态的,程序是静态的:程序是有序代码的集合;进程是程序的执行,进程有核心态/用户态
  • 进程是暂时的,程序是永久的:进程是一个状态变化的过程,程序可长久保存
  • 进程与程序的组成不同:进程的组成包括程序,数据和进程控制块(进程的状态信息)

进程的特点

  • 动态性:可动态的创建,结束进程
  • 并发性:进程可以被独立调度并占用处理机运行
  • 独立性:不同进程的工作不互相影响
  • 制约性:因访问共享数据/资源或进程间同步而产生制约
  • 程序=算法+数据结构
  • 进程快(process control block,PCB):描述进程的数据结构,操作系统管理控制进程运行所用的信息集合。
  • 操作系统为每个进程维护了一个
  • PCB,用来保存与该进程有关的各种状态信息,PCB是进程存在的唯一标志。

进程控制块PCB结构

为了实现进程模型,操作系统维护着一张表格(一个结构数组),即进程表(process table)。每个进程占用一个进程表项。(有些person称这些表项为进程控制块PCB)
PCB包含下列三大信息

1.进程标识信息

如进程的标识,本进程的产生者标识(父进程标识);用户标识

2.处理机状态信息保存区,保存进程的运行现场信息
  • 用户可见寄存器,用户程序可以使用的数据,地址等寄存器
  • 控制和状态寄存器,如程序寄存器(PC),程序状态字(PSW)
  • 栈指针,过程调用/系统调用/中断处理和返回时需要用到它
3.进程的控制信息

调度和状态信息:用于操作系统调度进程并占用处理机使用;
进程间通信信息:为支持进程间的与通信相关的各种标识,信号,信件等,这些信息存在接收方的PCB中;
存储管理信息:包含有指向本进程映像存储空间的数据结构;
进程所用资源:说明由进程打开,使用的系统资源,如打开的文件等;
有关数据结构等连接信息:进程可以连接到一个进程队列中,或连接到相关的其它进程的PCB。

4.PCB的组织方式

链表:统一状态的进程其PCB成一链表,多个状态对应多个不同的链表,各状态的进程形成不同的链表,例如就绪链表和阻塞链表
索引表:同一状态的进程归入一个index表(由index指向PCB),多个状态对应多个不同的index,各状态的进程形成不同的索引表,例如就绪索引表,阻塞索引表。
请添加图片描述

进程的生命周期管理

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

1.进程的创建

一下四种主要事件会导致进程的创建:

  • 系统初始化
  • 正在运行的程序执行了创建进程的系统调用
  • 用户请求创建一个新进程
  • 一个批处理作业的初始化
2.进程等待

在一下情况中,进程等待(阻塞)

  • 请求并等待系统服务,无法马上完成;
  • 启动某种操作,无法马上完成;
  • 需要的数据没有到达。
    进程只能自己阻塞自己,因为只有进程自身才能知道何时需要等待某种事件的发生
3.进程唤醒

唤醒的原因如下:

  • 被阻塞进程需要的资源可被满足;
  • 被阻塞进程等待的事件到达;
  • 将该进程的PCB插入到就绪队列中。
    进程只能被别的进程或操作系统唤醒。
4.进程的终止

进程终止通常由下列条件引起:

  • 正常退出(自愿的)(大多数)
  • 出错退出(自愿的)
  • 严重错误(非自愿)
  • 被其他进程杀死(非自愿)

进程的状态变化模型

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

  • 运行状态(running):当一个进程正在处理机上运行时;
  • 就绪状态(ready):一个进程获得了除了处理机之外的一切所需资源,一旦得到处理机即可运行;
  • 等待状态(或阻塞状态blocked):一个进程正在等待某一事件而暂停运行的状态,如等待资源,等待I/O完成。
  • 请添加图片描述
    进程还有其他的基本状态,包括,
  • 创建状态(new),一个进程正在被创建,还没被转到就绪状态之前的状态。
  • 结束状态(exit),一个进程正在从系统中消失的状态,这是因为进程结束或由于其它原因所导致。
    请添加图片描述
    可能的状态变化
    请添加图片描述

进程挂起suspend

1.进程挂起是一种合理且充分地利用系统资源地方式。挂起时,进程没有占用内存空间,处于挂起状态地进程映射在磁盘上。

请添加图片描述
挂起就是把一个进程从内存转到外存

2.挂起状态

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

(1).挂起:内存->外存
  • 阻塞->阻塞挂起:没有进程处于就绪状态;或者就绪进程需要更多地内存资源;
  • 就绪->就绪挂起:当高优先级阻塞(系统认为会很块就绪地)进程和低优先级就绪进程冲突时,系统会挂起低优先级就绪进程;
  • 运行->就绪挂起:对于抢先是分时系统,当有高优先级阻塞进程挂起进程因为事件而变成就绪挂起进程时,系统可能会把正在运行地进程转到就绪挂起状态。
(2)在外存中的状态
  • 阻塞挂起->就绪挂起:当阻塞挂起的进程因为相关事件出现时,系统会把阻塞挂起进程转化为就绪挂起进程状态。
(3)解挂/激活(active):外存->内存
  • 就绪挂起->就绪:现在没有就绪进程;当前的就绪挂起进程的优先级高于就绪进程;
  • 阻塞挂起->阻塞:当一个进程释放足够的内存时,系统会把一个高优先级的阻塞挂起进程(系统认为会很块出现所等待的事件发生)转为阻塞进程。
3.从进程角度看待OS

用进程的观点来看待OS,OS包括用户进程,磁盘管理进程,中断进程等;
请添加图片描述
以进程为基本结构的OS包括:
最底层scheduler为CPU的调度程序(包括中断处理等);
上面一层为一组各式各样的进程。

4.状态队列
  • 状态队列是由操作系统来维护的一组队列,用来表示系统当中所有进程的当前状态;
  • 不同的状态分别用不同的队列来表示(就绪队列,各种类型的阻塞队列);
  • 每个进程的PCB都根据它的状态加入到相应的队列当中,当一个进程的状态发生变化时,它的PCB从一个状态队列中脱离,加入到另一个状态队列里。
  • 请添加图片描述
4.*进程的Fork()和Evec()和Exit()
  • Exec()调用允许一个进程“加载”一个不同的程序并且在main开始执行(事实上 _start)
  • 它允许一个进程指定参数的数量(argc)和它字符串参数数组(argv)
  • 如果调用成功:它是相同的进程…,但是它运行了一个不同的程序!!
  • 代码,stack(栈)&heap(堆)重写

wait()系统调用及作用
exit()系统调用的作用:
exit()
加入僵尸进程之后进程状态图:
加入僵尸进程之后的流程图

线程

为什么使用线程

例子一:如一个有三个线程的字处理软件:

  • 一个线程用于后台格式处理
  • 一个线程与用户交互
  • 一个线程处理磁盘备份

例子二:在这里插入图片描述

单线程方案

在这里插入图片描述

多线程方案

在这里插入图片描述
因此,需要满足:实体间能够并发地执行;实体之间共享相同的地址空间。->线程

线程的定义

在这里插入图片描述
进程 = 资源管理 + 线程

线程所需的资源:

在这里插入图片描述

线程与进程的比较
  • 线程是资源分配的单位,线程是CPU调度单位;
  • 进程拥有完整的资源平台,而线程只占有必须的资源,如寄存器,栈。
  • 线程同样由就绪,阻塞,执行三种基本状态,同样具有状态之间的转换关系。
  • 线程能减少并发执行的时间和空间开销:(线程的创建时间/终止时间/(同一进程内)切换时间更小;同一进程内各线程共享内存和文件资源,可直接进行不通过内核的通信)。

线程的实现

有三种线程实现的方法,

  • 用户线程:在用户空间实现,例如POSIX Pthreads,Mach C-trreads,Solaris threads。
  • 内核线程:内核中实现,例如Windows,Solaris,LInux
  • 轻量级进程:在内核中实现,支持用户线程,例如Solaris
    在这里插入图片描述
1.用户线程
  • 在用户空间实现的线程机制,不依赖于操作系统的内核;
  • 由一组用户级的线程库来完成线程的管理,包括创建/终止/同步/调度;
    - 在用户空间管理线程时,每个进程需要有其专用的线程表(thread table),用来跟踪该进程中的线程。这些表和内核中的进程表类似,不过它仅仅记录各个线程的属性,如每个线程的程序寄存器,堆栈指针,寄存器和状态等。

- 所有的这类实现都有同样的通用结构如下图(61p),线程在一个运行时系统的上层运行,该运行时系统是一个管理线程的过程集合。
在这里插入图片描述

优点:

  • 不需要操作系统内核了解用户线程的存在,可用于不支持线程技术的多进程操作系统;
  • 每个进程都需要它私有的线程控制块TCB列表,来跟踪记录它各个线程的状态信息(PC/栈指针/寄存器),TCB由线程库函数来维护;
  • 用户线程的切换由线程库函数实现,无需用户态/核心态切换,所以速度块;
  • 允许每个进程有自定义的线程调度算法。

缺点

  • 如果一个线程发起系统调用阻塞,则整个进程都在等待;
  • 如果一个线程开始运行,除非它主动交出CPU,否则该线程所在进程的其他线程得到的时间片较少,执行会较慢。
2.内核线程

是指在操作系统的内核中实现的一种线程机制,由操作系统的内核来完成线程的创建,终止和管理。

  • 由内核维护进程和上下文信息,也就是进程/线程控制块PCB/TCB;
  • 线程的创建/终止/切换都是通过系统调用或内核函数来实现(内核实现),所以系统开销大;
  • 在一个进程中,如果某个内核线程发起系统调用而阻塞,不会影响其它内核线程的运行;
  • 时间片分配给线程,多线程的进程能获得更多的CPU时间;
  • Windows NT/2000/XP 支持内核线程。
    在这里插入图片描述
3.轻量级进程(lightweight process)

他是内核支持的用户线程。一个进程可以有一个或多个轻量级进程,每个轻量级进程由一个单独的内核线程来支持(Solaris/Linux)。
在这里插入图片描述

上下文切换

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

  • 必须在切换之前储存许多部分的进程上下文;
  • 必须能够在之后恢复他们,所以进程不能显示它曾经被暂停过;
  • 必须快速(因为上下文切换非常频繁)。
上下文需要存储的内容:
  • 例如寄存器(PC/SP/…),CPU状态,…
  • 一些时候可能会费时,所以需要尽量避免。
    在这里插入图片描述
  • 操作系统为活跃进程准备了PCB;
  • 操作系统将PCB放置到一个合适的队列里。
    在这里插入图片描述
    来源:现代操作系统和清华大学网课:连接如下(https://www.bilibili.com/video/BV1uW411f72n/?spm_id_from=333.337.search-card.all.click&vd_source=8ccbc9751c5ed620529749d5cee5cf80)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值