【Linux的进程管理】

Linux的进程

一个二进制的可执行文件,在操作系统中可以运行起来,就需要申请资源,以进程为实体在操作系统中进行各种状态的变化。操作系统为程序申请资源,有文件描述符集,内存,信号集,页表,cpu资源。进程就是可执行二进制文件&内核数据结构然后再操作系统的资源下的一个状态会发生变化的实体,也是操作系统分配资源的最小单位。程序先加载至内存,然后操作系统为其创建进程。

进程的管理

内核需要对每一个进程都要有了解,所以需要对进程进行管理,由进程控制块PCB管理,实质上是对进程属性集合的描述。在Linux中是由一个task_struct的结构体类型进行管理,一个task_struct就是一个进程的描述。一个task_struct内会有许多的属性,有当前该进程的唯一标识ID,操作系统为该进程创建为模板的父进程ID,当前任务的状态,文件描述符集合,进程地址空间,内存空间,信号集等一些重要属性。为了让操作系统更好的对这些进程进行管理,使用链表的数据结构对这些进程控制块task_struct进行管理。然后每个进程都会有一个指向下一个进程的指针。

task_struct组织管理进程
在这里插入图片描述
链表数据结构进行对task_struct进行管理。
在这里插入图片描述

进程的状态

有运行状态,阻塞状态,结束状态。
运行状态的进程会有两种情况,被CPU调度和准备被CPU调度,因为一个CPU只能调度一个进程,有些进程虽然资源准备就绪,但是因为自身进程优先级的原因,就会导致资源已经就绪了,但还没有被调度,只能等上一个进程完成后,才能进行调度,因为就绪的进程实质上就差被CPU调度了,使用它也可以是运行状态的。进程时间片用完以后,如果进程没有接受,且协其他的资源也没有缺少,就从运行状态转变为就绪状态。

阻塞状态 有可中断和不可中断这两种。可中断状态时,进程会休眠,当某个条件满足时,就会成为就绪状态,被CPU调度,条件可能时硬件的信号或者系统的资源。
不可中断状态 是指进程正在等待某些硬件操作完成,且这个等待过程不允许被中断。一旦进程进入不可中断状态,它将无法被任何信号或中断唤醒,直到等待的硬件操作完成。尽管进程处于等待状态,但它仍然占用一定的系统资源,如CPU时间片(尽管实际上并不执行任何操作)和进程表项。

结束状态 进程释放他之前申请的资源,返回给操作系统。

阻塞进程多了,就使用挂起状态,当阻塞的进程多路,就会占用物理内存,就会将这些进程置换到磁盘当中,腾出内存供其他的进程进行使用。

不同状态的进程由不同的功能的链表进行管理

操作系统为了更高效率的调度处于运行状态的进程,会使用一个就绪队列的链表将就绪态的进程进行管理,操作系统直接调度进行队列的进程即可()。
需要等待资源的进程就使用一个阻塞队列的链表(wait_queue)进行管理,当阻塞的进程资源准备好了或者事件完成,就将阻塞等待的进程的状态改为运行状态(wake_up()函数唤醒等待的进程),然后将该进程添加到就绪队列,在阻塞队列删除,等待CPU的调度。

Linux的进程切换和进程上下文

CPU可以使正在被调度的进程进行挂起,把另一个进程切换或恢复之前挂起的进程重新让CPU进行调度的能力。这种切换叫进程切换。当正在执行的进程被切换的时候,操作系统会保存当前进程的消息,包括当前寄存器的数据,程序计数器PC,内存管理的信息,进程的内核栈,用户堆栈的信息,当前的进程状态或者打开的文件,网络套接字等,因为有些进程是因为进程的时间片用完了,但可以继续在就绪队列中等待下一次被CPU调度。然后将下一个进程的寄存器数据,内核栈和用户堆栈信息,内存管理的信息进行恢复,根据程序计数器的位置CPU继续的执行下去。
进程的上下文包括了用户空间的上下文,寄存器上下文,系统空间的上下文,文件或网络I/O的上下文。

进程调度

Linux通过对进程的快速切换,让CPU在短时间内对多个进程独立的调度,让用户看起来有多个任务在同一时间内一起执行,这种情况叫并发。如果是多个CPU,就是并行。有抢占式调度和非抢占式的调度。

抢占和非抢占式调度

  • 非抢占式调度算法挑选一个进程,然后让该进程运行直到被阻塞,或者直到该进程退出,才会调用另外一个进程,也就是说不会理时钟中断这个事情。
  • 抢占式调度算法挑选一个进程,然后让该进程只运行某段时间,如果在该时段结束时,该进程仍然在运行时,则会把它挂起,接着调度程序从就绪队列挑选另外一个进程。这种抢占式调度处理,需要在时间间隔的末端发生时钟中断,以便把 CPU 控制返回给调度程序进行调度,也就是常说的时间片机制。

调度算法

先来先服务

