【Linux】进程概念

操作系统:任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。操作系统包括:

  1. 内核(进程管理,内存管理,文件管理,驱动管理)
  2. 其他程序(函数库,Shell程序等)

什么是进程?

  • 从用户的角度看:进程是程序的一次动态执行过程,正在执行的程序。
  • 从内核的角度看:进程是操作系统分配资源的基本单位
  • 进程有自己的状态和独立的地址空间,进程会被切换,有生命周期,动态运行,有PCB,状态 优先级,上下文等。

操作系统怎么管理进程?

  我们每个人都有自己的信息,学校在开学前得到了我们的信息,将我们的信息存储到数据库中,我们来到学校,都自己的班级,如果需要找人,根据班级和名字就可以找到;
  
  进程也是如此,我们把进程的信息放在一个结构体中,称这个结构体为进程控制块(PCB, process control block), Linux操作系统下的PCB叫做task_struct,这样进程就被描述了,再通过链式存储组织起来。

task_struct的内容分类

  1. 标识符:描述进程的唯一标识符,每个进程的标识符都不同
  2. 状态:任务状态,退出代码,退出信号等
  3. 优先级:进程会被操作系统调度,相对于其他进程的优先级
  4. 程序计数器:程序中即将被执行的下一条指令的地址
  5. 内存指针:程序和进程相关的数据的指针,包括其他进程共享的内存块的指针
  6. 上下文数据:这是非常重要的,进程执行时处理器的寄存器中的数据,举一个例子:假如有人休学了,学校会将他的档案保留下来,等他回来继续上学时,他的档案还在
  7. I/O状态信息:包括显示的I/O请求,分配给进程的I/O设备,被进程使用的文件列表
  8. 记账信息:时钟数总和,时间限制等等
  9. 其他信息

每个进程有自己的状态和独立的地址空间;进程被操作系统所管理,被切换,调度都是通过修改PCB中对应的内容来实现的。

如何查看进程呢?

  1. cd /proc proc目录里的数字就是进程的pid;
    这里写图片描述
  2. 使用ps aux | grep test
    这里写图片描述

我们的Linux系统中最多可以有多少进程?cat /proc/sys/kernel/pid_max
这里写图片描述

进程的状态

Linux中进程的状态有7中状态:

  1. 运行态(R):它表明进程要么是在运行中,要么是在运行队列里;
  2. 睡眠态(S):进程在等待时间完成,也叫可中断睡眠,可以被唤醒;
  3. 磁盘休眠状态(D):有时候也叫做不可中断睡眠,进程通常会等待IO的结束;
  4. 停止状态(T):可以通过发送SIGSTOP信号给进程来停止进程,被暂停的进程可以通过发送SIGCONT信号让进程继续运行;
  5. 死亡态(X):这个状态是一个返回状态,不会再任务列表里看到这个状态;
    这里写图片描述
  6. 僵尸进程(Z):当进程退出并且父进程没有读到子进程退出的返回代码时,就会产生僵尸进程。只要子进程退出,父进程还在运行,但是父进程没有读取子进程的退出状态,那么子进程就进入僵尸状态。

    • 僵尸进程会以终止状态保持在进程列表中,并且会一直等待父进程读取退出状态码。
    • 我们知道进程的退出状态必须被维持下去,因为它要告诉它的父进程,你交给我的任务,我完成的怎么样了,但是父进程一直不读取,那么子进程维护状态也是占资源的,这样,就会造成内存资源的浪费。
    • 僵尸进程怎么处理?
      1.子进程退出时向父进程发送SIGCHILD信号,父进程处理SIGCHILD信号。调用wait或waitpid函数,父进程阻塞等待子进程,处理完再继续运行父进程。
      2.强制杀死父进程,则进程变为孤儿进程,被系统回收。

    模拟实现僵尸进程:

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int main()
{
    pid_t id = fork();
    if(id < 0)
    {
        perror("fork");
        return 1;
    }
    else if(id == 0)
    {  // child
        printf("child[%d] is begin Z...\n", getpid());
        sleep(5);
        exit(0);
    }
    else
    {
        // parent
        printf("parent[%d] is sleeping ...\n", getpid());
        sleep(30);
    }
    return 0;
}

这里写图片描述
7. 孤儿进程:父进程提前退出,子进程后退出,那么子进程就被称之为“孤儿进程”,孤儿进程会被1号进程领养,由init进程回收。

