在操作系统系统里,进程是一个非常重要的概念。

一、什么是进程呢?

按我的理解,通俗的来说进程是运行起来的程序。唯一标示进程的是进程描述符(PID)。

那么先来了解一下进程和程序的区别:

  1. 程序是静态概念,本身作为一种软件资源长期保存;而进程是程序的执行过程,它是动态概念,有一定的生命期,是动态产生和消亡的。   

  2. 程序和进程无一一对应关系。一个程序可以由多个进程公用;另一一方面,一个进程在活动中有可顺序地执行若干个程序

二、进程的分类

1)根据在linux不同模式下运行分为:

    核心态:这类进程运行在内核模式

    用户态:这类进程工作在用户模式

2)按照进程的状态可分为:

    运行态:running, 正在运行的进程

    可中断睡眠态:进程处于睡眠状态,但是可以被中断

    不可中断的睡眠态:进程处于睡眠状态,但是不可以被中断

    停止态:stoped 不会被内核调度

    僵死态:zombie 产生的原因是进程结束后,它的父进程没有wait它,所导致的。

3)按照操作的密集程度

    CPU密集型:进程在运行时,占用CPU时间较多的进程。

    I/O密集型:进程在运行时,占用I/O时间较多的进程。

    通常情况下,I/O密集型的优先级要高于CPU密集型。


三、进程的优先级

进程的有优先级,是用0-139数字来表示的,数字优先级从小到大依次是:0-99,139-100。

优先级又分为2类:

    实时优先级:0-99,是由内核维护的

    静态优先级:100-139,可以使用nice来调整,nice值的取值范围是[-20,19),分别对应100到139。nice默认值是0。

nice值:-20~19:默认0

注意:只有管理员才能使用负整数的nice值,以提升进程的优先级,而普通用户只能使用正整数的nice值,以降低进程的优先级


四、进程的创建和终止

除了init进程之外,剩下其他的各个进程都是由其父进程创建的; 由fork()系统调用来实现;

每个父进程通过fork()系统调用来复制自身的数据给子进程使用;这种复制方式不是理解复制,而是写时复制(CoW);;

任何父进程创建的子进程都必须由父进程亲自销毁,任何进程的父子关系都保存在task struct中;


五、父子进程的关系
    1.子进程是由一个进程所产生的进程,产生这个子进程的进程称为父进程

   2.在linux系统中,使用系统调用fork创建进程。fork复制的内容包括父进程的数据和堆栈段以及父进程的进程环境。
   3.父进程终止子进程自然终止。
    
六、前台进程和后台进程    
前台进程:
  在shell提示处理打入命令后,创建一个子进程,运行命令,Shell等待命令退出,然后返回到对用户给出提示符。这条命令与Shell异步运行,即在前台运行,用户在它完成之前不能执行别一个命令

  很简单,我们在执行这个查找命令时,无法进行其它操作,这个查找就属于前台进程

后台进程:

  在Shell提示处打入命令,若后随一个&,Shell创建子进程运行此命令,但不等待命令退出,而直接返回到对用户给出提示。这条命令与Shell同步运行,即在后台运行。"后台进程必须是非交互式的" ;