第7章 进程调度 - 内核态用户态的切换与进程调度的关系
1 思考
我们都知道处理器会在用户态和内核态之间切换;进程调度的时候,也会在用户进程和内核进程之间进行切换。
它们有什么关系呢?是不是用户进程和内核进程之间的切换,才导致处理器在用户态和内核态之间的切换呢?
其他人和我也有一样的困惑:
这篇文章写的很不错,可以概括为以下几个知识点:
- 内核负责创建进程,并管理进程标识符task_struct;内核在创建进程的同时,也会为进程创建用户栈(位于用户空间,< 3GB)和内核栈(位于内核空间,3-4GB)
- 当进程运行在用户空间时,CPU堆栈指针寄存器的内容是用户堆栈地址;运行在内核态时,CPU堆栈指针寄存器的内容是内核态地址
- 进程通过系统调用和中断,从用户态陷入内核态,此时的时序为:
① 先陷入内核态,由内核态完成用户态堆栈地址的保存
② 恢复时也是在内核态把保存的用户态堆栈恢复到寄存器,之后再切到用户栈 - 一旦从内核态返回用户态,内核栈的信息就会失效,因此每次进程从用户态陷入到内核态时,内核栈都是空的
- 为什么每个进程都要有用户栈和内核栈这两个不同的栈?为了保证多个进程并行执行(可以同时陷入到内核态,在内核态休眠)
下面这张图给出了进程描述符和内核栈的位置关系:

- 内核就是常驻内存的代码+数据+API,等待着执行和访问;内核不是进程,没有内核进程的内核也可以正常工作
- 无论是系统调用还是中断,都是进程从用户态切到内核态 —— 用户态是进程的普通执行状态,内核态却不属于进程!
但是也没有发生进程间切换,所以有些人误说成“进程从用户态切到内核态” - 之前经常提到内核进程/线程,所以混淆了用户进程-内核进程之间的切换,与用户态-内核态切换的关系
- 内核进程很少见也很少用到,比如0号进程(idle),1号进程(init)等,另外还有一些不和用户进程交互、专门用于监控的进程
—— 除此之外没有必要关注内核进程,所以可以认为内核就是一堆代码+数据+API
本文来自博客园,作者:moonのsun,转载请注明原文链接:https://www.cnblogs.com/moon-sun-blog/p/18803502

浙公网安备 33010602011771号