【进程 & 线程】学习基础知识(概念、状态、控制、比较、调度算法)

1. 进程与线程的概念

1.1 基础概念

  • 进程:是系统进行资源分配与调度的基本单位,是系统中并发执行的单位。
  • 线程:是进程的一个实体,是CPU调度与分派的基本单位。是比进程更小的能够独立运行的单位,有时被称为轻量级进程。
  • 进程是资源分配的最小单位,线程是CPU调度的最小单位。
  • 不同进程地址空间相互独立,同一进程内的线程共享同意地址空间。一个进程的线程在另外一个进程是不可见的。
  • 进程间不会相互影响,但是一个线程崩溃可能导致整个进程崩溃。
  • 创建进程或撤销进程,系统都会给进程分配或回收资源,操作系统的开销远大于线程的创建和撤销。

举例:

计算机中的核心是 CPU ,说它是我们的大脑一点不为过。在此用一个连锁火锅店举例,因为疫情的影响,今天到目前营业额一般,只好开一家店,其他疫情较为严重的店只好先关闭,这里涉及的含义:单个 CPU 一次只运行一个任务。进程就类似这家火锅店,它代表 CPU 所能处理的单个任务,其他地方火锅店只能处于非运行状态。

一个火锅店有很多服务员,一起协同工作,将火锅店做的红红火火,那么线程就好比这些服务员,一个进程可有多个线程

火锅店各个工作房间是共享的,所有服务员都可以进出,这意味着进程的内存空间共享,每个线程都可以使用这些共享内存。但是不是每个房间都可以容纳相同的人数,比如卫生间就只有一个人,其他人不能同时进去。这意味着一个线程在使用共享内存的时候,其他线程需要等待结束才能使用这块内存。那怎么防止别人进入呢?很直接的办法就是进去之后记得关门(上锁),上了锁,其他人想进来发现是上锁了,那就等锁打开后再进去,这就叫做互斥锁,防止多个线程同时读写某一块内存区域。

另外:

  • 如果以多进程的方式运行,那么允许多个任务同时进行。
  • 如果以多线程的方式运行,那么允许将一个任务拆分成不同的部分运行。
  • 为了防止进程/线程之间产生冲突和允许进程之间的共享资源,需要提供协调机制。

1.2 并发和并行

  • 并发:在一个时间段多个程序都启动运行在同一个处理机中。
  • 并行:假设目前有A、B两个进程,分别在不同的cpu管理执行,两个进程不抢占CPU资源且可以同时运行,这叫做并行。

在这里插入图片描述

如果是单核 CPU ,在我们看来这些事儿是同时发生的,其实那是因为底层 CPU 切换的速度太快以致于我们完全感受不到它的切换,仅此为错觉而已。

但是如果是多核 CPU ,各个 CPU 负责不同的进程,各个进程不抢占 CPU ,这样同时进行,这就是真正意义上的并行。

1.3 同步和异步

  • 同步:当一个同步调用发出后,调用者要一直等待返回结果。通知后,才能进行后续的执行。
  • 异步:当一个异步过程调用发出后,调用者不能立即返回结果。当调用的部件处理完成后,通过状态、通知来通知调用者。

2. 进程

2.1 进程的状态

一个进程的活动期间至少具备三种状态:就绪、运行、阻塞。

在这里插入图片描述

就绪状态:可运行,因为其他进程正在运行而停止。
运行状态:占用CPU正在运行。
阻塞状态:该进程正在等待某一事件发生(如等待输入/输出操作的完成)而暂时停止运行,这时,即使给它CPU控制权,它也无法运行

  1. 就绪 --> 运行

准备就绪,被操作系统的进程调度器选中之后,分配CPU开始运行。

  1. 运行 --> 阻塞

当进程提出某种请求且必须等待资源的情况下,例如I/O请求。

  1. 阻塞 --> 就绪

当进程所等待的时间完成,就从阻塞变为就绪。

  1. 运行 --> 就绪

处于运行中的进程,由于分配给他的时间片用完,所以回到就绪状态暂停执行,再从就绪状态中挑选别的进程执行。

