**:全選
937 struct task_struct ;
pid,從字面上是process id,但其實是thread id。
tgid,從字面上,應該是thread group id,也就是真正的process id。
這一點,可以從系統呼叫getpid和gettid中看出來(位於kernel/timer.c)。
**:全選
954 asmlinkage long sys_getpid(void)
955
1100 asmlinkage long sys_gettid(void)
1101
group_leader欄位,指向執行緒組中的第乙個執行緒,建立第乙個執行緒的時候,group_leader指向自己,建立其後的執行緒時,指向第乙個執行緒的task_struct結構;
thread_group,當前程序所有執行緒的佇列,對於group_leader,這是個佇列頭,對於其後的程序而言,通過這個字段,掛入佇列中,可以通過此佇列,遍歷所有執行緒。
執行緒組中各個執行緒的關係,是在do_fork中設定的,具體的**在copy_process中(位於kernel/fork.c):**:全選
959 copy_process()
960
1254 if (likely(p->pid))
...
1271 }
...
1320 }
1113-1114行說明在建立執行緒時,從父程序獲取tgid,表明他們在同乙個執行緒組中;1181-1182則對group_leader和thread_group初始化,對於第乙個執行緒,則group_leader就是它自己;1234-1236行,將新建立的執行緒的group_leader設定成為父程序得group_leader,無論父程序是不是執行緒組中的第乙個執行緒,它的group_leader都是指向第乙個執行緒的task_struct,同時通過thread_group欄位,掛入到第乙個執行緒的thread_group佇列中;1266行表明只有執行緒組中的第乙個執行緒,才會通過tasks欄位,掛入到init_task佇列中。
在引入執行緒組概念後,退出部分也引入了乙個新的系統呼叫exit_group(位於kernel/exit.c)
1055 noret_type void
1056 do_group_exit(int exit_code)
1057
1073 spin_unlock_irq(&sighand->siglock);
1074 }
1075
1076 do_exit(exit_code);
1077 /* notreached */
1078 }
在1060行中,current->signal其實是執行緒組中所有執行緒共享的,對於呼叫exit_group的那個執行緒,如果是乙個多執行緒的程序,就會進入1062-1074這部分**,如果是單執行緒,則直接進入do_exit退出程序。這部分**的主要操作在zap_other_threads中(位於kernel/signal.c)
void zap_other_threads(struct task_struct *p)
982
1002 }
next_thread定義在include/linux/sched.h中,如下
651 static inline struct task_struct *next_thread(const struct task_struct *p)
1652
其實就是通過task_struct中的thread_group佇列來遍歷執行緒組中的所有執行緒。
在其中,會在signal->flags中設定signal_group_exit,同時,搜尋執行緒組中所有程序,在每個執行緒中掛上乙個sigkill訊號,這樣,當那些執行緒排程到執行的時候,就會處理sigkill訊號,對於sigkill訊號的處理,會呼叫do_group_exit,不過,當這次呼叫到do_group_exit的時候,將執行到1061行,然後就到了1076行的do_exit。這樣,當執行緒組中的每個執行緒都執行過一遍後,整個執行緒組就退出了。
Linux2 6核心實現的是NPTL
nptl是乙個1 1的執行緒模型,即乙個執行緒對於乙個作業系統的排程程序,優點是非常簡單。而其他一些作業系統比如solaris則是mxn的,m對應建立的執行緒數,n對應作業系統可以執行的實體。n轉 全選 937 struct task struct pid,從字面上是process id,但其實是t...
Linux 2 6 驅動模板
obj m vs10xx.o vs10xx objs vs10xx.o kerneldir home kerson linux 2.6.39 pwd shell pwd modules make c kerneldir m pwd modules cp vs10xx.ko armnfs phony ...
Linux2 6程序切換
1.程序切換是指 儲存prev程序的上下文,用next的上下文替代。其中上下文包括 頁全域性目錄 核心態堆疊 硬體上下文。2.80x86為程序切換提供的硬體支援 第一種 通過任務門 第二種 通過jmp和call指令 把硬體上下文存在tss中,執行這條指令時,通過硬體自動切換tss,完成硬體上下文的過...