文章目录

  • 一、内核线程概念
  • 二、内核线程、普通进程、用户线程
  • 三、内核线程、普通进程区别
  • 四、内核线程主要用途
  • 五、内核线程创建函数 kernel_thread 源码

一、内核线程概念


直接 由 Linux 内核 启动的线程 , 被称为 " 内核线程 " ;

" 内核线程 " 是一种 特殊进程 , 独立运行在 " 内核空间 " , 其将 " 内核函数 " 委托给 独立进程 , 该 " 独立进程 " 与 其它进程 ( 包括 普通进程 , 内核自身 , 用户级线程 ) 并行执行 ;

" 内核线程 " 也称为 " 守护进程 " ;

二、内核线程、普通进程、用户线程


在 【Linux 内核】进程管理 ( 进程特殊形式 | 内核线程 | 用户线程 | C 标准库与 Linux 内核中进程相关概念 | Linux 查看进程命令及输出字段解析 ) 一、进程特殊形式 ( 内核线程 | 用户线程 ) 博客章节 , 有介绍内核线程 ,

普通的进程 , 包含 内核虚拟地址空间 和 用户虚拟地址空间 , 其中 内核虚拟地址空间 所有进程共享 , 用户虚拟地址空间 由进程独立拥有 ; 除了 普通进程 外 , 进程 还有 222 种 特殊形式 :

  • 内核级线程 : 只有 内核虚拟地址空间 , 没有 用户虚拟地址空间 的进程 , 称为 内核线程 ;
  • 用户级线程 : 共享 用户虚拟地址空间 的进程 , 称为 用户线程 ;

三、内核线程、普通进程区别


" 内核线程 " 与 " 普通进程 " 区别是 , 内核进程 没有 " 独立的进程地址空间 " ;

task_struct 进程描述符 结构体中的 , mm 指针指向的空间就是 " 独立的进程地址空间 " ;

在 Linux 内核 中 , " 进程控制块 " 是通过 task_struct 结构体 进行描述的 ; Linux 内核中 , 所有 进程管理 相关算法逻辑 , 都是基于 task_struct 结构体的 ; task_struct " 进程描述符 " 结构体在 linux-5.6.18\include\linux\sched.h 头文件中 第 629629629 ~ 130013001300 行定义 ;

mm 字段是一个指针 , 指针指向 mm_struct 结构体 , 这是 " 内存描述符 " , 与 tsak_struct 进程描述符性质相似 ;

对于 进程 来说 , active_mm 字段 与 mm 字段 指向同一个 " 内存描述符 " ;

但对于 " 内核线程 " 来说 , mm 字段 指向 空指针 , active_mm 字段 指向 从进程借用的 " 内存描述符 " ;

 struct mm_struct        *mm;struct mm_struct        *active_mm;

源码地址 : linux-5.6.18\include\linux\sched.h

四、内核线程主要用途


内核线程主要用途 :

内存同步 : 周期性执行如下同步操作 , 同步 " 修改的内存页 " 与 " 页来源块设备 " , 如 : mmap 文件映射 ;

写交换区 : 假如同步 " 修改的内存页 " 与 " 页来源块设备 " 时 , 内存页使用率很低 , 则 将同步内容写入 " 交换区 " ;

延时管理 : 管理 " 延时动作 " , Deferred Action ;

系统日志 : 管理控制 文件系统 事务日志 生成 ;

五、内核线程创建函数 kernel_thread 源码


linux-5.6.18\kernel\fork.c 源码中的

pid_t kernel_thread(int (*fn)(void *), void *arg, unsigned long flags)

方法 , 就是创建内核线程的函数 , 该函数中最终也是调用了 _do_fork() 函数 , 与 fork() , vfork() , clone() 等系统调用函数创建进程的方式类似 ;

/** Create a kernel thread.*/
pid_t kernel_thread(int (*fn)(void *), void *arg, unsigned long flags)
{struct kernel_clone_args args = {.flags       = ((lower_32_bits(flags) | CLONE_VM |CLONE_UNTRACED) & ~CSIGNAL),.exit_signal  = (lower_32_bits(flags) & CSIGNAL),.stack      = (unsigned long)fn,.stack_size    = (unsigned long)arg,};return _do_fork(&args);
}

