1. 调研进程的调度算法.
FCFS(First Come First Serve):根据程序的前后顺序分派CPU资源,要当前进程完成后才可让出CPU进行下一进程处理
有利于长作业和CPU繁忙的作业,不利于短作业和I/O繁忙作业、
轮转法(Round Robin)
将所有需要CPU处理的就绪的进程按照FCFS原则排队。之后CPU会划分时间片,根据时间片来给队列上的程序执行,当时间片结束。当前进程中断,让出CPU让下一进程使用。
高响应比优先调度算法:根据“响应比=(进程执行时间+进程等待时间)/ 进程执行时间”这个公式得到的响应比来进行调度。高响应比优先算法在等待时间相同的情况下,作业执行的时间越短,响应比越高,满足段任务优先,同时响应比会随着等待时间增加而变大,优先级会提高,能够避免饥饿现象。优点是兼顾长短作业,缺点是计算响应比开销大,适用于批处理系统。
2. 调研task_struct结构体, 理解结构体中的各个字段的含义.
标识符:与进程相关的唯一标识符,用来区别正在执行的进程和其他进程。状态:描述进程的状态,因为进程有挂起,阻塞,运行等好几个状态,所以都有个标识符来记录进程的执行状态。
优先级:如果有好几个进程正在执行,就涉及到进程被执行的先后顺序的问题,这和进程优先级这个标识符有关。
程序计数器:程序中即将被执行的下一条指令的地址。
内存指针:程序代码和进程相关数据的指针。
上下文数据:进程执行时处理器的寄存器中的数据。
I/O状态信息:包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表等。
记账信息:包括处理器的时间总和,记账号等等。
3. 使用代码模拟实现僵尸进程, 孤儿进程的场景.
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int main()
{
pid_t id = fork();
if(id<0)//子程序
{
printf("error");
exit(1);
}
if(id==0)//子程序
{
printf("child pid is :%d,father pid is :%d\n",getpid(),getppid());
exit(1);
}
else//父程序
{
while(1)
{
printf("father pid is :%d\n",getpid());
sleep(1);
}
}
return 0;
}
此时父进程迟迟不接收子进程的信息,使得子进程进入僵尸状态。
若要产生孤儿进程
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int main()
{
pid_t id = fork();
if(id<0)//子程序
{
printf("error");
exit(1);
}
if(id==0)//子程序
{
printf("child pid is :%d,father pid is :%d\n",getpid(),getppid());
sleep(3);
}
else//父程序
{
while(1)
{
printf("father pid is :%d\n",getpid());
exit(1)
}
}
return 0;
}
此时父进程先于子进程退出,使得子进程成为孤儿进程,由1号程序领养