1. 调研进程的调度算法.
初步了解一下进程
进程概念:(1)从用户角度看,进程是程序的一次动态的执行过程(放在内存中的)
(2)从内核角度
进程是分配CPU,内存等系统资源的基本单位
从每个进程都有自己独立的虚拟地址空间(4G)和运行状态
进程是系统分配资源的最小单位
进程是程序的一次动态执行过程,需要对进程的现场信息进行维护,就需要相应的数据结构
对应着C语言的结构体。这个结构体叫PCB
进程创建的一般过程
1.给新进程分配一个标识符。在内核中分配一个PCB
2.复制父进程的环境 PCB
3.分配资源(程序 数据 栈等)内存资源
4.复制父进程的地址空间的内容
5.将进程置成就绪状态,放入就绪队列
进程的调度算法:
2. 调研task_struct结构体, 理解结构体中的各个字段的含义.
task_struct结构:
1.进程状态,将记录进程在等待,运行或死锁。
2.调度信息,由哪个调度函数调度,怎样调度等。
3.进程的通讯情况
4.因为要插入进程树,必须有联系父子兄弟的指针,当然是task_struct型
5.时间信息,比如计算好执行的时间,以便cpu分配。
6.标号,决定改进进程归属
7.可以读写打开文件的一些信息
8.进程上下文和内核上下文
9.处理器上下文
10.内存信息
因为每一个PCB都是这样的,只有这些结构,才能满足一个进程的所有要求
3. 使用代码模拟实现僵尸进程, 孤儿进程的场景.
如果子进程先死,子进程就会变成僵尸进程(清理僵尸,结束父进程)
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
pid_t pid=fork();
if(pid>0){
printf("This is parent!\n");}
else if(pid==0){
printf("This is child!\n");
sleep(3);
exit(EXIT_SUCCESS);}
}
如果父进程先死,子进程就变成孤儿进程,孤儿进程会被1
号进程收养
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
pid_t pid=fork();
if(pid>0){
printf("This is parent!\n");
sleep(3);
exit(0);}
else if(pid==0){
printf("This is child!\n");
sleep(3);}
}
6. 练习使用setenv, export等环境变量相关的函数和命令.
设置环境变量 putenv(“name=value”) 函数
取值 getenv(“环境变量名”)
环境变量:本进程和子进程都能使用 export 变量名