引言:最近在看Java内置锁的实现时看到重量级锁的性能开销较大,主要因为使用重量级锁需要用到一个pthread_mutex_lock系统调用,导致Java程序需要在用户态和内核态之间切换,由于不太了解用户态和内核态到底是什么,所有今天来研究一下。

是什么?

Linux体系中内核态与用户态是什么?

在Linux操作系统体系中,进程被分为2种类型,一种是操作系统自身运行的内核类进程,也被称为操作系统进程;另一种非操作系统进程运行在操作系统提供的能力之上的一种用户自定义的程序,我们将其称为用户类进程。

如上图所示,操作系统的工作是管理CPU、内存、硬盘、网络设备、输入输出等设备。

内核态中运行的代码可以调度CPU、分配内存回收内存、接受键鼠的中断信号等。

用户态,是用户程序所运行的模式,运行在该模式的代码被限制,不能进行某些操作,比如写入其他进程的存储空间,不能调度CPU,只能等待CPU调度。

为什么?

为什么会有内核态与用户态这两种空间的存在呢?

举个例子:

其实无论是不是Linux,对于任何操作系统来说,创建一个新的进程都是属于核心功能,因为它要做很多底层细致地工作,消耗系统的物理资源,比如分配物理内存,从父进程拷贝相关信息,拷贝设置页目录页表等等。

这些显然不能随便让哪个程序就能去做,于是自然引出特权级别的概念,最关键的权利必须由高特权级的程序来执行,这样做的好处:

  1. 既可以保证资源的集中管理,减少资源的使用冲突;
  2. 也可以降低其他程序的开发门槛,降低出错的概率,减少程序的开发运维成本。

用户进程工作在用户态,它是受限的,很多涉及到硬件的操作都无法执行,但是它们又想要取得结果,就只能请求工作在内核态的操作系统帮助完成这些操作,并将操作结果交给用户进程。

怎么用?

用户态如何切换到内核态?有三种方式:

一、中断

要想在任何需要的时候回到操作系统,这相当于是改变了CPU的正常执行流程,所以一个非常熟悉的字眼——中断(Interrupt)就出现了。通过中断,可以保证回到操作系统,从而将CPU的控制权交给操作系统。

中断的字面意思就是打断正常执行流程,但是注意,它表示的是打断流程而不是终止流程,这是不同的概念。中断是操作系统中非常重要的机制,正如上面所描述的:中断用于保证CPU控制权交给操作系统,从而让操作系统可以执行某些操作。

比如硬盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执行后续操作等。

二、系统调用

系统调用(system call)就是操作系统提供给用户进程请求操作系统做一些特权操作的接口,即为用户进程提供服务的窗口。在Linux下可以通过man syscalls命令查看Linux提供的所有系统调用。

理解系统调用其实很简单,比如有一个程序想要读取a.log文件(例如head -n 1 a.log),读取之前必须先打开文件,但是用户进程是没有权限打开文件的,所以用户进程只能发送一个open()的系统调用请求操作系统去帮忙打开这个文件,操作系统打开这个文件后会将打开的结果——文件描述符交给用户进程,用户进程通过这个文件描述符就能去操作这个文件。再进一步,用户进程想要从这个打开的文件中读取一行数据,用户进程是没有权限读取文件的,只能发送一个read()系统调用请求操作系统去读取这一行数据,操作系统读取这行数据后就能交给用户进程。

不难发现,系统调用open()和read()都像是函数。其实它们确实都是函数,只不过是比较特殊的由操作系统提供的,一般是由汇编语言编写或参杂了部分汇编代码,因为它们要和硬件交互。

发起系统调用后的主要过程:

1.发起系统调用,请求操作系统帮忙执行某些操作,这会产生软中断;
2.软中断导致陷入内核,CPU控制权交给操作系统,操作系统处理中断,即执行被请求的操作;
3.如果一切正常,操作系统在完成操作后会恢复到断点处继续向下执行,这会回到用户态;
4.用户进程取得操作系统操作的成果,继续向下执行。

Java语言中的重量级锁便是使用pthread_mutex_lock系统调用来实现。

三、异常

当CPU在执行运行在用户态下的程序时,发生了某些事先不可知的异常,这时会触发由当前运行进程切换到处理此异常的内核相关程序中,也就转到了内核态,比如缺页异常。

小结:

这3种方式是系统在运行时由用户态转到内核态的最主要方式,其中系统调用可以认为是用户进程主动发起的,异常和外围设备中断则是被动的。

