Linux进程概念(四):进程优先级 && 环境变量

目录

进程优先级

学前补充

命令行参数 

环境变量

环境变量$PATH 

整体理解环境变量

environ指针

获取环境变量的三种方式

内建指令 

证明内建指令的存在


进程优先级

基本概念:指定进程获取某种资源的先后顺序

linux的优先级是进程控制块task_struct中的一个内部字段“int piro”,prio的值越小优先级越高 

产生原因:进程访问的资源(CPU等)是有限的,而会有多个进程试图访问同一资源

查看进程优先级指令:ps -al 

  • PRI:进程的优先级,值越小优先级越高
  • NI:也叫nice值,是一个整型的进程优先级的修正数据,nice的取值范围是[-20,19](40个)
  • 新的优先级 = 优先级 + nice

调整进程优先级方式之一(nice和renice指令也可以做到,记得自行查找):

  • top指令:进入Linux的任务资源管理器
  • r:开始修改
  • 输入要调整进程的PID
  • 输入新的nice

注意事项:Linux中,每次调整优先级都是基于默认PRI的,且不建议频繁调整优先级

学前补充

  • 进程的竞争性:CPU数量有限,进程数量多,进程在使用CPU资源时会产生竞争
  • 进程的独立性:多进程运行时各进程独占一份资源,进程间不会互相影响
  • 并行:多个进程在多CPU上同时执行
  • 并发:多个进程在单CPU上以极快的速度轮转执行,在一段时间内多个进程均可被执行

命令行参数 

基本概念:main函数的参数可带可不带( main(int argc, char *argv[]) )

  • argc是argv数组中指针的个数
  • argv是一个变长指针数组,每个指针都指向一个字符串,数组必须以NULL结尾

命令行参数的产生原因:为了交给程序不同的参数,从而定制不同的程序功能

        命令行字符串默认是传递给父进程bash(命令行解释器)的,bash对命令行字符串做处理后(malloc开辟指针数组,数组中的字符指针分别指向分割好的多个字符串),由于父进程的数据默认能被子进程看到并访问,故在命令行上启动的子进程可以看到父进程构建的指针数组,在子进程中对数组中的内容进行判断就可以产生不同的功能(程序   -a,父进程处理后argv数组中的argv[0] = "程序名"、argv[1] = "-a",在子进程中做出判断,if(strcmp(argv[1],"-a")) 则执行某功能;程序 -a -l,则子进程中if(strcmp(argv[1],"-a") && strcmp(argv[2],"-l") )则执行某功能    )

C语言的命令行参数:http://t.csdnimg.cn/IhtqG 

环境变量

基本概念: 登陆时与登录、用户、路径、程序等相关的全局变量叫做环境变量(默认配置信息)

  • $PATH:可执行文件所在路径
  • $HOME:当前用户家目录所在路径
  • $SHELL:当前正在运行的SHELL的完整路径
  • $HISTSIZE:历史指令记录条数,默认为1000条
  • $PWD:当前工作目录

显示所有环境变量:env

打印环境变量:echo $环境变量

注意事项:

1、Linux中,与环境变量相关的配置文件通常位于用户主目录下的 .bashrc 或.bash_profile中

2、可通过export 自定义环境变量名 = 自定义环境变量值添加自定义环境变量

3、可通过unset 自定义环境变量名取消环境变量

4、在env中找不到但是可以echo $打印的变量称为本地变量

5、本地变量不被视为环境变量(未被添加到环境变量表中)只在本bash内有效,无法被子进程继承下去,除非将其导入环境变量表,才能被子进程获取 

5、环境变量具有系统级的全局属性,因为环境变量本身会被子进程继承下去

环境变量$PATH 

指令的本质是程序

1、未指明路径的ls指令和指明路径的/user/bin/ls指令的意义相同且都能被执行:

2、自定义的可执行程序必须指明路径后才能执行:

原因:环境变量PATH用于告诉命令行解释器,应该去哪些路径下寻找可执行程序

PATH中存放的是bash在寻找命令时的默认搜索路径,各个子路径由:进行划分:

  • 执行命令时bash会逐个查找默认搜索路径中的子路径,当前子路径中未找到就跳转至下一路径下寻找,如果都没找到就报“command not found”,找到了就会加载并运行该指令,ls指令在默认路径的子路径usr/bin中所以可以不加路径直接执行,但a.out没在执行时就需要指明路径 

3、可通过suod cp a.out /usr/bin/指令将a.out指令加载到默认路径的子路径/usr/bin中,使用sudo rm /usr/bin/a.out将指令从子路径/usr/bin中删除

  • 由于环境变量是内存级的,故每次登录Linux系统时都会将PATH中的内容恢复至默认状态
  • 这是因为最开始的环境变量(包括PATH)不是在内存中的,而是在系统的配置文件中,每次登录Linux时bash会从配置文件中读取环境变量(包括PATH)后续在程序中队PATH中的默认路径的修改不会影响配置文件

4、 可通过PATH=$PATH:/当前程序的所在路径指令,将当前程序所在路径放入默认搜索路径中,就可以执行当前程序所在路径中的所有程序

结论:登陆Linux系统时,与环境变量相关的配置文件已经加载到bash进程中

整体理解环境变量

environ指针

基本概念:Linux中提供了environ指针,通过该指针可以获取当前进程的环境变量

结论1:环境变量默认可以被子进程拿到

原因: bash进程启动时,默认会形成两张“表”:argv[]命令行参数表(基于用户输入的命令行字符串)、env[]环境变量表(基于系统的配置文件),子进程可以看到并访问这两张“表”

结论:main函数可以传递的参数个数是0、2、3 

获取环境变量的三种方式

1、extern char** environ

2、通过main函数参数

3、getenv(“环境变量名”)

  • 只能拿到单个环境变量
  • 需要包含头文件<stdlib.h> 

注意事项: extern char** environ和main函数参数不同

内建指令 

基本概念:Linux中80%的命令(外部命令)是bash创建而子进程执行的,20%的命令是内建命令

注意事项:内建指令是由bash亲自执行的,不会创建子进程,故bash可以看到修改后的数据

  • bash的“创建”就是找到该命令的可执行程序文件,然后新建一个子进程去执行该可执行文件(向bash中输入ls,则会创建一个子进程并指令ls程序
  • 在bash中输入ls命令时,bash会创建一个新的子进程来执行该命令

证明内建指令的存在

~over~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值