在操作系统中,"用户态"(User Mode)和"内核态"(Kernel Mode)是CPU执行程序时的两种不同权限级别,它们定义了程序运行时可以访问的资源和执行的指令范围。
用户态(User Mode):
- 用户态是程序正常运行的状态,大部分程序的大部分时间都运行在此模式下。
- 在用户态下,程序可以访问自己的内存空间,执行非特权指令,但不能直接访问硬件或执行对系统有重大影响的操作,如修改系统时间、内存管理等。
- 用户态的限制增加了系统的安全性,防止了一个程序的错误影响到整个系统。
内核态(Kernel Mode):
- 内核态是操作系统核心部分运行的状态,具有更高的权限。
- 在内核态下,程序可以直接访问和操作所有硬件资源,执行特权指令,如加载和卸载驱动程序、分配系统内存、改变CPU状态等。
- 从用户态切换到内核态通常是因为程序需要执行一些只能在内核态下完成的操作,如系统调用或处理中断。
- 这种切换需要保存当前上下文(用户态的寄存器状态等),加载内核态的上下文,执行完毕后再恢复用户态的上下文,这个过程涉及到CPU状态的改变,相对耗时。
关于synchronized
锁提到的“牵扯到了用户态和内核态的切换,效率不高”,主要是因为在某些情况下(尤其是早期的Java版本或特定的使用场景中),synchronized
可能导致线程在等待锁或者释放锁的时候发生用户态到内核态的切换。这种切换开销较大,因为它涉及到操作系统层面的处理,包括上下文保存与恢复,以及可能的线程调度。随着Java的发展,尤其是从Java 6引入了偏向锁、轻量级锁等优化后,synchronized
的性能已经有了显著提升,能在很多情况下避免昂贵的内核态切换,从而提高并发性能。但即便如此,在高度竞争的锁场景下,性能损耗仍然是一个考量因素。
简单来说,用户态和内核态是操作系统的两种运行模式。用户态下,程序权限有限,只能执行基本操作;内核态则拥有更高权限,能直接访问硬件资源。当使用synchronized
锁时,可能涉及这两种模式之间的转换,这过程较为耗时,影响效率。