chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux的進程

strongerHuang ? 來源:嵌入式Hacker ? 作者:吳偉東 ? 2020-11-29 09:51 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

目的:

初步了解進程描述符 task_struct。

目錄:

Linux的進程

Linux 的進程描述符

task_struct

內(nèi)核如何找到 task_struct

task_struct 的分配和初始化

實驗:打印 task_struct / thread_info / kernel mode stack

環(huán)境:

Linux-4.14 + ARMv7

1. Linux 的進程

進程的術(shù)語是 process,是 Linux 最基礎(chǔ)的抽象,另一個基礎(chǔ)抽象是文件。

最簡單的理解,進程就是執(zhí)行中 (executing, 不等于running) 的程序。

更準(zhǔn)確一點的理解,進程包括執(zhí)行中的程序以及相關(guān)的資源(包括cpu狀態(tài)、打開的文件、掛起的信號、tty、內(nèi)存地址空間等)。

一種簡潔的說法:進程 = n*執(zhí)行流 + 資源,n>=1。

Linux 進程的特點:

通過系統(tǒng)調(diào)用 fork() 創(chuàng)建進程,fork() 會復(fù)制現(xiàn)有進程來創(chuàng)建一個全新的進程。

內(nèi)核里,并不嚴(yán)格區(qū)分進程和線程。

從內(nèi)核的角度看,調(diào)度單位是線程 (即執(zhí)行流)??梢园丫€程看做是進程里的一條執(zhí)行流,1個進程里可以有1個或者多個線程。

內(nèi)核里,常把進程稱為 task 或者 thread,這樣描述更準(zhǔn)確,因為許多進程就只有1條執(zhí)行流。

內(nèi)核通過輕量級進程 (lightweight process) 來支持多線程。1個輕量級進程就對應(yīng)1個線程,輕量級進程之間可以共享打開的文件、地址空間等資源。

2. Linux 的進程描述符

2.1 task_struct

內(nèi)核里,通過 task_struct 結(jié)構(gòu)體來描述一個進程,稱為進程描述符 (process descriptor),它保存著支撐一個進程正常運行的所有信息。

每一個進程,即便是輕量級進程(即線程),都有1個 task_struct。

sched.h(includelinux) structtask_struct{ structthread_infothread_info; volatilelongstate; void*stack; [...] structmm_struct*mm; [...] pid_tpid; [...] structtask_struct*parent; [...] charcomm[TASK_COMM_LEN]; [...] structfiles_struct*files; [...] structsignal_struct*signal; }

這是一個龐大的結(jié)構(gòu)體,不僅有許多進程相關(guān)的基礎(chǔ)字段,還有許多指向其他數(shù)據(jù)結(jié)構(gòu)的指針。

它包含的字段能完整地描述一個正在執(zhí)行的程序,包括 cpu 狀態(tài)、打開的文件、地址空間、掛起的信號、進程狀態(tài)等。

點擊查看大圖

作為初學(xué)者,先簡單地了解部分字段就好::

struct thread_info thread_info:進程底層信息,平臺相關(guān),下面會詳細(xì)描述。

long state:進程當(dāng)前的狀態(tài),下面是幾個比較重要的進程狀態(tài)以及它們之間的轉(zhuǎn)換流程。

點擊查看大圖

void *stack:指向進程內(nèi)核棧,下面會解釋。

struct mm_struct *mm:與進程地址空間相關(guān)的信息都保存在一個叫內(nèi)存描述符 (memory descriptor) 的結(jié)構(gòu)體 (mm_struct) 中。

點擊查看大圖

pid_t pid:進程標(biāo)識符,本質(zhì)就是一個數(shù)字,是用戶空間引用進程的唯一標(biāo)識。

struct task_struct *parent:父進程的 task_struct。

char comm[TASK_COMM_LEN]:進程的名稱。

struct files_struct*files:打開的文件表。

struct signal_struct *signal:信號處理相關(guān)。

其他字段,等到有需要的時候再回過頭來學(xué)習(xí)。

2.2 當(dāng)發(fā)生系統(tǒng)調(diào)用或者進程切換時,內(nèi)核如何找到 task_struct ?

對于 ARM 架構(gòu),答案是:通過內(nèi)核棧 (kernel mode stack)。

為什么要有內(nèi)核棧?

因為內(nèi)核是可重入的,在內(nèi)核中會有多條與不同進程相關(guān)聯(lián)的執(zhí)行路徑。因此不同的進程處于內(nèi)核態(tài)時,都需要有自己私有的進程內(nèi)核棧 (process kernel stack)。

