0%

Linux内核运行方式

Linux内核运行方式

前两天被AA问了个问题,你觉得Linux的内核是一个进程吗
第一反应自然是一个进程,但是接下来就被问到了内核是一个进程的话,进程调度是怎么实现的,以进程来管理进程吗之类的问题
所以首先应该能给出答案,Linux的内核并不是一个进程
那么接下来就出现了第二个问题,内核并不是一个进程,那么如何做到进程调度,内存管理这些事情的呢

为此查了一个下午各种各样的资料

众所周知,一个进程拥有内核空间和用户空间两个空间,用户空间存放的就是进程自己的数据,代码,堆栈之类的东西,还有一个libc函数库,而内核空间则是映射到内核数据区。也就是说,内核数据在物理内存上只有一份,但是会在每个进程中映射一份,内核数据就是各个进程的进程控制块,操作系统的资源分配表,文件标识符之类的各种各样的资源,还有就是系统调用函数,以及一系列的内核相关函数。

只有在系统刚启动时,内核可能表现的像一个进程,当启动完成后,内核会启动一部分线程,提供相应的服务,这些进程可以在ps里面看到,都由方括号包裹起来,标识为内核启动的线程。而更多的情况下,内核表现的更像是一个巨大的函数库,也可以说内核是运行在用户进程里的,当用户进程发起系统调用时,进入内核态,这并不是说内核开始运行,而是用户进程调用内核函数,去访问内核数据。

对于读写等操作是很便于理解的,进程进入内核态,仍是该进程在运行,通过系统调用接口获取了内核数据
但最令人困惑也是最典型的应当是进程调度(这段我也没有十足的把握),因为内核不能作为进程运行,调度的载体就变成了自身,暂且考虑两个情况:
1.进程由于IO等待一类的事务主动挂起,这时进程同样是通过系统调用进入内核态,使用内核中的调度算法并修改内核数据结构,可以理解为以当前进程程为载体,内核完成了一次进程调度?
2.进程由于时间片到期被剥夺,这时进程由于是被剥夺了运行权利,自然不可能由其本身发起一个中断进入内核,而内核本身并不是一个运行的进程,所以内核也不能够发起这个中断。因此,这个中断是由硬件产生的,通过硬件中断迫使进程进入内核态,走一遍调度流程完成调度

参考链接

搜了一大堆资料,就这个知乎的问答感觉说的最清楚
https://www.zhihu.com/question/309060309/answer/575332809