进程相关概念
??????1.進(jìn)程相關(guān)概念
??????進(jìn)程是代碼的一次動(dòng)態(tài)執(zhí)行,擔(dān)當(dāng)分配系統(tǒng)資源的角色,進(jìn)程信息是被放在一個(gè)一個(gè)數(shù)據(jù)結(jié)構(gòu)中,是一個(gè)結(jié)構(gòu)體task_struct
??????2.進(jìn)程控制塊內(nèi)容
????????????????????
//linux下的進(jìn)程控制塊 struct task_struct {volatile long state;// 說明了該進(jìn)程是否可以執(zhí)行,還是可中斷等信息unsigned long flags;// Flage 是進(jìn)程號(hào),在調(diào)用fork()時(shí)給出int sigpending;// 進(jìn)程上是否有待處理的信號(hào) mm_segment_t addr_limit;// 進(jìn)程地址空間,區(qū)分內(nèi)核進(jìn)程與普通進(jìn)程在內(nèi)存存放的位置不同0 - 0xBFFFFFFF for user - thead0 - 0xFFFFFFFF for kernel - threadvolatile long need_resched; //調(diào)度標(biāo)志,表示該進(jìn)程是否需要重新調(diào)度, 若非 0, 則當(dāng)從內(nèi)核態(tài)返回到用戶態(tài),會(huì)發(fā)生調(diào)度 int lock_depth;//鎖深度 long nice; //進(jìn)程的基本時(shí)間片 unsigned long policy; //進(jìn)程的調(diào)度策略,有三種 實(shí)時(shí)進(jìn)程:SCHED_FIFO,SCHED_RR 分時(shí)進(jìn)程:SCHED_OTHER struct mm_struct mm; //進(jìn)程內(nèi)存管理信息 int processor; //若進(jìn)程不在任何CPU上運(yùn)行。cpus_runnable 的值是0,否則是1。 這個(gè)值在運(yùn)行隊(duì)列被鎖時(shí)更新. unsigned long cpus_runnable, cpus_allowed;struct list_head run_list; //指向運(yùn)行隊(duì)列的指針 unsigned long sleep_time; //進(jìn)程的睡眠時(shí)間 struct task_struct next_task, prev_task; //用于將系統(tǒng)中所有的進(jìn)程連成一個(gè)雙向循環(huán)鏈表,其根是init_task. struct mm_struct active_mm;truct list_head local_pages; //指向本地頁面unsigned int allocation_order, nr_local_pages;struct linux_binfmt binfmt;// 進(jìn)程所運(yùn)行的可執(zhí)行文件的格式int exit_code, exit_signal;int pdeath_signal;// 父進(jìn)程終止是向子進(jìn)程發(fā)送的信號(hào)unsigned long personality; // Linux 可以運(yùn)行由其他UNIX操作系統(tǒng)生成的符合iBCS2標(biāo)準(zhǔn)的程序int did_exec : 1; //按POSIX要求設(shè)計(jì)的布爾量,區(qū)分進(jìn)程正在執(zhí)行從父進(jìn)程中繼承的代碼,還是執(zhí)行由execve裝入的新程序代碼 pid_t pid;// 進(jìn)程標(biāo)識(shí)符,用來代表一個(gè)進(jìn)程pid_t pgrp; //進(jìn)程組標(biāo)識(shí),表示進(jìn)程所屬的進(jìn)程組pid_t tty_old_pgrp; //進(jìn)程控制終端所在的組標(biāo)識(shí)pid_t session; //進(jìn)程的會(huì)話標(biāo)識(shí)pid_t tgid;int leader; //標(biāo)志,表示進(jìn)程是否為會(huì)話主管struct task_structp_opptr p_pptr, p_cptr, p_ysptr, p_osptr;struct list_head thread_group;// 線程鏈表struct task_struct pidhash_next; //用于將進(jìn)程鏈入HASH表pidhash struct task_struct pidhash_pprev;wait_queue_head_t wait_chldexit; //供wait4()使用struct completion vfork_done; //供vfork() 使用 unsigned long rt_priority; // 實(shí)時(shí)優(yōu)先級(jí),用它計(jì)算實(shí)時(shí)進(jìn)程調(diào)度時(shí)的weight值,unsigned long it_real_value, it_prof_value, it_virt_value;unsigned long it_real_incr, it_prof_incr, it_virt_value;struct timer_list real_timer;//指向?qū)崟r(shí)定時(shí)器的指針struct tms times; //記錄進(jìn)程消耗的時(shí)間,unsigned long start_time;//進(jìn)程創(chuàng)建的時(shí)間long per_cpu_utime[NR_CPUS], per_cpu_stime[NR_CPUS];//記錄進(jìn)程在每個(gè)CPU上所消耗的用戶態(tài)時(shí)間和核心態(tài)時(shí)間mm fault and swap info : this can arguably be seen as eithermm - specific or thread - specific//內(nèi)存缺頁和交換信息://min_flt, maj_flt累計(jì)進(jìn)程的次缺頁數(shù)(Copy on Write頁和匿名頁)和主缺頁數(shù)(從映射文件或交換設(shè)備讀入的頁面數(shù));//nswap記錄進(jìn)程累計(jì)換出的頁面數(shù),即寫到交換設(shè)備上的頁面數(shù)。//cmin_flt, cmaj_flt, cnswap記錄本進(jìn)程為祖先的所有子孫進(jìn)程的累計(jì)次缺頁數(shù),主缺頁數(shù)和換出頁面數(shù)。在父進(jìn)程//回收終止的子進(jìn)程時(shí),父進(jìn)程會(huì)將子進(jìn)程的這些信息累計(jì)到自己結(jié)構(gòu)的這些域中unsigned long min_flt, maj_flt, nswap, cmin_flt, cmaj_flt, cnswap;int swappable : 1; //表示進(jìn)程的虛擬地址空間是否允許換出process credentials ///進(jìn)程認(rèn)證信息//uid,gid為運(yùn)行該進(jìn)程的用戶的用戶標(biāo)識(shí)符和組標(biāo)識(shí)符,通常是進(jìn)程創(chuàng)建者的uid,gid //euid,egid為有效uid,gid//fsuid,fsgid為文件系統(tǒng)uid,gid,這兩個(gè)ID號(hào)通常與有效uid,gid相等,在檢查對(duì)于文件系統(tǒng)的訪問權(quán)限時(shí)使用他們。//suid,sgid為備份uid,giduid_t uid, euid, suid, fsuid;gid_t gid, egid, sgid, fsgid;int ngroups; //記錄進(jìn)程在多少個(gè)用戶組中gid_t groups[NGROUPS]; //記錄進(jìn)程所在的組kernel_cap_t cap_effective, cap_inheritable,cap_permitted;//進(jìn)程的權(quán)能,分別是有效位集合,繼承位集合,允許位集合int keep_capabilities : 1;struct user_struct user;limitsstruct rlimit rlim[RLIM_NLIMITS]; //與進(jìn)程相關(guān)的資源限制信息unsigned short used_math; //是否使用FPUchar comm[16]; //進(jìn)程正在運(yùn)行的可執(zhí)行文件名file system info //文件系統(tǒng)信息int link_count, total_link_count;struct tty_struct tty; NULL if no tty 進(jìn)程所在的控制終端,如果不需要控制終端,則該指針為空unsigned int locks; How many file locks are being heldipc stuff //進(jìn)程間通信信息struct sem_undo semundo; //進(jìn)程在信號(hào)燈上的所有undo操作struct sem_queue semsleeping; //當(dāng)進(jìn)程因?yàn)樾盘?hào)燈操作而掛起時(shí),他在該隊(duì)列中記錄等待的操作CPU - specific state of this task //進(jìn)程的CPU狀態(tài),切換時(shí),要保存到停止進(jìn)程的task_struct中struct thread_struct thread;filesystem information; 文件系統(tǒng)信息struct fs_struct fs;open file information //打開文件信息struct files_struct files;signal handlers //信號(hào)處理函數(shù)spinlock_t sigmask_lock;Protects signal and blockedstruct signal_struct sig; //信號(hào)處理函數(shù),sigset_t blocked; //進(jìn)程當(dāng)前要阻塞的信號(hào),每個(gè)信號(hào)對(duì)應(yīng)一位struct sigpending pending; //進(jìn)程上是否有待處理的信號(hào) }??????3.進(jìn)程狀態(tài)
??????R 運(yùn)行狀態(tài),S 睡眠狀態(tài), D 狀態(tài)深度睡眠狀態(tài),(在該狀態(tài)下的進(jìn)程不能被其他進(jìn)程喚醒,只有自己可以喚醒自己),T 停止?fàn)顟B(tài), t 追加狀態(tài), X 死亡狀態(tài), Z 僵尸狀態(tài)
??????4.僵尸進(jìn)程
??????定義:;所謂僵尸進(jìn)程就是進(jìn)程處于一個(gè)僵死的狀態(tài),即進(jìn)程已經(jīng)退出,但其父進(jìn)程沒有得到子進(jìn)程的退出信息,此時(shí)的進(jìn)程就會(huì)成為一個(gè)僵尸進(jìn)程。
??????來看一段代碼
??????于是看到了系統(tǒng)中出現(xiàn)了一個(gè)僵尸進(jìn)程。在此必須注意,僵尸進(jìn)程的父進(jìn)程如果一直不去讀取該進(jìn)程的信息,則這個(gè)進(jìn)程將會(huì)一直處于將是狀態(tài),并且該進(jìn)程的PCB也將一直被維持,那么就會(huì)造成內(nèi)從泄露。
??????5.孤兒進(jìn)程
????????孤兒進(jìn)程就是父進(jìn)程先于子進(jìn)程退出,此時(shí)的子進(jìn)程就會(huì)變成孤兒進(jìn)程,那是不是就是說該進(jìn)程的信息就沒人來讀取嗎?答案是否定的。此時(shí)的子進(jìn)程會(huì)被1號(hào)init進(jìn)程領(lǐng)養(yǎng),于是該子進(jìn)程就會(huì)變成孤兒進(jìn)程。
#include<stdio.h> #include<unistd.h> #include<sys/types.h> #include<stdlib.h>int main() {pid_t id;id = fork();if(id < 0){perror("fork");exit(0);}else if(id == 0){printf("I am child\n");sleep(1);}else{printf("I am father\n");sleep(15);}return; }??????????
????????監(jiān)視可以看到并沒有僵尸狀態(tài),則說明子進(jìn)程退出時(shí)的信息被其他進(jìn)程讀取,進(jìn)而也說明進(jìn)程被領(lǐng)養(yǎng)。
??????6.查看系統(tǒng)進(jìn)程
????????查看系統(tǒng)進(jìn)程可以用ps,或者top命令來查看
????????
????????其中 PRI 是優(yōu)先級(jí),數(shù)字越小優(yōu)先級(jí)越高,而 nice 是用來修改 PRI 的 PRI(new) = PRI(old) + nice, nice 的取值范圍是 -20 到 19, 創(chuàng)建進(jìn)程時(shí) PRI 默認(rèn)是80, 而 nice 默認(rèn)為 0。
????????進(jìn)城之間具有競(jìng)爭性, 系統(tǒng)進(jìn)程數(shù)目眾多, 而 CPU 的資源有限,因此為了能夠高效完成任務(wù),合理競(jìng)爭相關(guān)資源,進(jìn)程之間就需要有一個(gè)優(yōu)先級(jí),確保CPU正常工作;同時(shí)進(jìn)程在運(yùn)行期間獨(dú)享各自資源,互不干擾,因此進(jìn)程是具有獨(dú)立性的;在多個(gè)CPU 的狀況下, 進(jìn)程之間可以同時(shí)工作,因此進(jìn)程具有獨(dú)立性;當(dāng)只有一個(gè)CPU時(shí),為了讓每個(gè)進(jìn)程得以運(yùn)行,CPU采用進(jìn)程切換的方式,以確保在一段時(shí)間里每一個(gè)進(jìn)程都可以得以運(yùn)行,因此進(jìn)程具有并發(fā)性。
總結(jié)
- 上一篇: 英雄联盟中,暗影之拳和不祥之刃哪个好,希
- 下一篇: 自主编写shell