当前位置:网站首页>那些令人懵逼的用户态&内核态
那些令人懵逼的用户态&内核态
2022-06-22 13:33:00 【Evan_L】
前言
在讨论多线程时,总会不可避免地听到:线程切换损耗、上下文切换,内核态、用户态。这些专有名词还真是不好理解。因为这背后涉及的不仅仅是线程,甚至是计算机硬件与操作系统层面的内容。因此,本文的目的,只是想搞清楚用户态和内核态。
用户态与内核态
为什么会有用户态和内核态?说到底还是处于安全考虑。我们的应用程序谁都可以开发,谁都可以在操作系统中运行。如果没有一个安全机制,防止不法之徒恶意破坏,那肯定要完蛋。因此,从CPU层面就开始考虑这个事情了(这也是为什么开篇就说这是一整个计算机体系的内容)CPU分为4个等级,ring0-ring3。ring0拥有最大权限,所有资源都能控制。而ring3权限最小,我们的应用程序都是在这个权限下运行的。
kernel也就是操作系统内核,Applications也就是应用程序。除此之外,内核有自己的专属空间,这部分地址,用户程序是不能直接访问的。
那么问题来了,如果应用程序需要请求某些资源怎么办?例如,操作硬盘上的文件?于是操作系统提供了一系列的系统调用,通过系统调用,由内核代码来执行这些操作。
进程、系统调用、上下文
进程在用户态空间有自己函数栈、内存映射表等等。而在内核空间也有对应的函数栈,用于执行内核代码函数。因此当CPU在执行进程在用户空间的代码时,我们称,进程工作在用户态。当进程在CPU上执行内核代码时,就认为进程工作在内核态。
当用户程序需要访问系统资源发起系统调用时,就需要进入内核态。所谓系统调用,就是发起一个软中断,让程序陷入内核态。关于软中断,也是计算机体系架构/操作系统的内容。这里不展开。
CPU上下文切换
进程有用户态的函数栈,也有内核态的函数栈。当陷入内核态时,就需要切换到内核态的函数栈运行。因此,这里就涉及到上下文切换。这个地方的上下文,指的是CPU上下文。就是切换CPU的程序计数器、以及一系列的寄存器。
进程上下文切换
那么当我们需要切换进程的时候,这意味着,不仅用户态的虚拟内存、函数栈等等资源,还有内核态的堆栈等等资源也需要进行切换。于是,我们不禁想:那么线程切换的时候,又干啥了呢?
线程上下文切换
要想理解线程上下文,就不得不对线程模型进行一番了解。这里大概了解一些概念:ULT、KTL、LWP。
线程模型
上面我们谈到进程有用户态的函数栈、内存空间等等,在内核态中也有这么些资源。但是这些资源,在线程中,有没有这些资源,取决于线程的实现方式。
用户级线程(n:1模型)
ULT:User Level Thread,指在用户空间对线程进行实现,内核并不知道存在线程这么个东西。换句话说,这种实现方式下,自然就没有与线程对应的内核态的资源了。因此整个进程(包括用户线程)共享进程所有的内核资源。这意味着任何一个用户线程在陷入内核态并且被阻塞时,整个进程都会被阻塞!
这个时候就需要注意了,与进程相比,线程没有内核资源。这个点将引申出后面内核线程的概念。
内核级线程(1:1模型/n:m模型)
指需要内核的参与,由内核完成线程的调度。换而言之,就是内核知道线程这个东西的存在,并对其提供支持。
而NPTL(Native POSIX Threading Library)从Linux2.6开始就被采用了。上面我们说到用户级线程没有内核空间相关资源,于是这里上了一个LWP(Light Weight Process),怎么做的呢?其实Linux对于线程也好,还是进程也罢,在内核中,都是task_struct。对于同一个进程中的所有线程作为一个分组,共享进程的虚拟内存、全局变量等,但是它有自己的函数栈。而LWP在用户态空间共享了进程的资源。
与用户线程相对的,内核线程只运行在内核态,不受用户态上下文的拖累。而它就是为LWP提供支持。
用户线程->LWP(用户态)->内核线程(内核态)

