核心**為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核心版本...