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

1.什么是进程

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

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

进程的特征:并发

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

2.进程的建立与终止

如下几类操做能够建立和终止线程。异步

A 建立进程

(1) 系统初始化会建立新的进程函数

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

(3) 用户发出请求,建立一个进程学习

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

 

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

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.本身对操做系统模型的见解

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

相关文章
相关标签/搜索