• 第三章 進程管理


    可以參考《深入Linux內核架構》第二章閱讀筆記

    1. 進程 process

    • 程序本身並不是進程,進程是處於執行期的程序以及相關的資源的總稱。如:可執行代碼段、打開的文件、掛起的信號、內核內部數據、處理器狀態、一個或多個具有內存映射的內存地址空間以及一個或多個執行線程、存放全局變量的數據段等等。

    • 實際上,進程就是正在執行的程序代碼的實時結果。

    • 進程的另一個名字是任務(task)

    2. 現代操作系統提供的兩種虛擬機制

    • 虛擬處理器:讓正在分享同一個處理器的多個進程都覺着自己在獨享處理器

    • 虛擬內存:讓進程在分配和管理內存時覺得自己擁有整個系統的所有內存資源

    3. 進程描述符 task_struct

    內核將進程的列表存放在叫做任務隊列(task list)的雙向循環鏈表中,鏈表中的每一項的類型都是task_struct,稱爲進程描述符,其中記錄了一個具體進程的所有信息。系統中的所有進程都通過其task_struct的tasks域串在一起。

    4. 進程退出執行後會被設置爲僵死狀態,處於僵死態的進程所佔有的內存就是內核棧、thread_info結構體和task_struct機構,直到當它的父進程調用wait()或者waitpid()時,該進程的task_struct以及其所獨享的資源纔會全部釋放。

    5. thread_info

    在每個任務的內核棧的尾端都有一個struct thread_info結構體,該結構體中的task存放的是指向該任務實際task_struct的指針。

    注:上圖中應該將 struct thread_struct 寫成 struct thread_info。

    如對於ARM64架構的處理器:

    1. /*
    2. * how to get the current stack pointer from C
    3. */
    4. registerunsignedlong current_stack_pointer asm("sp");
    5. /*
    6. * how to get the thread information struct from C
    7. */
    8. staticinlinestruct thread_info *current_thread_info(void) __attribute_const__;
    9. staticinlinestruct thread_info *current_thread_info(void)
    10. {
    11. return(struct thread_info *)
    12. (current_stack_pointer &~(THREAD_SIZE -1));
    13. }
    其中,THREAD_SIZE的值是16384,即16KB,從這裏看到,對於ARM64系統,內核棧的大小是16KB,頁大小是8KB。

    6. current

    使用current宏可以獲得當前正在運行的進程的task_struct,定義如下:

    1. #define get_current()(current_thread_info()->task)
    2. #define current get_current()

    在進程通過系統調用或者觸發某個異常陷入內盒空間時,current宏才有效。

    7. PID

    • 內核通過一個唯一的進程標識值(process identification value)或者PID來標識每個進程。

    • 類型是pid_t,存放在task_struct的pid域

    • 目前PID的最大值是32768,表示系統中允許同時存在的進程的最大數目,可以通過修改/proc/sys/kernel/pid_max改變這個值。

    8. 進程的狀態

    在task_struct的state域描述了進程的當前狀態。一共有五種:

    注:TASK_RUNNING —— 進程是可執行的;它或者正在執行,或者在運行隊列中等待。

    9. 可以通過宏set_task_state(task, state)或者set_current_state(state)改變進程的狀態。

    10. init進程的PID是1,task_struct的parent域指向其父進程,children域爲該進程的子進程鏈表。

    11. 線程

    • Linux內核並沒有線程這一概念,它把所有的線程都當做進程來實現,線程僅僅被視爲一個與其他進程共享某些資源的進程

    • 創建線程:

      1. clone(CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND,0)
      說明:
    參數標誌 含義
    CLONE_FILES 父子進程共享打開的文件
    CLONE_FS 父子進程共享文件系統信息
    CLONE_SIGHAND 父子進程共享信號處理函數及背阻斷的信號

    CLONE_VM

    父子進程共享地址空間

    12. 內核線程

    • 獨立運行與內核空間的標準進程

    • 跟普通進程的區別是內核線程沒有獨立的地址空間(其task_struct的mm域爲NULL),只在內核空間運行

    • 跟普通進程一樣可以被調度和搶佔

    • 內核線程的創建也會調用clone

    完。





  • 相关阅读:
    synchronized锁机制 之 代码块锁(转)
    执行mvn 报错 source-1.5 中不支持 diamond运算符
    Git常用命令及场景
    mysql数据库导入与导出
    Linux磁盘空间分析及清理(df、du、rm)
    IIs配置文件存放路径
    解决SQLite database is locked
    C#测试web服务是否可用
    Jquery easyui-combobox 的一个BUG
    iframe自适应方法
  • 原文地址:https://www.cnblogs.com/pengdonglin137/p/5839558.html
Copyright © 2020-2023  润新知