进程优先级及环境变量(是的,main函数是有三个参数~)


一、进程优先级

1. 了解优先级

(1)区分优先级和权限:

优先级:是使用某种“事物”的先后顺序。
权限:能不能使用某种“事物”。

(2)优先级的存在目的:在被管理对象很多的时候,优先级起到仲裁的作用。

2. 进程优先级

进程优先级决定了哪个进程优先使用某种资源(如CPU,外设IO等)

进程控制块中:

Struct task_struct{
// 内含优先级信息
//通过整数来表示的,一般数值越小,优先级越高
}

进程优先级作用:
1.仲裁 2.抢占(当一个更高的优先级的进程过来时,可以允许抢占资源)

3. 查看系统进程优先级

命令 ps –l 查看在当前用户的上下文中所创建的进程

Ps aus 显示系统内的所有进程
查看当前用户的进程

  • UID : 代表执行者的身份
  • PID : 代表这个进程的代号
  • PPID :代表这个进程是由哪个进程发展衍生而来的,亦即父进程的代号
  • PRI:代表这个进程可被执行的优先级,其值越小越早被执行
  • NI :代表这个进程的nice值

4. PRI和NI

进程的优先级包括两部分:
PRI:即进程的优先级,就是程序被CPU执行的先后顺序,PRI越小,进程的优先级别越高。

NI:(nice):不是优先级,而是属于优先级的修正数据。

所以在linux中调整进程的优先级调整的不是PRI,而是nice值。

  • PRI_new = PRI_old + nice
    (Nice的取值范围[-20, 19],因此 pri_new[60, 99]。
    在默认情况下,pri(old)默认80,nice默认0。)

注:除非特殊情况,否则尽量不要改优先级,一般让调度器自由去处理即可。

多次设置nice值时,新的优先级总是等于默认的80+本次设置的nice值(centos7)

5. 独立、竞争、并行、并发

围绕进程有四个概念:

1.独立性:多进程在运行时,每一个进程都需要独占资源(一个CPU只能跑一个进程,所以竞争性的去申请CPU)。在特定的一段调度周期内,一个进程可能会独占某种资源。但在一段长的周期之内,所有的资源都是被进程共享的。

多个进程在运行期间互不干扰,体现独立性。
如:Bash(父进程)->子进程(执行代码)
假如子进程崩溃,也不会影响父进程的正常运行。

2.竞争性:进程多,资源少。优先级便表明了进程的竞争性。

3.并行:在任何一个时刻,同时有多个进程在执行代码。

4.并发(其实是一种伪并行):当一个进程占有CPU,一直会运行到程序结尾吗? 不是的。基于时间片轮转的多个进程看起来在同时推进(因为时间很短,所以给人一种同时的感觉)的状态就叫做并发。

这里了解一下调度器,
作用(属于操作系统中的模块,专门负责进程调度):在调度时要做到公平,雨露均沾。

引入新概念,
时间片:时间片是浮动的。
(1) 不可抢占式调度(当一个时间片还没到的进程正在运行时,来了一个新的比它优先级更高的进程,那么新进程要等它跑完,再运行):如果进程在时间片内运行,不可被抢占。
(2)可抢占式调度(忽视先来后到,CPU剥离掉正在运行的进程,优先级高的直接上去):进程在时间片内可被抢占。

目前,很多os都是可抢占式。因为优先级更高的进程,说明它更紧迫。
而要明确一个概念就是,把正在运行的进程从CPU上剥离下来,不是缩短了它的时间片,只是使它的时间片后移了。

二、环境变量

思考:为什么在Linux中,ls等命令可以不带./ (路径),而我们自己编译的可执行程序在执行时要加上./(路径)呢?

首先,执行一条命令,第一要先找到这条命令,第二步再运行它。

./的目的是为了找到我们创建的可执行程序。
所以说明了,ls等命令不用带路径的原因一定是因为,ls有它自己的默认查找路径。

1. PATH

这个默认查找路径在PATH环境变量中。

环境变量也是变量,所以由变量名(path)+变量内容(包括一串路径)构成。

在Linux中,输入 echo $PATH 即可查看PATH中的内容
在这里插入图片描述
我们发现:

