一、進程控制塊(PCB)結構
進程控制塊(PCB)是系統為了管理進程設置的一個專門的數據結構。系統用它來記錄進程的外部特征,描述進程的運動變化過程。同時,系統可以利用PCB來控制和管理進程,所以說,PCB(進程控制塊)是系統感知進程存在的唯一標志。
Linux系統的PCB包括很多參數,每個PCB約占1KB多的內存空間。用於表示PCB的結構task_struct簡要描述如下:
include/linux/sched.h struct task_struct { volatile long state; struct thread_info *thread_info; atomic_t usage; unsigned long flags; unsigned long ptrace; int lock_depth; int prio, static_prio; struct list_head run_list; prio_array_t *array; unsigned long sleep_avg; long interactive_credit; unsigned long long timestamp; int activated; unsigned long policy; cpumask_t cpus_allowed; unsigned int time_slice, first_time_slice; struct list_head tasks; struct list_head ptrace_children; struct list_head ptrace_list; struct mm_struct *mm, *active_mm; ... struct linux_binfmt *binfmt; int exit_code, exit_signal; int pdeath_signal; ... pid_t pid; pid_t tgid; ... struct task_struct *real_parent; struct task_struct *parent; struct list_head children; struct list_head sibling; struct task_struct *group_leader; ... struct pid_link pids[PIDTYPE_MAX]; wait_queue_head_t wait_chldexit; struct completion *vfork_done; int __user *set_child_tid; int __user *clear_child_tid; unsigned long rt_priority; unsigned long it_real_value, it_prof_value, it_virt_value; unsigned long it_real_incr, it_prof_incr, it_virt_incr; struct timer_list real_timer; unsigned long utime, stime, cutime, cstime; unsigned long nvcsw, nivcsw, cnvcsw, cnivcsw; u64 start_time; ... uid_t uid,euid,suid,fsuid; gid_t gid,egid,sgid,fsgid; struct group_info *group_info; kernel_cap_t cap_effective, cap_inheritable, cap_permitted; int keep_capabilities:1; struct user_struct *user; ... struct rlimit rlim[RLIM_NLIMITS]; unsigned short used_math; char comm[16]; ... int link_count, total_link_count; ... struct fs_struct *fs; ... struct files_struct *files; ... unsigned long ptrace_message; siginfo_t *last_siginfo; ... };
表示進程的當前狀態。進程運行時, 它會根據具體情況改變狀態。進程狀態總共有TASK RUNN ING ( 可運行狀態)、TASK INTERRUPT IBLE ( 可中斷的等待狀態)、TASK UNINTERRUPT IBLE(不可中斷的等待狀態)、TASK ZOMB IE( 僵死狀態)、TASK STOPPED(暫停狀態) 等5種。
1000給出進程每次獲取CPU 后, 可使用的時間片長度(單位是jiffies)。
SCH ED_RR 2, 實時進程, 用基於優先權的輪轉法
在Linux 中所有進程(以PCB 的形式)組成一個雙向鏈表,
next_task和prev_task是鏈表的前后向指針。
struct task_struc t* p_cptr, * p_ysptr, * p_osptr
以上分別是指向該進程的原始父進程、父進程、子進程和新
老兄弟進程的指針。
struct task_struct** pidhash_pprev
用於鏈入進程hash表的前后指針。系統進程除了鏈入雙
向鏈表外, 還被加到hash表中。
戶標識和用戶組標識。
進程標識號和進程組標識號
[ NR_CPUS]
per_cpu_utime 是用戶態進程運行的時間, per_cpu_
stime是內核態進程運行的時間
文件系統數據成員:
fs保存了進程本身與VFS( 虛擬文件系統)的關系信息。
struct fs_struct
{
atom ic_t count;
rw lock_t lock;
int umask;
struct dentry* root, * pwd, * altroot;
struct vfsm ount* rootmnt, * pwdmnt, * altrootmnt;
}
其中root、rootm nt是根目錄的dentry 和其mount點的vfsmount。
pwd、pwdmnt 是當前工作目錄的dentry 和其mount 點的vfs..
mount。altroot、altrootmnt是保存根節點被替換之后原來根目標
的dentry和其mount點的vfsmount。
在Linux 中, 采用按需分頁的策略解決進程的內存需求。
task_struct的數據成員mm 指向關於存儲管理的mm_truc t結
構。
active_mm 指向活動地址空間。
表示線程空間地址。
用戶線程空間地址: 0..0xBFFFFFFF。
內核線程空間地址: 0..0xFFFFFFFF
用於申請空間時用的自旋鎖。自旋鎖的主要功能是臨界區
保護。
進程占用的頁面是否可換出。swappab le為1表示可換出。
2) unsigned long min_flt, maj_ flt
該進程累計minor缺頁次數和major缺頁次數。
3) unsigned long nswap
該進程累計換出頁面數。
4) unsigned long swap_cnt
下一次循環最多可換出的頁數。
二、makefile
makefile定義了一系列的規則來指定,哪些文件需要先編譯,哪些文件需要后編譯,哪些文件需要重新編譯,甚至於進行更復雜的功能操作,makefile帶來的好處就是——“自動化編譯”,一旦寫好,只需要一個make命令,整個工程完全自動編譯,極大的提高了軟件開發的效率。make是一個命令工具,是一個解釋makefile中指令的命令工具.
Makefile來告訴make命令如何編譯和鏈接這幾個文件。規則是:
1)如果這個工程沒有編譯過,那么我們的所有C文件都要編譯並被鏈接。
2)如果這個工程的某幾個C文件被修改,那么我們只編譯被修改的C文件,並鏈接目標程序。
3)如果這個工程的頭文件被改變了,那么我們需要編譯引用了這幾個頭文件的C文件,並鏈接目標程序。
下面舉一個簡單的例子:(進度條的實現)
1.vim proc.c寫入(進度條的實現)
2、vim Makefile寫入
第一行中並沒有任何參數,只是在冒號(:)后列出編譯中所需的文件,當第一行中的任何文件中更改時,make就知道需要重新編譯了。
其中.PHONY意思表示clean是一個“偽目標”,清除 所有 .o文件 ,.o文件就是目標文件
3、執行make指令就可以編譯proc.c這個程序