Linux 的行程結構

Linux 中的行程 (Process) 被稱為任務 (Task),其資料結構是一個稱為 task_struct 的 C 語言結構,該結構所記錄的欄位相當多,在 Linux 2.6.29.4 版當中光是該結構的宣告就占了 306 行的程式碼,範例 1 顯示了該結構的開頭與結束部分,由此可見要實作一個作業系統是相當不容易的工程。

範例 1 Linux 中的 Task 之結構

行號    Linux 2.6.29.4 版核心原始碼 include/linux/sched.h 檔案
…    …
1115    struct task_struct {
1116    volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */
1117    void *stack;
1118    atomic_t usage;
1119    unsigned int flags; /* per process flags, defined below */
1120    unsigned int ptrace;
…    …
1263    /* CPU-specific state of this task */
1264    struct thread_struct thread;
1265    /* filesystem information */
1266    struct fs_struct *fs;
1267    /* open file information */
1268    struct files_struct *files;
1269    /* namespaces */
1270    struct nsproxy *nsproxy;
1271    /* signal handlers */
1272    struct signal_struct *signal;
1273    struct sighand_struct *sighand;
…    …
1417    #ifdef CONFIG_TRACING
1418    /* state flags for use by tracers */
1419    unsigned long trace;
1420    #endif
1421    };
…    …

Linux 的行程結構中包含了一個 thread 欄位 (1264 行),該欄位用來儲存與 CPU 相關的暫存器、分段表等資訊,由於暫存器資訊是與處理器密切相關的,所以每一種 CPU 都會擁有不同的執行緒結構,IA32 (x86) 的thread_struct之程式片段如範例 10.3所示。

範例 2. Linux 中的IA32 (x86) 處理器的Thread 之結構

行號    Linux 2.6.29.4 版核心原始碼 arch/x86/include/asm/processor.h 檔案
…    …
391    struct thread_struct {
392    /* Cached TLS descriptors: */
393    struct desc_struct tls_array[GDT_ENTRY_TLS_ENTRIES];
394    unsigned long sp0;
395    unsigned long sp;
…    …
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License