當(dāng)進程從用戶態(tài)切換到內(nèi)核態(tài)時,所使用的棧會從用戶棧切換到內(nèi)核棧。

至于是如何切換的,關(guān)鍵詞是系統(tǒng)調(diào)用,這不是本文關(guān)注的重點,先放一邊,學(xué)習(xí)內(nèi)核要懂得恰當(dāng)?shù)臅r候忽略細(xì)節(jié)。

當(dāng)發(fā)生進程切換時,也會切換到目標(biāo)進程的內(nèi)核棧。

同上,關(guān)鍵詞是硬件上下文切換 (hardware context switch),忽略具體實現(xiàn)。

無論何時,只要進程處于內(nèi)核態(tài),就會有內(nèi)核??梢允褂?,否則系統(tǒng)就離崩潰不遠(yuǎn)了。

ARM 架構(gòu)的內(nèi)核棧和 task_struct 的關(guān)系如下:

內(nèi)核棧的長度是 THREAD_SIZE,對于 ARM 架構(gòu),一般是 2 個頁框的大小,即 8KB。

內(nèi)核將一個較小的數(shù)據(jù)結(jié)構(gòu) thread_info 放在內(nèi)核棧的底部,它負(fù)責(zé)將內(nèi)核棧和 task_struct 串聯(lián)起來。thread_info 是平臺相關(guān)的,在 ARM 架構(gòu)中的定義如下:

//thread_info.h(archarmincludeasm) structthread_info{ unsignedlongflags;/*lowlevelflags*/ intpreempt_count;/*0=>preemptable,<0?=>bug*/ mm_segment_taddr_limit;/*addresslimit*/ structtask_struct*task;/*maintaskstructure*/ [...] structcpu_context_savecpu_context;/*cpucontext*/ [...] };

thread_info 保存了一個進程能被調(diào)度執(zhí)行的最底層信息(low level task data),例如struct cpu_context_save cpu_context 會在進程切換時用來保存/恢復(fù)寄存器上下文。

內(nèi)核通過內(nèi)核棧的棧指針可以快速地拿到 thread_info:

//thread_info.h(includelinux) staticinlinestructthread_info*current_thread_info(void) { //current_stack_pointer是當(dāng)前進程內(nèi)核棧的棧指針 return(structthread_info*) (current_stack_pointer&~(THREAD_SIZE-1)); }

然后通過 thread_info 找到 task_struct:

//current.h(includeasm-generic) #definecurrent(current_thread_info()->task)

內(nèi)核里通過 current 宏可以獲得當(dāng)前進程的 task_struct。

2.3 task_struct 的分配和初始化

當(dāng)上層應(yīng)用使用 fork() 創(chuàng)建進程時,內(nèi)核會新建一個 task_struct。

進程的創(chuàng)建是個復(fù)雜的工作,可以延伸出無數(shù)的細(xì)節(jié)。這里我們只是簡單地了解一下 task_struct 的分配和部分初始化的流程。

fork() 在內(nèi)核里的核心流程:

dup_task_struct() 做了什么?

至于設(shè)置內(nèi)核棧里做了什么,涉及到了進程的創(chuàng)建與切換,不在本文的關(guān)注范圍內(nèi),以后再研究了。

3. 實驗:打印 task_struct / thread_info / kernel mode stack

實驗?zāi)康模?/p>

梳理 task_struct / thread_info / kernel mode stack 的關(guān)系。

實驗代碼:

#include #include #include staticvoidprint_task_info(structtask_struct*task) { printk(KERN_NOTICE"%10s%5dtask_struct(%p)/stack(%p~%p)/thread_info->task(%p)", task->comm, task->pid, task, task->stack, ((unsignedlong*)task->stack)+THREAD_SIZE, task_thread_info(task)->task); } staticint__inittask_init(void) { structtask_struct*task=current; printk(KERN_INFO"taskmoduleinit "); print_task_info(task); do{ task=task->parent; print_task_info(task); }while(task->pid!=0); return0; } module_init(task_init); staticvoid__exittask_exit(void) { printk(KERN_INFO"taskmoduleexit "); } module_exit(task_exit);

運行效果:

taskmoduleinit insmod3123task_struct(edb42580)/stack(ed46c000~ed474000)/thread_info->task(edb42580) bash2393task_struct(eda13e80)/stack(c9dda000~c9de2000)/thread_info->task(eda13e80) sshd2255task_struct(ee5c9f40)/stack(c9d2e000~c9d36000)/thread_info->task(ee5c9f40) sshd543task_struct(ef15f080)/stack(ee554000~ee55c000)/thread_info->task(ef15f080) systemd1task_struct(ef058000)/stack(ef04c000~ef054000)/thread_info->task(ef058000)

