第一次作业:基于Linux操作系统的进程模型分析

Posted 张铭裕

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第一次作业:基于Linux操作系统的进程模型分析相关的知识,希望对你有一定的参考价值。

1.什么是进程

·进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。它不只是程序的代码,还包括当前的活动,通过程序计数器的值和处理寄存器的内容来示。

·进程的概念主要有两点:第一,进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包扩文本区域(text region)、数据区域(data region)和堆栈(stack region)。文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。第二,进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时(操作系统执行之),它才能成为一个活动的实体,我们称其为进程。

进程的特征:

·动态性:进程的实质是程序在多道程序系统中的一次执行过程,进程是动态产生,动态消亡的。
·并发性:任何进程都可以同其他进程一起并发执行
·独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位;
·异步性:由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进

2.进程的创建与终止

以下几类操作可以创建和终止线程。

A 创建进程

(1) 系统初始化会创建新的进程

(2) 当一个正在运行的进程中,若执行了创建进程的系统调用,那么也会创建新的进程

(3) 用户发出请求,创建一个进程

(4) 初始化一个批处理作业时,也会创建新的线程

 

从本质上来说在技术上只有一种创建新进程的方法,即在一个已经存在的进程中,通过系统调用来创建一个新的进程。

Linux中可以使用fork函数来创建新进程。如下列代码所示:

 

#include<stdio.h>  
#include<sys/types.h>  
#include<unistd.h>  
int main(){  
       pid_t ret = fork();  
     printf("hello proc:%d,ret = %d\\n",getpid(),ret);  
       return 0;  
  }

 

 

B 进程终止

(1) 正常退出

(2)错误退出

(3) 致命错误

(4) 被其他进程杀死

3.进程的状态的转换

 

运行中的进程可能具有以下三种基本状态。
 
(1)就绪状态(Ready):进程已获得除处理器外的所需资源,等待分配处理器资源;只要分配了处理器进程就可执行。就绪进程可以按多个优先级来划分队列。例如,当一个进程由于时间片用完而进入就绪状态时,排入低优先级队列;当进程由I/O操作完成而进入就绪状态时,排入高优先级队列。
 
(2)运行状态(Running):进程占用处理器资源;处于此状态的进程的数目小于等于处理器的数目。在没有其他进程可以执行时(如所有进程都在阻塞状态),通常会自动执行系统的空闲进程。
 
(3)阻塞状态(Blocked):由于进程等待某种条件(如I/O操作或进程同步),在条件满足之前无法继续执行。该事件发生前即使把处理器资源分配给该进程,也无法运行。

 

4.进程的调度算法

时间片轮转调度算法:

每个进程被分配一个时间段,称作它的时间片,即该进程允许运行的时间。如果在时间片结束时进程还在运行,则CPU将被剥夺并分配给另一个进程。如果进程在时间片结束前阻塞或结束,则CPU当即进行切换。调度程序所要做的就是维护一张就绪进程列表,当进程用完它的时间片后,它被移到队列的末尾。

·该算法采取了非常公平的方式,即让就绪队列上的每个进程每次仅运行一个时间片。如果就绪队列上有N个进程,则每个进程每次大约都可获得1/N的处理机时间。

·时间片的大小对于系统性能有很大的影响。若选择很小的时间片,将有利于短作业,但意味着会频繁地执行进程调度和进程上下文的切换,这无疑会增加系统的开销。反之,若时间片选择得太长,且为使每个进程都能在一个时间片内完成,时间轮转调度算法便退化为先来先服务算法,无法满足短作业和交互式用户的需求。

算法运行流程图:

程序控制块的定义:

typedef struct node    
    {    
      char name[20];    /*进程的名字*/    
      int round;     /*分配CPU的时间片*/    
      int cputime;    /*CPU执行时间*/    
      int needtime;    /*进程执行所需要的时间*/    
      char state;     /*进程的状态,W--就绪态,R--执行态,F--完成态*/    
      int count;     /*记录执行的次数*/    
      struct node *next;   /*链表指针*/    
    }PCB; 

 

 

void RoundRun()    /*时间片轮转调度算法*/    
    {    

      int flag = 1;    

      GetFirst();    
      while(run != NULL)    
      {     
        while(flag)    
        {    
          run->count++;    
          run->cputime++;    
          run->needtime--;    
          if(run->needtime == 0)    
          {    
            run ->state = \'F\';    
            InsertFinish(run);    
            flag = 0;    
          }    
          else if(run->count == run->round)    
          {    
            run->state = \'W\';    
            run->count = 0;       
            InsertTime(run);    
            flag = 0;    
          }    
        }    
        flag = 1;    
        GetFirst();    
      }    
    }

 

 

 

对于源码的分析:

首先设置一个标志位为1,从就绪队列获取第一个节点,当获取的节点不为空和标志位为1时,这个进程所执行的次数加一,CPU执行的时间也进行自加,进程所需的时间自减,然后进行判断,当进程所需的时间为0也就是进程执行完毕时,把进程的状态设置为完成态,然后将进程插入到完成队列尾部,否则当时间片用完时,进程的状态设置为就绪态,计数器清零,将进程插入到就绪队列尾部,将标志位置为0,重新开始从就绪队列获取第一个节点。直到所有进程执行结束。

5.自己对操作系统模型的看法

操作系统是用户和计算机的接口,同时也是计算机硬件和其他软件的接口。是直接运行在机器上的最基本的系统软件,其他任何软件都必须在操作系统的支持下才能运行。所以操作系统对于计算机和学习计算机的我们是非常重要的。其中,进程又是操作系统最基本和核心的东西,我们需要了解与掌握进程,这对于我们以后更深入的学习操作体统也有很重要的意义。

以上是关于第一次作业:基于Linux操作系统的进程模型分析的主要内容,如果未能解决你的问题,请参考以下文章

第一次作业:基于Linux系统深入源码分析进程模型

第一次作业:基于Linux 2.6 的源码 分析进程模型

第一次作业:基于Linux操作系统深入源码进程模型分析

第一次作业:基于Linux进程模型分析

第一次作业: 基于Linux Kernel 2.6 的源码, 分析其进程模型

第一次作业:基于Linux进程模型分析