
目录孤儿进程孤儿进程会变成后台进程进程优先级什么是优先级为什么要有优先级进程优先级的变化范围是多少为什么只能在这个范围内不能更改任意数值补充概念——竞争、独立、并行、并发进程切换进程组织补充前置知识孤儿进程创建一个孤儿进程#includestdio.h#includeunistd.h#includesys/types.hintmain(){pid_tidfork();if(id0){//childwhile(1){printf(child process, pid: %d, ppid: %d\n,getpid(),getppid());sleep(1);}}else{//parentintcnt5;while(cnt){cnt--;printf(parent process, pid: %d, ppid: %d, cnt: %d\n,getpid(),getppid(),cnt);sleep(1);}}return0;}启用“监控”while:;dopsajx|head-1psajx|grepprocessTest|grep-vgrep;sleep1;echo;done可以发现子进程在变成孤儿进程后ppid会变成1PPIDPID PGID SID TTY TPGID STATUIDTIME COMMAND1294972949628534pts/228534S10040:00 ./processTestpid为1的进程一般是操作系统(的一部分)简记为操作系统为什么孤儿进程要被操作系统领养给孤儿进程的退出进行善后防止一直处于Z状态被OS领养之后系统可以进行回收Z状态的孤儿进程孤儿进程会变成后台进程当操作系统领养孤儿进程之后会把孤儿进程变成后台进程无法使用CtrlC杀死该进程必须使用kill命令kill-9[pid]然后它的僵尸会被OS回收区分前后台进程谁能从键盘里获取数据(IO)谁就是前台键盘只有一个所以在获取输入的时候只能有一个进程在获取键盘数据因此前台进程在任何时刻只能有一个后台进程可以有多个进程优先级什么是优先级权限是“能不能”的问题优先级是“先后顺序”的问题优先级进程在有权限获得某种资源的前提下得到该资源的先后顺序为什么要有优先级因为资源不足因此就要分配资源设置优先级决定进程获得某种资源的先后顺序使用ps -la查看更详细的进程信息$ps-laF SUIDPIDPPIDC PRI NI ADDR SZ WCHAN TTY TIME CMD0S100432355285340800-1054hrtime pts/2 00:00:00 processTest1S100432356323550800-1054hrtime pts/2 00:00:00 processTest0R100432361290130800-38336- pts/3 00:00:00ps其中UID是进程执行者在操作系统里的身份编号代表我当前登录的linux账号在系统中的数字编号为1004PRI代表这个进程可被执行的优先级其值越小越早被执行NI代表这个进程的nice值优先级的本质就是struct task_struct里面的两个整型变量NI指nice值是Linux系统特有的表示进程可被执行的优先级的修正数值PRI值越小越快被执行那么加入nice值之后将会使得PRI变为PRI(new) PRI(默认值) nice因此当nice值为负值的时候那么该程序将会优先级值将变小即其优先级会变高则其越快被执行所以调整进程优先级在Linux下就是调整进程nice值nice其取值范围是-20至19一共40个级别。nice的默认值为80有多种方法修改进程优先级举最简单的方法为例#includestdio.h#includeunistd.h#includesys/types.hintmain(){while(1){sleep(1);}return0;}然后运行该程序$ps-alF SUIDPIDPPIDC PRI NI ADDR SZ WCHAN TTY TIME CMD0S10041583285340800-1054hrtime pts/2 00:00:00 processTest0R10041619290130800-38336- pts/3 00:00:00ps然后启动top$top在界面中输入r指令再根据提示输入需要更改的进程的pid再输入更新后的nice值即可成功更改$ps-alF SUIDPIDPPIDC PRI NI ADDR SZ WCHAN TTY TIME CMD0S100415832853409010-1054hrtime pts/2 00:00:00 processTest0R10041844290130800-38336- pts/3 00:00:00ps如果在完成一次更改之后又再次尝试更改会修改失败因为更改进程优先级不会是一个高频操作因此频繁修改会被OS阻止可以使用root账号解除限制普通用户只能降低进程的优先级设nice为正数root用户才能提高进程优先级设nice为负数进程优先级的变化范围是多少PRI范围6099因为nice值范围-2019相当于有40个梯度为什么只能在这个范围内不能更改任意数值优先级的变化范围是有限的主流的操作系统都是分时操作系统——给进程分配时间片采用特定的调度策略较为均衡的让不同的进程的能在一段时间内得到CPU资源如果能够更改为任意数值可能会出现极大值导致某个进程的优先级极端高使得其它进程都无法获得时间片因此必须使优先级的改变控制在一定范围内补充概念——竞争、独立、并行、并发竞争性: 系统进程数目众多而CPU资源只有少量甚至1个所以进程之间是具有竞争属性的。为了高效完成任务更合理竞争相关资源便具有了优先级独立性: 多进程运行需要独享各种资源多进程运行期间互不干扰并行: 多个进程在多个CPU下分别同时进行运行这称之为并行并发: 多个进程在⼀个CPU下采用进程切换的方式在⼀段时间之内让多个进程都得以推进称之为并发进程切换寄存器是共享的但是寄存器里面的数据本质是进程私有的叫做进程上下文CPU上下文切换其实际含义是任务切换或者CPU寄存器切换。当多任务内核决定运行另外的任务时它保存正在运行任务的当前状态也就是CPU寄存器中的全部内容。这些内容被保存在任务自己的堆栈中入栈工作完成后就把下一个将要运行的任务的当前状况从该任务的栈中重新装入CPU寄存器并开始下一个任务的运行这一过程就是context switch。进程组织Linux内核里面的内核结构Linux采用链表结构补充前置知识C语言中任何变量的地址数字是开辟众多字节中地址数据最小的那个structA{inta;intb;intc;doubled;}我只知道结构体中C成员的地址怎么知道所在结构体变量的其它地址呢((structA*)0-c)//是c变量在结构体中的偏移量c语言提供了宏offsetof获得结构体内变量偏移量https://legacy.cplusplus.com/reference/cstddef/offsetof/因此可以使用变量地址 - 偏移量 结构体地址获得结构体地址