【Linux 内核】进程管理 ( 内核线程概念 | 内核线程、普通进程、用户线程 | 内核线程与普通进程区别 | 内核线程主要用途 | 内核线程创建函数 kernel_thread 源码 )相关推荐

  1. linux源码共享,Android之高仿飞鸽传书热点创建与共享源码

    这两天,无意中看到飞鸽传书这个小东东,然后又突然对他的wifi热点创建与共享比较感兴趣,于是乎把他的APK给反编译了,很蛋疼的还原了一下他的这一小模块代码,感觉效果差不多,所以跟大家分享一下,下面我们 ...

  2. 【SA8295P 源码分析】16 - TouchScreen Panel (TP)线程函数 tp_recv_thread() 源码分析

    [SA8295P 源码分析]16 - TouchScreen Panel (TP)线程函数 tp_recv_thread 源码分析 一.TP 线程函数:tp_recv_thread() 二.处理&am ...

  3. 【Linux 内核 内存管理】虚拟地址空间布局架构 ① ( 虚拟地址空间布局架构 | 用户虚拟地址空间划分 )

    文章目录 一.虚拟地址空间布局架构 二.用户虚拟地址空间划分 一.虚拟地址空间布局架构 在 646464 位的 Linux 操作系统中 , " ARM64 架构 " 并 不支持 6 ...

  4. linux内核函数open源码,open()在Linux内核的实现(1)-基本实现

    原标题:open()在Linux内核的实现(1)-基本实现 1.基本说明 在用户态使用open()时,必须向该函数传入文件路径和打开权限.这两个参数传入内核后,内核首先检查这个文件路径存在的合法性,同 ...

  5. java实现进程管理,Java调用批处理或可执行文件和Runtime、Process类实现Java版进程管理器...

    Java调用批处理或可执行文件 用Java编写应用时,有时需要在程序中调用另一个现成的可执行程序或系统命令,这时可以通过组合使用Java提供的Runtime类和Process类的方法实现.下面是一种比 ...

  6. java课程设计进程管理_GitHub - Shadow-Java/OS: 操作系统课程设计,关键词:进程同步与互斥、进程死锁、LRU页面替换算法、时间片轮转算法、时钟等...

    可视化仿真实现作业管理与虚页内存管理 ℹ️设计要求 在多任务的作业并发环境下,仿真实现作业及进程并发环境.MMU 地址变换.进程原语.页表生成与虚页调度算法(至少实现LRU).三级作业调度过程及算法( ...

  7. Linux动态库加载函数dlopen源码梳理(一)

    下载了libc的源码,现在就开始libc源码的学习,最近了解到了linux动态库的相关知识,那么就从linux动态库加载函数dlopen进行梳理学习吧. 如果还没下载libc源码,可通过 https: ...

  8. android 多线程创建texture,从源码角度剖析Android系统EGL及GL线程

    本文转载自天天P图攻城狮微信公众号,作者:天天P图Android工程师kenneyqin(覃华峥),原文链接https://mp.weixin.qq.com/s/j_N5_C7iQUPWENdRYfj ...

  9. linux下ping函数的源码,linux下ping命令的实现源码(转)

    相信大家一定遇到过上不了网的情形,都知道用个ping命令.这不小王就是这样的女孩,老是上不了网,老是找我,我就先ping一下,逐步找找问题在哪儿,有的放矢,不至于盲目抓瞎(说心里话,我真不愿意帮小王弄 ...

最新文章

  1. 2018 ICPC 徐州网络赛 D. Easy Math(思维,反演,杜教筛)
  2. 京东某女程序员求助:刚入职就意外怀孕,纠结还能不能过试用期?网友:职场女性太难!...
  3. java 无锁缓存_如何在高并发环境下设计出无锁的数据库操作(Java版本)
  4. Enable htaccess file work in Apache
  5. babel css3新特性_2018年面试前端总结
  6. unity 批量导入模型工具_零基础的Unity图形学笔记3:使用多模型UV与优化模型导出...
  7. Debian 新负责人发表演讲:Debian 的现状与面临的一些问题
  8. Reverse digits of an integer
  9. 从Mysql数据库中导入导出表结构
  10. 一步步编写avalon组件03:切换卡组件
  11. jlabel 不能连续两次set_关于JLabel的setText在监听器中不刷新有关问题(2)
  12. 将OpenWRT安装到 X86 电脑硬盘中
  13. java离职证明模板word_离职证明模板Word免费版下载
  14. USB引脚定义以及导线的颜色定义
  15. 斑马旅游在千帆竞发的出境游市场能否找到属于自己的道路?
  16. matlab中figure图片大小修改
  17. 疫情下的生鲜配送,数字供应链发挥了重大作用
  18. jQuery使用ajaxSubmit()提交表单示例(转)
  19. Linux 生产环境搭建
  20. Cadedce Allegro 里面怎么切线删除一条线上的某一段

热门文章

  1. Windows7 连接Windows Server服务器时提示:计算机无法连接到远程计算机上的另一个控制台会话。...
  2. linux之vsftpd虚拟用户搭建
  3. Documentum中关于日期时间类型字段的特殊处理
  4. AppDomain,应用程序域
  5. 系统性能优化的常见八大误区
  6. 如何开启mysql5.5的客户端服务 命令行打开方法
  7. 20162309单步追踪数组及查找课下补分博客
  8. SAP RFC 函数来创建 Java呼叫 学习总结 一步一步的插图
  9. 《Shell脚本学习指南》第一章 背景知识
  10. ASP的Server.UrlEncode和Asp.Net的Server.UrlEncode的返回结果不同