第7章 进程调度 - 内核态用户态的切换与进程调度的关系

1 思考

我们都知道处理器会在用户态和内核态之间切换;进程调度的时候,也会在用户进程和内核进程之间进行切换。

它们有什么关系呢?是不是用户进程和内核进程之间的切换,才导致处理器在用户态和内核态之间的切换呢?

其他人和我也有一样的困惑:

内核态是指一个特殊的进程,还是指进程的一种特殊状态?

内核是内存中的一个或一组进程么?

 

 

2 进程内核栈、用户栈

这篇文章写的很不错,可以概括为以下几个知识点:

  • 内核负责创建进程,并管理进程标识符task_struct;内核在创建进程的同时,也会为进程创建用户栈(位于用户空间,< 3GB)和内核栈(位于内核空间,3-4GB)
  • 当进程运行在用户空间时,CPU堆栈指针寄存器的内容是用户堆栈地址;运行在内核态时,CPU堆栈指针寄存器的内容是内核态地址
  • 进程通过系统调用和中断,从用户态陷入内核态,此时的时序为:
    ① 先陷入内核态,由内核态完成用户态堆栈地址的保存
    ② 恢复时也是在内核态把保存的用户态堆栈恢复到寄存器,之后再切到用户栈
  • 一旦从内核态返回用户态,内核栈的信息就会失效,因此每次进程从用户态陷入到内核态时,内核栈都是空的
  • 为什么每个进程都要有用户栈和内核栈这两个不同的栈?为了保证多个进程并行执行(可以同时陷入到内核态,在内核态休眠)

下面这张图给出了进程描述符和内核栈的位置关系:

 

 

3 内核是内存中的一个或一组进程么?

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

 

posted @ 2025-04-01 23:56  moonのsun  阅读(138)  评论(0)    收藏  举报