Linux寄存器+Linux2.6内核进程调度队列+命令行参数+环境变量

目录

一、寄存器

二、Linux2.6内核进程调度队列

(一)优先级

(二)活动队列

(三)过期队列

(四)active指针和expired指针

三、命令行参数

(一)举例一

(二)举例二

四、环境变量

(一)基本概念

(二)常见环境变量

(三)查看环境变量方法

(四)测试PATH

(五)和环境变量相关的命令

1. env: 显示所有环境变量

 2. export: 设置一个新的环境变量

3. echo: 显示某个环境变量值

(六)获取环境变量的三种方式

1. 通过系统调用获取或设置环境变量

2. 通过命令行第三个参数获取环境变量(env)

3. 通过第三方变量environ获取

(七)本地变量和环境变量


一、寄存器

  • eax寄存器:主要作用是用于存放函数的返回值,同时也用于存放一些临时数据和进行算术运算
int Function() {
    int result = 42;
    return result;
}

eax 寄存器将会存放返回值 42

  • eip 寄存器,它存储了当前正在执行的指令的内存地址,也就是程序计数器
  • 各个进程在CPU寄存器中形成的临时数据称为进程的上下文

二、Linux2.6内核进程调度队列

  • 如果有多个CPU就要考虑进程个数的负载均衡问题

(一)优先级

  • 普通优先级:100~139(我们都是普通的优先级,想想nice值的取值范围,可与之对应!)
  • 实时优先级:0~99(不关心) 

(二)活动队列

  • 时间片还没有结束的所有进程都按照优先级放在该队列
  • nr_active: 总共有多少个运行状态的进程
  • queue[140]: 一个元素就是一个进程队列,相同优先级的进程按照FIFO规则进行排队调度,所以,数组下标就是优先级
  • 从该结构中,选择一个最合适的进程,过程是怎么的呢?
  1. 从0下表开始遍历queue[140]
  2. 找到第一个非空队列,该队列必定为优先级最高的队列
  3. 拿到选中队列的第一个进程,开始运行,调度完成!
  4.  遍历queue[140]时间复杂度是常数!但还是太低效了!
  • bitmap[5]:一共140个优先级,一共140个进程队列,为了提高查找非空队列的效率,就可以用5*32个
  • 比特位表示队列是否为空,这样,便可以大大提高查找效率

(三)过期队列

  • 过期队列和活动队列结构一模一样
  • 过期队列上放置的进程,都是时间片耗尽的进程
  • 当活动队列上的进程都被处理完毕之后,对过期队列的进程进行时间片重新计算

(四)active指针和expired指针

  • active指针永远指向活动队列
  • expired指针永远指向过期队列
  • 可是活动队列上的进程会越来越少,过期队列上的进程会越来越多,因为进程时间片到期时一直都存在的。
  • 没关系,在合适的时候,只要能够交换active指针和expired指针的内容,就相当于有具有了一批新的活动进程

 

三、命令行参数

(一)举例一

#include<stdio.h>    
int main(int argc, char *argv[])    
{    
    int i = 0;    
    for(;i<argc;i++)                                                                                                          
    {    
        printf("%d: %s\n",i,argv[i]);    
    }    
    return 0;    
}
  • argc(argument count)表示传递给程序的命令行参数的数量(包括程序名称本身)
  • argv(argument vector)是一个指向指针数组的指针,其中每个指针指向一个包含命令行参数的字符串 

(二)举例二

#include<stdio.h>
#include<stdlib.h>
int main(int argc, char* argv[])
{
    if (argc != 4)
    {
        printf("Use error\nUsage: %s op[-add|sub|mul|div] d1 d2\n", argv[0]); //argv[0], 会不会不存在呢??
        return 1;
    }
    int x = atoi(argv[2]);
    int y = atoi(argv[3]);
    int result = 0;
    // 你的程序一定有4个命令行参数,第一个是程序名
    if (strcmp(argv[1], "-add") == 0)
    {
        result = x + y;
        printf("%d+%d=%d\n", x, y, result);
    }
    else if (strcmp(argv[1], "-sub") == 0)
    {
        result = x - y;
        printf("%d-%d=%d\n", x, y, result);
    }
    else if (strcmp(argv[1], "-mul") == 0)
    {
        result = x * y;
        printf("%d*%d=%d\n", x, y, result);
    }
    else if (strcmp(argv[1], "-div") == 0)
    {
        if (0 == y) printf("%d/%d=error! div zero\n", x, y);
        else printf("%d/%d=%d\n", x, y, x / y);
    }
    else
    {
        printf("Use error, you should use right command line\nUsage: %s op[-add|sub|mul|div] d1 d2\n", argv[0]); //argv[0], 会不会不存在呢??
    }
    return 0;

}

四、环境变量

(一)基本概念

  • 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数
  • 如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。
  • 环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性

(二)常见环境变量

  • PATH : 指定命令的搜索路径
  • HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)
  • SHELL : 当前Shell,它的值通常是/bin/bash

(三)查看环境变量方法

echo $NAME //NAME:你的环境变量名称

(四)测试PATH

echo $PATH

(五)和环境变量相关的命令

  • echo: 显示某个环境变量值
  • export: 设置一个新的环境变量
  • env: 显示所有环境变量
  • unset: 清除环境变量
  • set: 显示本地定义的shell变量和环境变量

1. env: 显示所有环境变量

 

 2. export: 设置一个新的环境变量

export MYENV=hello_world//创建了一个名为 MYENV 的环境变量,并将其值设为 hello_world

 

3. echo: 显示某个环境变量值

(六)获取环境变量的三种方式

1. 通过系统调用获取或设置环境变量

#include<stdio.h>                                                                                                             
#include<stdlib.h>    
int main()    
{    
    printf("%s\n",getenv("PATH"));    
    return 0;    
}

2. 通过命令行第三个参数获取环境变量(env)

  #include <stdio.h>    
  #include <stdlib.h>    
  int main(int argc, char*argv[], char *env[])    
  {    
      int i=0;    
      for(;env[i];i++)    
      {    
          printf("env[%d]: %s: \n", i, env[i]);                                                                               
      }    
      return 0;    
  }  

3. 通过第三方变量environ获取

  • libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头文件中,所以在使用时 要用extern声明 

 

#include <stdio.h>    
#include <stdlib.h>                                                           
#include <unistd.h>//environ的头文件                                                                                                             
int main()                                
{                                         
    extern char **environ;                
    int i=0;                              
    for(;environ[i];i++)                                                      
    {                                                                         
        printf("%d: %s: \n", i, environ[i]);    
    }                                     
    return 0;                             
} 

 

(七)本地变量和环境变量

  • 在Linux系统中,环境变量是在整个系统中可见的,并可以被子进程继承。这意味着子进程可以访问到父进程中的环境变量。
  • 相比之下,本地变量只在当前进程(或作用域)中有效,子进程无法直接访问或继承这些本地变量。这是因为本地变量的作用域限定在特定的进程或脚本中。

 

 

#include <stdio.h>    
#include <stdlib.h>//getenv的头文件    
int main()    
{    
    printf("NEW_env: %s\n", getenv("NEW_env"));                                                                                                  
    return 0;    
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值