用户态切换到内核态的方式:系统调用、中断、异常
用户态与内核态
用户态和内核态是操作系统的两种运行级别。
用户态拥有最低的特权级, 运行在用户态的程序不能执行某些特权指令(或者执行的结果不同),也不能直接访问操作系统内核数据结构和程序;只能受限的访问内存, 且不允许访问外围设备。占用处理器的能力可以被剥夺, CPU资源可以被其他程序获取。
内核态拥有较高的特权级,不限制指令的执行,可以访问内存所有数据, 包括外围设备。占用的处理器不可被剥夺。
这两种状态的主要差别是: 处于⽤户态执⾏时,进程所能访问的内存空间和对象受到限制,其所处于占有的处理机是可被抢占的 ; ⽽处于核⼼态执⾏中的进程,则能访问所有的内存空间和对象,且所占有的处理机是不允许被抢占的。
用户态切换到内核态的方式
系统调用
这是⽤户态进程主动要求切换到内核态的⼀种⽅式,⽤户态进程通过系统调⽤申请使⽤操作系统提供的服务程序完成⼯作,⽽系统调⽤的机制其核⼼还是使⽤了操作系统为⽤户特别开放的⼀个中断来实现。
中断
中断是外设的事件,当外围设备完成⽤户请求的操作后,会向 CPU 发出相应的中断信号,这时 CPU 会暂停执⾏下⼀条即将要执⾏的指令转⽽去执⾏与中断信号对应的处理程序,如果先前执⾏的指令是⽤户态下的程序,那么这个转换的过程⾃然也就发⽣了由⽤户态到内核态的切换。⽐如硬盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执⾏后续操作等。
异常
异常是CPU的事件,当 CPU 在执⾏运⾏在⽤户态下的程序时,发⽣了某些事先不可知的异常,这时会触发由当前运⾏进程切换到处理此异常的内核相关程序中,也就转到了内核态,⽐如缺⻚异常。
中断,异常,系统调用三者的联系和区别
产生原因
系统调用:应用程序请求操作系统提供某些服务(如读写文件等)
中断:各种外部设备I/O
异常:程序执行时发生了意想不到的错误(恶意程序,未得到应有的资源等)
请求方式
系统调用:异步或同步
中断:异步
异常:同步
OS对该类事件的响应
系统调用:等待系统完成相应服务的信号(异步:边干边等,同步:只等着)
中断:执行中断处理程序。
异常:执行异常处理程序或重新执行发生了异常的程序指令