核心執行緒建立
核心執行緒的建立最終是由kthreadd完成,核心建立核心執行緒的其他api是kthread_create_on_node對它的封裝。
常見的kthread_create_on_cpu和create_worker最終呼叫kthread_create_on_node
核心初始化時,會建立兩個程序init和kthreadd,init程序最終會從核心態轉到使用者態,執行/etc/init.d的各種service,完成系統載入;kthreadd用於建立核心執行緒,其是所有核心執行緒的parent
static noinline void __init_refok rest_init(void)
kthreadd是建立的核心執行緒kthreadd的執行函式,在乙個迴圈中遍歷kthread_create_list,呼叫create_thread為每個節點建立核心執行緒。
int kthreadd(void *unused)
spin_unlock(&kthread_create_lock);
} return 0;
}
create_kthread呼叫kernel_thread建立核心執行緒:
static void create_kthread(struct kthread_create_info *create)
}
上面簡單介紹了kthreadd建立核心執行緒的過程,那麼系統中kswapd,ksoftirq等核心執行緒是如何建立的呢,kthread_create_list鍊錶節點何時被加入的呢?
kthread_create_on_node(threadfn, data, node, name)
建立核心執行緒,返回建立的核心執行緒對應的描述符task_struct。其中,threadfn是核心執行緒的執行函式,data是threadfn的引數,node是建立核心執行緒中分配記憶體的節點node,name是建立的核心執行緒名稱。
核心執行緒的特點:建立的核心執行緒狀態是stop,需要主動呼叫wake_up_process喚醒該執行緒。如果終止該核心執行緒,要麼直接呼叫do_exit,或者呼叫kthread_stop。
建立核心執行緒的原理:
1. 分配kthread_create_info描述符,初始化建立核心執行緒的描述符,kthread_create_list維護了kthreadd需要建立的核心執行緒
2. 設定核心執行緒的cpu_mask和排程策略
struct kthread_create_info create;
create.threadfn = threadfn;
create.data = data;
create.node = node;
init_completion(&create.done);
spin_lock(&kthread_create_lock);
list_add_tail(&create.list, &kthread_create_list);//維護需要建立的核心執行緒鍊錶
spin_unlock(&kthread_create_lock);
wake_up_process(kthreadd_task);//喚醒kthreadd,用於建立核心執行緒。
wait_for_completion(&create.done);
....
sched_setscheduler_nocheck(create.result, sched_normal, ¶m); //核心執行緒預設排程策略:sched_normal。
set_cpus_allowed_ptr(create.result, cpu_all_mask);//核心執行緒被允許執行的cpu是系統可使用的cpu
kthread_create_on_cpu建立核心執行緒,此外還會喚醒該核心執行緒。
struct task_struct *kthread_create_on_cpu(int (*threadfn)(void *data),
void *data, unsigned int cpu,
const char *namefmt)
create_worker為pool建立woker,其中每個worker的function----worker_thread:
static struct worker *create_worker(struct worker_pool *pool)
kfree(worker);
return null;
}
建立核心執行緒
在作業系統的最小執行單元就是執行緒,在核心中線程的概念更加容易看出來。比如說有的時候需要使用執行緒來完成一些任務,可是這些任務的工作量過大的時候系統處理這些任務就必須停下來等待。而等待的過程就大大的浪費了cup寶貴的時間,所以這個時候利用多執行緒去處理是最好的方法。在驅動裡生成的執行緒一般是系統執行...
建立核心執行緒
在作業系統的最小執行單元就是執行緒,在核心中線程的概念更加容易看出來。比如說有的時候需要使用執行緒來完成一些任務,可是這些任務的工作量過大的時候系統處理這些任務就必須停下來等待。而等待的過程就大大的浪費了cup寶貴的時間,所以這個時候利用多執行緒去處理是最好的方法。在驅動裡生成的執行緒一般是系統執行...
建立核心執行緒
在linux中,有一些程序完全執行在核心空間,比如ksoftirqd等等,這些程序稱為核心執行緒。今天,我們就動手建立乙個核心執行緒。引言 如果使用者層的程序違規訪問記憶體,核心會傳送乙個sigse 訊號給程序。我們的目標就是,建立乙個核心執行緒,如果發生了段錯誤,就在控制台列印 mykthread...