进程从用户态到内核态的那些事

一般说来,进程既可在用户模式下运行,又可在内核模式下运行。内核模式的权限高于用户模式的权限。进程每次调用一个系统调用时,进程的运行方式都发生变化:从用户模式切换到内核模式,然后继续执行。

可见:一个进程在CPU上运行可以有两种运行模式(进程状态):用户模式和内核模式。如果当前运行的是用户程序(用户代码),那么对应进程就处于用户模式(用户态),如果出现系统调用或者发生中断,那么对应进程就处于内核模式(核心态)。

在UNIX系统上,内核对外的接口是系统调用,系统调用以C函数的形式出现,所以内核外的程序都必须经由系统调用才能获得操作系统的服务。那么系统调用在核心模式运行和用户代码在用户模式运行有什么区别呢?

由于系统调用能直接进入内核执行,所以其执行效率很高。系统调用包含一种特殊的程序段,这些程序段成为原语,其特点是必须作为整体执行,不允许被中断,也不允许并发执行。你说效率高不高?


任何进程要想占有CPU,从而真正处于执行状态,就必须经由进程调度。进程调度

机制主要涉及到调度方式、调度时机和调度策略。


1.调度方式

Linux内核的调度方式基本上采用“抢占式优先级”方式,即当进程在用户模式


下运行时,不管是否自愿,在一定条件下(如时间片用完或等待I/O),核心就可


以暂时剥夺其运行而调度其它进程进入运行。但是,一旦进程切换到内核模式下


运行,就不受以上限制而一直运行下去,直至又回到用户模式之前才会发生进程


调度。


Linux系统中的调度策略基本上继承了Unix的以优先级为基础的调度。就是说,


核心为系统中每个进程计算出一个优先权,该优先权反映了一个进程获得CPU使用


权的资格,即高优先权的进程优先得到运行。


核心从进程就绪队列中挑选一个优先权最高的进程,为其分配一个CPU时间片,令


其投入运行。在运行过程中,当前进程的优先权随时间递减,这样就实现了“负


反馈”作用:经过一段时间之后,原来级别较低的进程就相对“提升”了级别,


从而有机会得到运行。当所有进程的优先权都变为0时,就重新计算一次所有进程


的优先权。


2.调度策略


Linux系统针对不同类别的进程提供了三种不同的调度策略,即SCHED_FIFO、


SCHED_RR及SCHED_OTHER。其中,SCHED_FIFO适合于实时进程,它们对时间性要


求比较强,而每次运行所需的时间比较短,一旦这种进程被调度开始运行后,就


要一直运行到自愿让出CPU,或者被优先权更高的进程抢占其执行权为止。


SCHED_RR对应“时间片轮转法”,适合于每次运行需要较长时间的实时进程。一


个运行进程分配一个时间片(如200毫秒),当时间片用完后,CPU被另外进程抢


占,而该进程被送回相同优先级队列的末尾。 


SCHED_OTHER是传统的Unix调度策略,适合于交互式的分时进程。这类进程的优


先权取决于两个因素,一个因素是进程剩余时间配额,如果进程用完了配给的时


间,则相应优先权为0;另一个是进程的优先数nice,这是从Unix系统沿袭下来


的方法,优先数越小,其优先级越高。


nice的取值范围是19~-20。用户可以利用nice命令设定进程的nice值。但一般


用户只能设定正值,从而主动降低其优先级;只有特权用户才能把nice的值置为


负数。进程的优先权就是以上二者之和。核心动态调整用户态进程的优先级。


这样,一个进程从创建到完成任务后终止,需要经历多次反馈循环。当进程再次


被调度运行时,它就从上次断点处开始继续执行。



对于实时进程,其优先权的值是(1000+设定的正值),因此,至少是1000。所


以,实时进程的优先权高于其它类型进程的优先权。


另外,时间配额及nice值与实时进程的优先权无关。如果系统中有实时进程处于


就绪状态,则非实时进程就不能被调度运行,直至所有实时进程都完成了,非实


时进程才有机会占用CPU。


后台命令(在命令末尾有&符号,如gcc f1.c& )对应后台进程(又称后台作


业),后台进程的优先级低于任何交互(前台)进程的优先级。所以,只有当系


统中当前不存在可运行的交互进程时,才调度后台进程运行。后台进程往往按批


处理方式调度运行。


3.调度时机

核心进行进程调度的时机有以下几种情况:(1)当前进程调用系统调用


nanosleep( )或pause( )使自己进入睡眠状态,主动让出一段时间的CPU使用


权;(2)进程终止,永久地放弃对CPU的使用;(3)在时钟中断处理程序执行过程


中,发现当前进程连续运行的时间过长;(4)当唤醒一个睡眠进程时,发现被唤醒


的进程比当前进程更有资格运行;(5)一个进程通过执行系统调用来改变调度策略


或降低自身的优先权(如nice命令),从而引起立即调度。


4.调度算法

进程调度的算法应该比较简单,以便减少频繁调度时的系统开销。Linux执行进


程调度时,首先查找所有在就绪队列中的进程,从中选出优先级最高且在内存的


一个进程。如果队列中有实时进程,那么实时进程将优先运行。


如果最需要运行的进程不是当前进程,那么当前进程就被挂起,并且保存它的现


场所涉及的一切机器状态,包括程序计数器和CPU寄存器等,然后为选中的进程恢


复运行现场。

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值