Linux之进程概念(2)
孤儿进程
-
父进程如果提前退出,那么子进程后退出,进入Z之后,那该如何处理呢?
-
父进程先退出,子进程就称之为"孤儿进程"
-
孤儿进程被1号init进程领养,当然要有init进程回收喽。
1号是操作系统。
为什么要领养?
如果不领养,子进程进入僵尸状态,会造成资源泄露。这就好像孩子除了自身的父母,还有政府来负责。父进程相当于是父母,1号init进程相当于政府
为什么父进程不用回收?
因为父进程有自己的父进程,也就是bash,会自动回收
代码如下:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
pid_t id = fork();
if(id < 0){
perror("fork");
return 1;
}
else if(id == 0){//child
printf("I am child, pid : %d\n", getpid());
sleep(10);
}else{//parent
printf("I am parent, pid: %d\n", getpid());
sleep(3);
exit(0);
}
return 0;
}
进程优先级
基本概念
-
cpu资源分配的先后顺序,就是指进程的优先权(priority)。
-
优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用,可以改善系统性能。
-
还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整 体性能。
是什么?
是进程得到CPU资源的先后顺序
为什么?
目标资源稀缺,导致要通过优先级判断谁先谁后
对比优先级和权限:
拿学生去学校食堂打饭为例子,学生没有权限去教职工食堂打饭,在学生食堂打饭只是时间先后问题
总结来说:优先级是先后的问题,权限是决定能否得到
怎么办?
优先级也是个整数,int ,类似于前面说的task_struct
值越低,优先级越高,反之,优先级越低
一个进程基于时间片的分时操作系统,考虑一定的公平性,优先级可能变化,但是变化不大
举个例子:还是拿打饭为例子,比如学生只能在规定的时间内吃饭
小知识:
系统怎么知道我是访问文件的时候,是拥有者,所属组,还是other?
Linux操作系统中,访问任何资源,都是进程访问,进程代表用户
PRI:进程的优先级 ,默认的数值:80
NI:进程优先级的修正数值 ,默认的数值:nice值,默认为0
进程真实的优先级=PRI(默认)+NI
每次调整都是以PRI为基准,进行调整
方法:nice, renice命令
优先级的极值问题:
nice[-20,19]
Linux进程优先级范围[60,99]
为什么存在范围?
优先级设置不合理,会导致优先级低的进程,长时间得不到CPU资源,进而导致:进程饥饿
查看系统进程
在linux或者unix系统中,用ps --l命令则会类似输出以下几个内容:
我们很容易注意到其中的几个重要信息,有下:
-
UID : 代表执行者的身份
-
PID : 代表这个进程的代号
-
PPID :代表这个进程是由哪个进程发展衍生而来的,亦即父进程的代号
-
PRI :代表这个进程可被执行的优先级,其值越小越早被执行
-
NI :代表这个进程的nice值
PRI and NI
-
PRI也还是比较好理解的,即进程的优先级,或者通俗点说就是程序被CPU执行的先后顺序,此值越小 进程的优先级别越高
-
那NI呢?就是我们所要说的nice值了,其表示进程可被执行的优先级的修正数值
-
PRI值越小越快被执行,那么加入nice值后,将会使得PRI变为:PRI(new)=PRI(old)+nice
-
这样,当nice值为负值的时候,那么该程序将会优先级值将变小,即其优先级会变高,则其越快被执行
-
所以,调整进程优先级,在Linux下,就是调整进程nice值 nice其取值范围是-20至19,一共40个级别
PRI vs NI
-
需要强调一点的是,进程的nice值不是进程的优先级,他们不是一个概念,但是进程nice值会影响到进 程的优先级变化。
-
可以理解nice值是进程优先级的修正修正数据
查看进程优先级的命令
用top命令更改已存在进程的nice:
-
top
-
进入top后按"r"-->输入进程PID-->输入nice值
其他概念
竞争性: 系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高 效完成任务,更合理竞争相关资源,便具有了优先级
独立性: 多进程运行,需要独享各种资源,多进程运行期间互不干扰
并行: 多个进程在多个CPU下分别,同时进行运行,这称之为并行
并发: 多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为 并发
环境变量
基本概念
环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数
如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但 是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。
环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性
常见环境变量
PATH : 指定命令的搜索路径
HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)
SHELL : 当前Shell,它的值通常是/bin/bash。
查看环境变量方法
echo $NAME //NAME:你的环境变量名称
测试PATH
- 创建hello.c文件
C++
#include <stdio.h>
int main()
{
printf("hello world!\n");
return 0;
}
- 对比./hello执行和之间hello执行
- 为什么有些指令可以直接执行,不需要带路径,而我们的二进制程序需要带路径才能执行?
- 将我们的程序所在路径加入环境变量PATH当中, export PATH=$PATH:hello程序所在路径
- 对比测试
- 还有什么方法可以不用带路径,直接就可以运行呢?
测试HOME
用root和普通用户,分别执行echo $HOME, 对比差异. 执行cd ~; pwd ,对应~ 和HOME 的关系
和环境变量相关的命令
- echo: 显示某个环境变量值
- export: 设置一个新的环境变量
- env: 显示所有环境变量
- unset: 清除环境变量
- set: 显示本地定义的shell变量和环境变量
环境变量的组织方式
每个程序都会收到一张环境表,环境表是一个字符指针数组,每个指针指向一个以'\0'结尾的环境字符串
进程切换
1.死循环进程如何进行?
1)一旦一个进程占有CPU,会把自己的代码跑完吗? 不会,因为存在时间片
2)死循环进程不会打死系统,不会一直占用CPU
2.CPU,寄存器
CPU上存储着寄存器,寄存器上存储着正在运行的数据,也就是临时数据
结论:
1.寄存器就是CPU内部的临时空间
2.寄存器不等于寄存器里面的数值
3.如何切换?
首先引入一个故事:
一个同学去当兵,需要先和辅导员沟通,保留学籍,等到当兵结束了,需要恢复学籍
注意点:
时间片:当代计算器都是分时操作系统,没有进程都有它合适的时间片(其实就是一个计数器)。时间片到达,就会被操作系统从CPU中剥离下来
Linux2.6内核进程调度队列
3.如何切换?
首先引入一个故事:
一个同学去当兵,需要先和辅导员沟通,保留学籍,等到当兵结束了,需要恢复学籍
注意点:
时间片:当代计算器都是分时操作系统,没有进程都有它合适的时间片(其实就是一个计数器)。时间片到达,就会被操作系统从CPU中剥离下来