进程的部分知识点总结


         本篇博客将为大家分析进程的调度算法、task_struct结构体,模拟实现僵尸进程and孤儿进程,

并对进程与虚拟空间做相应的阐述,最后将使用setenv、export等环境变量 相关的函数和命

令进行相应的操作 。

task_struct结构体:

task_struct是什么?首先我们对该结构体做一个相对的认识。

       linux内核通过一个被称为进程描述符的task_struct结构体来管理进程,这个结构体包含了一

个进程所需要的所有信息它在定义在linux-2.6.38.8/include/linux/sched.h文件中

task_struct主要包含以下几个成员:
1)进程状态,记录进程在等待、运行或死锁
2)调度信息,由那个调度函数调度,怎么调度等
3)进程的通讯状态
4)因为也要插入进程树,必须 有联系父子兄弟的指针,当然是task_struct型
5)时间信息,比如计算好执行时间,以便cpu分配
6)标号,决定进程归属
7)可以读写 打开的一些文件信息
8)进程上下文和内核上下文
9)处理器上下文

10)内存信息


进程的调度算法:

关于进程的调度方法,以下将对其中的五种方法做一个总结:

1)时间片轮调度算法(RR):给每个进程固定的执行时间,根据进程达到的先后顺序在单位时间片

内执行,执行完成后便调度执行下一个进程执行,时间片轮转调度不考虑进程等待时间和执行时间,

属于抢占式调度。优点是兼顾长短作业;缺点是平均等待时间较长,上下文切换较费时。使用于分时

系统。

2)先来先服务调度算法(FCFS):根据进程到达的先后顺序执行进程,不考虑等待时间和执行时间,

会产生饥饿现象。属于非抢占式调度,优点是公平,实现简单;缺点是不利于短工作

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

4)多级反馈队列调度算法:将时间片轮转和优先级调度相结合,把进程优先级分成不同的队列,先

按优先级调度,优先级相同的,按时间片轮转。优点是兼顾长短作业,有较好的相应时间,可行性强,

适用于各种作业环境。

5)高响应比优先级调度算法:根据“响应比=(进程执行时间+进程等待时间)/进程执行时间”这个

公式得到的响应比来进行观察。高响应比会随着等待事件增加而变大,优先级会提高,能够避免饥饿

现象。优点是兼顾长短作业,缺点是计算机响应开销大,适用于处理系统。


僵尸进程与孤儿进程的实现:

在linux中,进程分为多种状态,如下:
R(running):运行状态;
S(sleeping):睡眠状态(浅度睡眠);
D(disk sleep):磁盘睡眠状态;
T(stopped):停止状态;
X(dead):死亡状态;
Z(zomble):僵尸状态

       僵尸状态是一种比较特殊的状态:当进程退出并且父进程(使用wait()系统调用)没有读取到子

进程退出的返回代码时就会产生僵尸进程。僵尸进程会以终止状态保持在进程表中,并且会一直等待父

进程读取退出状态代码。如果父进程还存在而一直不调用wait,则该僵尸进程将无法回收,等待其父进

程退出后该进程将被init回收。

代码实现:
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<unistd.h>

int main(){
pid_t pid=getpid();
pid_t id=fork();
if(id = -1){
printf("fork error!return code is %d\n",errno);
return;
}
else if(id = 0){
printf("child pid is %d\n",getpid());
exit();
}
else{
while(1){
printf("father pid is %d,return pid is %d\n",getpid(),id);
       sleep(1);
}
}
return 0;
}
孤儿进程:
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>

int main(){
int id=fork();
if(id = -1){
printf("fork error!return code is %d\n",errno);
return;
}
else if(id = 0){
printf("child pid is %d,parents pid is %d\n",getpid(),getppid());
sleep(3);
}
else{
printf("father pid is %d,child pid is %d\n",getppid(),getpid());
       printf("father process is exxited!\n");
}
return 0;
}


set env, export等函数的区别:



   1) env是显示变量 ;
set和export是设置变量;
set用于csh环境;
export用于bash环境;
   格式:
set DISPLAY 192.168.1.1:0
export DISPLAY =192.168.1.1:0
   2)  env命令显示用户的变量;
        export命令显示当前导出成用户变量的shell变量


   3)  set命令显示当前shell的变量,包含当前用户的变量;
env命令显示当前用户的变量;
export命令显示当前导出成用户变量的shell变量。  

        每个shell有自己特有的变量(set)显示的变量,这个和用户变量是不同的,当前用户变量和你用

什么shell无关,不管你用什么shell都在,比如HOME,SHELL等这些变量,

        但shell自己的变量不同shell是不同的,比如BASH_ARGC,  BASH等,这些变量只有set才会显示,

是bash特有的,export不加参数的时候,显示哪些变量被导出成了用户变量,因为一个shell自己的变

量可以通过export “导出”变成一个用户变量。




































  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值