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

  1. 创建hello.c文件
#include <stdio.h>
 int main()
 {
 printf("hello world!\n");
 return 0;
 }
  1. 对比./hello执行和之间hello执行
  2. 为什么有些指令可以直接执行,不需要带路径,而我们的二进制程序需要带路径才能执行?
  3. 将我们的程序所在路径加入环境变量PATH当中, export PATH=$PATH:hello程序所在路径
  4. 对比测试
  5. 还有什么方法可以不用带路径,直接就可以运行呢?

测试HOME

用root和普通用户,分别执行echo $HOME, 对比差异. 执行cd ~; pwd ,对应~ 和HOME 的关系

和环境变量相关的命令

  1. echo: 显示某个环境变量值
  2. export: 设置一个新的环境变量
  3. env: 显示所有环境变量
  4. unset: 清除环境变量
  5. set: 显示本地定义的shell变量和环境变量

环境变量的组织方式

在这里插入图片描述

每个程序都会收到一张环境表,环境表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境字符串
在这里插入图片描述

进程切换

1.死循环进程如何进行?

1)一旦一个进程占有CPU,会把自己的代码跑完吗? 不会,因为存在时间片

2)死循环进程不会打死系统,不会一直占用CPU

2.CPU,寄存器

CPU上存储着寄存器,寄存器上存储着正在运行的数据,也就是临时数据

结论:

1.寄存器就是CPU内部的临时空间

2.寄存器不等于寄存器里面的数值

3.如何切换?

首先引入一个故事:

一个同学去当兵,需要先和辅导员沟通,保留学籍,等到当兵结束了,需要恢复学籍

在这里插入图片描述

注意点:

时间片:当代计算器都是分时操作系统,没有进程都有它合适的时间片(其实就是一个计数器)。时间片到达,就会被操作系统从CPU中剥离下来

Linux2.6内核进程调度队列

3.如何切换?

首先引入一个故事:

一个同学去当兵,需要先和辅导员沟通,保留学籍,等到当兵结束了,需要恢复学籍

在这里插入图片描述

在这里插入图片描述

注意点:

时间片:当代计算器都是分时操作系统,没有进程都有它合适的时间片(其实就是一个计数器)。时间片到达,就会被操作系统从CPU中剥离下来

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部