哈哈哈哈哈操欧洲电影,久草网在线,亚洲久久熟女熟妇视频,麻豆精品色,久久福利在线视频,日韩中文字幕的,淫乱毛视频一区,亚洲成人一二三,中文人妻日韩精品电影

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

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

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

Linux的進(jìn)程

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

掃碼添加小助手

加入工程師交流群

目的:

初步了解進(jìn)程描述符 task_struct。

目錄:

Linux的進(jìn)程

Linux 的進(jìn)程描述符

task_struct

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

task_struct 的分配和初始化

實(shí)驗(yàn):打印 task_struct / thread_info / kernel mode stack

環(huán)境:

Linux-4.14 + ARMv7

1. Linux 的進(jìn)程

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

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

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

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

Linux 進(jìn)程的特點(diǎn):

通過(guò)系統(tǒng)調(diào)用 fork() 創(chuàng)建進(jìn)程,fork() 會(huì)復(fù)制現(xiàn)有進(jìn)程來(lái)創(chuàng)建一個(gè)全新的進(jìn)程。

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

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

內(nèi)核里,常把進(jìn)程稱(chēng)為 task 或者 thread,這樣描述更準(zhǔn)確,因?yàn)樵S多進(jìn)程就只有1條執(zhí)行流。

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

2. Linux 的進(jìn)程描述符

2.1 task_struct

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

每一個(gè)進(jìn)程,即便是輕量級(jí)進(jìn)程(即線程),都有1個(gè) 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; }

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

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

點(diǎn)擊查看大圖

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

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

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

點(diǎn)擊查看大圖

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

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

點(diǎn)擊查看大圖

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

struct task_struct *parent:父進(jìn)程的 task_struct。

char comm[TASK_COMM_LEN]:進(jìn)程的名稱(chēng)。

struct files_struct*files:打開(kāi)的文件表。

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

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

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

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

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

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

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

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

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

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

無(wú)論何時(shí),只要進(jìn)程處于內(nèi)核態(tài),就會(huì)有內(nèi)核??梢允褂茫駝t系統(tǒng)就離崩潰不遠(yuǎn)了。

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

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

內(nèi)核將一個(gè)較小的數(shù)據(jù)結(jié)構(gòu) thread_info 放在內(nèi)核棧的底部,它負(fù)責(zé)將內(nèi)核棧和 task_struct 串聯(lián)起來(lái)。thread_info 是平臺(tái)相關(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 保存了一個(gè)進(jìn)程能被調(diào)度執(zhí)行的最底層信息(low level task data),例如struct cpu_context_save cpu_context 會(huì)在進(jìn)程切換時(shí)用來(lái)保存/恢復(fù)寄存器上下文。

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

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

然后通過(guò) thread_info 找到 task_struct:

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

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

2.3 task_struct 的分配和初始化

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

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

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

dup_task_struct() 做了什么?

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

3. 實(shí)驗(yàn):打印 task_struct / thread_info / kernel mode stack

實(shí)驗(yàn)?zāi)康模?/p>

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

實(shí)驗(yà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);

運(yùn)行效果:

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)

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

4. 相關(guān)參考

