//此函式用以終止輸入引數k對應的程序
//返回值就是 int (*threadfn)(void *data) 的int值
int kthread_stop(struct task_struct *k)
ret = k->exit_code;
put_task_struct(k);
trace_sched_kthread_stop_ret(ret);
return ret;
}//將 wait 加入到 q所在等待佇列的頭部,wait需要滿足是乙個單獨節點,不與別的元素相干
void prepare_to_wait(wait_queue_head_t *q, wait_queue_t *wait, int state)
//將 wait 加入到 q所在等待佇列的尾部,wait需要滿足是乙個單獨節點,不與別的元素相干
void prepare_to_wait_exclusive(wait_queue_head_t *q, wait_queue_t *wait, int state)
//將 wait 從 q所在的等待佇列中刪除
void remove_wait_queue(wait_queue_head_t *q, wait_queue_t *wait)
//改變p的排程策略及實時優先順序
int sched_setscheduler(struct task_struct *p, int policy,
const struct sched_param *param)
/*程序的優先順序分為 靜態優先順序, 動態優先順序
靜態優先順序:程序在建立之初就分配的值,100-139,越小越緊急,static_prio=120+nice
動態優先順序:隨著程序在核心的時間而改變,是核心排程的參考依據,與程序排程策略 policy 有關
*///更改p的nice值,也即修改它的靜態優先順序
void set_user_nice(struct task_struct *p, long nice)
queued = task_on_rq_queued(p);
if (queued)
dequeue_task(rq, p, 0);
p->static_prio = nice_to_prio(nice);
set_load_weight(p);
old_prio = p->prio;
p->prio = effective_prio(p);
delta = p->prio - old_prio;
if (queued)
out_unlock:
task_rq_unlock(rq, p, &flags);
}//獲取程序的nice值
static inline int task_nice(const struct task_struct *p)
//喚醒睡眠狀態的程序,使程序變為 task_running態,從而能被cpu重新排程執行
int wake_up_process(struct task_struct *p)
//讓當前程序所占用的核心空間短暫讓步,短暫釋放占用的cpu資源,給其他程序執行的機會
void yield(void)
[例]result=kthread_create_on_node(my_function,null,-1,namefrm);
wake_up_process(result);
yield(); //此時 my_function得以執行,沒有yield,父程序不會讓步
一些核心程序排程API 3
程序狀態描述 task running 0 可執行狀態,要麼準備執行,要麼正在執行 task interruptible 1 可中斷的等待狀態,程序在睡眠狀態,直到某個條件為真 才被排程執行,函式interruptible sleep on 使程序進入 該狀態task uninterruptible...
一些核心排程API(2)
根據tcb,獲取對應的記憶體資訊,儲存在專門描述tcb記憶體資訊的 mm struct 中 struct mm struct get task mm struct task struct task task unlock task return mm tcb專門的記憶體資訊儲存區 struct mm...
一些核心模組API 2
核心符號表 就是在核心的內部函式或變數中,可供外部引用的函式和變數的符號表。其實說白了就是乙個索引檔案,它存在的目的就是讓外部軟體可以知道kernel檔案內部實際分配的位置。給乙個記憶體位址address,查詢乙個核心符號,並將該符號的基本資訊,符號名name,偏移offset 大小size,所屬模...