Linux的内核态与用户态相关推荐

  1. Linux的init进程(内核态到用户态的变化)

    init进程,也就是内核启动3个进程中的进程1: init进程完成了从内核态向用户态的转变: (1)init进程是比较特殊,一个进程两个状态,init刚开始运行时是内核态,他属于内核线程,然后他自己运 ...

  2. Linux 操作系统原理 — 内核态与用户态

    目录 文章目录 目录 Linux 的内核态与用户态 系统调用(System Call) Shell 用户态和内核态的切换 进程的用户空间和内核空间的内存布局 内核空间 用户空间 Linux 的内核态与 ...

  3. 【Linux 内核】Linux 内核体系架构 ( 硬件层面 | 内核空间 | 用户空间 | 内核态与用户态切换 | 系统调用 | 体系结构抽象层 )

    文章目录 一.Linux 内核体系架构 二.内核态与用户态切换 ( 系统调用层 ) 三.体系结构抽象层 一.Linux 内核体系架构 Linux 内核最初的源码不足一万行 , 当前的 Linux 内核 ...

  4. Linux 内核态与用户态通信 netlink

    参考资料: https://blog.csdn.net/zqixiao_09/article/details/77131283 https://www.cnblogs.com/lopnor/p/615 ...

  5. Linux内核态之间进程通信,内核态和用户态通信(二)--实现

    本文主要使用netlink套接字实现中断环境与用户态进程通信. 系统环境:基于linux 2.6.32.27 和 linux 3.16.36 Linux内核态和用户态进程通信方法的提出和实现 用户上下 ...

  6. linux c程序中内核态与用户态内存存储问题

    Unix/Linux的体系架构 如上图所示,从宏观上来看,Linux操作系统的体系架构分为用户态和内核态(或者用户空间和内核).内核从本质上看是一种软件--控制计算机的硬件资源,并提供上层应用程序运行 ...

  7. 【转】linux内核态和用户态的区别

    原文网址:http://www.mike.org.cn/articles/linux-kernel-mode-and-user-mode-distinction/ 内核态与用户态是操作系统的两种运行级 ...

  8. linux 用户态 内核态 通信,procfs(从0开始,内核态和用户态通信charpter2)

    这篇博文将针对linux内核态与用户态通信方式中的procfs进行详细的学习. /proc主要存放内核的一些控制信息,所以这些信息大部分的逻辑位置位于内核控制的内存,在/proc下使用ls -l你会发 ...

  9. Linux 0.11-从内核态到用户态-23

    Linux 0.11-从内核态到用户态-23 从内核态到用户态 转载 从内核态到用户态 书接上回,上回书咱们从整体上鸟瞰了一下第三部分要讲的内容,代码上就是还差四句话就走到了 main 函数的尽头. ...

  10. Linux系统中内核态、用户态和零拷贝技术解析

    ​目录 ​第一:存储介质的性能 ​第二:内核态和用户态 第三:内核态和用户态是怎么控制数据传输的? ​第四:什么是 DMA ? ​第五:零拷贝技术实现的方式 第六:mmap + write 第七:se ...

最新文章

  1. SpringBatch学习一个Demo项目
  2. 别瞎操心了!机器人根本不会抢你的饭碗
  3. python 神经网络中隐藏层的作用是什么?
  4. Spring Cloud中,Eureka常见问题总结
  5. 计算机组成asr实验,计算机组成与结构实验讲义.doc
  6. testng的报告自定义笔记
  7. 2016总结 wjwdive
  8. python 入门到实践期末考试常出现的考试内容_Python编程入门到实践—列表篇(一)...
  9. libvirt中的message bus
  10. JavaScript小数运算出现多位的解决办法
  11. java一个和_你知道Java中和||放一个表达式中怎么执行吗-百度经验
  12. Ubuntu安装显卡驱动教程
  13. 计算机win7设置用户密码,Win7怎么设置密码 win7设置开机密码教程
  14. 淘宝直播火爆的背后,阿里做了什么?
  15. 什么是Library
  16. springboot不停机更新(配合Nginx优雅发版)
  17. 项目里程碑达成的标准
  18. SAP UI5 应用开发教程之六十九 - 如何从 SAP UI5 Not Found 页面跳转回到正常的应用页面试读版
  19. 【PBR系列七】基于物理的环境光照(下):镜面反射 IBL(Specular IBL)
  20. PS CS6视频剪辑基本技巧(一)CS6可以实现的视频剪辑功能

热门文章

  1. 计算机进制之间的转换(2进制、10进制、8进制、16进制)
  2. 大闹天宫 页游 架设教程 自玩 单机
  3. 张馨予一幅画拍出几十万,然而范冰冰却一直在向粉丝要画!
  4. 支持国产自主可控OS——信创服务器操作系统的配置与管理 (统信UOS版)-新书发布
  5. 7. 文件和数据格式化
  6. 辨识DV、OV、EV三种证书类型
  7. 浅谈微信与微博的区别
  8. CentOS 7教程(二)-网络设置
  9. [转]织梦标签全攻略
  10. POJ - Nice Milk(半平面交)