进程的调度算法:
<1>先来先服务调度算法(FCFS,first come first served):
谁第一个排队,谁就先被执行,在它执行过程中,不会中断它
<2>短作业优先调度算法(SJF,shortest job first):
对预计执行时间短的进程有限分配处理机,通常后来的短进程不会抢先正在执行的进程;
对长进程非常不利,可能长时间得不到执行
<3>最高响应比优先法(HRRN,highest response radio next):
对于FCFS和SJF的平衡,FCFS方式只考虑每个作业的等待时间而未考虑执行时间的长短,而SJF只考虑了执行时间而未考虑等待时间的长短,因此两种算法在某种极端的情况下会带来某些不便
HRRN通过综合这两种情况算出响应比R,根据响应比完成调度
优点:长作业也有机会投入运行
缺点:每次调度前要计算响应比
<4>时间片轮转法(RR,Round-Robin):
采用剥夺方式,每个进程被分配一个时间段,按照在队列中的顺序交替执行;不利于处理紧急作业
<5>多级反馈队列(multilevel feedback queue):
UNIX使用这种调度算法;进程在进入待调度的队列等待时,首先进入优先级最高的Q1中等待;
首先调度优先级高的队列中的进程;若高优先级队列中已经没有调度的进程,则调度次优先级队列的进程;
同一队列中的各个进程按照时间片轮转调度;
低优先级队列中的进程在运行时,又有新到达的作业,运行完这个时间片后,CPU马上分配给新到达的作业(剥夺)
task_struct结构体:
pcb中的一些描述信息:
内存指针 指向程序代码在内存中的位置
程序计数器 上下文数据---程序下次执行的指令,存储程序的数据
标识符PID
进程状态 描述程序是否在运行
进程优先级 cpu资源的优先分配权---避免急需响应的程序卡顿
IO状态信息
记账信息 记录程序运行的时间
进程的信息可以通过系统的/proc文件夹查看:
代码模拟实现僵尸进程, 孤儿进程:
僵尸进程:
子进程先于父进程退出,操作系统保存着退出原因导致操作系统无法回收资源,通知父进程获取退出原因,允许操作系统释放资源,但是父进程没有关注这个通知导致进程退出后无法释放所有资源,处于僵死状态变为僵尸进程
代码实现:
进程状态:
杀掉子进程之后:
孤儿进程:
父进程先于子进程退出,子进程成为孤儿进程,运行在后台,父进程变为1号进程sysytemd
杀死父进程之后:
环境变量特性:
全局特性(父子进程之间的继承关系,父进程设置了子进程的环境变量)
shell创建的process程序,所需要的环境变量都是bash给予的
代码中操作环境变量:
main函数中的第三个参数 int main(int argc,char* argv[],char* env[])
exten char** environ
函数 char * getenv putenv setenv
修改PATH效果图:
设置环境变量PATH前:
设置环境变量PATH后: