目录

一、进程优先级

 1、优先级概念

 2、优先级特点

 3、修改Linux下的优先级

二、进程切换

 1、进程特性

 2、进程切换

三、环境变量

 1、基本概念

 2、常见环境变量

 3、查看环境变量方法

 4、PATH环境变量

 5、和环境变量相关的命令

 6、环境变量的组织方式

 7、通过代码如何获取环境变量

 8、通过系统调用获取或设置环境变量

 9、环境变量通常是具有全局属性的


一、进程优先级

 1、优先级概念

 2、优先级特点

  1. 进程的优先级和状态一样,本质都是PCB里面一个数字(也可能多个数字),操作系统通过这些数字来辨别进程的状态优先级;
  2. 通过 psal 指令可以看到进程的详细信息,PRI 和 NI 的值合并在一起代表 Linux 进程的优先级。PRI 其实就是最终优先,只不过它受 NI 值的调控。

输入 ps -l 命令后,会显示一下内容

此时可以注意到其中几个重要信息,有下:

Linux 给我们提供了修改 进程 优先级的权限,目的就是让我们多任务运行进行合理处理提高系统运行效率

注意:(1)进程的nice值不是进程的优先级,他们不是一个概念,但是进程nice值会影响到进程的优先级变化;(2)可以理解nice值是进程优先级的修正修正数据

 3、修改Linux下的优先级

输入top进入top后,按‘r’,然后输入进程PID,输入nice值。

(1)输入 top 指令

(2) 输入 r 

(3) 输入进程的 id

(4)输入 NI 值(例如:NI = -10) 

结果:PRI(新的) = PRI(旧的) + NI(-10) = 70 

注意:普通用户无法直接修改NI的值,必须切换root用户或者使用sudo提权执行top指令

二、进程切换

 1、进程特性

 2、进程切换

(1) 一个CPU里面存在一套硬件寄存器寄存器分为用户可见的寄存器用户不可见的寄存器

(2) 计算机调度某个进程时,CPU 会把这个进程的 PCB 地址加载某个存器,也就是说,CPU内有寄存器可以找到进程的PCB地址

(3) CPU里有一个 eip存器(PC指针),指向当前执行指令的下一条指令地址

(4) 当进程在运行时候,一定会产生非常多的临时数据,这些临时数据属于当前进程,虽然CPU内部只有一套存器硬件,但是寄存器里面保存数据属于当前进程的,存器硬件和寄存器内的数据是两码事

(5) 进程在调度时候占有CPU,但是却不是一直占有到进程结束,进程都有自己时间片!因为时间片的存在,进程会出现没有被执行完就被拿下去的情况。

(6) 在进程重新被CPU调度时候,CPU必须知道一次这个进程运行到哪,当进程被换下去的时候,进程的运行信息会被存在操作系统里面以便下次CPU重新调度时进程能够正常运行,这叫做进程的上下文保护。当进程被CPU重新调度上来时,首先要做的第一件事情就是读取操作系统中进程运行的相关数据,这叫做进程的上下文恢复

三、环境变量

 1、基本概念

 2、常见环境变量

 3、查看环境变量方法

我们可以通过指令 echo $NAME 来查看当前环境变量信息(NAME :环境变量名)

//查看用户信息
echo $USER
//查看PATH环境变量
echo $PATH

 4、PATH环境变量

  (1)直接添加PATH环境变量

  (2)使用 export 命令添加

注意:我们不能直接写成这样:export PATH=/home/xqh/dir,这样会导致把系统默认的环境变量PATH覆盖掉,我们默认的那些指令就不能直接使用了,只能通过指定路径方式来使用(关掉Xshell,重新打开,就恢复了)。

 5、和环境变量相关的命令

  1. echo: 显示某个环境变量值
  2. export: 设置一个新的环境变量
  3. env: 显示所有环境变量;
  4. unset: 清除环境变量;
  5. set: 显示本地定义shell变量和环境变量。

  1、查看所有的环境变量:env 指令

  2、也可以通过set 指令来查看环境变量表,不过还会多很多信息,包括本地环境变量等。 

  环境变量 具有全局属性,可以供所有子进程共享,倘若我们不想让 环境变量共享,可以设置本地变量。

$ TEST=private  //可以直接在命令行添加本地变量。

 

现在的 TEST 环境变量是不被子进程共享的。

$ unset TEST  //移除设置本地环境变量

想让 TEST 进入 环境变量表,只用加上 export 关键字

$ export TEST=public     // 此时环境变量已经加入到环境变量表中。

 6、环境变量的组织方式

  环境变量表是以指针数组的形式存储的。

 7、通过代码如何获取环境变量

  我相信大家心中想的 main 函数是无参的形式,实际上main函数是可以传参的,并且最多可以传 3 个参数。

int argc, char *argv[], char *env[]

  • 我们可以通过上面的3个参数来获取环境变量。
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc, char* argv[], char* env[])
{
	int i = 0;
	for (; env[i]; i++) 
    {
		printf("%sn", env[i]);
	}
	return 0;
}

#include <stdio.h&gt;
#include <unistd.h&gt;
#include <stdlib.h&gt;
int main(int argc, char* argv[])
{
	extern char** environ;
	int i = 0;
	for (; environ[i]; i++) 
    {
		printf("%sn", environ[i]);
	}
	return 0;
}

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

 8、通过系统调用获取设置环境变量

#include <stdio.h&gt;
#include <stdlib.h>
int main()
{
    char* env = getenv("PATH");
	printf("%sn", env);
	return 0;
}


  通过以上运行,可以看到既可以用函数 getenv() 获取,也可以使用 echo $环境变量名获取

 9、环境变量通常是具有全局属性的

  • 环境变量通常具有全局属性,可以被子进程继承下去。
#include <stdio.h>
#include <stdlib.h>
int main()
{
	char* env = getenv("MYENV");
	if (env) 
    {
		printf("%sn", env);
	}
	return 0;
}

运行如下: 

直接查看,发现没有结果说明该环境变量根本不存在

然后,导出环境变量 export MYENV=”hello world” ,此时再次运行程序发现结果了!

说明环境变量是可以被子进程继承下去的!

 


本文要是有不足的地方,欢迎大家在下面评论,我会在第一时间更正。

老铁们,记着点赞关注!!!   

 

原文地址:https://blog.csdn.net/m0_63198468/article/details/131344299

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_44198.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注