引言:最近在看Java内置锁的实现时看到重量级锁的性能开销较大,主要因为使用重量级锁需要用到一个pthread_mutex_lock系统调用,导致Java程序需要在用户态和内核态之间切换,由于不太了解用户态和内核态到底是什么,所有今天来研究一下。
是什么?
Linux体系中内核态与用户态是什么?
在Linux操作系统体系中,进程被分为2种类型,一种是操作系统自身运行的内核类进程,也被称为操作系统进程;另一种非操作系统进程运行在操作系统提供的能力之上的一种用户自定义的程序,我们将其称为用户类进程。
如上图所示,操作系统的工作是管理CPU、内存、硬盘、网络设备、输入输出等设备。
内核态中运行的代码可以调度CPU、分配内存回收内存、接受键鼠的中断信号等。
用户态,是用户程序所运行的模式,运行在该模式的代码被限制,不能进行某些操作,比如写入其他进程的存储空间,不能调度CPU,只能等待CPU调度。
为什么?
为什么会有内核态与用户态这两种空间的存在呢?
举个例子:
其实无论是不是Linux,对于任何操作系统来说,创建一个新的进程都是属于核心功能,因为它要做很多底层细致地工作,消耗系统的物理资源,比如分配物理内存,从父进程拷贝相关信息,拷贝设置页目录页表等等。
这些显然不能随便让哪