Linux 进程的相关简介

1. 调研进程的调度算法.
时间片轮转调度算法(RR):给每个进程固定的执行时间,根据进程到达的先后顺序让进程在单位时间片内执行,执行完成后便调度下一个进程执行,时间片轮转调度不考虑进程等待时间和执行时间,属于抢占式调度。优点是兼顾长短作业;缺点是平均等待时间较长,上下文切换较费时。适用于分时系统。

先来先服务调度算法(FCFS):根据进程到达的先后顺序执行进程,不考虑等待时间和执行时间,会产生饥饿现象。属于非抢占式调度,优点是公平,实现简单;缺点是不利于短作业。

优先级调度算法(HPF):在进程等待队列中选择优先级最高的来执行。

多级反馈队列调度算法:将时间片轮转与优先级调度相结合,把进程按优先级分成不同的队列,先按优先级调度,优先级相同的,按时间片轮转。优点是兼顾长短作业,有较好的响应时间,可行性强,适用于各种作业环境。

高响应比优先调度算法:根据“响应比=(进程执行时间+进程等待时间)/ 进程执行时间”这个公式得到的响应比来进行调度。高响应比优先算法在等待时间相同的情况下,作业执行的时间越短,响应比越高,满足段任务优先,同时响应比会随着等待时间增加而变大,优先级会提高,能够避免饥饿现象。优点是兼顾长短作业,缺点是计算响应比开销大,适用于批处理系统。

2. 调研task_struct结构体, 理解结构体中的各个字段的含义.
Linux内核通过一个被称为进程描述符的task_struct结构体来管理进程,这个结构体包含了一个进程所需的所有信息。
task_struct结构:
1.进程状态,将记录进程在等待,运行或死锁。
2.调度信息,由哪个调度函数调度,怎样调度等。
3.进程的通讯情况
4.因为要插入进程树,必须有联系父子兄弟的指针,当然是task_struct型
5.时间信息,比如计算好执行的时间,以便cpu分配。
6.标号,决定改进进程归属
7.可以读写打开文件的一些信息
8.进程上下文和内核上下文
9.处理器上下文
10.内存信息

3. 使用代码模拟实现僵尸进程, 孤儿进程的场景.
孤儿进程:一个父进程退出后,它的子进程还在运行,那么子进程会成为孤儿进程,这些孤儿进程会被系统的进程号1的进程所收养,并对他们完成状态收集工作。

int main()
{
    pid_t pid;
    pid = fork();
    if(pid==0)
    {
        sleep(3);
        printf("i am the child process pid = :%d,ppid = %d\n",getpid(),getppid());
    }else if(pid>0)
    {
        printf(" parent :pid=%d,ppid = %d\n",getpid(),getppid());
    }
}
//运行结果
[root@localhost linux_home]# ./a.out 
 parent :pid=3254,ppid = 2898
[root@localhost linux_home]# i am the child process pid = :3255,ppid = 1(成为孤儿)

僵尸进程:一个进程使用fork创建了子进程,由于父进程没有使用wait或者waitpid来获取子进程的状态信息,那么子进程的进程描述符还在系统中。这种进程成为僵尸进程。
这样做是有危害的:不去调用wait的话,那么保留的那段信息就不会释放,其进程号会一直占用,但是系统所能使用的进程号是有限的。

int main()
{
    pid_t pid;
    pid = fork();
    if(pid==0)
    {
        printf("i am the child process pid = :%d,ppid = %d\n",getpid(),getppid());
    }else if(pid>0)
    {
        sleep(3);
        system("ps -ef|grep a.out");
        printf(" parent :pid=%d,ppid = %d\n",getpid(),getppid());
    }
}


[root@localhost linux_home]# ./a.out 
i am the child process pid = :3393,ppid = 3392
root       3392   2898  0 10:58 pts/0    00:00:00 ./a.out
root       3393   3392  0 10:58 pts/0    00:00:00 [a.out] <defunct>//僵死
root       3394   3392  0 10:58 pts/0    00:00:00 sh -c ps -ef|grep a.out
root       3396   3394  0 10:58 pts/0    00:00:00 grep a.out
 parent :pid=3392,ppid = 2898

4. 练习使用setenv, export等环境变量相关的函数和命令.
set:可以定义局部变量,set只对当前进程有效,不会传递到子进程
setenv:可以定义环境变量,不仅对当前进程有效,还会传递到子进程
注意:当同时使用set setenv时,会优先使用set设置的值

[root@localhost fork_test]#en=avj
[root@localhost fork_test]# echo $en
avj
用export定义全局变量en:
[root@localhost fork_test]# export en
[root@localhost fork_test]# bash
[root@localhost fork_test]# echo $en
avj
[root@localhost fork_test]# exit
exit
用unset取消设置全局变量:
[root@localhost fork_test]# unset $en
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值