程序排程二 程序建立do fork

2021-09-05 12:23:15 字數 2282 閱讀 5463

一、前言

kernel在啟動初期並沒有「程序」這個概念,因為不涉及多工併發、排程,kernel 起來後會在start_kernel

中建立kthread和init程序,在0號程序的基礎上建立init程序(pid為1),0 程序會被設定成idle程序,加入到執行

佇列中。當cpu上沒有可排程程序時,排程器才會選擇0號程序執行:

int start_kernel()

pid_t kernel_thread(int (*fn)(void *), void *arg, unsigned long flags)

從上面的**中可以看出,在start_kernel階段會建立kthread和init的程序,init程序是所有使用者程序的父程序,

kthread程序是核心程序的父程序,下面會重點_do_fork建立程序的流程。

二、do_fork流程:

long _do_fork(unsigned long clone_flags,//建立程序標誌位

unsigned long stack_start, //使用者態棧的起始位址

unsigned long stack_size, //使用者態棧的大小

int __user *parent_tidptr,

int __user *child_tidptr,

unsigned long tls)

1、寫時複製技術(copy on write,cow):

程序的使用了寫時拷貝技術,為了減少建立執行緒時的工作量,採用了寫時複製技術,子程序只複製父程序的頁表,

不會複製頁面內容,當子程序需要寫入新內容時才觸發寫時複製機制,為子程序建立乙個副本。寫時拷貝是一種可以

推遲甚至避免拷貝資料的技術。核心此時並不複製整個程序的位址空間,而是讓父子程序共享同乙個位址空間。只用

在需要寫入的時候才會複製位址空間,從而使各個進行擁有各自的位址空間。

2、clone_flags標記位:

#define csignal		0x000000ff	/* signal mask to be sent at exit */

#define clone_vm 0x00000100 /* 父子程序共享記憶體空間 */

#define clone_fs 0x00000200 /* 父子程序共享檔案系統 */

#define clone_files 0x00000400 /* 父子程序共享檔案描敘符 */

#define clone_sighand 0x00000800 /* 父子程序共享相同的訊號處理 */

#define clone_ptrace 0x00002000 /* 父程序被trace,子程序同樣被trace */

#define clone_vfork 0x00004000 /* 父程序被掛起,直到子程序釋放了虛擬記憶體資源(exit/execve) */

#define clone_thread 0x00010000 /* 父子程序共享相同的執行緒群 */

#define clone_newns 0x00020000 /* new mount namespace group */

#define clone_sysvsem 0x00040000 /* share system v sem_undo semantics */

#define clone_settls 0x00080000 /* create a new tls for the child */

#define clone_parent_settid 0x00100000 /* set the tid in the parent */

3、其中do_fork所做的工作可以用下圖來初步的描敘:

(1)do_fork主要呼叫copy_process()函式來建立乙個新的程序,copy_process函式非常長,可以分解為如下:

a、標誌位clone_flags檢查:

b、dump_task_struct( )分配task_struct:

c、sched_fork(clone_flags, p)初始化程序排程相關的資料結構,如排程實體;

d、複製父程序的資訊:

(2)在copy_proces()函式中成功建立乙個程序後,會呼叫wake_up_new_task(p)將對應的程序加入

排程器中等待排程執行。

實驗二 程序排程預備

1,程序pcb結構定義,佇列,輸入程序序列,排序,輸出 2,程序預備排程 c或其他高階語言 用什麼資料結構表示程序?使用者可以輸入指定數目的程序資料。可以對程序進行排序,如按到達時間。輸出程序資訊以供檢視。3,排程演算法效能的衡量 使響應時間最短 從提交到響應 e.g.使用者敲下鍵盤後回顯的速度 呑...

程序排程之建立程序

do fork struct pid pid alloc pid struct pid pid kmem cache alloc pid cachep,gfp kernel 分配pid結構體空間 nr alloc pidmap current nsproxy pid ns 分配pid程序號 pid ...

linux核心(二) 程序管理之程序排程簡述

一 簡述 排程程式負責決定將哪個程序投入執行,何時執行以及執行多長時間,進度排程可看做在可執行程序之間分配有限的處理器時間資源的核心子系統。二 排程器介紹 1 排程器概念 排程器的乙個重要目標是有效的分配cpu時間片,同時提供很好的使用者體驗。排程器的一般原理是按需分配的計算能力,向系統中每個程序提...