Linux2 6執行緒模型NPTL實現

2021-05-08 03:39:57 字數 2418 閱讀 6573

**:全選

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,完成硬體上下文的過...