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


    目录

    一、寄存器

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

    (一)优先级

    (二)活动队列

    (三)过期队列

    (四)active指针和expired指针

    三、命令行参数

    (一)举例一

    (二)举例二

    四、环境变量

    (一)基本概念

    (二)常见环境变量

    (三)查看环境变量方法

    (四)测试PATH

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

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

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

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

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

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

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

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

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


    一、寄存器

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

    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指针的内容,就相当于有具有了一批新的活动进程

     

    三、命令行参数

    (一)举例一

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

    (二)举例二

    1. #include
    2. #include
    3. int main(int argc, char* argv[])
    4. {
    5. if (argc != 4)
    6. {
    7. printf("Use error\nUsage: %s op[-add|sub|mul|div] d1 d2\n", argv[0]); //argv[0], 会不会不存在呢??
    8. return 1;
    9. }
    10. int x = atoi(argv[2]);
    11. int y = atoi(argv[3]);
    12. int result = 0;
    13. // 你的程序一定有4个命令行参数,第一个是程序名
    14. if (strcmp(argv[1], "-add") == 0)
    15. {
    16. result = x + y;
    17. printf("%d+%d=%d\n", x, y, result);
    18. }
    19. else if (strcmp(argv[1], "-sub") == 0)
    20. {
    21. result = x - y;
    22. printf("%d-%d=%d\n", x, y, result);
    23. }
    24. else if (strcmp(argv[1], "-mul") == 0)
    25. {
    26. result = x * y;
    27. printf("%d*%d=%d\n", x, y, result);
    28. }
    29. else if (strcmp(argv[1], "-div") == 0)
    30. {
    31. if (0 == y) printf("%d/%d=error! div zero\n", x, y);
    32. else printf("%d/%d=%d\n", x, y, x / y);
    33. }
    34. else
    35. {
    36. printf("Use error, you should use right command line\nUsage: %s op[-add|sub|mul|div] d1 d2\n", argv[0]); //argv[0], 会不会不存在呢??
    37. }
    38. return 0;
    39. }

    四、环境变量

    (一)基本概念

    • 环境变量(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. 通过系统调用获取或设置环境变量

    1. #include
    2. #include
    3. int main()
    4. {
    5. printf("%s\n",getenv("PATH"));
    6. return 0;
    7. }

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

    1. #include
    2. #include
    3. int main(int argc, char*argv[], char *env[])
    4. {
    5. int i=0;
    6. for(;env[i];i++)
    7. {
    8. printf("env[%d]: %s: \n", i, env[i]);
    9. }
    10. return 0;
    11. }

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

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

     

    1. #include
    2. #include
    3. #include //environ的头文件
    4. int main()
    5. {
    6. extern char **environ;
    7. int i=0;
    8. for(;environ[i];i++)
    9. {
    10. printf("%d: %s: \n", i, environ[i]);
    11. }
    12. return 0;
    13. }

     

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

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

     

     

    1. #include
    2. #include //getenv的头文件
    3. int main()
    4. {
    5. printf("NEW_env: %s\n", getenv("NEW_env"));
    6. return 0;
    7. }

     

  • 相关阅读:
    nginx配置
    MySQL的多版本并发控制与MVCC原理
    R语言ggplot2可视化:ggcharts包的bar_chart函数可视化条形图、bar_chart函数自动排序条形图并水平显示
    【POJ No. 3104】 烘干衣服 Drying
    《A Simple Baseline for BEV Perception Without LiDAR》论文笔记
    简单的网页制作期末作业——电影泰坦尼克号(4页)
    vue模板的首次渲染,和重新渲染,有哪些区别?
    第二周 优化算法实战
    Java读取本地TXT文本内的json数据
    动态规划问题(二)
  • 原文地址:https://blog.csdn.net/m0_63783532/article/details/133820043