Linux系统编程之进程介绍

  <强>我们平时写的C语言代码,通过编译器编译,最终它会成为一个可执行程序,当这个可执行程序运行起来后(没有结束之前),它就成为了一个进程。      <强>一、进程概述   

我们平时写的C语言代码,通过编译器编译,最终它会成为一个可执行程序,当这个可执行程序运行起来后(没有结束之前),它就成为了一个进程。   
程序是存放在存储介质上的一个可执行文件,而进程是程序执行的过程。进程的状态是变化的,其包括进程的创建,调度和消亡。程序是静态的,进程是动态的。   
在,   Linux 系统中,操作系统是通过进程去完成一个一个的任务,进程是管理事务的基本单元。进程拥有自己独立的处理环境(如:当前需要用到哪些环境变量,程序运行的目录在哪,当前是哪个用户在运行此程序等)和系统资源(如:处理器CPU占用率,存储器,I/O设备,数据,程序)。我们可以这么理解,公司相当于操作系统,部门相当于进程,公司通过部门来管理(系统通过进程管理),对于各个部门,每个部门有各自的资源,如人员,电脑设备,打印机等。

     <强>二、进程状态   

我们现在的电脑基本上都是多任务,我们聊着QQ的时候,同时可以看着视频,这里相当于QQ和视频两个程序同时运行着(两个进程)。早期的时候,电脑的CPU是单核的(单核理论上只运行操作一个任务),那它是如何做到多任务的呢?这就涉及到进程的调度策略。现在给大家举这么一个例子,有A, B, C三个进程,在我们单CPU的情况下,每一个时刻只有一个进程在运行,如果一运行完,B运行,B运行完,C运行,C运行完,一个运行,而CPU的运算速度足够快,一两次运行时间间隔足够短,从宏观上就我们就看到A, B, C好像同时运行,这就是实现单CPU运行多个任务的核心原理,通过时间片轮询调度策略实现多任务(更多详情,请看《Linux进程调度浅析》)。   
从上面的例子,我们可以得知,对于一进程而言,有时候在运行,有时候没有运行,两个状态不一样,所以,进程是有状态的,同时,状态是可以相互进行转换的,从执行的状态转换为不执行的状态,这里,我们可以把进程运行的整个生命周期简单划分为三种状态(实际上不指这三种状态):就绪态,执行态,等待态。

        

进程已经具备执行的一切条件,正在等待分配CPU的处理时间。

        

该进程正在占用CPU运行。

        

进程因不具备某些执行条件而暂时无法继续执行的状态。   
这里需要注意,就绪态和等待态都是不执行,但它们是有区别的,就绪态是指满足条件,时间没到,等待态是不满足条件。   
同样的,进程的这三种状态可以相互转换:   
   Linux系统编程之进程介绍

        

正在执行的进程因等待某种事件发生而无法继续执行时,便从执行状态变成等待状态

        

处于等待态的进程,若其等待的事件发生,于是进程由等待状态变成就绪态

        

当就绪态的进程所等待的cpu时间片一到来,进程就会从就绪态变成执行态

        

处于执行状态的进程在其执行过程中,因分配给它的一个时间片已用完而不得不让出cpu,于是进程从执行状态转变成就绪状态   
为了让大家更加清晰地了解三种状态的转换,给大家举一个韩买火车票的例子。   
lh匆忙地赶去火车站买火车票,太着急了,到了售票厅才发现忘记带身份证,这时候,就算lh排队也没的用,因为韩不具备买票的条件(没带身份证),这时候的lh属于等待态。   
lh给它对象打电话,让她把身份证带过来,等会,身份证送到了,这时候,韩可以去排队买票了,只是时间到,lh就可以买票了,这时,韩属于就绪态。而这过程是由等待态转换到就绪态。   
等了10分钟,终于到韩了,韩开始买的票,这时候,lh属于执行态。而这过程是由就绪态转换为执行态。   
而在买票的过程中,lh的对象打电话给他,让韩也帮她买一张火车的票,但是,lh没有她对象的身份证,接着,韩继续等他对象送身份证,这时候,lh由执行态转换为等待态。   
假如是这么一种情况,lh买火车票是给公司的同事买的(需要买100多张票),在买着票的过程中(执行态),后面还有很多人在排的队,后面排队的人肯定不爽,这时售票员就说,20分钟后,如果你还没处理完,请你到后面排队。结果,lh花了20分钟还是没有处理完,于是,乖乖地到后面重新排的队,这时候,lh由执行态转换为就绪态。

Linux系统编程之进程介绍