linux下进程的状态:https://editor.csdn.net/md/?articleId=107811301

2.2 进程的描述

在操作系统中,使用进程控制块(PCB)数据结构来描述进程。是进程存在的唯一标识。意味着一个进程的存在,必然会有一个PCB,进程消失,PCB随之消失。

PCB包含的信息

  • 进程描述信息
  1. 进程标识符:标识每个进程,唯一标识符。
  2. 用户标识符:进程归属的用户,主要为共享和保护服务。
  • 进程控制和管理信息
  1. 进程的当前状态:如new、ready、running、waiting等。
  2. 进程的优先级:进程抢占CPU时的优先级。
  • 资源分配清单
  1. 有关内存地址空间或者虚拟地址空间信息,所打开的文件列表和I/O设备信息。
  • CPU相关信息
  1. CPU各个寄存器的值,当进程被切换时,CPU的状态信息会保存在PCB中,以便重新执行,能从断点处继续。

PCB组织方式

通常是通过链表进行组织,将相同状态的进程连在一起,组成各种队列。比如:

将所有处于就绪状态的进程链在一起,称为就绪队列;

把所有因等待某事件而处于等待状态的进程链在一起就组成各种阻塞队列;

2.3 进程控制

  1. 创建进程

函数fork,从已存在进程中创建一个新的进程。原进程为父进程,新进程为子进程。

过程:

  • 为新进程分配一个唯一的进程标识符,申请一个新的PCB,若申请失败则创建失败。
  • 为进程分配资源,如果资源不足,就会进入等待状态,以等待资源。
  • 初始化PCB。
  • 将进程插入到就绪队列,等待被调度运行。
  1. 终止进程

正常结束、异常结束和外界干预(信号kill掉)

正常退出: 1. 从main返回;2. 调用exit;3. _exit
异常退出: ctrl + c,信号终止

过程:

  • 查找需要终止的进程的PCB
  • 如果处于执行状态,立即终止该进程的执行,将CPU资源分配给其他的进程。
  • 如果还有其他子进程,将子进程终止。
  • 将该进程所有的资源归还给父进程或者操作系统。
  • 将该PCB从队列中删除。
  1. 阻塞进程

当进程需要等待某一件事情完成时,可以调用阻塞语句将自己阻塞等待。一旦被阻塞等待,只能由其他进程唤醒。

过程:

  • 找到将要被阻塞进程标志号对应的PCB。
  • 如果正在执行,停止运行,将其转换为阻塞状态。
  • 将该PCB插入阻塞队列中。
  1. 唤醒进程

进程由执行变为阻塞的原因是 要等待某一件事情的完成,所以自己无法唤醒自己。

如果某进程正在等待I/O事件,需由别的进程发消息给它,则只有当该进程所期待的事情发生后,才由发现者进程唤醒它。

过程:

  • 在阻塞队列中找到相应进程的PCB。
  • 将其从阻塞队列移除,转换为就绪状态。
  • 将PCB插入就绪队列中,等待调度程序调度。

3. 线程 **

3.1 为什么使用线程

为了提高系统的资源利用率吞吐量

对于单进程的方式:各个函数之间不是并发执行,影响资源的使用效率;进程如果在执行的过程中被阻塞,那么它将被挂起,进程终有些等待的资源得不到执行。

对于多进程的方式:进程之间如何通信是个问题;维护进程的开销较大,创建和终止进程都需要分配和回收资源;进程切换时,需要保存当前的状态信息。

基于以上的缺点,引入了更小的独立运行单位:线程

线程可以:

  • 实体之间并发运行;
  • 实体之间共享相同的地址空间。

3.2 线程的优缺点

线程是进程当中的一条执行流

同一个进程内的线程,共享进程的代码段、数据段、打开的文件资源等。但每个线程都有自己独立的寄存器和栈,确保线程的控制流是相对独立的。

优点

  • 一个进程内可以同时存在多个线程
  • 各个线程之间并发执行
  • 各个线程之间可以共享地址空间和文件等资源

缺点

  • 当进程中的一个线程崩溃时,会导致其所属的所有线程崩溃。

