由 synchronized锁优化联想到用户态与内核态区别

我们知道synchronized的锁优化过程,从无状态-偏向锁-轻量级锁-重量级锁。优化点就是在多线程锁竞争时候避免线程过早地由用户态到内核态的转换,避免线程间频繁低在用户态和内核态间的切换,减少因CPU切换而中断耗费的时间。那为什么重量级锁竞争线程需要从用户态到内核态转变呢。这就需要知道用户态和内核态区别。

一、用户态和内核态的概念

(1)用户态(也称为目态),应用程序只能在用户态运行——运行用户程序, 用户可以操作和访问的空间,这个空间通常存放我们用户自己写的程序、数据等

(2)内核态(也称为管态或系统态),操作系统在系统态运行——运行操作系统程序, 是系统内核来操作的一块空间,这块空间里面存放系统内核的函数、接口等

二、二者的区别

(1)处于用户态执行时,进程所能访问的内存空间和对象受到限制,其所占有的处理机是可被抢占的。就是用户态的权限是自己分配空间使用内的有限权限,只能访问用户程序自己的存储空间 。

(2)而处于内核态执行中的进程,则能访问所有的内存空间、硬件资源以及对象,且所占用的处理机是不允许被抢占的。就是内核态可以使用操作系统的指令,可以使用所有的硬件资源,如中断、清理内存、设置时钟等。

由上可知,synchronized在升级到重量级别锁后,用户态切换到内核态主要原因:

  • 为了防止得不到资源的线程空转消耗CPU等资源,需要阻塞或唤醒竞争的线程,只有从用户态切换到内核态才能执行阻塞和唤醒线程操作。

三、用户态和内核态的转换

用户态切换到内核态的主要有3种方式:其中系统调用可以认为是用户进程主动发起的,异常和外围设备中断则是被动的

(1)系统调用

这是用户进程主动要求切换到内核态的一种方式,用户进程通过系统调用申请操作系统提供的服务程序完成工作。 synchronized的重量级锁就是此种方式从用户态切换到内核态的一种系统调用

(2)异常

当CPU在执行运行在用户态的程序时,发现了某些事件不可知的异常,这时便会触发由当前进程切换到处理此 异常的内核相关程序中,即内核态,比如缺页异常、除零异常等都会触发用户态到内核态的切换

(3)外围设备的中断

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章