Linux 內(nèi)核設(shè)計(jì)與實(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)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    88

    文章

    11806

    瀏覽量

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

    關(guān)注

    0

    文章

    279

    瀏覽量

    21121
  • 進(jìn)程
    +關(guān)注

    關(guān)注

    0

    文章

    211

    瀏覽量

    14559

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

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

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    飛凌嵌入式ElfBoard-進(jìn)程進(jìn)程狀態(tài)

    Linux系統(tǒng)中,進(jìn)程狀態(tài)對(duì)于系統(tǒng)調(diào)度、資源分配和管理非常重要,因?yàn)樗硎玖?b class='flag-5'>進(jìn)程當(dāng)前的執(zhí)行狀況和資源使用情況。在Linux 系統(tǒng)中使用ps -aux 命令可觀察到
    發(fā)表于 03-27 09:12

    飛凌嵌入式ElfBoard-進(jìn)程的相關(guān)信息之父進(jìn)程和子進(jìn)程

    進(jìn)程在創(chuàng)建時(shí),創(chuàng)建進(jìn)程是新進(jìn)程的父進(jìn)程,新進(jìn)程是創(chuàng)建進(jìn)程的子
    發(fā)表于 03-12 17:12

    飛凌嵌入式ElfBoard-進(jìn)程之什么是進(jìn)程

    Linux系統(tǒng)中,有些基本命令能夠查看到進(jìn)程的信息。例如ps、top、pgrep、pstree等;這些命令為用戶(hù)提供了查看和管理Linux進(jìn)程信息的多種功能。通過(guò)合理使用這些命令,用
    發(fā)表于 03-02 08:49

    Linux進(jìn)程管理不用愁!這6個(gè)工具幫你搞定90%場(chǎng)景

    Linux 系統(tǒng)中,進(jìn)程是資源分配的基本單位,無(wú)論是服務(wù)器運(yùn)維、程序調(diào)試還是日常使用,掌握進(jìn)程管理工具都是必備技能。今天就帶大家梳理 6 個(gè)最常用的進(jìn)程管理工具,從查看
    的頭像 發(fā)表于 02-04 16:23 ?2693次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>進(jìn)程</b>管理不用愁!這6個(gè)工具幫你搞定90%場(chǎng)景

    Linux進(jìn)程樹(shù)分析工具pstree詳解與實(shí)戰(zhàn)指南(另一視角優(yōu)化Linux系統(tǒng))

    Linux 系統(tǒng)開(kāi)發(fā)與運(yùn)維中,理解進(jìn)程的運(yùn)行狀態(tài)和相互關(guān)系是排查問(wèn)題、優(yōu)化性能的基礎(chǔ)。pstree 作為一款輕量高效的進(jìn)程樹(shù)可視化工具,能直觀展示系統(tǒng)中所有進(jìn)程的父子關(guān)系,為系統(tǒng)分
    的頭像 發(fā)表于 02-04 16:21 ?887次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>進(jìn)程</b>樹(shù)分析工具pstree詳解與實(shí)戰(zhàn)指南(另一視角優(yōu)化<b class='flag-5'>Linux</b>系統(tǒng))

    進(jìn)程通信

    進(jìn)程通信是指進(jìn)程之間的信息交換。PV操作是低級(jí)通信方式,髙級(jí)通信方式是指以較高的效率傳輸大量數(shù)據(jù)的通信方式。高級(jí)通信方法主要有以下三個(gè)類(lèi)。   共享存儲(chǔ)   在通信的進(jìn)程之間存在一塊可直接
    發(fā)表于 01-15 06:16

    進(jìn)程的控制

    進(jìn)程控制的主要功能是對(duì)系統(tǒng)中的所有進(jìn)程實(shí)施有效的管理,它具有創(chuàng)建新進(jìn)程、撤銷(xiāo)已有進(jìn)程、實(shí)現(xiàn)進(jìn)程狀態(tài)轉(zhuǎn)換等功能。在操作系統(tǒng)中,一般把
    發(fā)表于 01-15 06:05

    深入Linux內(nèi)核:進(jìn)程調(diào)度的核心邏輯與實(shí)現(xiàn)細(xì)節(jié)

    Linux系統(tǒng)中,進(jìn)程調(diào)度就像一位精明的“CPU管理員”——它決定著哪個(gè)進(jìn)程能優(yōu)先使用CPU,多久切換一次進(jìn)程,如何平衡系統(tǒng)響應(yīng)速度與資源利用率。小到桌面應(yīng)用的流暢點(diǎn)擊,大到服務(wù)器的
    的頭像 發(fā)表于 12-24 07:05 ?4547次閱讀
    深入<b class='flag-5'>Linux</b>內(nèi)核:<b class='flag-5'>進(jìn)程</b>調(diào)度的核心邏輯與實(shí)現(xiàn)細(xì)節(jié)

    解析Linux進(jìn)程、線程和協(xié)程

    影響其他進(jìn)程,進(jìn)程之間是高度隔離的。Linux中,進(jìn)程進(jìn)程標(biāo)識(shí)符(PID)唯一標(biāo)識(shí)。 進(jìn)程
    發(fā)表于 12-22 11:00

    Linux進(jìn)程間通信(IPC)全解析:從管道到?Socket,一篇講透

    在?Linux?世界里,進(jìn)程并非孤立存在。無(wú)論是后臺(tái)服務(wù)協(xié)作(如?Web?服務(wù)器與數(shù)據(jù)庫(kù))、命令行工具聯(lián)動(dòng)(如ps | grep),還是復(fù)雜應(yīng)用的模塊通信,都離不開(kāi) 進(jìn)程間通信(IPC
    的頭像 發(fā)表于 11-14 21:38 ?1.3w次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>進(jìn)程</b>間通信(IPC)全解析:從管道到?Socket,一篇講透

    【作品合集】合眾HZ-T536開(kāi)發(fā)板測(cè)評(píng)

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

    【HZ-T536開(kāi)發(fā)板免費(fèi)體驗(yàn)】—— linux 進(jìn)程創(chuàng)建

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

    Linux常用命令大全

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

    Linux后臺(tái)進(jìn)程管理詳解

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

    Linux系統(tǒng)進(jìn)程管理入門(mén)指南

    Linux 系統(tǒng)中,進(jìn)程是正在運(yùn)行的程序的實(shí)例。理解進(jìn)程的管理、查看和控制對(duì)于系統(tǒng)管理員和開(kāi)發(fā)者來(lái)說(shuō)非常重要
    的頭像 發(fā)表于 04-22 14:34 ?1296次閱讀
    <b class='flag-5'>Linux</b>系統(tǒng)<b class='flag-5'>進(jìn)程</b>管理入門(mén)指南
    信丰县| 临泉县| 雅江县| 梁河县| 德钦县| 桃江县| 庐江县| 河东区| 乡城县| 武夷山市| 富锦市| 西贡区| 南雄市| 桦甸市| 两当县| 诏安县| 威宁| 沾化县| 龙胜| 安丘市| 华池县| 界首市| 临洮县| 泰来县| 成都市| 桃园县| 东至县| 南雄市| 乌什县| 晋城| 沾化县| 临高县| 哈密市| 云霄县| 威远县| 城固县| 高尔夫| 朝阳市| 溧阳市| 泸溪县| 平南县|