【重难点】【操作系统 01】进程与程序有何区别、进程与线程有何区别、进程有哪几种状态、进程调度方法、保持进程同步的方法、如何解决临界区冲突

【重难点】【操作系统 01】进程与程序有何区别、进程与线程有何区别、进程有哪几种状态、进程调度方法、保持进程同步的方法、如何解决临界区冲突

一、进程与程序有何区别

程序的定义

程序是静态实体,是计算机指令的集合,它以文件的形式存储在磁盘上

进程的定义

进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位。操作系统引入进程的目的是为了提高 CPU 的执行效率,为了避免因等待而造成 CPU 空转以及其它计算机硬件资源的浪费

程序和进程的对比

  1. 程序不能申请系统资源,不能被系统调度,也不能作为独立运行的单位;进程是资源申请、调度和独立运行的单位
  2. 程序作为一个静态文件存储在计算机系统的硬盘等存储空间中;而进程则是处于动态条件下由操作系统维护的系统资源管理实体

二、进程与线程有何区别

线程的定义

线程是操作系统能够进行运算调度的最小单位。大部分情况下,它被包含在进程中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。同一进程中的多条线程共享该进程中的全部系统资源,如虚拟地址空间、文件描述符和信号处理等等。但同一进程中的多个线程有各自的调用栈、寄存器环境和线程本地存储。一个没有线程的进程可以看作是单线程的,同样线程也经常被看作是一种轻量级的进程。操作系统引入线程的目的是为了减少进程切换和创建的开销,举一个例子,有一个 Web 服务器需要进程以并发的方式处理来自不同用户的网页访问请求,可以通过创建父进程和多个子进程的方式来进行处理,但是创建一个进程要花费较大的系统开销和占用较多的资源。此外,这些不同的用户子进程在执行的时候涉及到进程上下文切换,上下文切换是一个复杂的过程。所以,为了减少进程切换和创建的开销,提高执行效率和节省资源,人们在操作系统中引入了线程的概念

进程与线程的对比

  1. 进程可以没有线程;而线程必须依赖进程存在
  2. 进程是并发程序在一个数据集合上的一次执行过程,进程是系统进行资源分配和调度的独立单位;线程是进程的实体,它是比进程更小的、能够独立执行的基本单元,线程自己不拥有任何系统资源,但是可以访问其隶属进程的全部资源
  3. 进程有自己的控制表 PCB;线程也有自己的控制表 TCB,但是 TCB 中所保存的线程状态比 PCB 少得多

三、进程有哪几种状态

进程一共有 5 种状态,分别是创建、就绪、执行、终止、阻塞

  • 运行状态就是进程正在 CPU 上运行
  • 就绪状态就是说进程已处于准备运行的状态,即进程获得了除 CPU 之外的一切所需资源,一旦得到 CPU 就可以运行
  • 阻塞状态就是进程正在等待某一事件而暂停运行,即使 CPU 空闲,该进程也不能运行,比如等待某资源为可用或等待 I/O 完成。
    在这里插入图片描述
  • 运行态→阻塞态:往往是由于等待 I/O、主存分配或等待人工操作而引起的
  • 阻塞态→就绪态:导致阻塞的原因已解决,一旦得到 CPU 就可以运行
  • 运行态→就绪态:不是由于自身原因,而是外界原因导致处于运行态的进程让出 CPU,例如时间片用完,或者被更高优先级的进程抢占 CPU
  • 就绪态→运行态:系统按某种策略选中就绪队列中的一个进程使用 CPU

四、进程调度算法

1.调度的概念

当 CPU 有一堆任务要处理时,由于其资源优先,这些事情就没有办法同时处理。这就需要确定某种规则来决定处理这些任务的顺序,这就是 “调度” 研究的问题

所谓的进程调度,就是从进程的就绪队列(阻塞)中按照一定的算法选择一个进程并将 CPU 分配给它运行,以实现进程的并发执行,这是操作系统中最基本的一种调度,在一般的操作系统中都必须配置进程调度。进程调度的频率很高,一般几十毫秒一次

进程调度算法分为三类:非抢占式进程调度算法、抢占式进程调度算法、最高优先级调度算法

2.非抢占式进程调度算法

所谓非抢占式的意思就是,当进程正在运行时,它就会一直运行,直到该进程完成或发生某个事件而被阻塞时,才会把 CPU 让给其它进程

先来先服务 FCFS

先来先服务(First Come First Serve),按照进程到达的先后顺序进行调度,先到的进程就先被调度,或者说,当前等待时间越久的越先得到服务

FCFS 公平、实现简单,但是对短进程不利,排在长进程后面的短进程需要等待很长时间,短进程的响应时间太长了,用户交互体验会变差

最短作业优先 SJF

最短作业优先(Shortest Job First),每次调度时选择当前已到达的、且运行时间最短的进程

SJF 和 FCFS 恰好相反,FCFS 对短进程不利,而 SJF 对长进程不利,因为如果一直有短进程进来,那么长进程永远得不到调度

高响应比优先 HRRN

高响应比优先(Highest Response Ratio Next),只有当前运行的进程主动放弃 CPU 时(正常/异常完成或主动阻塞),才需要进行调度,调度时计算所有就绪进程的响应比,为响应比最高的进程分配 CPU。响应比 = (进程的等待时间 + 进程需要的运行时间)/ 进程需要的运行时间

HRRN 同时考虑每个作业的等待时间长短和预估需要的执行时间长短,从中选出响应比最高的作业执行。这样,即使是长作业,随着它等待时间的增加,响应比也随之增加,也就有机会获得调度执行。但是由于每次调度前都要计算响应比,系统开销也会相应增加