在程序里,我們通過 task_struct 找到 stack,然后通過 stack 找到 thread_info,最后又通過 thread_info->task 找到 task_struct。

4. 相關(guān)參考

Linux 內(nèi)核設(shè)計與實現(xiàn) / 第 3.1 章節(jié)

深入理解 Linux 內(nèi)核 / 3

Linux 內(nèi)核深度解析 / 2.5.1

深入Linux 內(nèi)核架構(gòu) / 2.3

責(zé)任編輯:lq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Linux
    +關(guān)注

    關(guān)注

    88

    文章

    11576

    瀏覽量

    216647
  • 多線程
    +關(guān)注

    關(guān)注

    0

    文章

    279

    瀏覽量

    20774
  • 進程
    +關(guān)注

    關(guān)注

    0

    文章

    208

    瀏覽量

    14448

原文標(biāo)題:Linux 內(nèi)核 / 進程管理 / 如何描述一個進程?

文章出處:【微信號:strongerHuang,微信公眾號:strongerHuang】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    【作品合集】合眾HZ-T536開發(fā)板測評

    【HZ-T536開發(fā)板免費體驗】—— linux 進程創(chuàng)建 【HZ-T536開發(fā)板免費體驗】—— linux創(chuàng)建線程 作者:zealsoft【HZ-T536開發(fā)板免費體驗】1 - 開箱測試 【HZ-T536開發(fā)板
    發(fā)表于 09-12 09:37

    【HZ-T536開發(fā)板免費體驗】—— linux 進程創(chuàng)建

    Linux進程通信方式有這幾種: 1。管道 2。信號量 3。消息隊列 4。共享內(nèi)存 在本帖子中,我會講解fork(),exit()系統(tǒng)調(diào)用的實踐。通過應(yīng)用編程來實現(xiàn)系統(tǒng)調(diào)用。 1,進程創(chuàng)建 打開
    發(fā)表于 09-01 20:49

    詳解Linux系統(tǒng)中的服務(wù)管理

    Linux中,無論何時當(dāng)你安裝任何帶有服務(wù)和守護進程的包,系統(tǒng)默認(rèn)會把這些服務(wù)的初始化及 systemd腳本添加進去,不過此時它們并沒有被啟用。
    的頭像 發(fā)表于 05-23 15:10 ?518次閱讀
    詳解<b class='flag-5'>Linux</b>系統(tǒng)中的服務(wù)管理

    Linux常用命令大全

    Linux常用命令是指在Linux操作系統(tǒng)中廣泛使用的命令工具,這些命令工具可以完成各種不同的任務(wù),如管理文件和目錄、操作進程、網(wǎng)絡(luò)通信、軟件安裝等。
    的頭像 發(fā)表于 05-03 18:08 ?1418次閱讀

    Linux后臺進程管理詳解

    當(dāng)我們在終端或控制臺工作時,可能不希望由于運行一個作業(yè)而占住了屏幕,因為可能還有更重要的事情要做,比如閱讀電子郵件。對于密集訪問磁盤的進程,我們更希望它能夠在每天的非負(fù)荷高峰時間段運行(例如凌晨)。為了使這些進程能夠在后臺運行,也就是說不在終端屏幕上運行,有幾種選擇方法可
    的頭像 發(fā)表于 04-25 11:04 ?660次閱讀
    <b class='flag-5'>Linux</b>后臺<b class='flag-5'>進程</b>管理詳解

    Linux系統(tǒng)進程管理入門指南

    Linux 系統(tǒng)中,進程是正在運行的程序的實例。理解進程的管理、查看和控制對于系統(tǒng)管理員和開發(fā)者來說非常重要
    的頭像 發(fā)表于 04-22 14:34 ?687次閱讀
    <b class='flag-5'>Linux</b>系統(tǒng)<b class='flag-5'>進程</b>管理入門指南

    Linux進程狀態(tài)詳解

    進程狀態(tài)是task_struct內(nèi)的一個整數(shù);進行:進程在調(diào)度隊列中,進程的狀態(tài)都是running,阻塞:等待某種設(shè)備或者資源就緒。進程是一個隊列,設(shè)備也是一個隊列,當(dāng)我們讀磁盤,讀網(wǎng)
    的頭像 發(fā)表于 04-01 09:46 ?710次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>進程</b>狀態(tài)詳解

    Linux計劃任務(wù)cron詳解

    cron是linux下用來周期性的執(zhí)行某種任務(wù)或等待處理某些事件的一個守護進程,與windows下的計劃任務(wù)類似,當(dāng)安裝完成操作系統(tǒng)后,默認(rèn)會安裝此服務(wù) 工具,并且會自動啟動crond進程,crond
    的頭像 發(fā)表于 02-07 15:31 ?1372次閱讀
    <b class='flag-5'>Linux</b>計劃任務(wù)cron詳解

    深入解析Linux程序與進程

    什么是程序 一組計算機能識別和執(zhí)行的指令,用于指導(dǎo)計算機執(zhí)行特定任務(wù)或解決特定問題。程序通常由代碼、數(shù)據(jù)和資源文件組成,涉及語法、算法和數(shù)據(jù)結(jié)構(gòu)。為二進制文件 什么是進程 是一個具有獨立功能的程序
    的頭像 發(fā)表于 12-18 11:01 ?728次閱讀
    深入解析<b class='flag-5'>Linux</b>程序與<b class='flag-5'>進程</b>

    Linux之CPU調(diào)度策略和CPU親和性

    一、調(diào)度策略 調(diào)度進程 單個 CPU一次只能執(zhí)行一個進程,雖然 Linux 系統(tǒng)通過使用多任務(wù)同時處理多個進程,但當(dāng)多個進程同時運行在一個C
    的頭像 發(fā)表于 12-05 16:38 ?1519次閱讀
    <b class='flag-5'>Linux</b>之CPU調(diào)度策略和CPU親和性

    深入Linux進程管理:提升效率與穩(wěn)定性的關(guān)鍵方法

    目錄 Linux進程管理 8.1 IO負(fù)載 8.2 實時進程監(jiān)控 5.1 作業(yè)與會話 5.2 作業(yè)分類 4.1 ps 4.2pstree 4.3pgrep 4.4pidof 4.5 vmstat
    的頭像 發(fā)表于 11-22 11:05 ?978次閱讀
    深入<b class='flag-5'>Linux</b><b class='flag-5'>進程</b>管理:提升效率與穩(wěn)定性的關(guān)鍵方法

    一文搞懂Linux進程的睡眠和喚醒

    ): 進程在等待某個條件滿足(如I/O操作),可以被信號喚醒。 Linux通過內(nèi)核提供的系統(tǒng)調(diào)用來控制進程的睡眠。常用的系統(tǒng)調(diào)用有: sleep(): 使進程暫停指定的秒數(shù)。 usl
    發(fā)表于 11-04 15:15

    Linux網(wǎng)絡(luò)基礎(chǔ)知識總結(jié)

    同 CPU、內(nèi)存以及 I/O 一樣,網(wǎng)絡(luò)也是 Linux 系統(tǒng)最核心的功能。 網(wǎng)絡(luò)是一種把不同計算機或網(wǎng)絡(luò)設(shè)備連接到一起的技術(shù),它本質(zhì)上是一種進程間通信方式,特別是跨系統(tǒng)的進程間通信,必須要通過網(wǎng)絡(luò)才能進行。
    的頭像 發(fā)表于 10-28 10:42 ?855次閱讀
    <b class='flag-5'>Linux</b>網(wǎng)絡(luò)基礎(chǔ)知識總結(jié)

    Linux lsof命令的基本用法

    linux 系統(tǒng)中,一切皆文件。通過文件不僅僅可以訪問常規(guī)數(shù)據(jù),還可以訪問網(wǎng)絡(luò)連接和硬件。所以 lsof 命令不僅可以查看進程打開的文件、目錄,還可以查看進程監(jiān)聽的端口等 socket 相關(guān)的信息。本文將介紹 lsof 命令
    的頭像 發(fā)表于 10-23 11:52 ?1904次閱讀
    <b class='flag-5'>Linux</b> lsof命令的基本用法

    Linux用戶身份與進程權(quán)限詳解

    在學(xué)習(xí) Linux 系統(tǒng)權(quán)限相關(guān)的主題時,我們首先關(guān)注的基本都是文件的 ugo 權(quán)限。ugo 權(quán)限信息是文件的屬性,它指明了用戶與文件之間的關(guān)系。但是真正操作文件的卻是進程,也就是說用戶所擁有的文件
    的頭像 發(fā)表于 10-23 11:41 ?1013次閱讀
    <b class='flag-5'>Linux</b>用戶身份與<b class='flag-5'>進程</b>權(quán)限詳解