進程管理
1、 進程
概念
進程就是處於執行的程序。包括可執行程序代碼、打開的文件、掛起的信號、
內核數據、處理器狀態,內存地址空間、一個或多個線程、全局數據段
線程
是進程中活動的對象。包括獨立的程序計數器、進程棧、一組進程寄存器
虛擬機制
虛擬處理器、虛擬內存(後面詳細講解)
進程api
fork()->exec()
進程描述符及任務結構
實踐:瞭解task_struct 結構定義
包括打開的文件,進程地址空間,掛起的信號,進程狀態。。。
分配進程描述符
實踐:瞭解thread_info,curent_thread_info()
進程描述符的存放
進程pid最大是 32768,但可以修改/proc/sys/kernel/pid_max
進程狀態
TASK_RUNNING,TASK_INTRRUPTIBLE,TASK_UNINTRRUPTIBLE,__TASK_TRACE(例如ptrace),
進程樹
init進程是根進程,其它進程都是由此的子樹
進程創建
fork() 創建子進程,exec()讀取執行文件並載入地址空間運行。
fork() 採用寫時拷貝(copy-on-write),需要的時候才拷貝。可以減少拷貝,讓父進程和子進程共享一個拷貝
vfork()
同fork()
線程
linux從本質上來說沒有線程概念。windows上線程是執行單元,而linux只是進程間共享資源的手段。
創建線程
clone(CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND,0) ;//地址空間,文件系統資源,文件描述符,信號
同fork()差不多,clone(SIGCHLD,0)
vfork() 是 clone(CLONE_VFORK|CLONE_VM|SIGCHLD,0)
標誌位列表
參數標誌 | 含義 |
---|---|
CLONE_FILES | 打開的文件 |
CLONE_FS | 文件系統信息 |
CLONE_IDLETASK | pid=0,只供idle進程使用 |
CLONE_NEWNS | 爲子進程創建新命名空間 |
CLONE_PARENT | 子與父擁有同一個父進程 |
CLONE_PTRACE | 繼續調試子進程 |
CLONE_SETTID | tid寫至用戶空間 |
CLONE_SETTLS | TLS |
CLONE_SIGHAND | 共享信號 |
CLONE_SYSVSEM | system v |
CLONE_THREAD | 父子進程放入相同的線程組 |
CLONE_VFORK | 父進程準備睡眠等子進程喚醒 |
CLONE_UNTRACED | 防止被CLONE_PTRACE |
CLONE_STOP | 以TASK_STOP開始進程 |
CLONE_SETTLS | 創建新的TLS(線程本地存儲) |
CLONE_CHILD_CLEARTID | 清除子進程tid |
CLONE_CHILD_SETTID | 設置子進程tid |
CLONE_PARENT_SETTID | 設置父進程tid |
CLONE_VM | 共享地址空間 |