執行緒與程序在核心中的實現

2021-07-03 23:49:50 字數 1911 閱讀 2085

核心**為2.6.35.13。

程序與其對應的執行緒之間使用相同的記憶體空間、檔案描述符和一些其他的東西。

在核心中,執行緒與程序都是用結構體task_struct來表示的,在核心排程上並沒有什麼區別。

2.1         相同點

我們已經在上文中指出主線程與執行緒之間使用相同的記憶體空間、檔案描述符和一些其他的東西。

#include

#include

void*thread1(void*data)

pthread_exit

(0);

return;

}void*thread2(void*data)

pthread_exit

(0);

return;

}int

main()

if(pthread_create

(&th2

, null,thread2

, null))

pthread_join

(th1

, null);

pthread_join

(th2

, null);

return0;

為了驗證這些觀點,我以上面的使用者態**示例來說明(**不一定規範,僅為說明問題)。如上**,在主線程成建立了兩個執行緒thread1和thread2,然後就等待這兩個執行緒執行完成,但這兩個執行緒都一直在死迴圈中,也就說,整個都不為結束,除非我手動殺掉這個程序。

在核心中編寫(test)模組來檢視這三個(主)執行緒之間的關係,**如下:

#include

#include

#include

#include

static

void

print_task(structtask_struct *p)

static

inthello_init(void)

}while_each_thread

(g,t

);return0;

}static

void

hello_exit(void)

module_license

("dualbsd/gpl");

module_init

(hello_init);

module_exit

(hello_exit);

如上**,輪訓當前所有的執行緒,找到名稱為「a.out」的執行緒(即以上使用者態**生成的執行緒)。列印對應執行緒的pid、tgid、mm和files。其中,pid表示執行緒的乙個標識;tgid即threadgroup id,表示該執行緒組的id,其實也就是主線程的id;mm表示該task使用的記憶體空間;file表示該task所有開啟的檔案描述符。執行結果如下:

從上述結果中可以看出,主線程和兩個輔線程都擁有各自的pid,但其tgid都等於主線程的pid,而且他們的mm和files也指向同樣的一塊記憶體,也就是說:主線程和輔線程之間的確共享著記憶體空間和檔案描述符資訊。

在核心中,排程主線程和輔線程是沒有區別的。

(3 1)程序與執行緒 核心中的組織

2.linux 程序控制塊 task struct 3.程序在核心中的組織形式 pid t pid 程序process id uid t uid,euid 程序屬性 使用者id,有效使用者id gid t gid,egid volatile long state 程序狀態 int exit stat...

PHP變數在核心中的實現

我們都知道php是乙個弱型別語言,它的變數理論上可以儲存任何型別的資料。那麼,php的變數在核心中究竟是怎麼實現的呢?在php核心中,變數稱為zval,變數的值稱為zend value,注意這是兩個不同的東西。php中變數的記憶體是通過引用計數的方式進行管理的,在php7之前,zval容器中有兩個位...

Linux核心中的程序(一)

多工系統可以分為 非搶占式和搶占式。linux提供搶占式多工模式。程序在被搶占之前能夠執行的時間叫程序的時間片,linux獨一無二的公平排程程式本身並沒有採用時間片來達到公平排程。linux之前採用o 1 排程器,它對大伺服器的工作負載很理想,但是對響應時間敏感的程式卻有不足。在2.6.23核心版本...