Linux中有关环境变量和地址的初步理解

一、Linux中的环境变量

在Linux中,我们通常用的命令,程序还有工具等等其实本质上都是文件,同时我们可以认为Linux中万物皆文件这句话是正确的。
例如如果我们用./myproc这个命令运行myproc这个文件,但是系统是怎么确定myproc这个文件是在哪里的呢?
./是系统的命令,为什么系统的命令可以不带路径呢?答:环境变量。
环境变量的本质:是OS在内存/磁盘文件中开辟的空间,用来保存系统相关的数据。OS是可以自己开辟一段空间的用来保存变量名+变量的内容。语言上定义变量本质是:在内存中开辟空间(有名字)。
其中还有一种变量是只和本次登录有关,成为本地变量。例如:
export MY_VAR=‘Hello world!’
这个命令将把MY_VAR环境变量设置为Hello world!。在终端中可以使用echo命令来打印环境变量的值:
echo $MY_VAR
这个命令将输出:Hello world!
但是这个只会对本次登录有用。

另外,一个指令有很多选项,用来完成同一个命令的不同的子功能。例如:ls - l,ls -a,等等。
其中这些-l,-a选项的底层使用的就是我们的命令行参数。

同时也要认识到环境变量是一个全局变量,可以被所有子进程继承下去,那么我们平常的子进程都可以使用系统为我们开辟好的环境变量,我们在命令行上启动的进程,他们的父进程都是bash。

环境变量也是可以更改的,但是我们不建议更改环境变量,用默认的系统开好的就行,乱改会污染变量池。

二、初步认识虚拟地

下面,我们先来看这张图,这是C/C++的内存分布图,可以说是C/C++程序地址空间,但是这个是内存吗???
在这里插入图片描述
答案是遗憾的:这张图根本就不是内存!!那么不是内存又是什么呢?答:是进程的虚拟地址空间
可以理解为是语言上的地址,也就是虚拟地址。从低地址到高地址,下面来看这一段代码。

  1 #include <stdio.h>
  2 #include <unistd.h>
  3 #include <stdlib.h>
  4 
  5 int g_val = 0;
  6 
  7 int main()
  8 {
  9  pid_t id = fork();
 10  if(id < 0)
 11  {                                                                        
 12  perror("fork");                                     
 13  return 0;                 
 14  }                 
 15  else if(id == 0)                              
 16 { //child           
 17   g_val=100;                                                                                                                 
 18  printf("child[%d]: %d : %p\n", getpid(), g_val, &g_val);
 19  }                     
 20  else{ //parent
 21  printf("parent[%d]: %d : %p\n", getpid(), g_val, &g_val);         
 22  }                                                               
 23  sleep(1);                                                
 24  return 0;                            
 25  }

在这里插入图片描述
可以看到地址是一样的,但是输出居然不一样。说明已经发生了写时拷贝,如果这个输出的地址是物理地址的话,是绝对不可能出现出现不同的值这个情况的。说明输出的地址绝对不是物理地址。
我们在用C/C++语言所看到的地址,全部都是虚拟地址!物理地址,用户一概看不到,由OS统一管理

优先级

cpu资源分配的先后顺序,就是指进程的优先权(priority)。
优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用,可以改善系统性能。
还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整体性能。
在这里插入图片描述
在Linux中优先级数据的值越小,优先级越高。
PRI(new)=PRI(old)+NI. UID(就是类似于人的身份证,是执行者的身份)
我们只能更改NI的值,从[-20,19],更改只能让PRI最高到60,其中值得注意的是优先级是一种相对的优先级,不能出现绝对的优先级,否则会出现很严重的后果,可能会导致进程的“饥饿问题”(一直让进程处于等待迟迟得不到CPU的处理)。可以认为NI就是用来改变优先级用的。
用top命令更改已存在进程的nice:
进入top后按“r”–>输入进程PID–>输入nice值,就可以更改nice值了。

其他的一些概念:
竞争性: 系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高
效完成任务,更合理竞争相关资源,便具有了优先级
独立性: 多进程运行,需要独享各种资源,多进程运行期间互不干扰
并行: 多个进程在多个CPU下分别,同时进行运行,这称之为并行。(是真的在同时运行,要求有多个CPU)
并发: 多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发

总结

本次博客总结了环境变量,还有初步认识虚拟地址,还了解了优先级,后面会继续深入了解虚拟地址。

2023 年 6月 15日

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值