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

转载 2012年02月28日 20:17:43

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

可见:一个进程在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寄存器等,然后为选中的进程恢


复运行现场。

相关文章推荐

linux内核线程、轻量级进程和用户进程

转载:http://www.cnitblog.com/tarius.wu/articles/2277.html 转载:http://www.fansoo.com/blog/2011/kernel...

Linux下的进程类别(内核线程、轻量级进程和用户进程)以及其创建方式--Linux进程的管理与调度(四)

本文声明 日期 内核版本 架构 作者 GitHub CSDN 2016-05-12 Linux-4.5 X86 & arm gatieme LinuxDevi...
  • gatieme
  • gatieme
  • 2016年05月23日 15:42
  • 7498

Linux内核本身和进程的区别 内核线程、用户进程、用户线程

Linux内核本身和进程的区别 内核线程、用户进程、用户线程 这个概念是很多人都混淆的了,我也是,刚开始无法理解OS时,把Linux内核也当做一个进程。 其实内核本身不是以进程形式存在的,...

nginx lvs ha 对比

声明:y PS:Nginx/LVS/HAProxy是目前使用最广泛的三种负载均衡软件,本人都在多个项目中实施过,参考了一些资料,结合自己的一些使用经验,总结一下。 一般对负载均衡的使用是随...
  • xluren
  • xluren
  • 2014年09月09日 10:46
  • 3369

STL中vector的实现及面试问题

一、前言: 在学习c++的时候我们会接触两个库,一个是boost库另外一个就是STL库。关于STL库候捷先生的《STL源码剖析》中已经写的很详细了,今天我就关于STL中的vector实现及面试中的一...

cpu在内核态与用户态下执行,进程数的差别

当一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就称进程处于内核运行态(或简称为内核态)。此时处理器处于特权级最高的(0级)内核代码中执行。当进程处于内核态时,执行的内核代码会使用当前进程的...

linux 用户态和内核态以及进程上下文、中断上下文 内核空间用户空间理解

1、特权级       Intel x86架构的cpu一共有0~4四个特权级,0级最高,3级最低,ARM架构也有不同的特权级,硬件上在执行每条指令时都会对指令所具有的特权级做相应的检查。硬件已...

内核空间和用户空间,内核态和用户态,进程上下文和中断上下文

内核空间和用户空间  Linux简化了分段机制,使得虚拟地址与线性地址总是一致,因此,Linux的虚拟地址空间也为0~4G。Linux内核将这4G字节的空间分为两部分。将最高的1G字节(从虚拟地址0...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:进程从用户态到内核态的那些事
举报原因:
原因补充:

(最多只允许输入30个字)