1. 调研进程的调度算法.
答:
1,时间片轮转调度算法(RR)
给每个进程固定的执行时间,根据进程到达的先后顺序让进程执行单个时间片时间,执行完成后调度下一个进程,时间片轮转调转算法不考虑等待时间和执行时间,属于抢占式调度。特点是长短兼顾,缺点是平均等待时间长,上下文切换费时,适用于分时系统。
2,先来先服务调度算法(FCFS)
根据进程到达的先后顺序执行进程,不考虑等待时间和执行时间,会产生饥饿现象。属于非抢占式调度,优点是公平,实现简单;缺点是不利于短作业。
3,优先级调度算法(HPF):在进程等待队列中选择优先级最高的来执行。
4,多级反馈队列调度算法:
将时间片轮转与优先级调度相结合,把进程按优先级分成不同的队列,先按优先级调度,优先级相同的,按时间片轮转。优点是兼顾长短作业,有较好的响应时间,可行性强,适用于各种作业环境。
5,高响应比优先调度算法:
根据“响应比=(进程执行时间+进程等待时间)/ 进程执行时间”这个公式得到的响应比来进行调度。高响应比优先算法在等待时间相同的情况下,作业执行的时间越短,响应比越高,满足段任务优先,同时响应比会随着等待时间增加而变大,优先级会提高,能够避免饥饿现象。优点是兼顾长短作业,缺点是计算响应比开销大,适用于批处理系统。
2. 调研task_struct结构体, 理解结构体中的各个字段的含义.
答:
1.进程状态,记录进程在等待,运行,或死锁
2.调度信息,由哪个调度函数调度,怎样调度等
3.进程的通讯状态
4.因为要插入进程树,必须有联系父子兄弟的指针,当然是tast_struct型
5.时间信息,比如计算好执行的时间以便cpu分配
6.标号,决定进程归属
7.可以读写打开的一些文件信息
8.进程上下文和内核上下文
9.处理器上下文
10.内存信息
3. 使用代码模拟实现僵尸进程, 孤儿进程的场景.
孤儿进程
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <string.h>
5 #include <unistd.h>
6 #include<stdio.h>
7 int main ()
8 {
9 ssize_t id=fork();
10 if(id<0)
11 {
12 perror("fork");
13 exit(1);
14 }
if(id==0)
16 {
17 //子进程
18 printf("i am child !\n");
19 sleep(20);
20 }
21 if(id>0)
22
23 {
24 //父进程
25 printf("i am father!\n");
26 sleep(10);
27 }
28
30 return 0;
31 }
僵尸进程
#include<stdio.h>
2 #include<stdlib.h>
3 int main ()
4 {
5 pid_t id =fork();
6 if(id<0)
7 {
8 perror("fork");
9 }
10 else if(id>0)
11 {
12 //father
13 printf("father[%d] if sleeeping ...\n",getpid());
14 sleep(30);
}
16 else
17 {
18 //child
19 printf("child [%d] is z...\n",getpid());
20 sleep(5);
21 exit(EXIT_SUCCESS);
22 }
23 return 0;
24 }