先来先服务的调度算法,是最简单的调度算法,是基于非抢占式的调度算法。直到当前在CPU调度的进程执行完成或者当前进程因为某些资源没有准备好的时候被阻塞。才会让出CPU资源。让下一个进程进行调度。每个进程在就绪队列中进行等待,先到先服务。

  • 适合CPU密集,和进程时间短的,因为可以减少进程切换的开销。
  • 不适合I/O密集,因为会有可能阻塞。看似很好的调度算法,但是如果一个进程是长作业,后续的进程就不能及时的被调度。
CPU密集和I/O密集
  • 在Linux中,更倾向于I/O密集型的进程。I/O密集型是计算机进行I/O操作会占大部分,CPU要等待I/O操作的完成,CPU的计算占少量,CPU利用率低,不能充分的使用CPU资源。所以可以使用多线程的方式来提高CPU的利用率。
  • CPU密集型,也是计算密集型,CPU的 Loading 100%,CPU密集型主要是消耗CPU资源,I/O处理很少,会在极短的时间内完成,而不会涉及大量的等待外部数据的时间。只有计算机有多个CPU,才能在CPU密集型的到效率的提升。

最短作业优先调度算法

在这里插入图片描述
最短作业有限,是将短作业时间的进程,排在运行队列的前面,选择最短时间的进程进行调度,可以提高系统的吞吐量,让更多的进程被调度。

  • 缺点:如果有太多的短作业,就会造成后续的长作业无法在合理的时间被调度。对于有实时性的任务实用性较差。

高响应比优先调度算法

该方法主要是为了权衡短作业和长作业,先计算响应优先级,然后将响应优先级高的进程先运行。优先级的算法是(等待的时间 + 要求服务的时间)/要求服务的时间。执行的时候,要么执行完毕,要么进行阻塞等待,然后更新高响应比,重新调度,直到进程全部执行完毕。

  • 优点:短作业多的时候,可以提高效率,提高操作系统的吞吐量。
  • 缺点:可能响应比的低的长作业长时间不会被调度,造成饥饿现象的问题。

时间片轮转调度算法

最简单直接的方法就是时间片轮转RR的调度算法,为每一个进程分配一个时间段,运行进程只能在该长度的时间内被CPU调度执行,如果时间片用完或者进程在时间片内完成了任务,都把CPU资源切换给下一个进程。
在这里插入图片描述

时间片的长度设置
  • 如果时间片分配得太少,会造成进程上下文的频繁切换,降低CPU的效率。
  • 如果时间分配过长,短作业的响应时间会变成。

最高优先级调度算法

该方法式赋予进程一个优先级,优先级高的进程先被CPU进行调度,有非抢占式和抢占式这两中最高优先级调度算法。

非抢占式

当CPU可以进行调度式,选择队列中优先级最高的进行运行,只有该进程让出CPU资源或发送等待事件时,才会让出CPU资源。

  • 优点:没有抢占,减少了频繁的上下文切换,有利于提高系统的稳定和可靠性。
  • 缺点:当有优先级更高的进程,可能会无法及时的进行调度,如果一个优先级高的作业调度时间长,可能会导致低优先级的作业产生饥饿情况。
抢占式

抢占式的话,如果来了一个优先级更高的进程,则会将当前进程挂起,让出CPU资源,调度优先级更高的进程。

  • 优点:在就绪队列中,优先级更高的进程会被调度,无论当前CPU是否调度进程,及时调度了,也会被高优先级进程进行抢占。
  • 缺点:会造成频繁的进程上下文切换。导致系统性能下降。
静态优先级和动态优先级
  • 静态优先级:在创建进程的时候就已经确定了,然后整个运行时间优先级都不会改变。
  • 动态优先级:会动态变化优先级,随着运行时间的增加,优先级会降低,如果进程等待时间增加了,优先级就提高。

多级反馈队列调度算法

是时间片轮转和最高优先级算法的综合和发展。

  • 多级:表示有多个队列,每个队列优先级高到低,优先级越高,时间片越短。
  • 反馈:如果有优先级更高的进程到来,加入到优先级高的队列,然后将当前调度的进程切换下来,来运行刚到来的优先级更高的进程。
    -在这里插入图片描述

工作原理

  • 设置多个队列,队列优先级由高到低,同时,优先级越高的队列,时间片就越短。
  • 当新的进程到来的时候,将进程添加到优先级最高的队列中,按先来先到的调度方法。如果在第一级队列规定的时间片没运行完成,则将其转入到第二级队列的末尾,以此类推,直至完成。
  • 如果在第一级队列规定的时间片没运行完成,则将其转入到第二级队列的末尾,以此类推,直至完成。
    可以发现,对于短作业可能在第一级队列很快的处理完。对于长作业,如果处理不完,可以移到下一次队列进行等待被执行,虽然等待时间变长了,但总会运行的。
  • 优点:对于短作业和优先级较高的进程,响应的时间越短,就可以提高系统的响应速度。有多级队列,可以合理分配的CPU的时间,避免被进程占用过多时间。
  • 缺点:频繁的队列调度和进程的移到会导致进程上下文的频繁切换,系统性能会降低。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值