【Linux 内核】进程管理 ( 内核线程概念 | 内核线程、普通进程、用户线程 | 内核线程与普通进程区别 | 内核线程主要用途 | 内核线程创建函数 kernel_thread 源码 )
文章目錄
- 一、內(nèi)核線程概念
- 二、內(nèi)核線程、普通進(jìn)程、用戶線程
- 三、內(nèi)核線程、普通進(jìn)程區(qū)別
- 四、內(nèi)核線程主要用途
- 五、內(nèi)核線程創(chuàng)建函數(shù) kernel_thread 源碼
一、內(nèi)核線程概念
直接 由 Linux 內(nèi)核 啟動(dòng)的線程 , 被稱為 " 內(nèi)核線程 " ;
" 內(nèi)核線程 " 是一種 特殊進(jìn)程 , 獨(dú)立運(yùn)行在 " 內(nèi)核空間 " , 其將 " 內(nèi)核函數(shù) " 委托給 獨(dú)立進(jìn)程 , 該 " 獨(dú)立進(jìn)程 " 與 其它進(jìn)程 ( 包括 普通進(jìn)程 , 內(nèi)核自身 , 用戶級(jí)線程 ) 并行執(zhí)行 ;
" 內(nèi)核線程 " 也稱為 " 守護(hù)進(jìn)程 " ;
二、內(nèi)核線程、普通進(jìn)程、用戶線程
在 【Linux 內(nèi)核】進(jìn)程管理 ( 進(jìn)程特殊形式 | 內(nèi)核線程 | 用戶線程 | C 標(biāo)準(zhǔn)庫(kù)與 Linux 內(nèi)核中進(jìn)程相關(guān)概念 | Linux 查看進(jìn)程命令及輸出字段解析 ) 一、進(jìn)程特殊形式 ( 內(nèi)核線程 | 用戶線程 ) 博客章節(jié) , 有介紹內(nèi)核線程 ,
普通的進(jìn)程 , 包含 內(nèi)核虛擬地址空間 和 用戶虛擬地址空間 , 其中 內(nèi)核虛擬地址空間 所有進(jìn)程共享 , 用戶虛擬地址空間 由進(jìn)程獨(dú)立擁有 ; 除了 普通進(jìn)程 外 , 進(jìn)程 還有 222 種 特殊形式 :
- 內(nèi)核級(jí)線程 : 只有 內(nèi)核虛擬地址空間 , 沒有 用戶虛擬地址空間 的進(jìn)程 , 稱為 內(nèi)核線程 ;
- 用戶級(jí)線程 : 共享 用戶虛擬地址空間 的進(jìn)程 , 稱為 用戶線程 ;
三、內(nèi)核線程、普通進(jìn)程區(qū)別
" 內(nèi)核線程 " 與 " 普通進(jìn)程 " 區(qū)別是 , 內(nèi)核進(jìn)程 沒有 " 獨(dú)立的進(jìn)程地址空間 " ;
在 task_struct 進(jìn)程描述符 結(jié)構(gòu)體中的 , mm 指針指向的空間就是 " 獨(dú)立的進(jìn)程地址空間 " ;
在 Linux 內(nèi)核 中 , " 進(jìn)程控制塊 " 是通過(guò) task_struct 結(jié)構(gòu)體 進(jìn)行描述的 ; Linux 內(nèi)核中 , 所有 進(jìn)程管理 相關(guān)算法邏輯 , 都是基于 task_struct 結(jié)構(gòu)體的 ; task_struct " 進(jìn)程描述符 " 結(jié)構(gòu)體在 linux-5.6.18\include\linux\sched.h 頭文件中 第 629629629 ~ 130013001300 行定義 ;
mm 字段是一個(gè)指針 , 指針指向 mm_struct 結(jié)構(gòu)體 , 這是 " 內(nèi)存描述符 " , 與 tsak_struct 進(jìn)程描述符性質(zhì)相似 ;
對(duì)于 進(jìn)程 來(lái)說(shuō) , active_mm 字段 與 mm 字段 指向同一個(gè) " 內(nèi)存描述符 " ;
但對(duì)于 " 內(nèi)核線程 " 來(lái)說(shuō) , mm 字段 指向 空指針 , active_mm 字段 指向 從進(jìn)程借用的 " 內(nèi)存描述符 " ;
struct mm_struct *mm;struct mm_struct *active_mm;源碼地址 : linux-5.6.18\include\linux\sched.h
四、內(nèi)核線程主要用途
內(nèi)核線程主要用途 :
內(nèi)存同步 : 周期性執(zhí)行如下同步操作 , 同步 " 修改的內(nèi)存頁(yè) " 與 " 頁(yè)來(lái)源塊設(shè)備 " , 如 : mmap 文件映射 ;
寫交換區(qū) : 假如同步 " 修改的內(nèi)存頁(yè) " 與 " 頁(yè)來(lái)源塊設(shè)備 " 時(shí) , 內(nèi)存頁(yè)使用率很低 , 則 將同步內(nèi)容寫入 " 交換區(qū) " ;
延時(shí)管理 : 管理 " 延時(shí)動(dòng)作 " , Deferred Action ;
系統(tǒng)日志 : 管理控制 文件系統(tǒng) 事務(wù)日志 生成 ;
五、內(nèi)核線程創(chuàng)建函數(shù) kernel_thread 源碼
在 linux-5.6.18\kernel\fork.c 源碼中的
pid_t kernel_thread(int (*fn)(void *), void *arg, unsigned long flags)方法 , 就是創(chuàng)建內(nèi)核線程的函數(shù) , 該函數(shù)中最終也是調(diào)用了 _do_fork() 函數(shù) , 與 fork() , vfork() , clone() 等系統(tǒng)調(diào)用函數(shù)創(chuàng)建進(jìn)程的方式類似 ;
/** 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); }總結(jié)
以上是生活随笔為你收集整理的【Linux 内核】进程管理 ( 内核线程概念 | 内核线程、普通进程、用户线程 | 内核线程与普通进程区别 | 内核线程主要用途 | 内核线程创建函数 kernel_thread 源码 )的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【Linux 内核】进程管理 ( 进程相
- 下一篇: 【Linux 内核】进程管理 ( 进程状