举个例子,对于游戏的用户设计,则不应该使用多线程的方式,否则一个用户挂了,会影响其他同个进程的线程。

3.3 进程与线程的比较 !!!

  • 进程是资源分配的最小单位,线程是CPU调度的最小单位。
  • 进程拥有完整的资源平台,线程只独有必不可少的资源,如寄存器和栈。
  • 线程与进程同样拥有就绪、执行、阻塞三种状态及转换关系。
  • 线程能减少并发执行的时间和空间开销。

线程比进程减少开销,体现在以下方面:

  • 在同一进程中,线程的切换不会引起进程的切换,在由一个进程中的线程切换到另一个进程中的线程时,将会引起进程的切换。
  • 由于在创建或撤消进程时,系统都要为之分配或回收资源,如内存空间、I/o设备等。因此,操作系统所付出的开销将显著地大于在创建或撤消线程时的开销。
  • 在进行进程切换时,涉及到整个当前进程CPU环境的保存以及新被调度运行的进程的CPU环境的设置。而线程切换只须保存和设置少量寄存器的内容,并 不涉及存储器管理方面的操作。
  • 线程的终止比进程快,因为释放的资源比进程少很多。

4. 调度算法

调度算法是指:调度程序是内核的重要组成部分,决定下一个要运行的程序。是根据系统分配资源策略所规定的调度算法。

  1. 先来先服务调度算法(FCFS):

相当于队列的先进先出特性,每一次调度都从队列中选择最先进入队列的投入运行,直到进程退出或被阻塞。(非抢占式)

适用于CPU繁忙作业的系统,不适用于I/O繁忙型作业系统。。对长作业有利,对后面等待的短作业不利。

  1. 最短作业优先(SJF):

优先选择运行时间最短的进程来运行,有助于提高系统的吞吐量。

对长作业不利。例如,一个就绪队列有很多短作业,一个长作业有可能长期不会被运行,一直在等待。

  1. 高响应比优先(HRRN):

每次调度时,先计算相应比优先级,将相应比优先级最高的进程投入运行。

在这里插入图片描述

  • 如果两个进程的等待时间一样,那么要求服务时间越短优先权越高,这样短作业容易被选中。
  • 如果要求服务时间一样,那么等待时间越长,相应比越高。这样也兼顾了等待时间较长的长作业。
  1. 时间片轮转调度算法(RR):

每个进程都被分配一个时间段,就是时间片,即允许在该时间段内运行。

如果时间片用完,该进程还在运行,那么将会把此进程从CPU释放出来,并把CPU分配给另外一个进程。

如果在时间片结束前结束或阻塞,则将CPU立即切换。

关键点:

如果时间片分配的太长引起短作业响应时间变长,如果太短导致过多的进程上下文切换,降低CPU效率。

通常将时间片设为20ms~50ms

  1. 最高优先级调度算法(HPF):

从就绪队列中选择优先级最高的进程运行。

进程的优先级分为:

  • 静态优先级,在进程创建的时候就已经确定,并且不会改变。
  • 动态优先级,根据进程的动态变化调整优先级,比如进程的运行时间增加,则降低优先级;等待时间增加,则降低优先级。

处理优先级的办法:

  • 非抢占式:当就绪队列中出现较高优先级的进程,运行完当前进程,再选择优先级较高的进程。
  • 抢占式:当出现较高优先级的进程,立即挂起当前进程,调度优先级高的进程运行。

缺点:

有可能优先级低的进程永远不会被调度。

  1. 多级反馈队列调度算法
  • 设置多个队列,每个队列的优先级从高到低,优先级越高时间片越小。
  • 新进程被放进第一队列的末尾,按先来先服务等待被调度。如果在第一队列的时间片内没运行完成,则加入第二队列的末尾,以此类推。
  • 当较高优先级的队列为空,才调度低优先级的队列。如果运行中,有新进程进入较高队列,则停止当前进程并将其移动到原队列的末尾,接着让较高优先级的进程队列。
©️2020 CSDN 皮肤主题: 1024 设计师:上身试试 返回首页