当前位置: 首页 > news >正文

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

相关文章:

  • Linux系统编程-网络基础(四)-协议03:数据包封装【以太网(Mac)帧:最大值1500字节称为以太网的MTU(最大传输单元),不包括帧报头长度】
  • 一次诡异的numpy数组越界访问
  • cmd炫技小方法
  • kafka搭建单机开发教程
  • 如果你需要用Python搞个二维码,那应该收藏这篇博客
  • Linux权限的认识
  • 【JavaScript】五个常用功能/案例:判断特定结尾字符串 | 获取指定字符串 | 颜色字符串转换 | 字符串转驼峰格式 | 简易购物车
  • Kotlin 字符串与空值判断
  • 【NLP开发】Python实现聊天机器人(ALICE)
  • 【题解】同济线代习题二 8.1
  • 【C语言】五分钟彻底搞定字符串
  • 【极客日常】PyQt5的QListView兼容左键双击事件和右键上下文菜单的方法
  • 基于遗传优化算法的小车障碍物避障路线规划matlab仿真(包括matlab仿真录像)
  • vue后台系统管理项目-openlayers地图定位、港口数据标记功能
  • 通讯录的文件版本(产品经理又来加需求了!)
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • 2019.2.20 c++ 知识梳理
  • angular组件开发
  • css系列之关于字体的事
  • Iterator 和 for...of 循环
  • java8-模拟hadoop
  • Java新版本的开发已正式进入轨道,版本号18.3
  • Spring声明式事务管理之一:五大属性分析
  • tensorflow学习笔记3——MNIST应用篇
  • Vue ES6 Jade Scss Webpack Gulp
  • Zsh 开发指南(第十四篇 文件读写)
  • 搞机器学习要哪些技能
  • 回流、重绘及其优化
  • 记一次删除Git记录中的大文件的过程
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 使用API自动生成工具优化前端工作流
  • 用简单代码看卷积组块发展
  • 正则学习笔记
  • nb
  • 阿里云ACE认证学习知识点梳理
  • #stm32整理(一)flash读写
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (二)hibernate配置管理
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (转)关于多人操作数据的处理策略
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • **PHP二维数组遍历时同时赋值
  • .NET Entity FrameWork 总结 ,在项目中用处个人感觉不大。适合初级用用,不涉及到与数据库通信。
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • .NET4.0并行计算技术基础(1)
  • .NetCore 如何动态路由
  • .net实现头像缩放截取功能 -----转载自accp教程网
  • .sys文件乱码_python vscode输出乱码
  • /etc/sudoers (root权限管理)
  • @Query中countQuery的介绍
  • @Resource和@Autowired的区别