導航:首頁 > 操作系統 > linux內核創建線程

linux內核創建線程

發布時間:2022-05-10 02:51:17

linux 可以在線程中再創建線程嗎

1、windows里的進程/線程是繼承自OS/2的。在windows里,"進程"是指一個程序,而"線程"是一個"進程"里的一個執行"線索"。從核心上講,windows的多進程與Linux並無多大的區別,在windows里的線程才相當於Linux的進程,是一個實際正在執行的代碼。但是,windows里同一個進程里各個線程之間是共享數據段的。這才是與Linux的進程最大的不同。2、在windows下,使用CreateThread函數創建線程,與Linux下創建進程同,windows線程不是從創建處開始運行的,而是由CreateThread指定一個函數,線程就從那個函數處開始運行。此程序同前面的UNIX程序一樣,由兩個線程各列印1000條信息。threadID是子線程的線程號,另外,全局變數g是子線程與父線程共享的,這就是與Linux最大的不同之處。大家可以看出,windows的進程/線程要比Linux復雜,在Linux要實現類似windows的線程並不難,只要fork以後,讓子進程調用ThreadProc函數,並且為全局變數開設共享數據區就行了,但在windows下就無法實現類似fork的功能了。所以現在windows下的C語言編譯器所提供的庫函數雖然已經能兼容大多數Linux/UNIX的庫函數,但卻仍無法實現fork。3、對於多任務系統,共享數據區是必要的,但也是一個容易引起混亂的問題,windows下,一個程序員很容易忘記線程之間的數據是共享的這一情況,一個線程修改過一個變數後,另一個線程卻又修改了它,結果引起程序出問題。但在Linux下,由於變數本來並不共享,而由程序員來顯式地指定要共享的數據,使程序變得更清晰與安全。

㈡ linux 驅動中,如何建立一個普通線程

gcc xxx.c -lpthread 其中的-l是指包含的lib庫,具體寫法可以man gcc看下 多線程函數除了要包含頭文件pthread.h外還必須要包含lib庫pthread pthread_create是創建線程,但具體的線程裡面做什麼事是在void *create(void *arg)里,這個函數名是自...

㈢ linux內核創建內核線程有哪些方法