3.抢占式进程调度算法

抢占式就是指当前进程在运行时可以被打断

最短剩余时间优先 SRTN

最短剩余时间优先(Shortest Remaining Time Next),当一个新的进程到达时,把它所需要的整个运行时间与当前进程的剩余运行时间作比较。如果新的进程需要的时间更少,则挂起当前进程,运行新的进程,否则新的进程等待

SJF 的抢占式版本,比 SJF 稍微公平一点,如果当前进程即将完成,那么即使不断进来短进程,还是有很大概率优先级比短进程高,不会长时间得不到调度

轮转调度 RR

轮转调度(Round-Robin),也称时间片调度算法,调度程序每次把 CPU 分给就绪队列的第一个进程,并规定固定的使用时间,成为时间片,通常为 10ms ~ 200ms。就绪队列中的每个进程轮流地运行一个时间片,当时间片耗尽时就强迫当前运行进程让出 CPU 资源,转而排到就绪队列尾部,等待下一轮调度

需要注意的是,时间片的长度是一个很关键的因素:

  • 如果时间片设置得太短,就会导致频繁的进程上下文切换,降低了 CPU 效率
  • 如果时间片设置得太长,那么随着就绪队列中进程数目的增加,轮转一次消耗的总时间加长,即每个进程的响应速度变慢。当时间片大到足以让进程完成其所有任务,RR 便退化为 FCFS

RR 对每个进程都一视同仁,如果用户进程太多,可能会导致内核的服务进程响应跟不上。而在操作系统中,内核进程是比用户进程重要得多的,毕竟它关乎整个系统的稳定性

4.最高优先级调度算法

最高优先级优先 HPF

最高优先级优先(Highest Priority First),就是从就绪队列中选择最高优先级的进程执行。进程优先级分为静态优先级和动态优先级:

  • 静态优先级:创建进程时,就预先规定优先级,并且整个运行过程中该进程的优先级都不会发生变化。一般来说,内核进程的优先级都是高于用户进程的
  • 动态优先级:根据进程的动态变化调整优先级,比如随着进程的运行时间增加,适当地降低其优先级。随着就绪队列中进程的等待时间增加,其优先级也会适当地被提高

另外需要注意的是,HPF 并非是固定的抢占式或非抢占式策略,系统可预先规定使用哪种策略:

  • 非抢占式:当就绪队列中出现优先级高的进程,则运行完当前进程后,再选择该优先级高的进程
  • 抢占式:当就绪队列中出现优先级高的进程,则立即强制剥夺当前运行进程的 CPU 资源,分配给优先级更高的进程运行

五、保持进程同步的方法

进程同步就是控制多个进程按一定顺序执行,而进程间通信(IPC)是在进程间传输信息。它们之间的关系是:进程通信是一种手段,而进程同步是一种目的,为了能够达到进程同步的目的,需要让进程进行通信,传输一些进程同步所需要的信息

保持进程同步的方法也就是进程间的通信方式,常用的进程间通信方式有管道、共享内存、消息队列、信号量和套接字

管道

管道分为命名管道和匿名管道,命名管道可以用于两个以上的进程间通信,匿名管道则只能用于有血缘关系(父子进程、兄弟进程、爷孙进程等)的进程间通信。Linux 中的 “|” 命令就是匿名管道,表示把一个进程的输出作为另一个进程的输入。管道就是内核里的一段缓存,从管道一端写入的数据实际上是缓存在内核种,从另一端读取也就是从内核中读取这段数据。管道是半双工的,数据只能向一个方向流动,双方需要互相通信时,需要建立起两个管道

共享内存

共享内存就是映射一段能被其它线程访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的一种程间通信方式,因为没有内存拷贝的操作,但需要依靠互斥锁或信号量来实现同步

信号

信号是 LInux 系统中的进程间通信方式,信号可以在任何时候发给某一进程,用于通知该进程某个事件已经发生。比如 kill -9 命令就可以向指定的进程发送一个终止信号从而杀死进程

信号量

信号量本质就是一个计数器,记录资源能被多少个进程同时访问,用来实现进程之间的互斥与同步,信号量的引入是为了解决共享内存通信方式造成的进场安全问题

消息队列

多个不相干的进程可以通过一个消息队列来传递数据,且传递的是一个有意义的数据结构,而管道只能传递没有意义的字节流,还需在再接收端做解析。消息队列和管道一样是有一个 buffer size 限制的,当 buffer size 为空或为满的时候,send 和 receive 会 sleep

消息队列的目的是提供高于一般速度的进程间通信方式,但现在与其它形式的程间通信相比,速度方面已经没有什么差别,在考虑到使用消息队列时遇到的问题,在新的应用程序中不应当再使用它们

套接字

可用于不同主机之间的进程间通信

六、如何解决临界区冲突

临界资源

临界资源是一次仅允许一个进程使用的共享资源。属于临界资源的硬件比如打印机,软件比如消息队列。进程间采取互斥方式实现这种资源的共享

临界区

每个进程中访问临界资源的那段程序称为临界区

解决临界区冲突的方法:

  1. 如果有若干进程要求进入空闲的临界区,一次仅允许一个进程进入
  2. 任何时候,处于临界区内的进程不可多于一个。如果已有进程进入自己的临界区,则其它所有试图进入临界区的进程必须等待
  3. 进入临界区的进程要在有限时间内退出,以便其它进程能及时进入自己的临界区
  4. 如果进程不能进入自己的临界区,则应让出 CPU,避免进程出现 “忙等” 现象
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

313YPHU3

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值