模拟实现孤儿进程:

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int main()
{
    pid_t id = fork();
    if(id < 0)
    {
        perror("fork");
        return 1;
    }
    else if(id == 0)
    {
        printf("I am child, pid is %d\n", getpid());
        sleep(10);
    }
    else
    {// parent
        printf("I am parent, pid is %d\n", getpid());
        sleep(3);
        exit(0);
    }
    return 0;
}

这里写图片描述

进程的优先级

  1. CPU资源分配的先后顺序,就是进程的优先权。优先权高的进程有先执行的权利。
  2. 查看系统进程
    这里写图片描述
    ps -l 命令:
    UID:执行者的身份
    PID:进程的代号
    PPID:进程的父进程代码
    PRI:进程可被执行的优先级,其值越小越早被执行
    NI:这个进程的nice值
  3. PRI和NI

    1. PRI是进程的优先级,或者说是程序被CPU执行的先后顺序,值越小优先级越高;
    2. nice值不是进程的优先级,但是他的变化会影响到进程的优先级变化;它表示的是进程可被执行的优先级的修正数据;
    3. PRI(new) = PRI(old) + nice,这样,当nice值为负时,那么程序优先级值会变小,其优先级会变高;
    4. 在Linux中,调整进程优先级,就是调整nice值,nice的取值时-20至19。
  4. 设置进程的优先级

    1. 启动前调整:nice -n nice值 执行的程序
      这里写图片描述
    2. 调整已存在进程的nice:renice nice值 -p 进程ID
      这里写图片描述
    3. 用top命令更改已存在进程的nice:top-->r-->进程ID-->nice值

进程调度的任务

  1. 保存处理机的现场信息;
  2. 按某种算法选取进程;
  3. 把处理机分配给进程。

进程的调度算法:

  1. 先来先服务(FCFS):非抢占式的算法,按照请求CPU的顺序使用CPU;
    优缺点:已于理解实现简单,只需要一个队列,相对公平; 不利于短进程,不利于I/O繁忙的进程
  2. 最短作业优先(SJF):短进程优先,对预计执行时间短的进程优先分派处理机。
      优缺点:相比于FCFS,改善了平均周转时间和平均带权周转时间,提高系统吞吐量; 对长进程很不利,可能长时间得不到执行,难以准确的预估进程的执行时间,没有考虑到作业的紧急程度。
  3. 最高相应比优先(HRRN):对FCFS和SIJ综合平衡,响应比R定义为:R=(W+T)/T, T为作业预估计需要的执行时间,W为后背状态队列中的等待时间。R最大的的投入执行。
      优缺点:长时间作业也有机会投入运行; 每次调度之前计算响应比,增加系统开销。
  4. 时间片轮转算法(RR):采用剥夺策略,每个进程被分配一个时间段,即进程允许运行的时间。进程以FCFS的方式按时间片轮流使用CPU。
      优缺点:特点是简单易行,平均响应时间短; 不利于紧急作业,时间片的大小对系统性能影响很大,如果选的太小,频繁的执行进程调度和进程上下文的切换,增加系统开销,如果选的太长,RR算法退化为FCFS算法,无法满足段作业和交互式用户需求。
  5. 多级反馈队列(multilevel feedback queue)
    (1)设置多个就绪队列,进程在进入待调度的队列等待时,首先进入优先级最高的Q1;
    (2)首先调度优先级高的队列中的进程,若高优先级队列中已经没有调度的进程,则调度次优先级队列中的进程;
    (3)对于同一个队列中的各个进程,按照时间片轮转法调度;比如Q1队列的时间片为N,那么Q1的作业在经历了N个时间片后若还没有完成,则进入Q2队列等待,若Q2的时间片用完后作业还没有完成,一直进入下一级队列,直至完成。
    (4)在低优先级的队列中的进程在运行时,又有新的作业到达,那么在运行完这个时间片后,CPU马上分匹配给新到的作业。
    (5)能较好的满足各种类型用户的需要。

其他概念:

  1. 竞争性:系统进程数量很多,但是CPU资源只有少量,所以进程之间是有竞争属性的。为了更合理的竞争相关资源,所以进程才有优先级;
  2. 独立性:多进程运行,需要独享各种资源,多进程运行期间互不干扰;
  3. 并行:多个进程在多个CPU下分别同时运行;
  4. 并发:多个进程在一个CPU下采用进程切换的方式,在一段时间内,多个进程都得以推进,称之为并发。

猜你喜欢

转载自blog.csdn.net/wei_cheng18/article/details/80443268