Linux 进程切换与命令行参数

 

目录

 

进程优先级调度的收尾

命令行参数

环境变量

认识系统中的环境变量​编辑

PWD

HOME

获取系统环境变量


进程优先级调度的收尾

Linux 进程切换与命令行参数_第1张图片

假设进程1现在要切走了,切入进程2.那进程1就要先保存数据,方便以后恢复,Linux 进程切换与命令行参数_第2张图片 

然后进程2再切走,进程1再把数据还原:
Linux 进程切换与命令行参数_第3张图片

操作系统又分为实时操作系统和分时操作系统。

实时操作系统是是给操作系统一个进程,操作系统必须优先处理这个进程,处理完之后才能处理下个进程,列如车载系统会优先处理刹车。

分时操作系统是操作系统自己会按优先级对进程进行调度。

linux即可以实时,又可以分时。linux有140个优先级,其中前100个是普通的,后面40个。

放在一个指针数里里面,这个指针数组叫做tast_struct* queue[140]:

Linux 进程切换与命令行参数_第4张图片

 假设此时有优先级为60,80,90的进程吗,那它们就会从上到下放到queue[40]里面:Linux 进程切换与命令行参数_第5张图片

然后此时60进程处理完了,80进程也快结束时,又来了1个优先级为80的进程,然后快结束时又来了几个,那优先级为90的进程一直没有机会被调度,会处于饥饿状态,并且这种调度方式也不符合操作系统公平调度的方针。

为了避免这种情况发生,所以还有一个queue【140】队列,然后这两个队列通过两个指针变量来控制。

active指针和expired指针。active指针指向活跃队列,expired指针指向过期队列。

假如以后又有优先级为80的进程加入,那就直接让它们加进过期队列里排着,等我活跃队列的进程全部结束,再把active和expired指针的内容交换一下,这样active指针就会指向过期队列,就会去处理过期队列的内容。

Linux 进程切换与命令行参数_第6张图片

伴随着queue[140]的还有一个int bit[map]5。

int=4bit=32位

32 bit*5=160;

它通过8位8位遍历这160个0,在第几个位上有1就代表优先级为一那一位的有进程。这种遍历方法接近O(1),被称之为Linux2.6内核的调度队列与调度原理。

假设cpu现在要调度一个进程,操作系统就会去queue[140]里去查看,先看active是否有进程,active显示有进程,那就去bitmap[5]里查看,bitmap[5]再8位8位遍历160个位,假设在第80位发现一个1,那么就去把优先级为80的进程,把它的pcb喂给CPU。

 Linux 进程切换与命令行参数_第7张图片

命令行参数

main函数有两个参数:

int main(int argc,char* argv[])

整形argc,指定字符串指针数组argv有多少个元素。

现在我们把argv的初始元素打印出来看看:

#include    
int main(int argc,char* argv[])                                                                                  
{    
int i=0;    
for(;i

 如下图,运行结果是 ./myproc,这是第一个元素,也就是下标为0的元素,这个元素也就是我们的可执行文件的文件名。

 argv一共有5个参数,假设我们给这个四个参数传参,它即会把这四个参数依次打印出来:

c语言中没有字符串类型,通过char*来表示一个字符串数组 ,char*指针存放着字符串数组的首元素地址。

Linux 进程切换与命令行参数_第8张图片

那这样写的用处在哪呢?假设我们通过设置main函数参数来实现了一个计算器:

#include
#include
#include
int main(int argc,char* argv[])
{
    if(argc!=4)
    {
        printf("输入错误,请至少输入四个参数:%s",argv[0]);

    }
    int a= atoi(argv[2]);

    int b= atoi(argv[3]);
    int result=0;
   if( strcmp(argv[1],"add")==0)
    {
        result=a+b;
        printf("%d+%d=%d\n",a,b,result);

    }

   else if( strcmp(argv[1],"sub")==0)
   {                                                                                                             
        result=a-b;
        printf("%d-%d=%d\n",a,b,result);

    }

       else if( strcmp(argv[1],"mul")==0)
    {
        result=a*b;
        printf("%d*%d=%d\n",a,b,result);                                                                         

    }

   else if( strcmp(argv[1],"div")==0)
    {
        if(argv[3]==0)printf("除数不能为0");
        result=a/b;
        printf("%d*%d=%d\n",a,b,result);

    }

   else 
   {
       printf("你输入了+-*/以外的操作符");
   }




    
    
    return 0;

Linux 进程切换与命令行参数_第9张图片

 上面这段程序说明了我们在输入命令参数的时候实际上是输入用空格分隔的字符串,然后shell1把这些字符串传给main函数的argc,argv两个参数,然后运行的。

比如我们输入 touch test.c,vim就是一个参数,test.c就是文件名。

我们可以模拟实现一下touch:

Linux 进程切换与命令行参数_第10张图片

环境变量

我们执行我们自己的命令是要加./,比如./a.out:

而我们执行系统命令时则直接输入命令就可以了:

 我们知道"./"的意思就是当前目录的意思,我们的./a.out就是指当前目录下找a.out这个可执行程序,然后执行它。

那ls,pwd,cd这种系统命令为什么不用加“./”呢?原因就是它们已经被系统配过路径了,这个被配置过的路径就叫做环境

我们可以环境打印出来看看:

下面就是系统配置的环境,是几个主要文件的路径,其中以冒号作为分隔符

 我们可以把我们自己的命令的所在路径加到这个环境里面,就可以实现我们再次输入命令可以直接输入而不用加“./"了:

假设我们系统环境变量置空:

 那么我们会发现我们许多命令都用不了了:

不过不要紧,这是环境变量加载进内存,我们只是对内存中的环境变量置空了而已,只要重启一下shell就可以了。

重启完之后系统命令就又可以直接使用了:

而我们再次直接输入“a.out”就会报错:这是因为重启之后又恢复到了默认路径:

假设我们就想要不用“./”,那我们可以把我们得可执行文件路径赋值到环境中某个文件下:

这个时候就可以不+“. /”直接使用mytouch:

把可执行程序加载进环境列表中的行为我们称为 “程序安装”。

认识系统中的环境变量

PWD

HOME

会在登陆用户前形成当前用户的起始路径:

Linux 进程切换与命令行参数_第11张图片

输入“env”命令可以查看系统所有环境变量:

Linux 进程切换与命令行参数_第12张图片

获取系统环境变量

getenv命令可以获取系统环境变量,它有一个参数,需要输入环境变量名称,getenv包含于头文件:

 假设我们要获取"PATH"

printf("%s",getenv("PATH"));   

那么这有什么用处呢?

我们可以写一个是否合法用户登录的代码:

  #include    
      
  #include    
  #include    
W>int main(int argc,char* argv[])    
      
  {    
      char* who=getenv("USER");    
      if(strcmp(who,"root")!=0)    
      {                                                                                                          
          printf("%s非法登录\n",who);    
          return 1;    
      }    
      else    
      {    
      printf("%s用户登录\n",who);    
      }    
      

Linux 进程切换与命令行参数_第13张图片

你可能感兴趣的:(linux,运维,服务器,1024程序员节)