java程序员有必要了解的底层知识内核态与用户态

背景

多线程场景下,我们为了保证线程同步,都会给相应的逻辑代码上加锁,这个时候会存在线程的切换问题,那线程的切换,创建,销毁会消耗性能,因此很多时候我们会用线程池!但是用线程池也不能避免线程切换带来的性能消耗,那线程切换,具体性能消耗在哪?下面我来简单聊聊我个人理解!

线程状态切换

线程的切换,往往伴随着线程的阻塞跟唤醒,也伴随着用户态跟内核态的转换,这个是需要操作系统介入的,所以会消耗大量的系统资源,因为用户态与内核态都有各自专用的内存空间,专用的寄存器等,用户态切换至内核态需要传递给许多变量、参数给内核,内核也需要保护好用户态在切换时的一些寄存器值、变量等,以便内核态调用结束后切换回用户态继续工作。了解线程的切换代价,也更有利于我们对java锁优缺点的理解.那用户态和内核态具体是什么呢?

内核态

CPU可以访问内存所有数据, 包括外围设备, 例如硬盘, 网卡. CPU也可以将自己从一个程序切换到另一个程序!在程序的角度可以简单理解为程序在执行用户代码时,被别的线程占了锁,导致阻塞的时候!

用户态

只能受限的访问内存, 且不允许访问外围设备. 占用CPU的能力被剥夺, CPU资源可以被其他程序获取.在程序的角度可以简单理解为程序在运行用户代码的时候!

你可能感兴趣的:(java)