第一次作业:深入源码分析进程模型

Posted whispered

tags:

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

前言:这个是老师布置的作业,

一 什么是进程

1.进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。

在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。

也就是说进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动,是系统进行资源分配和调度运行的基本单位。

2.进程的定义:

狭义定义:进程是正在运行的程序的实例;

广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。

3.特征

动态性:进程的实质是程序在多道程序系统中的一次执行过程,进程是动态产生,动态消亡的。
并发性:任何进程都可以同其他进程一起并发执行
独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位;
异步性:由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进
结构特征:进程由程序、数据和进程控制块三部分组成。
多个不同的进程可以包含相同的程序:一个程序在不同的数据集里就构成不同的进程,能得到不同的结果;但是执行过程中,程序不能发生改变。

二.进程状态如何转换

1.进程的基本状态

(1)执行状态(Running):进程占用处理机,进程的程序正在执行。单处理机系统中只能有一个进程处于执行状态,多处理机系统中可能有多个进程处于执行状态。

(2)等待状态(Blocked):也叫阻塞或睡眠状态,是进程由于等待某种事件的发生而处于暂停执行的状态。如进程因等待I/O的完成、等待缓冲空间等。

(3)就绪状态(Ready):进程已分配到处理机以外的所有必要资源,具备了执行的所有条件。可能会有多个进程处于就绪状态,排成就绪队列。

2. 进程状态的转换

(1)就绪状态->执行状态:进程调度程序为处于就绪状态的进程分配处理机后,该进程进入执行状态。

(2)执行状态->等待状态:正在执行的进程因需要等待某事件而无法执行。

(3)等待状态->就绪状态:进程所等待的事件发生了,进程就从等待状态进入就绪状态。

(4)执行状态->就绪状态:正在执行的进程因时间片用完而被暂停执行;或者在可抢占调度方式中,一个优先权高的进程到来后,正在执行的低优先权的进程被强制撤下处理机,转换为就绪状态.

三.进程是如何调度的

进程调度算法
1.FCFS-先来先服务算法
算法规则:按照进程进入就绪队列的先后顺序进程选择。对于进程调度来说,一旦一个进程占用了处理机,它就一致运行下去,知道该进程完成其工作或者因等待某事件而不能继续运行时才释放处理机。
特点:  不可剥夺,实现简单
缺点:  不适合分时系统。一旦一个用户的进程获得了处理机,在一段时间内其它用户的进程就得不到运行
          不适合实时系统。不可剥夺造成当优先级更高的进程需要运行时无法获得处理机。
显然,FCFS是早期多道批处理系统时代的设想或者实现

2.优先级调度算法:优先级+FCFS
基本算法规则:根据进程的优先级来实现进程调度,当多个进程处于同一优先级时,根据先来先服务的原则选择进程(是不是很像四则运算法则)。
特点:适合实时处理,当某些进程的优先级太低而始终得不到处理机时,就可能出现"饿死"现象

优先级调度算法又分为:非剥夺的优先级调度算法和可剥夺的优先级调度算法
非剥夺的优先级调度算法:   一旦某个高优先级的进程占用了处理机,便一直运行下去,直到由于其自身原因而主动让出处理机时(执行完成或者等待事件)才让另一高优先级进程运行
可剥夺的优先级算法:  任何适合都严格按照最高优先级进程在处理机上运行的原则进行进程调度。即在处理机上运行的进程永远时就绪队列中优先级最高的进程。
在进程运行过程中,一旦有另一个优先级更高的进程出现就让出处理机给更高优先级的进程。我们称这种方式为抢占处理机(对方不愿意,就是抢)

Unix/Linux
在Unix/Linux系统中,其进程调度算法就属于"可剥夺的优先级调度算法",每个进程的优先数都是动态优先数,由系统为各进程每隔一段时间计算一次。

3.时间片轮转调度算法:时间片+FCFS
算法规则:将处理机时间划分为若干的时间片,以时间片为单位,就绪队列中的进程轮流(即先来先服务)使用处理机1个时间片
特点:适合分时系统,剥夺算法;不适合实时系统

4.短进程优先
算法规则:根据进程所需的运行时间来调度就绪队列中的程序占用处理机,以实现平均等待时间最短
特点:非剥夺调度,不适合实时系统,不可行。运行时间难以估计


5.最短剩余时间(剥夺式的短进程优先)
算法规则:让进程运行到完成时所需要的运行时间最短的进程优先得到处理。

特点:适合分时系统,保证及时响应用户的要求; 可剥夺;频繁地调度进程,系统开销大
6. 最高响应比优先调度算法
算法规则:根据最高响应比来进行调度

响应比=(等待时间+要求服务时间)/要求服务时间
特点:非剥夺调度,不适合实时系统;响应比高者优先。
7.多级反馈队列调度算法(时间片+优先级+FCFS)
算法考虑:
为了提高系统吞吐量和降低平均等待时间而照顾短进程;
为了得到较好的输入输出设备利用率和对交互式的及时响应而照顾I/O进程;
在进程运行中根据进程运行情况动态地考虑进程的运行性质(以计算为主还是以IO为主),同时进行相应调度

算法实现:
设置多个进程就绪队列,每个就绪队列对应一个调度级别。第1级队列的优先级最高,后面的各级队列的优先级逐次递减;
调度时始终选择优先级最高的进程占用处理机(优先级+FCFS);
各级就绪队列中的进程所分的时间片与优先级成反比。优先级最高的进程所分时间片最少,优先级越低的进程所分时间片越多(时间片)。

 

 

例:先来先服务算法

 

 

 

 

实验步骤

1. 先定义一个数组代表各作业运行的时间,再定义一个数组代表各作业到达系统的时间,注意到达系统的时间以第一个作业为0基础(注意:若各程序都同时到达系统,则到达系统时间都为0)。

2. 输入作业数。

3. 然后运用循环结构累积作业周转时间和带权周转时间。

4. 最后,作业周转时间和带权周转时间分别除以作业数即可得到平均作业周转时间和平均带权周转时间。

实验代码:

#include<iostream>

#include<cmath>

using namespace std;

int main()

{

       int n,a[100],b[100];

       double s[100],m[100],T=0,W=0;

       cout<<"请输入作业数:"<<endl;

       cin>>n;

       cout<<"请分别输入各作业到达系统的时间:"<<endl;

       for(int i=0;i<n;i++)

       {

       cin>>b[i];

       }

       cout<<"请分别输入各作业所运行的时间:"<<endl;

for(i=0;i<n;i++)

       {

          cin>>a[i];s[0]=0;

          s[i+1]=s[i]+a[i];

          m[i+1]=(s[i+1]-b[i])/a[i];

       T=T+s[i+1]-b[i];

          W=W+m[i+1];

}

       cout<<"平均周转时间为:"<<T/n<<endl;

       cout<<"平均带权周转时间为:"<<W/n<<endl;

       return 0;

}

谈谈自己对该操作系统进程模型的看法

操作系统中最核心的概念是进程, 进程也是并发程序设计中的一个最重要、 最基本的概念。进程是一个动态的过程, 即进程有生命周期, 它拥有资源, 是程序的执行过程, 其状态是变化的。 Windows、 unix和Linux是目前最流行的几个操作系统。这一次是因为老师布置了作业,所以自己才会去了解,现在的我对操作系统还是认识不清晰,所以如果有错的总结,还请大家多多体谅,并帮忙指出。

 

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

第一次作业:深入源码分析进程模型

第一次作业:深入源码分析进程模型

第一次作业:深入源码分析进程模型

第一次作业:深入源码分析进程模型(linux)

第一次作业:深入源码分析进程模型

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