回到线程上下文切换,在NPTL实现下,线程上下文切换,需要切换用户态的函数栈,LWP的内核函数栈,但不需要切换进程的虚拟内存、全局变量。而在用户级线程模型的经典LinuxTreads实现下,只需要切换用户空间的资源即可。
总结
- 由用户程序创建的进程有内核态和用户态资源,如果一个进程只存在内核运行,则可以理解为内核进程。
- 用户线程,按照实现分为用户级线程、内核级线程。
- 内核级线程,只是说该线程有内核的支持,它并没有内核态资源。但是当LWP陷入内核态,并通过KLT对它进行支持的时候,说该线程处于内核态,倒也说的过去。
后记
如前,要搞清楚这些东西,还是得从计算机体系结构开始慢慢学习理解。文章排版可能有些乱,但内容的顺序感觉还行。各位看官,勉强看吧。。。
参考
极客时间-计算机组成原理
极客时间-趣谈Linux内核
轻量级线程(LWP)介绍以及与内核线程、用户线程的区别
Linux线程模型
CPU上下文
操作系统 | 中断 & 系统调用浅析
边栏推荐
- The diffusion model is crazy again! This time the occupied area is
- 作为过来人,写给初入职场的程序员的一些忠告
- Neuron+ekuiper realizes data collection, cleaning and anti control of industrial Internet of things
- Madcap flare 2022, documentation in language or format
- phpStudy 2016搭建-pikachu靶场
- Software architecture
- 一文彻底弄懂工厂模式(Factory)
- RealNetworks vs. 微软:早期流媒体行业之争
- S7-200SMART与FANUC机器人进行Profinet通信的具体方法和步骤
- Implementation of redis+caffeine two-level cache
猜你喜欢

Software architecture

位置编码(PE)是如何在Transformers中发挥作用的

Verification code is the natural enemy of automation? See how the great God solved it
![[untitled]](/img/ff/f23e5275683d4d7b13fcb94cc77702.png)
[untitled]

How to implement interface exception scenario testing? Exploration of test methods and implementation of test tools

轻松上手Fluentd,结合 Rainbond 插件市场,日志收集更快捷
![[introduction to postgraduate entrance examination] analysis of postgraduate entrance examination data of Cyberspace Security Major of Beijing Jiaotong University from 2018 to 2022](/img/84/b572b3b80cc0dd1489076116cf0638.png)
[introduction to postgraduate entrance examination] analysis of postgraduate entrance examination data of Cyberspace Security Major of Beijing Jiaotong University from 2018 to 2022

Kukai TV ADB

扩散模型又杀疯了!这一次被攻占的领域是...

C language student management system (open source)
随机推荐
Support vector machine for machine learning
How maxscale handles event status after MariaDB master-slave switchover -handle_ events
OpenVINO CPU加速调研
Implementation of redis+caffeine two-level cache
Go all out to implement the flood control and disaster relief measures in detail and in place, and resolutely protect the safety of people's lives and property
Verification code is the natural enemy of automation? See how the great God solved it
As a passer-by, some advice for programmers who are new to the workplace
一文彻底弄懂单例模式(Singleton)
Perceptron of machine learning
Zhongshanshan: engineers after being blasted will take off | ONEFLOW u
网站存在的价值是什么?为什么要搭建独立站
Lisez ceci pour vous apprendre à jouer avec la cible de test de pénétration vulnhub - driftingblues - 5
Software architecture
【浙江大学】考研初试复试资料分享
Le modèle de diffusion est encore fou! Cette fois - ci, la zone occupée était...
unity的富文本Text的Color设置颜色全透明
验证码是自动化的天敌?看看大神是怎么解决的
Neuron+ekuiper realizes data collection, cleaning and anti control of industrial Internet of things
机器学习之随机森林
Error: unable to find a match: lrzsz