1.頭文件
#include <linux/sched.h> //wake_up_process()
#include <linux/kthread.h> //kthread_create()、kthread_run()
#include <err.h> //IS_ERR()、PTR_ERR()
2.實現
2.1創建線程
在模塊初始化時,可以進行線程的創建。使用下面的函數和宏定義:
struct task_struct *kthread_create(int (*threadfn)(void *data),
void *data,
const char namefmt[], ...);
#define kthread_run(threadfn, data, namefmt, ...) \
({ \
struct task_struct *__k \
= kthread_create(threadfn, data, namefmt, ## __VA_ARGS__); \
if (!IS_ERR(__k)) \
wake_up_process(__k); \
__k; \
})
例如:
static struct task_struct *test_task;
static int test_init_mole(void)
{
int err;
test_task = kthread_create(test_thread, NULL, "test_task");
if(IS_ERR(test_task)){
printk("Unable to start kernel thread. ");
err = PTR_ERR(test_task);
test_task = NULL;
return err;
}
wake_up_process(test_task);
return 0;
}
mole_init(test_init_mole);
2.2線程函數
在線程函數里,完成所需的業務邏輯工作。主要框架如下所示:
int threadfunc(void *data){

while(1){
set_current_state(TASK_UNINTERRUPTIBLE);
if(kthread_should_stop()) break;
if(){//條件為真
//進行業務處理
}
else{//條件為假
//讓出CPU運行其他線程,並在指定的時間內重新被調度
schele_timeout(HZ);
}
}

return 0;
}
2.3結束線程
在模塊卸載時,可以結束線程的運行。使用下面的函數:
int kthread_stop(struct task_struct *k);
例如:
static void test_cleanup_mole(void)
{
if(test_task){
kthread_stop(test_task);
test_task = NULL;
}
}
mole_exit(test_cleanup_mole);
3.注意事項
(1) 在調用kthread_stop函數時,線程函數不能已經運行結束。否則,kthread_stop函數會一直進行等待。
(2) 線程函數必須能讓出CPU,以便能運行其他線程。同時線程函數也必須能重新被調度運行。在例子程序中,這是通過schele_timeout()函數完成的。
4.性能測試
可以使用top命令來查看線程(包括內核線程)的CPU利用率。命令如下:
top –p 線程號
可以使用下面命令來查找線程號:
ps aux|grep 線程名
可以用下面的命令顯示所有內核線程:
ps afx
註:線程名由kthread_create函數的第三個參數指定

在分析usb_hub_init()的代碼的時候,忽略掉了一部份.
代碼片段如下所示:
int usb_hub_init(void)
{
……
khubd_task = kthread_run(hub_thread, NULL, "khubd");
……
}
Kthread_run() 是kernel中用來啟動一個新kernel線程的介面,它所要執行的函數就是後面跟的第一個參數.在這里,也就是hub_thread().另外,順帶 提一句,要終止kthread_run()創建的線程,可以調用kthread_stop().

㈣ 麻煩解釋一下linux下進程和線程有什麼區別和聯系,linux下多線程和多進程通信的實現方法,請通俗解釋

兄弟看到你這么高的分我就找了些資料:也算是對昨天學的知識總結一下吧
一、先說概念不管是windows還是linux下的進程和線程概念都是一樣的,只是管理進程和線程的方式不一樣,這個是前提,到時候你可別問我windows下進程和線程啊。這個涉及到操作系統原理。下面給你解答。
說道進程不得不提作業這個名詞 ,我想兄弟你電腦里不會有一個程序吧對不?當你的系統啟動完畢後你看看你的任務管理器里是不是有很多進程呢?那麼多程序是怎麼調如內存呢?能理解嗎?這里要明白程序和進程的關系,程序是你磁碟上的一個文件,當你需要它時進入內存後才成為進程,好比QQ在磁碟上就是一個文件而已,只有進入了內存才成為進程,進程是活動的。QQ要掃描你文件啊,記錄你聊天記錄啊,偷偷上傳個啥東西什麼的你也不知道對不,他是活動的。這個能明白嗎?
再看作業,這個作業可不是你寫作業的那個作業啊。系統一看好傢伙你個QQ那麼大的傢伙你想一下子進入內存啊?沒門!慢慢來嘛,系統就把QQ程序分為好幾塊,這幾塊不能亂分的,要符合自然結構就是循環啦選擇啦這樣的結構,你把人家循環結構咔嚓截斷了,怎麼讓人家QQ運行啊?這就是作業要一塊一塊的進入內存,同時要為作業產生JCB(JOB CONTROL BLOCK)作業控制塊,你進入內存不能亂跑啊,要聽系統的話,你要是進入系統自己的內存。框一下,內存不能讀寫 對話框就出來了,嚴重點直接藍臉給你!你懂得。這是window下的,linux下直接給你報錯!沒事了就!所一系統通過jcb控制進程。JCB包含了進程號優先順序好多內容,你打開你的windows任務管理器看看進程是不是有好多屬性啊?那就是PCB(PRCESS,CONTROL BLOCK)同理作業也包含那些內容只是多少而已。下面寫出進程特點:
1、進程是分配計算機資源最小的單位。你想啊人是要用程序幹活的吧?你把程序調入內存成了就成了進程,所以說進程是分配資源的最小單位。你在linux下打開終端輸入top命令看是不是有好多進程?
2、進程有操作系統為作業產生。有「父進程」產生「子進程」之間是父子關系,並可以繼續向下產生「子進程」。還拿QQ來說,你雙擊QQ.exe。QQ啟動了輸入賬號密碼打開主界面了。這時候你要聊天,QQ進程趕緊產生個「兒子」說 「兒子你去陪主人聊天去吧。這樣子進程產生了。突然你想看美女要傳照片這時候那個」兒子「有」生「了一個」兒子「說」兒子「你去傳照片。那個「兒子領到任務去傳照片了。這時你想關了QQ,QQ提示你說」你還有個「兒子」和「孫子」還在幹活呢你真要結束嗎?你蒽了確定。QQ對他「兒子」(你聊天窗口)說:」兒子啊對不起了,主人要關閉我你也不能活啊「咔嚓一下」兒子「死了,兒子死之前對他兒子說:「兒子啊你爺爺不讓我活了,你也別活了咔嚓孫子也死了。最後世界安靜了。這就是進程的父子關系。能明白嗎?記住:進程之活動在內存中。不能使用CPU,只管分配資源。
再說線程:線程也產生在內存中並且在內存中存在相當長的時間,但它的活動區域主要在CPU中,並且運行和滅亡都存在於CPU中,可以這么說,線程是程序中能被系統調度進入CPU中最小程序單位,它能直接使用進程分配的CPU的資源。
還拿QQ來說當你要傳文件時QQ總要判斷一下文件的擴展名吧,ok這時那個」兒子「趕緊對它爸爸說我需要一個線程判斷擴展名QQ趕緊對一個管這個的線程說:」快點去CPU里計算下那個擴展名是什麼然後向主人報告計算完了就「死了」消亡了,但是它的線程還在內存中!還等著你下一次傳文件然後計算然後消亡!
線程之間是相互獨立的。一個在CPU,一個在內存里還能有關系嗎對不?CPU在每一個瞬間只能進入一個線程,當線程進入CPU時立即產生一個新的線程,新線程仍停留在內存中,就好比上面那個傳文件還會等著你再傳文件再計算擴展名。
線程相對線程是獨立的,但它在內存中並不是獨立的,這就好比你不開QQ能用QQ傳輸文件嗎?它只存在與進程分配的資源中,也就是說計算擴展名這個線程只能停留在QQ這個進程中,不能跑到別的進程里!!相當於程序產生了新的進程和線程,進程向CPU申請資源,再有線程來使用,他們都是為程序服務的只是分工不同!
因為你沒提問linux下是怎麼管理進程和線程的所以我就不回答了,這個問題我建議你還是看看《笨兔兔的故事》裡面講到了linux是怎麼管理進程和線程的。挺幽默的比我說得還好。
你第二個問題說實話我回答不了你!我想你現在連進程和線程還沒理解第二個你更理解不了了你說對不?我猜的其實你用C/C++不管是在windows下編程還是在Linux下編程思想都是一樣的對吧,如果你理解了在windows下線程間通信,在linux更沒問題了!
參考資料:黑客手冊2009合訂本非安全第一二季244頁,245頁,328頁,329頁,398頁,399頁
淺談操作系統原理 (一 二三)
ubuntu中文論壇 笨兔兔的故事
http://forum.ubuntu.org.cn/viewtopic.php?f=120&t=267518
希望我的回答你能理解

㈤ linux內核線程怎麼設置優先順序

Linux內核的三種調度策略:
1,SCHED_OTHER
分時調度策略,
2,SCHED_FIFO實時調度策略,先到先服務。一旦佔用cpu則一直運行。一直運行直到有更高優先順序任務到達或自己放棄
3,SCHED_RR實時調度策略,時間片輪轉。當進程的時間片用完,系統將重新分配時間片,並置於就緒隊列尾。放在隊列尾保證了所有具有相同優先順序的RR任務的調度公平
Linux線程優先順序設置
首先,可以通過以下兩個函數來獲得線程可以設置的最高和最低優先順序,函數中的策略即上述三種策略的宏定義:
int
sched_get_priority_max(int
policy);
int
sched_get_priority_min(int
policy);
SCHED_OTHER是不支持優先順序使用的,而SCHED_FIFO和SCHED_RR支持優先順序的使用,他們分別為1和99,數值越大優先順序越高。
設置和獲取優先順序通過以下兩個函數:
int
pthread_attr_setschedparam(pthread_attr_t
*attr,
const
struct
sched_param
*param);
int
pthread_attr_getschedparam(const
pthread_attr_t
*attr,
struct
sched_param
*param);
例如以下代碼創建了一個優先順序為10的線程:
struct
sched_param
{
int
__sched_priority;
//所要設定的線程優先順序
};
例:創建優先順序為10的線程
pthread_attr_t
attr;
struct
sched_param
param;
pthread_attr_init(&attr);
pthread_attr_setschedpolicy(&attr,
SCHED_RR);
param.sched_priority
=
10;
pthread_attr_setschedparam(&attr,
¶m);
pthread_create(xxx
,
&attr
,
xxx
,
xxx);
pthread_attr_destroy(&attr);

㈥ Linux 怎麼增大可以創建的最大線程數

檢查ulimit -a 的結果,查看stack size:

stack size (kbytes, -s) 8192

8192KB 就是棧的大小。不能超過這個棧的數目,因此上面2)分配的buf大小超過了棧限制,得到了setmentation fault。

