程序的管理與排程是所有作業系統的核心功能。從核心的角度來看,程序是核心分配資源(cpu,memory)的重要單元,是計算機用來管理這些資源的一種抽象。從本節開始,將對linux核心的程序管理與排程子系統進行分析,其中使用的核心版本是4.4。
在linux核心中,每乙個程序唯一對應乙個struct task_struct結構體,核心通過這些task_struct的管理實現對程序的管理。此資料結構定義在./include/linux/sched.h中,結構太過龐大,下面作為例項只列出了前面幾行。
struct task_struct
按照結構成員的用途,大體上分成了如下的類別,
(1) 基本資訊。comm, pid, tgid, uid, gid, stack, on_cpu, on_rq, in_execve, in_iowait…
(2) 程序關係。real_parent, children, sibling…
(3) 狀態相關。state, exit_state, exit_code…
(4) 使用記憶體。mm, active_mm, min_flt, maj_flt…
(5) 排程相關。prio, static_prio, normal_prio, rt_prio, sched_class, se, policy…
(6) 事件相關。utime, stime, start_time, real_start_time…
(7) 訊號相關。signal, sighand, blocked, real_blocked, pending…
(8)檔案系統。fs, files, nameidata…
(9) misc
程序的狀態定義如下所示,
#define task_running 0 //r態,程序正在執行或在rq中等待執行
#define task_interruptible 1 //s態,阻塞等待資源或者訊號
#define task_uninterruptible 2 //d態,阻塞等待資源
#define __task_stopped 4 //暫停狀態
#define __task_traced 8 //跟蹤狀態
/* in tsk->exit_state */
#define exit_dead 16
#define exit_zombie 32
#define exit_trace (exit_zombie | exit_dead)
/* in tsk->state again */
#define task_dead 64
#define task_wakekill 128
#define task_waking 256
#define task_parked 512
#define task_noload 1024
#define task_state_max 2048
狀態轉換的狀態機如圖所示,
程序的初始化是在start_kernel中的reset_init中實現的,建立了兩個程序init和kthreadd。
kernel_thread(kernel_init, null, clone_fs); //init程序建立
pid = kernel_thread(kthreadd, null, clone_fs | clone_files); //kthread核心執行緒建立
建立的init程序再通過解析init.rc等檔案進行使用者程序的建立。
static int __ref kernel_init(void *unused)
建立的kthreadd核心執行緒通過遍歷kthread_create_list建立核心執行緒。
int kthreadd(void *unused)
spin_unlock(&kthread_create_lock);
}return
0;}
kthreadd與核心執行緒的關係如下:
kthreadd-+-vsertestwq
|-adaptive_ts_wor
|-agdsp_access
|-ata_sff
|-aud_sblock-1-3
|-aud_sblock-1-4
|-binder
|-bioset
|-bm_perf
|-carveout_camera
|-carveout_fb
|-carveout_mm
|-carveout_overla
|-cfg80211
|-cfinteractive
|-compr drain
|-compr monitor
|-crypto
|-deferwq
|-devfreq_wq
|-dhd_dpc
|-dhd_rxf
|-dhd_watchdog_th
…常用的程序建立方法如下:
fork—————–使用者程序
pthread_create—- 使用者執行緒
kthread_create —-核心執行緒
do_fork
thread_info儲存了特定體系結構的彙編**段需要訪問的那部分程序的資料。核心棧供使用者程序的核心**或核心執行緒使用。arm 32bit 處理器thread_info和核心棧task->stack合用2頁記憶體空間。
union thread_union ;
常用的current指標指向了當前的thread_info的task成員。
#define get_current() (current_thread_info()->task)
#define current get_current()
static
inline
struct thread_info *current_thread_info(void)
current_thread_info就是當前sp遮蔽掉低12位。
Linux程序管理與排程
核心版本 架構作者 github csdn 2016 07 21 linux 4.6 x86 arm gatieme linuxdevicedrivers linux程序管理與排程 專案描述 kernelinkernel 乙個執行在linux上的小巧核心,修改了linux kernel的start ...
記憶體管理與程序排程
一 記憶體管理 1 核心 使用alloc pages申請物理頁幀 使用kmalloc申請專用 通用記憶體塊 vmalloc申請物理不連續,邏輯相連記憶體 使用kmap建立高階位址對映 外碎片 空閒記憶體零散分布,無法滿足大記憶體需求 夥伴系統解決 內碎片 申請一塊記憶體真正使用的只有小部分 slab...
程序管理 程序排程
一 概念 1 處理機管理是作業系統的主要功能之一。處理機管理的實現策略決定了作業系統的型別,其演算法好壞直接影響整個系統的效能 2 程序排程 通過某種規則或演算法從就緒 等待 程序佇列中選出乙個程序投入執行 3 排程是乙個基本的作業系統功能。cpu排程是作業系統設計的核心問題 二 cpu排程程式 1...