用户态和内核态的区别

用户态和内核态的区别


你是世界的一杆称,一头重一头轻。 –RuiDer

                      --大侄子的纪念日2018-8-27   

before

本篇文章是我在学习Java的synchornized锁底层原理时碰到的一个知识点,了解过synchornized底层原理的都会知道重量级锁中线程的阻塞和唤醒操作,这两种操作涉及到系统的调用,线程从用户态和内核态的切换,其开销非常大。

用户态和内核态的区别(转载)

    内核态与用户态是操作系统的两种运行级别,当程序运行在3级特权级上时,
就可以称之为运行在用户态,因为这是最低特权级,是普通的用户进程运
行的特权级,大部分用户直接面对的程序都是运行在用户态;反之,当程
序运行在0级特权级上时,就可以称之为运行在内核态。运行在用户态下
的程序不能直接访问操作系统内核数据结构和程序。当我们在系统中执行
一个程序时,大部分时间是运行在用户态下的,在其需要操作系统帮助完
成某些它没有权力和能力完成的工作时就会切换到内核态。 
这两种状态的主要差别是: 处于用户态执行时,进程所能访问的内存空间
和对象受到限制,其所处于占有的处理机是可被抢占的 ; 而处于核心态
执行中的进程,则能访问所有的内存空间和对象,且所占有的处理机是不
允许被抢占的。 
通常来说,以下三种情况会导致用户态到内核态的切换:

1)系统调用

这是用户态进程主动要求切换到内核态的一种方式,用户态进程通过系统
调用申请使用操作系统提供的服务程序完成工作,比如前例中fork()实
际上就是执行了一个创建新进程的系统调用。而系统调用的机制其核心还
是使用了操作系统为用户特别开放的一个中断来实现,例如
Linux的int 80h中断。

2)异常

当CPU在执行运行在用户态下的程序时,发生了某些事先不可知的异常,这时
会触发由当前运行进程切换到处理此异常的内核相关程序中,也就转到了内核
态,比如缺页异常。

3)外围设备的中断

当外围设备完成用户请求的操作后,会向CPU发出相应的中断信号,
这时CPU会暂停执行下一条即将要执行的指令转而去执行与中断信
号对应的处理程序,如果先前执行的指令是用户态下的程序,那么
这个转换的过程自然也就发生了由用户态到内核态的切换。比如硬
盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执行后
续操作等。

这3种方式是系统在运行时由用户态转到内核态的最主要方式,其中
系统调用可以认为是用户进程主动发起的,异常和外围设备中断则
是被动的。

猜你喜欢

转载自blog.csdn.net/qq_40910541/article/details/82215811