【linux进程】进程优先级&命令行参数&环境变量

一,进程切换

在操作系统内部,进程切换是一个复杂的过程,在这个过程中CPU里的寄存器发挥了及其重要的作用:

如图,有两个进程:进程1和进程2
在这里插入图片描述
当进程1被CPU调度时,CPU中的所有寄存器会保留进程1的临时数据,CPU内部的所有的寄存器中的临时数据,叫做进程的上下文
假设进程1的时间片到了,不再被调度了,进程1就会被剥离,此时会把寄存器中的上下文内容保存到pcb中,换上进程2。
但是我们要考虑进程1还会恢复啊,就要从上一次进程1运行到的地方继续执行。

结论:
进程在切换,最重要的一件事情是:上下文数据的保护和恢复!

对CPU内的寄存器的理解:

1. 寄存器本身是硬件,具有数据的存储能力,CPU的寄存器硬件只有一套!!
2. CPU内部的数据,可以有多套,有几个进程,就有几套和该进程对应的上下文数据
3. 寄存器!寄存器的内容

二,进程优先级

1. 什么是优先级

优先级:指定进程获取CPU资源的先后顺序。

1. 在运行队列的头部,进程的优先级较高,在队列尾部,优先级较低。
2. 优先级其实是进程中task struct进程控制块的若干个内部字段(属性)。
3. Linux中优先级数字越小,优先级越高。

2. 权限 vs 优先级

权限:能不能的问题
优先级:已经能了,而是获取资源的顺序问题

3. 为什么要有优先级

进程访问的资源(CPU)始终都是有限的。系统中的进程数量大部分情况都是有较多的。

操作系统关于调度和优先级的原则:

1. 现在使用的0S大部分是分时操作系统(基于时间片进行调度轮转),调度时要保证基本的公平
2. 如果进程因为长时间不被调度,就造成了饥饿问题

4. 优先级的查看方式

使用指令: ps -al

在这里插入图片描述

上图中有两个重要的数据:
在这里插入图片描述
使用 top 指令更改nice值,进而改变进程优先级:

进入top后按"r" -> 输入进程PID -> 输入nice值.

注意:

1. nice值不能让你任意调整,而是有范围的![-20,19],一共40个级别。
2. 每次调整优先级的值,都是从进程默认的优先级值开始的。

三,命令行参数

1. 什么是命令行参数

在这里插入图片描述

代码演示:
在这里插入图片描述

2. 为什么要有命令行参数

本质:命令行参数本质是交给我们程序不同的选项,用来定制不同的程序功能
比如指令中会携带很多的选项。

代码演示:
在这里插入图片描述

3. 是谁做的

先说明一个前提:

父进程的数据,默认能被子进程看到并访问!

代码验证:
在这里插入图片描述

修改一下代码并且连续运行这个程序:
在这里插入图片描述

这个id是1246790的进程是谁啊?
在这里插入图片描述

结论:

1. 命令行中启动的程序,都会变成进程,这些进程都是bash 的子进程
2. 所以上面图中的"./myprocess”(路径+程序名称),默认是输入给父进程bash的
这个bash会对命令行字符串进行解释,从而生成那个char * argv[] (那张表)而子进程是可以看见那张表的,进而把它们作为参数

四,环境变量

1. 基本概念

1. 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数。
2. 如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。
3. 环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性

2. 常见环境变量

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

我们以PATH变量为例,对环境变量进行理解

查看环境变量里的内容,使用指令:
echo $环境变量

在这里插入图片描述
系统中很多的配置,在我们登录Linux系统的时候,已经被加载到了bash进程中(内存)。
查看PATH环境变量,会出现很多路径,这些路径以冒(:)号为分隔符。

整个长串,表示的是: bash在执行命令的时候,因为要把命令的二进制文件加载到内存,所以需要先找到命令,这一长串就是bash内部维护的命令的默认搜索路径(会依次搜索)

所以现在我们可以知道,为什么在使用指令(1s,pwd…)的时候可以不用加路径,因为它们所在的路径 /usr/bin 是在 bash 的环境变量中的

在这里插入图片描述
这里演示方式2:
在这里插入图片描述

结论:
1. 直接对PATH变量进行赋值会直接覆盖原有的内容!
2.P ATH这种环境变量是内存级的,如果不小心直接把它覆盖了,不用担心,关闭Xshe1l,重新启动又会恢复!!

正确的把指定路径添加到环境变量的操作:
在这里插入图片描述

注意:
(1) 最开始的环境变量不是在内存中,而是在系统的对应的配置文件中!
(2) 在我们登录Linux系统的时候,这些文件会被加载到了bash进程的上下文中,所以要想永久修改环境变量,就要修改这些配置文件!

在这里插入图片描述

其他环境变量的使用:

在这里插入图片描述

3. 查看环境变量

查看系统的所有环境变量,使用指令:env

在这里插入图片描述

也可以自定义环境变量:

导入一个环境变量,使用指令:
export 环境变量=内容

在这里插入图片描述

取消自定义环境变量,使用指令:
unset 环境变量

在这里插入图片描述

4. 对环境变量的再理解

首先看一下系统定义的一个全局环境变量:
在这里插入图片描述

用代码打印出环境变量:
在这里插入图片描述

结论:
那些环境变量,默认在bash内部,./myprocess
是bash的子进程,所以环境变量也是可以被子进程拿到的!!

原理如下:
在这里插入图片描述

结论:
bash进程启动的时候,默认会给我子进程形成两张表:
1.argv[]命令行参数表:来自用户输入的命令行
2.env[]环境变量表:来自0S的配置文件
bash通过各种方式把这两张表交给子进程!!!

所以,既然可以把命令行参数表传给main函数,那传环境变量表当然也可以。
第二种打印环境变量的方式:
(注:main函数最多传三个参数)

在这里插入图片描述

5. getenv和putenv

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

getenv: 根据环境变量名,直接拿到一个环境变量内容

使用man手册查看:
在这里插入图片描述

使用方式:
在这里插入图片描述

putenv: 改变或增加一个环境变量

在这里插入图片描述

6. 内建命令

子进程导入一些数据和对数据的修改是不会被父进程看见的,因为进程具有独立性。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

评论 56
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值