1、所有的路径几乎都是以绝对路径的形式,从根目录往下定位的。
2、路径由冒号作为分隔符,形成了若干个子路径

因此,我们可以知道,系统在查找ls命令时,是从这些一个一个的子路径中进行查找,找到就执行该路径下的ls命令;找不到,就接着往下找。如果都遍历过了也没有找到,就会报错:command not found.

如果也想让我们自己的程序运行起来而不带路径:

  • cp 程序名 + 上面出现的任意一个路径(sudo 提升权限)

这样便不需要带路径了,系统会在PATH中查找对应的路径,然后执行。

上述拷贝的方式严重不推荐,因为会污染Linux自带的命令池。

我们推荐把该进程当前的路径直接添加进环境变量 ↓,这样不会污染。(因为只是在这一次有效,下次登录就恢复默认)

  • pwd 找到当前路径
  • export PATH=$PATH: [ 想要添加的路径 ]

总结:
1、通过上述说明,那么我们便可以理解,在安装软件时,其实就是把对应软件的可执行程序拷贝到了PATH中的某个路径下。

2、PATH是环境变量中的一个,系统有多个环境变量(下面列举),用来解决不同场景的问题。

2. 常见环境变量:

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

查看环境变量方法

  • env可以帮我们查看当前用户下的所有的环境变量
  • echo $HOSTNAME 可以查看主机名
  • echo $SHELL 查看在全局范围内保存的当前用户使用的shell的类别。Linux里用的是bash,而bash的本质其实还是Linux中的可执行程序,只不过在启动时,它先以进程的方式启动)。
  • echo $USER 查看当前用户是谁
  • echo $home 查看一个账号的主工作目录

其他相关命令

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

关于环境变量的清晰认知

1、环境变量是什么:是系统中的某些具有一定全局性质的变量,通常是为了满足某些系统需求。

2、存在的目的:是为了方便用户、开发者,系统进行某种最简单化的查找,定位,确认等等的问题。

3、如何获取,使用操纵呢
第一种方式:命令行的方式,如env查看,export导出环境变量等等。
第二种方式,用语言如何获取?(下面进行详细讲解)

3. 使用语言如何操纵环境变量?

下面以C语言为例。

main函数其实有三个参数

int main(int argc, char* argv[], char* env[])
{
	return 0;
}
  1. int argc:表示命令行参数的个数,也就是一个命令后的 -a -b -c 一共有多少个由它决定。
  2. char* argv:是一个指针数组。每一个元素里存放一个指向字符串的指针。它会把-a,-b,-c看做一个一个的字符串,分别指向它们。第一个元素存放可执行程序的名字(C/C++),最后一个元素以NULL结尾。所以有效元素有多少个,取决于你用空格隔开了多少。

如:输入ls -a -b -c
argv[0]存放ls,argv[1]存放-a,argv[2]存放-b,依次往后,最后argv[4]存放NULL。
在这里插入图片描述

我们在test,c中可以加入判断语句,
在这里插入图片描述
其实,也就可以更清晰的了解到,为什么在Linux中输入一些ls -l / ls -a的命令,会有不同的行为。因为它在程序内部对命令行参数进行了内容的判定,根据不同的选项在内部表现不同的行为。
在这里插入图片描述

  1. char *env[]:叫做环境变量列表。
    在系统中,本质上保存的也是一个一个字符串的地址。
    最后也是以NULL结尾,所以我们可以通过判断是否为空来结束掉遍历。
    在这里插入图片描述

用C语言来获取环境变量:
在这里插入图片描述

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

代码的方式我们已经了解过了,那么还有一种更简洁的获取方式:
通过调用getenv函数

#include<stdlib.h>
char* getenv(const char* name);

// 参数是要获取的环境变量名字,返回值是环境变量的内容。

在这里插入图片描述

因此,模拟实现pwd命令,直接调用上面的程序即可。

5. 环境变量的全局性

环境变量具有全局性。
在调用export导出我们自己设置的全局变量后,用子进程来查看是可以访问到的,这说明:父进程的环境变量是可以被子进程继承下去的。因此体现全局性。

而我们自己设置的变量,如果不调用export导出,就是普通变量,并不能被子进程所查看,不具有全局性。


评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值