LInux上,最大線程數目是:

number of threads = total virtual memory / (stack size*1024*1024)

在32位系統上,進程空間是4G,其中0-3G是用戶空間(0x0-0xBFFFFFFF), 3G-4G是內核空間。
因此理論上講,用戶空間大小/棧大小=最大線程數。3072M/8M=384,考慮到系統的佔用,主線程等,我的系統上是380. 也許在你的系統上是382.

我們可以減小棧限制或者增大虛擬內存使得線程的數目增加。
檢查虛擬內存: ulimit -v
檢查棧大小: ulimit -s

設置虛擬內存:ulimit -v 新值
設置棧大小: ulimit -s 新值

㈦ linux內核基礎進程管理

linux內核基礎進程管理
進程管理
進程:
處於執行期的程序(目標碼存放在內存中),進程是其所用的資源和打開的文件描述符,CPU的使用情況,掛起的信號,內核的內部數據等等一系列的信息與資源的總稱。
執行線程:
簡稱線程,是在進程中活動的對象,每一個線程都擁有一個獨立的程序計數器,進程棧,和一組進程寄存器。
在內核看來,線程只是一種特殊的進程,所以內核的調度對象是線程,而不是進程。
進程提供兩種虛擬機制:
虛擬處理器和虛擬內存,其實就是一種假象,給進程提供的一種假象,好像進程正在獨立的使用所有的內存資源與整個處理器,假象一直是計算機的一個重要問題,在《深入理解計算機系統》一書中有更詳細的描述。
進程描述符及任務結構:
內核把進程的列表放在一個叫做任務隊列的雙向鏈表中,其中的每一項是一個結構體,task_struct這是一個稱為進程描述符的結構這個結構包含一個進程所需的所有信息。在32位機器上就有1.7KB已經不小了。
分配進程描述符:
linux通過slab分配器分配進程描述符。現在一般建立一個struct thread_info 結構體來記錄進程描述符的,這個結構體是為了減少對寄存器的依賴,尤其是像X86 這種寄存器較少的結構,一般進程描述符是提前分配並且在一個進程死亡後它的描述符還可以再次使用所以linux的進程創建非常迅速。
進程描述符的存放:
內核通過唯一的進程標識值或者PID來標識每一個進程。PID其實是一個整形,可以通過改變系統代碼的宏值來改變進程ID的上限。

閱讀全文

與linux內核創建線程相關的資料

熱點內容
噴油螺桿製冷壓縮機 瀏覽:578
python員工信息登記表 瀏覽:376
高中美術pdf 瀏覽:160
java實現排列 瀏覽:512
javavector的用法 瀏覽:981
osi實現加密的三層 瀏覽:231
大眾寶來原廠中控如何安裝app 瀏覽:913
linux內核根文件系統 瀏覽:242
3d的命令面板不見了 瀏覽:525
武漢理工大學伺服器ip地址 瀏覽:148
亞馬遜雲伺服器登錄 瀏覽:524
安卓手機如何進行文件處理 瀏覽:70
mysql執行系統命令 瀏覽:929
php支持curlhttps 瀏覽:142
新預演算法責任 瀏覽:443
伺服器如何處理5萬人同時在線 瀏覽:250
哈夫曼編碼數據壓縮 瀏覽:424
鎖定伺服器是什麼意思 瀏覽:383
場景檢測演算法 瀏覽:616
解壓手機軟體觸屏 瀏覽:348