文章目录
一、进程优先级
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 查看一个账号的主工作目录
其他相关命令
- echo: 显示某个环境变量值
- export: 设置一个新的环境变量
- env: 显示所有环境变量
- unset: 清除环境变量
- set: 显示本地定义的shell变量和环境变量
关于环境变量的清晰认知
1、环境变量是什么:是系统中的某些具有一定全局性质的变量,通常是为了满足某些系统需求。
2、存在的目的:是为了方便用户、开发者,系统进行某种最简单化的查找,定位,确认等等的问题。
3、如何获取,使用操纵呢
第一种方式:命令行的方式,如env查看,export导出环境变量等等。
第二种方式,用语言如何获取?(下面进行详细讲解)
3. 使用语言如何操纵环境变量?
下面以C语言为例。
main函数其实有三个参数:
int main(int argc, char* argv[], char* env[])
{
return 0;
}
- int argc:表示命令行参数的个数,也就是一个命令后的 -a -b -c 一共有多少个由它决定。
- 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的命令,会有不同的行为。因为它在程序内部对命令行参数进行了内容的判定,根据不同的选项在内部表现不同的行为。
- char *env[]:叫做环境变量列表。
在系统中,本质上保存的也是一个一个字符串的地址。
最后也是以NULL结尾,所以我们可以通过判断是否为空来结束掉遍历。
用C语言来获取环境变量:
4. 通过系统调用获取或设置环境变量
代码的方式我们已经了解过了,那么还有一种更简洁的获取方式:
通过调用getenv函数
#include<stdlib.h>
char* getenv(const char* name);
// 参数是要获取的环境变量名字,返回值是环境变量的内容。
因此,模拟实现pwd命令,直接调用上面的程序即可。
5. 环境变量的全局性
环境变量具有全局性。
在调用export导出我们自己设置的全局变量后,用子进程来查看是可以访问到的,这说明:父进程的环境变量是可以被子进程继承下去的。因此体现全局性。
而我们自己设置的变量,如果不调用export导出,就是普通变量,并不能被子进程所查看,不具有全局性。