在操作系统系统里,进程是一个非常重要的概念。
一、什么是进程呢?
按我的理解,通俗的来说进程是运行起来的程序。唯一标示进程的是进程描述符(PID)。
那么先来了解一下进程和程序的区别:
- 程序是静态概念,本身作为一种软件资源长期保存;而进程是程序的执行过程,它是动态概念,有一定的生命期,是动态产生和消亡的。
- 程序和进程无一一对应关系。一个程序可以由多个进程公用;另一一方面,一个进程在活动中有可顺序地执行若干个程序
二、进程的分类
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同步运行,即在后台运行。"后台进程必须是非交互式的" ;