👍作者主页:进击的1++
🤩 专栏链接:【1++的Linux】
一,进程状态
下面是Linux中的几种进程状态:
- R—运行状态:并不意味着进程一定在运行中,也可能在运行队列中。
- S–睡眠状态:意味着进程在等待事件完成。(可中断睡眠)
- D–磁盘休眠状态:在这个状态的进程通常会等待io的结束(不可中断睡眠)
- T—停止状态:可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可
以通过发送 SIGCONT 信号让进程继续运行。 - X—死亡状态:这个状态只是一个返回状态,你不会在任务列表里看到这个状态。
我们可以使用ps axj 或者ps aux来查看进程状态。
了解完上面的一些状态后,我们来了解一个特别的状态—僵尸状态。
什么是僵尸状态呢?
僵尸状态是当进程退出,父进程没有没有读到子进程退出的返回代码时就会产生僵尸进程。
僵死进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态。
我们来看一个能够维持30秒僵尸进程的代码:
#include<iostream>
#include<unistd.h>
using namespace std;
void test1()
{
int ret=fork();
if(ret>0)
{
cout<<"parent"<<getpid()<<endl;
sleep(35);
}
else{
cout<<"child---Z"<<getpid()<<endl;
sleep(5);
}
}
int main()
{
test1();
return 0;
}
运行结果:
我们通过结果可以看到其子进程确实是僵尸进程。
僵尸进程有什么危害呢?
- 维护退出状态本身就要用数据维护,属于进程基本信息,所以保存在task_struct中,所以,当一直是僵尸状态,那么pcb就得一直维护,导致会占用资源。
- 会有内存泄漏。
孤儿进程
什么叫孤儿进程?
父进程退出,子进程还在就叫孤儿进程。
孤儿进程会被领养,会被一号进程领养(init—系统本身)
为什么要进行领养呢?
当孤儿进程未来想要退出时,父进程不在,需要领养进程来进行回收。
二,进程优先级
什么叫进程优先级?
cpu资源分配的先后顺序就叫做进程的优先权。
为什么要有优先级?
优先权高的进程有优先执行的权力,配置进程优先权对多任务环境的linux很有用,可以改善系统性能。还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整体性能。
再通俗点就是:cpu是有限的,而进程很多,因此要通过某种方式来竞争资源。
我们在环境中输入下面命令:
ps -l
我们得到以下结果:
其中UID PID PPID PRI NI分别是执行者的身份 ,这个进程的代号,其父进程的代号,优先级,nice值。
我们重点来看后两个!!!
PRI是进程的优先级,其表示该进程被cpu执行的先后顺序,其值越小,优先级越高。
那么NI是啥呢?可以将其理解为优先级的修正数值。
因此调整nice值就是调整进程的优先级。nice值的取值范围是-19 - 20。
那么如何更改nice值
可以使用top命令进行修改。其使用格式如下: 进入top后按“r”–>输入进程PID–>输入nice值。
调整已存在进程的nice:renice
renice -5 -p 5200
#PID为5200的进程nice设为-5
Linux 中查看进程的优先级
- 使用 ps 命令查看进程优先级: ps -eo pid,ni,cmd 1 上述命令将显示进程的 PID、Nice 值(进程优先级)和命令名称。
- 使用 top 命令查看进程优先级: top -p 1 将 替换为进程的实际进程 ID,即可显示该进程的详细信息,包括 Nice 值(PR 列)。
- 使用 htop 命令查看进程优先级: htop 1 打开 htop 后,可以使用上下箭头键浏览进程列表,Nice 值将在 PRI 列中显示。
每次设置优先级都要从进程最开始的优先级开始设置。
竞争性: 系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级
独立性: 多进程运行,需要独享各种资源,多进程运行期间互不干扰
并行: 多个进程在多个CPU下分别,同时进行运行,这称之为并行
并发: 多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发。
补充:
当A进程在运行时,那么cpu内的寄存器里一定是A的临时数据,我们将其称为A的上下文。当进行切换时,A需要带走自己的上下文,带走暂时保存的目的是:为了下次再次运行的时候能够恢复上去,按照之前的逻辑继续运行,就像没有中断一样。
三,环境变量
什么是环境变量?
环境变量一般是指:在操作系统中用来指定操作系统运行环境的一些参数。如:系统的命令可以直接运行,而我们写的程序要加路径才能运行。因为系统命令在环境变量中!!!
常见的环境变量有:
PATH : 指定命令的搜索路径
HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)
SHELL : 当前Shell,它的值通常是/bin/bash。
在Linux安装一些软件通常要添加路径环境变量PATH.PATH环境变量通俗的讲就是把程序的路径"备案"到系统中,这样执行这些程序时就不需要输入完整路径,直接在bash输入程序名就可以执行.比如常用的ls命令就是添加好了环境变量才可以直接执行ls。
- echo: 显示某个环境变量值
- export: 设置一个新的环境变量
- env: 显示所有环境变量
- unset: 清除环境变量
- set: 显示本地定义的shell变量和环境变量
增添前:
将自己的程序命令路径增添环境变量后:
环境变量的组织方式:
操作系统会在内存中申请一块空间对环境变量进行存储。
环境变量存在环境表中,环境表中存的是字符指针,每个指针指向一个以’\0’结尾的字符串,由变量名+路径组成。
其结构如下图:
注意:子进程的环境变量都是从父进程中继承来的。环境变量具有全局属性。
四,获取环境变量
方法一:命令行第三个参数
我们会在某先教材上看见
这样的写法,是不是感到很奇怪,因为我们是在集成环境里写代码,没有过多接触命令行的方式来执行程序,所以不是很了解。
我们先来了解argc和argv其分别代表参数的个数和参数序列
我们来看下面的例子:
我们看到的命令的不同选项,就是用的这样的原理,来完成其不能的子功能。
我们再来看env
通过结果我们发现其可以或取到环境变量。
方法二:通过系统调用获得
运行结果: