Linux——孤儿进程|进程的优先级 用top命令去修改优先级 其他概念 环境变量 PATH 获取环境变量
目录
孤儿进程
进程的优先级
用top命令去修改优先级
其他概念
环境变量
PATH
获取环境变量
孤儿进程
父进程如果提前退出,那么子进程后退出,进入Z之后,那该如何处理呢?
父进程先退出,子进程就称之为“孤儿进程”
孤儿进程被1号init进程领养,当然要由init进程回收。
写一份代码测试孤儿进程一开始子进程是4222,父进程是4221
当父进程退出后,4222的父进程变为1
被回收会子进程的程序还在运行,屏幕仍然在滚动,我们输入kill -9 4222 即可杀掉子进程
总结:父进程退出,子进程还在,子进程就叫孤儿进程,孤儿进程会被1号进程领养(init,系统本身)
领养的目的是为了回收子进程
进程的优先级
为什么要有优先级?
因为CPU是有限的,进程太多,需要通过某种方式竞争资源,优先级是用来确认谁先获得某种资源,谁后获得,我们可以用一些数据表面优先级
Linux优先级:优先级=老的优先级+nice值
程序运行起来之后,使用ps -la,pri是优先级,ni是nice值
PRI :代表这个进程可被执行的优先级,其值越小越早被执行
NI :代表这个进程的nice值,其表示进程可被执行的优先级的修正数值
PRI值越小越快被执行,那么加入nice值后,将会使得PRI变为: PRI(new)=PRI(old)+nice
这样,当nice值为负值的时候,那么该程序将会优先级值将变小,即其优先级会变高,则其越快被执行所以,调整进程优先级,在Linux下,就是调整进程nice值
nice其取值范围是-20至19,一共40个级别
用top命令去修改优先级
输入top,然后输入r,renice就是对nice值重新设置
输入要修改的PID,按回车
输入修改后的nice值
由于nice的范围是-20-19,所以如果我们renice 20,nice会变为19
我们再次renice 15,此时优先级应该是95+15=110,而我们查看时候却是95,这是因为每次设置的时候,都要从进程最开始的优先级开始,最开始的优先级是80,也就是老优先级是80
由于nice值是-20-19,且每次从80开始设置,所以优先级范围是60-99,这是因为操作系统要对各种资源进行均衡,做到雨露均沾。防止恶意调动
优先级=老的优先级+nice值
其他概念
竞争性: 系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级
独立性: 多进程运行,需要独享各种资源,多进程运行期间互不干扰
并行: 多个进程在多个CPU下分别,同时进行运行,这称之为并行
并发: 多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发CPU里面存有大量寄存器,如果CPU在运行进程A,CPU的寄存器里面,一定保存的是A的临时数据(如形参,形参的返回值),这些临时数据叫做A的上下文
上下文数据不能被丢弃
如果进程里正在运行A,此时切换到了进程B,进程A暂时被切换走的时候,需要进程A顺便带走自己的上下文数据,带走暂时保存的目的:为了下次回来的时候,能恢复上去,就能继续按照之前的逻辑向后运行,就如同没有中断过一样
cpu内的寄存器只有一份,但是上下文可以有多份,分别对应不同的进程
环境变量
PATH
PATH : 指定命令的搜索路径
HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)
SHELL : 当前Shell,它的值通常是/bin/bash。
环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数
如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。
环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性1.echo: 显示某个环境变量值
2. export: 设置一个新的环境变量(导出环境变量到当前BASH)
3. env: 显示所有环境变量
4. unset: 清除环境变量
5. set: 显示本地定义的shell变量和环境变量
ls是一个文件,我们可以直接使用ls,也可输入ls的路径运行ls
但对于我们自己写的程序,直接输入文件名,是不能运行的,如果想运行必须加上./表面路径
出现这种情况是因为跟环境变量有关系,如果想输入自己的文件名,直接运行文件,我们需要对环境变量进行设置
环境变量PATH,我们写的程序并不在环境变量所维护的路径下,所以不能直接用文件名运行
查看环境变量
如果想用文件名运行,我们可以把我们的文件移动到上面的任何一个路径里,但不推荐这种做法,这种做法会污染别人的命令池
我们可以将我们当前的路径放到环境变量里
输入export PATH=$PATH:路径名
这时就能直接运行
查看linux下的所有环境变量,输入env
我们也可修改PATH所在路径,但是输入指令之后会不起作用
我们ctrl+d重新登陆一下即可
系统中还有home和shell
home是我们的家目录
获取环境变量
main函数最多可以有三个参数int main(int argc,char *argv[],char *env[])
argc和argv是命令行参数,
这就是命令行参数(启动程序时,给程序传入的选项),argc决定argv数组的大小,数组里放的是选项,命令行参数是通过父进程继承的,最开始的父进程为BASH
env是环境变量参数。是一个指针数组类型,我们可通过env[i]数组来获取环境变量
每个程序都会收到一张环境表,环境表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境字符串
运行后直接查看环境变量
这样也可获取环境变量
libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头文件中,所以在使用时 要用extern声明。
运行后直接查看环境变量
但这俩种获取环境变量的方法都不太推荐
输入man getenv,查看使用规则
环境变量是从父进程继承下来的,最开始的环境变量来自BASH,因此环境变量具有全局属性一开启机器BASH就会运行
如果这样直接获取BASH中没有的环境变量会报错
用export给BASH导入环境变量
通过查询BAHS中没有test_game_over这个环境变量,我们直接导入,重启后就没了
定义一个变量
我们查看这个变量时,发现找不到,这是因为这个变量不是环境变量,虽然被定义出来了,虽然也在上下文当中,但环境变量里没找到它
我们使用set命令,set命令可以把系统的所有环境变量和私有变量都显示出来,env只显示与环境变量相关的东西,但此时my_name_is仍然不是环境变量
命令行可以定义俩种变量一种是局部变量例如my_name_is
还有一种环境变量,需要前面加export