内核线程的进程描述符task_struct中的mm和active_mm
2023-09-27 14:29:05 时间
task_struct进程描述符中包含两个跟进程地址空间相关的字段mm, active_mm,
struct task_struct
{
// ...
struct mm_struct *mm;
struct mm_struct *avtive_mm;
//...
};
大多数计算机上系统的全部虚拟地址空间分为两个部分: 供用户态程序访问的虚拟地址空间和供内核访问的内核空间。每当内核执行上下文切换时, 虚拟地址空间的用户层部分都会切换, 以便当前运行的进程匹配, 而内核空间不会放生切换。
对于普通用户进程来说,mm指向虚拟地址空间的用户空间部分,而对于内核线程,mm为NULL。
这位优化提供了一些余地, 可遵循所谓的惰性TLB处理(lazy TLB handing)。active_mm主要用于优化,由于内核线程不与任何特定的用户层进程相关,内核并不需要倒换虚拟地址空间的用户层部分,保留旧设置即可。由于内核线程之前可能是任何用户层进程在执行,故用户空间部分的内容本质上是随机的,内核线程决不能修改其内容,故将mm设置为NULL,同时如果切换出去的是用户进程,内核将原来进程的mm存放在新内核线程的active_mm中,因为某些时候内核必须知道用户空间当前包含了什么。
为什么没有mm指针的进程称为惰性TLB进程?
假如内核线程之后运行的进程与之前是同一个, 在这种情况下, 内核并不需要修改用户空间地址表。地址转换后备缓冲器(即TLB)中的信息仍然有效。只有在内核线程之后, 执行的进程是与此前不同的用户层进程时, 才需要切换(并对应清除TLB数据)。
内核线程和普通的进程间的区别在于内核线程没有独立的地址空间,mm指针被设置为NULL;它只在 内核空间运行,从来不切换到用户空间去;并且和普通进程一样,可以被调度,也可以被抢占。
相关文章
- Ubuntu Desktop 16.04 LTS 下成功配置Jupyter的两个python内核版本(2.7x,3.5x)
- 互斥锁Mutex:鸿蒙轻内核中处理临界资源独占的“法官”
- 用Visual studio2012在Windows8上开发内核驱动监视进程创建
- RT-thread内核之空闲线程
- c#网络通信框架networkcomms内核解析之一 消息传送2
- Windows内核之线程简单介绍
- 嵌入式操作系统内核原理和开发(固定内存分配算法)
- CentOS和Redhat发行版linux内核版本的对应关系
- 【Linux 内核】Linux 内核体系架构 ( 进程调度 | 内存管理 | 中断管理 | 设备管理 | 文件系统 )
- 【Linux 内核】Linux 内核特性 ( 组织形式 | 进程调度 | 内核线程 | 多平台虚拟内存管理 | 虚拟文件系统 | 内核模块机制 | 定制系统调用 | 网络模块架构 )
- Hi3518ev300(Huawei LiteOS 3.2.3)内核移植 iperf 工具所做的改动,参照Hi3516ev100的内核(支持iperf)
- Linux内核中断和异常分析(下)
- Linux内核线程kernel thread详解--Linux进程的管理与调度(十)
- Linux下的进程类别(内核线程、轻量级进程和用户进程)--Linux进程的管理与调度(四)
- 深入理解LInux内核-进程通信
- 深入理解Linux内核-进程地址空间
- 深入理解Linux内核-进程调度