当前位置:文档之家› 操作系统--最高响应比优先调度算法实验报告(广西民大)

操作系统--最高响应比优先调度算法实验报告(广西民大)

操作系统--最高响应比优先调度算法实验报告(广西民大)
操作系统--最高响应比优先调度算法实验报告(广西民大)

进程调度模拟设计

——最高响应比优先调度算法实验报告

一、实验题目与要求

1、实验题目:加深对作业概念的理解。深入了解批处理系统如何组织作业、管理作业和调度作业。

2、实验要求:编写程序完成批处理系统中的作业调度,要求采用响应比高者优先的作业调度算法。实现具体包括:首先确定作业控制块的内容和组成方式;然后完成作业调度;最后编写主函数,对所做工作进行测试。

二、总的设计思想及语言环境、工具

1、总的设计思想:

最高响应比优先法(HRRN)是对FCFS方式和SJF 方式的一种综合平衡。HRRN 调度策略同时考虑每个作业的等待时间长短和估计需要的执行时间长短,从中选出响应比最高的作业投入执行。

响应比R定义如下: R=(W+T)/T=1+W/T

其中T为该作业估计需要的执行时间,W为作业在后备状态队列中的等待时间。

每当要进行作业调度时,系统计算每个作业的响应比,选择其中R最大者投入执行。这样,即使是长作业,随着它等待时间的增加,W/T也就随着增加,也就有机会获得调度执行。这种算法是介于FCFS和SJF 之间的一种折中算法。由于长作业也有机会投入运行,在同一时间内处理的作业数显然要少于SJF 法,从而采用HRRN 方式时其吞吐量将小于采用SJF 法时的吞吐量。另外,由于每次调度前要计算响应比,系统开销也要相应增加。

2、语言环境:

计算机基本配置要求:

操作系统:WIN 98/2000/XP/2003 等Windows平台

内存:256MB及以上

主存64KB(Memory)(以KB为单位分配)

开发语言:Visual C++ 6.0

3、工具:Windows平台+Visual C++ 6.0

三、数据结构与模块说明(功能与框图)

作业调度的实现主要有两个问题:一个是如何将系统中的作业组织起来;另一个是如何进行作业调度。

为了将系统中的作业组织起来,需要为每个进入系统的作业建立档案以记录和作业相关的信息,例如,作业名、作业所需资源、作业执行时间、作业进入系统的时间、作业信息在存储器中的位置、指向下一个作业控制块的指针等信息。这个记录作业相关信息的数据块称为作业控制块(JCB ),并将系统中等待作业调度的作业控制块组织成一个队列,这个队列称为后备队列。当进行作业调度时,从后备队列中查找选择作业。

由于实验中没有实际作业,作业控制块中的信息内容只使用了实验中需要的数据。作业控制块中首先应该包括作业名;其次是作业所需资源(内存大小、打印机的数量和磁带机的数量);采用响应比高者优先作业调度算法,为了计算响应比,还需要有作业的估计执行时间、作业在系统中的等待时间;另外,指向下一个作业控制块的指针必不可少。

实验中,作业控制块及队列的数据结构定义如下:

struct task {

string name; /*作业号*/

int arrTime; /* 作业到达时间*/

int serTime; /*作业要求服务时间*/

int waiTime; /*等待时间*/

int begTime; /*开始运行时间*/

int finTime; /*结束运行时间*/

int turTime; /*周转时间*/

int wTuTime; /*带权周转时间*/

int priority;/*优先权*/

int finish;/*是否已经完成*/

}JCB[10];

存放作业控制块的区域:

#define n 10

JCB jobtable[10];

int jobcount;

将作业控制块组织成一个队列,实验中采用静态链表的方式模拟作业的后备队列,作业队列头指针定义为:int *head;

实验中,内存采用可移动的动态分区管理方法,即只要内存空闲区总和比作业大就可以满足作业对内存的需求;对打印机和磁带机这两种独占设备采用静态分配法,即作业执行前必须获得所需资源,并且执行完才归还。

采用响应比高者优先调度算法进行调度时,必须计算出系统中所有满足必要条件作业的响应比,从中选择响应比最高的一个作业装入主存储器分配资源。由于是实验,所以就将作业控制块出队,并输出作业名代替装入处存储器,同时修改系统的资源数量。

最高响应比优先调度算法的作业调度程序流程图(如下)

HRN

四、参考源程序:

#include

#include

#include

#include

#include

#include

typedef char string[10]; /* //定义string为含有10个字符元素的字符数组类型*/ struct task {

string name; /*作业号*/

int arrTime; /* 作业到达时间*/

int serTime; /*作业要求服务时间*/

int waiTime; /*等待时间*/

int begTime; /*开始运行时间*/

int finTime; /*结束运行时间*/

int turTime; /*周转时间*/

int wTuTime; /*带权周转时间*/

int priority;/*优先权*/

int finish;/*是否已经完成*/

}JCB[10];

int num;

void input()

{

int i;

system("cls");

printf("\n请输入作业数量: ");

scanf("%d", &num);

for(i=0;i

{

printf("\n请输入作业NO.%d:\n",i);

printf(" 作业名称: ");

scanf("%s",JCB[i].name);

printf(" 到达时间: ");

scanf("%d",&JCB[i].arrTime);

printf(" 服务时间: ");

scanf("%d",&JCB[i].serTime);

JCB[i].priority = 0;

JCB[i].finish =0;

}

int HRN(int pre)

{

int current=1,i,j;/* 优先权=(等待时间+服务时间)/服务时间*/

for(i=0; i

{

JCB[i].waiTime=JCB[pre].finTime-JCB[i].arrTime; /*等待时间=上一个作业的完成时间-到达时间*/

JCB[i].priority=(JCB[i].waiTime+JCB[i].serTime)/JCB[i].serTime;

}

for(i=0; i

{

if(!JCB[i].finish)

{

current=i; /*找到第一个还没完成的作业*/

break;

}

}

for( j=i; j

{

if( !JCB[j].finish) /* 还没完成(运行)*/

{

if(JCB[current].arrTime<=JCB[pre].finTime) /*如果作业在上一个作业完成之前到达*/

{

if(JCB[j].arrTime<=JCB[pre].finTime && JCB[j].priority>JCB[current].priority )

current=j;/* 找出到达时间在上一个作业完成之前,优先权高的作业*/

}

else /* 如果作业是在上一个作业完成之后到达*/

{

if(JCB[j].arrTime

current=j; /* 找出比较早到达的一个*/

if(JCB[j].arrTime==JCB[current].arrTime) /* 如果同时到达*/

if(JCB[j].priority>JCB[current].priority)

current=j; /*找出服务时间比较短的一个*/

}

}

}

return current;/*返回当前作业*/

}

void runing(int i, int times, int pre, int staTime, int endTime)

if(times==0)

{

JCB[i].begTime=JCB[i].arrTime;

JCB[i].finTime=JCB[i].begTime+JCB[i].serTime;

JCB[i].turTime=JCB[i].serTime;

JCB[i].wTuTime=1.0;

staTime=JCB[i].begTime;

}

else

{

if(JCB[i].arrTime>JCB[pre].finTime)

JCB[i].begTime=JCB[i].arrTime;

else

JCB[i].begTime=JCB[pre].finTime;

JCB[i].finTime=JCB[i].begTime+JCB[i].serTime;

JCB[i].turTime=JCB[i].finTime-JCB[i].arrTime;

JCB[i].wTuTime=JCB[i].turTime/JCB[i].serTime;

}

if(times==num-1)

endTime=JCB[i].finTime;

JCB[i].finish=1;

}

void print(int i,int times)

{

if(times==0)

{

printf(" 名称到达时间服务时间开始时间完成时间周转时间带权周转时间\n");

}

printf("%9s%9d%9d%9d%9d%9d%9d\n",

JCB[i].name,JCB[i].arrTime,JCB[i].serTime,

JCB[i].begTime,JCB[i].finTime,JCB[i].turTime,JCB[i].wTuTime);

}

void check( )

{

int i;

int staTime, endTime, sumTurTime=0.0, sumWTuTime=0.0, aveTurTime, aveWTuTime;

int current=0, times=0, pre=0;

JCB[pre].finTime=0;

for(i=0; i

{

JCB[i].finish=0;

}

staTime, endTime,sumTurTime=0.0, sumWTuTime=0.0, aveTurTime, aveWTuTime;

current=0; times=0; pre=0;

JCB[pre].finTime=0;

printf("-------------------------------------------------------------------------\n");

for(i=0; i

{

JCB[i].finish=0;

}

staTime, endTime,sumTurTime=0.0, sumWTuTime=0.0, aveTurTime, aveWTuTime;

current=0; times=0; pre=0;

JCB[pre].finTime=0;

printf("\n-- HRRN -----------------------------------------------------------------\n");

for(times=0; times

{

current=HRN(pre);

runing(current, times, pre, staTime, endTime);

print(current, times);

pre=current;

}

for(i=0; i

{

sumTurTime+=JCB[i].turTime;

sumWTuTime+=JCB[i].wTuTime;

}

aveTurTime=sumTurTime/num;

aveWTuTime=sumWTuTime/num;

printf("(计与平均值) %9d%9d%9d%9d\n",NULL,sumTurTime,aveTurTime,aveWTuTi me);

printf("-------------------------------------------------------------------------\n");

}

void main()

{

char again;

do {

system("cls"); /*清屏*/

printf("please input 4 groups of datas:\n");

input();

check();

printf("Continue...(Y/N): ");

do{

again = getch();

}while(again!='Y' && again!='y' && again!='N' && again!='n');

}while(again=='Y' || again=='y');

}

五、运行结果与运行情况

六、运行结果分析:从运行结果得到调度序列结果为:

X1→X2→X3

X1到达时间最早,服务时间也最短,其响应比最高;

X2到达时间为22,但因X1早到达,所以开始时间为22,其服务时间为12,所以响应比X1小;

X3到达时间最迟,其响应比最小,所以在最后。

七、自我评价与总结:

本次课程设计题目较为简单,主要是对优先级和最高响应比这两个算法的理解和对进程调度的功能以及进程调度算法有深入的理解。

在这次的课程设计中,让我感觉较为不满意的地方是,在课程设计开始之前我对于最高响应比优先法理解不熟悉,导致了响应比的计算错

误,从而加大了完成代码的时间量。

对于这次出现的这个问题,使我有了对程序设计的严谨性,课本基础知识的理解程度上有了更深刻的认识,也让我明白到了基础知识的重

要性。

完成此次课程实际之后,我对进程调度模拟设计的各种算法有了更进一步的理解,也加深了我对于C++面向对象方面的掌握,在编写程序

中所遇到的问题让我有了对操作系统有了迫切要更深层次的掌握,并操

作系统这门课程实在是很重要的一门课程。

操作系统-Linux课程实验报告

实验、 Linux Ubuntu的安装、创建新的虚拟机VMWare 实验 Shell编程 1.实验目的与内容 通过本实验,了解Linux系统的shell机制,掌握简单的shell编程技巧。 编制简单的Shell程序,该程序在用户登录时自动执行,显示某些提示信息,如“Welcome to Linux”, 并在命令提示符中包含当前时间、当前目录和当前用户名等基本信息。 2.程序源代码清单 #include<> #include int main(){ printf("Hello Linux\n"); int pid; int state; int pfd[2]; pipe(pfd); if (fork()==0){ printf("In the grep progress\n"); dup2(pfd[0],0); close(pfd[0]); close(pfd[1]); execlp("grep","grep","sh",0); perror("exelp grep error"); } esle if(fork()==0){ printf("In the ps progress\n"); dup2(pfd[1],1); close(pfd[0]); close(pfd[1]); execlp("ps","ps","-ef",0); perror("execlp ps -ef"); }

close(pfd[1]); close(pfd[0]); wait(&state); wait(&state); } 实验内核模块 实验步骤: (1).编写内核模块 文件中主要包含init_clock(),exit_clock(),read_clock()三个函数。其中init_clock(),exit_clock()负责将模块从系统中加载或卸载,以及增加或删除模块在/proc中的入口。read_clock()负责产生/proc/clock被读时的动作。 (2).编译内核模块Makefile文件 # Makefile under ifneq ($(KERNELRELEASE),) #kbuild syntax. dependency relationshsip of files and target modules are listed here. obj-m := else PWD := $(shell pwd) KVER ?= $(shell uname -r) KDIR := /lib/modules/$(KVER)/build all: $(MAKE) -C $(KDIR) M=$(PWD) modules clean: rm -rf .*.cmd *.o *. *.ko .tmp_versions *.symvers *.order endif 编译完成之后生成模块文件。 (3).内核模块源代码 #include #include #include #include #include #include #define MODULE #define MODULE_VERSION "" #define MODULE_NAME "clock" struct proc_dir_entry* my_clock; int read_clock(char* page, char** start, off_t off, int count, int* eof, void* data) { int len; struct timeval xtime;

操作系统实验报告--实验一--进程管理

实验一进程管理 一、目的 进程调度是处理机管理的核心内容。本实验要求编写和调试一个简单的进程调度程序。通过本实验加深理解有关进程控制块、进程队列的概念,并体会和了解进程调度算法的具体实施办法。 二、实验内容及要求 1、设计进程控制块PCB的结构(PCB结构通常包括以下信息:进程名(进程ID)、进程优先数、轮转时间片、进程所占用的CPU时间、进程的状态、当前队列指针等。可根据实验的不同,PCB结构的内容可以作适当的增删)。为了便于处理,程序中的某进程运行时间以时间片为单位计算。各进程的轮转时间数以及进程需运行的时间片数的初始值均由用户给定。 2、系统资源(r1…r w),共有w类,每类数目为r1…r w。随机产生n进程P i(id,s(j,k),t),0<=i<=n,0<=j<=m,0<=k<=dt为总运行时间,在运行过程中,会随机申请新的资源。 3、每个进程可有三个状态(即就绪状态W、运行状态R、等待或阻塞状态B),并假设初始状态为就绪状态。建立进程就绪队列。 4、编制进程调度算法:时间片轮转调度算法 本程序用该算法对n个进程进行调度,进程每执行一次,CPU时间片数加1,进程还需要的时间片数减1。在调度算法中,采用固定时间片(即:每执行一次进程,该进程的执行时间片数为已执行了1个单位),这时,CPU时间片数加1,进程还需要的时间片数减1,并排列到就绪队列的尾上。 三、实验环境 操作系统环境:Windows系统。 编程语言:C#。 四、实验思路和设计 1、程序流程图

2、主要程序代码 //PCB结构体 struct pcb { public int id; //进程ID public int ra; //所需资源A的数量 public int rb; //所需资源B的数量 public int rc; //所需资源C的数量 public int ntime; //所需的时间片个数 public int rtime; //已经运行的时间片个数 public char state; //进程状态,W(等待)、R(运行)、B(阻塞) //public int next; } ArrayList hready = new ArrayList(); ArrayList hblock = new ArrayList(); Random random = new Random(); //ArrayList p = new ArrayList(); int m, n, r, a,a1, b,b1, c,c1, h = 0, i = 1, time1Inteval;//m为要模拟的进程个数,n为初始化进程个数 //r为可随机产生的进程数(r=m-n) //a,b,c分别为A,B,C三类资源的总量 //i为进城计数,i=1…n //h为运行的时间片次数,time1Inteval为时间片大小(毫秒) //对进程进行初始化,建立就绪数组、阻塞数组。 public void input()//对进程进行初始化,建立就绪队列、阻塞队列 { m = int.Parse(textBox4.Text); n = int.Parse(textBox5.Text); a = int.Parse(textBox6.Text); b = int.Parse(textBox7.Text); c = int.Parse(textBox8.Text); a1 = a; b1 = b; c1 = c; r = m - n; time1Inteval = int.Parse(textBox9.Text); timer1.Interval = time1Inteval; for (i = 1; i <= n; i++) { pcb jincheng = new pcb(); jincheng.id = i; jincheng.ra = (random.Next(a) + 1); jincheng.rb = (random.Next(b) + 1); jincheng.rc = (random.Next(c) + 1); jincheng.ntime = (random.Next(1, 5)); jincheng.rtime = 0;

操作系统实验报告_实验五

实验五:管道通信 实验内容: 1.阅读以下程序: #include #include #include main() { int filedes[2]; char buffer[80]; if(pipe(filedes)<0) //建立管道,filedes[0]为管道里的读取端,filedes[1]则为管道的写入端 //成功则返回零,否则返回-1,错误原因存于errno中 err_quit(“pipe error”); if(fork()>0){ char s[ ] = “hello!\n”; close(filedes[0]); //关闭filedes[0]文件 write(filedes[1],s,sizeof(s)); //s所指的内存写入到filedes[1]文件内 close(filedes[1]); //关闭filedes[0]文件 }else{ close(filedes[1]); read(filedes[0],buffer,80); //把filedes[0]文件传送80个字节到buffer缓冲区内 printf(“%s”,buffer); close(filedes[0]); } } 编译并运行程序,分析程序执行过程和结果,注释程序主要语句。

2.阅读以下程序: #include #include #include main() { char buffer[80]; int fd; unlink(FIFO); //删除FIFO文件 mkfifo(FIFO,0666); //FIFO是管道名,0666是权限 if(fork()>0){ char s[ ] = “hello!\n”;

操作系统经典习题+解释

●假定一个阅览室最多可容纳100人,读者进入和离开阅览室时都必须在阅览室门口的 一个登记表上进行登记,而且每次只允许一人进行登记操作,请用记录型信号量机制实现上述问题的同步。 定义信号量sum,mutex,初值分别为100,1。(3分)则第i个读者的活动描述为:procedure P i(i=1,2,3……) begin wait(sum); wait(mutex); 登记; signal(mutex); 进入阅览室; 阅读; wait(mutex); 登记; signal(mutex); 离开阅览室; signal(sum); end ●请用信号量解决以下的“过独木桥”问题:同一方向的行人可连续过桥,当某一方向 有人过桥时,另一方向的行人必须等待;当某一方向无人过桥时,另一方向的行人可以过桥。 将独木桥的两个方向分别标记为A和B;并用整形变量countA和countB分别表示A、B 方向上已在独木桥上的行人数,初值为0;再设置三个初值都1的互斥信号量:SA用来实现对countA的互斥访问,SB用来实现对countB的互斥访问,mutex用来实现两个方向的行人对独木桥的互斥使用。则具体描述如下: Var SA,SB,mutex:semaphore:=1,1,1; CountA,countB:integer:=0,0: begin parbegin process A: begin wait(SA); if(countA=0) then wait(mutex); countA:=countA+1; signal(SA); 过独木桥; wait(SA); countA:=countA-1; if (countA=0) then signal(mutex); signa(SA); end process B: begin wait(SB);

计算机操作系统实验课实验报告

实验报告 实验课程: 计算机操作系统学生姓名:XXX 学号:XXXX 专业班级:软件 2014年12月25日

目录 实验一熟悉Windows XP中的进程和线程.. 3实验二进程调度 (7) 实验三死锁避免—银行家算法的实现 (18) 实验四存储管理 (24)

实验一熟悉Windows XP中的进程和线程 一、实验名称 熟悉Windows XP中的进程和线程 二、实验目的 1、熟悉Windows中任务管理器的使用。 2、通过任务管理器识别操作系统中的进程和线程的相关信息。 3、掌握利用spy++.exe来察看Windows中各个任务的更详细信息。 三、实验结果分析 1、启动操作系统自带的任务管理器: 方法:直接按组合键Ctrl+Alt+Del,或者是在点击任务条上的“开始”“运行”,并输入“taskmgr.exe”。

2、调整任务管理器的“查看”中的相关设置,显示关于进程的以下各项信息,并 完成下表: 表一:统计进程的各项主要信息 3、启动办公软件“Word”,在任务管理器中找到该软件的登记,并将其结束掉。再

从任务管理器中分别找到下列程序:winlogon.exe、lsass.exe、csrss.exe、smss.exe,试着结束它们,观察到的反应是任务管理器无法结束进程, 原因是该系统是系统进程。 4、在任务管理器中找到进程“explorer.exe”,将之结束掉,并将桌面上你打开的所 有窗口最小化,看看你的计算机系统起来什么样的变化桌面上图标菜单都消失了、得到的结论explorer.exe是管理桌面图标的文件(说出explorer.exe进程的作用)。 5、运行“spy++.exe”应用软件,点击按钮“”,切换到进程显示栏上,查看进 程“explorer.exe”的各项信息,并填写下表: 进程:explorer.exe 中的各个线程

嵌入式操作系统实验报告

中南大学信息科学与工程学院实验报告 姓名:安磊 班级:计科0901 学号: 0909090310

指导老师:宋虹

目录 课程设计内容 ----------------------------------- 3 uC/OS操作系统简介 ------------------------------------ 3 uC/OS操作系统的组成 ------------------------------ 3 uC/OS操作系统功能作用 ---------------------------- 4 uC/OS文件系统的建立 ---------------------------- 6 文件系统设计的原则 ------------------------------6 文件系统的层次结构和功能模块 ---------------------6 文件系统的详细设计 -------------------------------- 8 文件系统核心代码 --------------------------------- 9 课程设计感想 ------------------------------------- 11 附录-------------------------------------------------- 12

课程设计内容 在uC/OS操作系统中增加一个简单的文件系统。 要求如下: (1)熟悉并分析uc/os操作系统 (2)设计并实现一个简单的文件系统 (3)可以是存放在内存的虚拟文件系统,也可以是存放在磁盘的实际文件系统 (4)编写测试代码,测试对文件的相关操作:建立,读写等 课程设计目的 操作系统课程主要讲述的内容是多道操作系统的原理与技术,与其它计算机原理、编译原理、汇编语言、计算机网络、程序设计等专业课程关系十分密切。 本课程设计的目的综合应用学生所学知识,建立系统和完整的计算机系统概念,理解和巩固操作系统基本理论、原理和方法,掌握操作系统开发的基本技能。 I.uC/OS操作系统简介 μC/OS-II是一种可移植的,可植入ROM的,可裁剪的,抢占式的,实时多任务操作系统内核。它被广泛应用于微处理器、微控制器和数字信号处理器。 μC/OS 和μC/OS-II 是专门为计算机的嵌入式应用设计的,绝大部分代码是用C语言编写的。CPU 硬件相关部分是用汇编语言编写的、总量约200行的汇编语言部分被压缩到最低限度,为的是便于移植到任何一种其它的CPU 上。用户只要有标准的ANSI 的C交叉编译器,有汇编器、连接器等软件工具,就可以将μC/OS-II嵌入到开发的产品中。μC/OS-II 具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点,最小内核可编译至2KB 。μC/OS-II 已经移植到了几乎所有知名的CPU 上。 严格地说uC/OS-II只是一个实时操作系统内核,它仅仅包含了任务调度,任务管理,时间管理,内存管理和任务间的通信和同步等基本功能。没有提供输入输出管理,文件系统,网络等额外的服务。但由于uC/OS-II良好的可扩展性和源码开放,这些非必须的功能完全 可以由用户自己根据需要分别实现。 uC/OS-II目标是实现一个基于优先级调度的抢占式的实时内核,并在这个内核之上提供最基本的系统服务,如信号量,邮箱,消息队列,内存管理,中断管理等。 uC/OS操作系统的组成 μC/OS-II可以大致分成核心、任务处理、时间处理、任务同步与通信,CPU的移植等5个部分。如下图:

操作系统实验报告

操作系统教程 实 验 指 导 书 姓名: 学号: 班级:软124班 指导老师:郭玉华 2014年12月10日

实验一WINDOWS进程初识 1、实验目的 (1)学会使用VC编写基本的Win32 Consol Application(控制台应用程序)。 (2)掌握WINDOWS API的使用方法。 (3)编写测试程序,理解用户态运行和核心态运行。 2、实验内容和步骤 (1)编写基本的Win32 Consol Application 步骤1:登录进入Windows,启动VC++ 6.0。 步骤2:在“FILE”菜单中单击“NEW”子菜单,在“projects”选项卡中选择“Win32 Consol Application”,然后在“Project name”处输入工程名,在“Location”处输入工程目录。创建一个新的控制台应用程序工程。 步骤3:在“FILE”菜单中单击“NEW”子菜单,在“Files”选项卡中选择“C++ Source File”, 然后在“File”处输入C/C++源程序的文件名。 步骤4:将清单1-1所示的程序清单复制到新创建的C/C++源程序中。编译成可执行文件。 步骤5:在“开始”菜单中单击“程序”-“附件”-“命令提示符”命令,进入Windows“命令提示符”窗口,然后进入工程目录中的debug子目录,执行编译好的可执行程序: E:\课程\os课\os实验\程序\os11\debug>hello.exe 运行结果 (如果运行不成功,则可能的原因是什么?) : 有可能是因为DOS下路径的问题 (2)计算进程在核心态运行和用户态运行的时间 步骤1:按照(1)中的步骤创建一个新的“Win32 Consol Application”工程,然后将清单1-2中的程序拷贝过来,编译成可执行文件。 步骤2:在创建一个新的“Win32 Consol Application”工程,程序的参考程序如清单1-3所示,编译成可执行文件并执行。 步骤3:在“命令提示符”窗口中运行步骤1中生成的可执行文件,测试步骤2中可执行文件在核心态运行和用户态运行的时间。 E:\课程\os课\os实验\程序\os12\debug>time TEST.exe 步骤4:运行结果 (如果运行不成功,则可能的原因是什么?) : 因为程序是个死循环程序 步骤5:分别屏蔽While循环中的两个for循环,或调整两个for循环的次数,写出运行结果。 屏蔽i循环: 屏蔽j循环: _______________________________________________________________________________调整循环变量i的循环次数:

计算机操作系统算法题(最全)

6. 算法题(共32个题目) 200348. 在信号量机制中,若P(S)操作是可中断的,则会有什么问题? 此题答案为:答: P(S)的操作如下: Begin S.Value:= S.Value-1; ① If S.Value<0 Then ② Begin Insert(*,S.L); Block(*) ③ End End. 若P(S)可中断的,例如进程A在执行了语句①之后从CPU上退 下了,假定此时S.Value=0;这时换另一进程B,B又将S.Value 的值减1使之为-1,在执行语句③时,B被阻塞;然后又换回A执行,由于A的"断点"是语句①之后,当它执行语句②时,由于这时S.Value已经是-1,故进程继续执行而被阻塞。这就出现了错误: 本来A操作P(S)操作后,S.Value=0,是不应该被阻塞的,现在却被阻塞了。 200350. 何谓临界区?下面给出的两个进程互斥的算法是安全的吗?为什么?

#define true; # define false; Int flag[2]; flag[1]=flag[2]=false; enter-crtsec(i) int i; { While(flag[1-i]) flag[i]=true; } feave-crtsec(i) Int i; { flag[i]=false; } process I; … Enter-crtsec(i); In critical section; Leave-crtsec(i);

此题答案为:答:一次仅允许一个进程使用的资源称为临界资源,在进程中对临界资源访问的程序段称为临界区。 从概念上讲,系统中各进程在逻辑上是独立的,它们可以按各自的速度向前推进。但由于它们共享某些临界资源,因而产生了临界区问题。对于具有临界区问题的并发进程,它们之间必须互斥,以保证不会同时进入临界区。 这种算法不是安全的。因为,在进入临界区的enter-crtsec()不是一个原语操作,如果两个进程同时执行完其循环(此前两个flag均为false),则这两个进程可同时进入临界区。 200353. 某车站售票厅,任何时刻最多可容纳20名购票者进入,当售票少于20名购票者时,则厅外的购票者可立即进入,否则需在外面等待。若把一个购票者看作一个进程,请回答下列问题: (1)用P、V操作管理这些并发进程时,应怎样定义信号量?写出信号量的初值以及信号量各种取值的含义。 (2)根据所定义的信号量,把应执行的P、V操作填入下述程序中,以保证进程能够正确地并发执行。 Cobegin PROCESS Pi(i=1,2,…) Begin 进入售票厅; 购票; 退出; End;

实时操作系统报告

实时操作系统课程实验报告 专业:通信1001 学号:3100601025 姓名:陈治州 完成时间:2013年6月11日

实验简易电饭煲的模拟 一.实验目的: 掌握在基于嵌入式实时操作系统μC/OS-II的应用中,基于多任务的模式的编程方法。锻炼综合应用多任务机制,任务间的通信机制,内存管理等的能力。 二.实验要求: 1.按“S”开机,系统进入待机状态,时间区域显示当前北京时间,默认模式“煮饭”; 2.按“C”选择模式,即在“煮饭”、“煮粥”和“煮面”模式中循环选择; 3.按“B”开始执行模式命令,“开始”状态选中,时间区域开始倒计时,倒计时完成后进入“保温”状态,同时该状态显示选中,时间区域显示保温时间; 4.按“Q”取消当前工作状态,系统进入待机状态,时间区域显示北京时间,模式为当前模式; 5.按“X”退出系统,时间区域不显示。 6.煮饭时长为30,煮粥时长为50,煮面时长为40. 三.实验设计: 1.设计思路: 以老师所给的五个程序为基础,看懂每个实验之后,对borlandc的操作有了大概的认识,重点以第五个实验Task_EX为框架,利用其中界面显示与按键扫描以及做出相应的响应,对应实现此次实验所需要的功能。 本次实验分为界面显示、按键查询与响应、切换功能、时钟显示与倒计时模块,综合在一起实验所需功能。 2.模块划分图: (1)界面显示: Main() Taskstart() Taskstartdispinit() 在TaskStartDispInit()函数中,使用PC_DispStr()函数画出界面。

(2)按键查询与响应: Main() Taskstart() 在TaskStart()函数中,用if (PC_GetKey(&key) == TRUE)判断是否有按键输入。然后根据key 的值,判断输入的按键是哪一个;在响应中用switch语句来执行对应按键的响应。 (3)切换功能: l计数“C”按 键的次数 M=l%3 Switch(m) M=0,1,2对应于煮饭,煮粥,煮面,然后使用PC_DispStr()函数在选择的选项前画上“@”指示,同时,在其余两项钱画上“”以“擦出”之前画下的“@”,注意l自增。 四.主要代码: #include "stdio.h" #include "includes.h" #include "time.h" #include "dos.h" #include "sys/types.h" #include "stdlib.h" #define TASK_STK_SIZE 512 #define N_TASKS 2 OS_STK TaskStk[N_TASKS][TASK_STK_SIZE]; OS_STK TaskStartStk[TASK_STK_SIZE]; INT8U TaskData[N_TASKS];

操作系统-Linux课程实验报告

实验 1.1、1.2 Linux Ubuntu的安装、创建新的虚拟机VMWare

实验1.3 Shell编程 1.实验目的与容 通过本实验,了解Linux系统的shell机制,掌握简单的shell编程技巧。 编制简单的Shell程序,该程序在用户登录时自动执行,显示某些提示信息,如“Welcome to Linux”, 并在命令提示符中包含当前时间、当前目录和当前用户名等基本信息。 2.程序源代码清单 #include #include int main(){ printf("Hello Linux\n"); int pid; int state; int pfd[2]; pipe(pfd); if (fork()==0){ printf("In the grep progress\n"); dup2(pfd[0],0); close(pfd[0]); close(pfd[1]); execlp("grep","grep","sh",0); perror("exelp grep error");

} esle if(fork()==0){ printf("In the ps progress\n"); dup2(pfd[1],1); close(pfd[0]); close(pfd[1]); execlp("ps","ps","-ef",0); perror("execlp ps -ef"); } close(pfd[1]); close(pfd[0]); wait(&state); wait(&state); } 实验2.3 核模块 实验步骤: (1).编写核模块 文件中主要包含init_clock(),exit_clock(),read_clock()三个函数。其中init_clock(),exit_clock()负责将模块从系统中加载或卸载,以及增加或删除模块在/proc中的入口。read_clock()负责产生/proc/clock被读时的动作。 (2).编译核模块Makefile文件 # Makefile under 2.6.25

操作系统精彩试题及问题详解

操作系统期末考试(A) 一、单项选择题(在每小题的四个备选答案中,只有一个是正确的,将其写在题干的括号中。每小题2分,共20分) 1、文件系统的主要组成部分是() A、文件控制块及文件 B、I/O文件及块设备文件 C、系统文件及用户文件 D、文件及管理文件的软件 2、实现进程互斥可采用的方法() A、中断 B、查询 C、开锁和关锁 D、按键处理 3、某页式管理系统中,地址寄存器的低9位表示页地址,则页面大小为() A、1024字节 B、512字节 C、1024K D、512K 4、串联文件适合于()存取 A、直接 B、顺序 C、索引 D、随机 5、进程的同步与互斥是由于程序的()引起的 A、顺序执行 B、长短不同 C、信号量 D、并发执行 6、信号量的值() A、总是为正 B、总是为负 C、总是为0 D、可以为负整数 7、多道程序的实质是() A、程序的顺序执行 B、程序的并发执行 C、多个处理机同时执行 D、用户程序和系统程序交叉执行 8、虚拟存储器最基本的特征是() A、从逻辑上扩充存容量 B、提高存利用率 C、驻留性 D、固定性 9、飞机定票系统是一个() A、实时系统 B、批处理系统 C、通用系统 D、分时系统 10、操作系统中,被调度和分派资源的基本单位,并可独立执行的实体是() A、线程 B、程序 C、进程 D、指令 二、名词解释(每小题3分,共15分) 1.死锁: 2.原子操作:

3.临界区: 4.虚拟存储器: 5.文件系统: 三、判断改错题(判断正误,并改正错误,每小题2分,共20分) 1、通道是通过通道程序来对I/O设备进行控制的。() 2、请求页式管理系统中,既可以减少外零头,又可以减少零头。() 3、操作系统中系统调用越多,系统功能就越强,用户使用越复杂。() 4、一个进程可以挂起自已,也可以激活自已。() 5、虚拟存储器的最大容量是由磁盘空间决定的。() 6、单级文件目录可以解决文件的重名问题。() 7、进程调度只有一种方式:剥夺方式。() 8、程序的顺度执行具有顺序性,封闭性和不可再现性。() 9、并行是指两个或多个事件在同一时间间隔发生,而并发性是指两个或多个事件在同 一时刻发生。() 10、进程控制一般都由操作系统核来实现。() 四、简答题(每小题5分,共25分) 1、简述死锁产生的原因及必要条件。 2、什么是多道程序技术,它带来了什么好处?

操作系统实验报告

操作系统教程实验报告 专业班级 学号 姓名 指导教师

实验一WINDOWS进程初识 1、实验目的 (1)学会使用VC编写基本的Win32 Consol Application(控制台应用程序)。 (2)掌握WINDOWS API的使用方法。 (3)编写测试程序,理解用户态运行和核心态运行。 2、实验内容和步骤 (1)编写基本的Win32 Consol Application 步骤1:登录进入Windows,启动VC++ 6.0。 步骤2:在“FILE”菜单中单击“NEW”子菜单,在“projects”选项卡中选择“Win32 Consol Application”,然后在“Project name”处输入工程名,在“Location”处输入工程目录。创建一个新的控制台应用程序工程。 步骤3:在“FILE”菜单中单击“NEW”子菜单,在“Files”选项卡中选择“C++ Source File”, 然后在“File”处输入C/C++源程序的文件名。 步骤4:将清单1-1所示的程序清单复制到新创建的C/C++源程序中。编译成可执行文件。 步骤5:在“开始”菜单中单击“程序”-“附件”-“命令提示符”命令,进入Windows “命令提示符”窗口,然后进入工程目录中的debug子目录,执行编译好的可执行程序:E:\课程\os课\os实验\程序\os11\debug>hello.exe 运行结果 (如果运行不成功,则可能的原因是什么?) : (2)计算进程在核心态运行和用户态运行的时间 步骤1:按照(1)中的步骤创建一个新的“Win32 Consol Application”工程,然后将清单1-2中的程序拷贝过来,编译成可执行文件。 步骤2:在创建一个新的“Win32 Consol Application”工程,程序的参考程序如清单1-3所示,编译成可执行文件并执行。 步骤3:在“命令提示符”窗口中运行步骤1中生成的可执行文件,测试步骤2中可执行文件在核心态运行和用户态运行的时间。 E:\课程\os课\os实验\程序\os12\debug>time TEST.exe 步骤4:运行结果 (如果运行不成功,则可能的原因是什么?) : 步骤5:分别屏蔽While循环中的两个for循环,或调整两个for循环的次数,写出运行结果。 屏蔽i循环:

操作系统课程设计实验报告

河北大学工商学院 课程设计 题目:操作系统课程设计 学部信息学部 学科门类电气信息 专业计算机 学号2011482370 姓名耿雪涛 指导教师朱亮 2013 年6月19日

主要内容 一、设计目的 通过模拟操作系统的实现,加深对操作系统工作原理理解,进一步了解操作系统的实现方法,并可练习合作完成系统的团队精神和提高程序设计能力。 二、设计思想 实现一个模拟操作系统,使用VB、VC、CB等windows环境下的程序设计语言,以借助这些语言环境来模拟硬件的一些并行工作。模拟采用多道程序设计方法的单用户操作系统,该操作系统包括进程管理、存储管理、设备管理、文件管理和用户接口四部分。 设计模板如下图: 注:本人主要涉及设备管理模块

三、设计要求 设备管理主要包括设备的分配和回收。 ⑴模拟系统中有A、B、C三种独占型设备,A设备1个,B设备2个,C设备2个。 ⑵采用死锁的预防方法来处理申请独占设备可能造成的死锁。 ⑶屏幕显示 注:屏幕显示要求包括:每个设备是否被使用,哪个进程在使用该设备,哪些进程在等待使用该设备。 设备管理模块详细设计 一、设备管理的任务 I/O设备是按照用户的请求,控制设备的各种操作,用于完成I/O 设备与内存之间的数据交换(包括设备的分配与回收,设备的驱动管理等),最终完成用户的I/O请求,并且I/O设备为用户提供了使用外部设备的接口,可以满足用户的需求。 二、设备管理函数的详细描述 1、检查设备是否可用(主要代码) public bool JudgeDevice(DeviceType type) { bool str = false; switch (type) { case DeviceType.a: {

嵌入式实时操作系统实验报告

嵌入式实时操作系统实验报告 任务间通信机制的建立 系别计算机与电子系 专业班级***** 学生姓名****** 指导教师 ****** 提交日期 2012 年 4 月 1 日

一、实验目的 掌握在基于嵌入式实时操作系统μC/OS-II的应用中,任务使用信号量的一般原理。掌握在基于优先级的可抢占嵌入式实时操作系统的应用中,出现优先级反转现象的原理及解决优先级反转的策略——优先级继承的原理。 二、实验内容 1.建立并熟悉Borland C 编译及调试环境。 2.使用课本配套光盘中第五章的例程运行(例5-4,例5-5,例5-6),观察运行结果,掌握信号量的基本原理及使用方法,理解出现优先级反转现象的根本原因并提出解决方案。 3.试编写一个应用程序,采用计数器型信号量(初值为2),有3个用户任务需要此信号量,它们轮流使用此信号量,在同一时刻只有两个任务能使用信号量,当其中一个任务获得信号量时向屏幕打印“TASK N get the signal”。观察程序运行结果并记录。 4. 试编写一个应用程序实现例5-7的内容,即用优先级继承的方法解决优先级反转的问题,观察程序运行结果并记录。 5.在例5-8基础上修改程序增加一个任务HerTask,它和YouTask一样从邮箱Str_Box里取消息并打印出来,打印信息中增加任务标识,即由哪个任务打印的;MyTask发送消息改为当Times为5的倍数时才发送,HerTask接收消息采用无等待方式,如果邮箱为空,则输出“The mailbox is empty”, 观察程序运行结果并记录。 三、实验原理 1. 信号量 μC/OS-II中的信号量由两部分组成:一个是信号量的计数值,它是一个16位的无符号整数(0 到65,535之间);另一个是由等待该信号量的任务组成的等待任务表。用户要在OS_CFG.H中将OS_SEM_EN开关量常数置成1,这样μC/OS-II 才能支持信号量。

操作系统原理实验报告(终版)

操作系统原理实验报告(终版)

————————————————————————————————作者:————————————————————————————————日期:

[键入文字] XX学校 实验报告 课程名称: 学院: 专业班: 姓名: 学号: 指导教师: 2011 年3 月

目录 实验1 进程管理 (3) 一、实验目的 (3) 二、实验内容 (3) 三、实验要求 (3) 四、程序说明和程序流程图 (4) 五、程序代码 (5) 六、程序运行结果及分析 (7) 七.指导教师评议 (8) 实验2 进程通信 (9) 一、实验目的 (9) 二、实验内容 (9) 三、实验要求 (9) 四、程序说明和程序流程图 (9) 五、程序代码 (11) 七.指导教师评议 (14) 实验3 存储管理 (15) 一、实验目的 (15) 二、实验内容 (15) 三、实验要求 (15) 四、程序说明和程序流程图 (16) 六、程序运行结果及分析 (23)

七.指导教师评议 (23) 实验4 文件系统 (24) 一、实验目的 (24) 二、实验内容 (24) 三、实验要求 (24) 四、程序说明和程序流程图 (24) 五、程序代码 (26) 六、程序运行结果及分析 (26) 七.指导教师评议 (27)

实验1 进程管理 一、实验目的 1. 弄清进程和程序的区别,加深对进程概念的理解。 2. 了解并发进程的执行过程,进一步认识并发执行的实质。 3. 掌握解决进程互斥使用资源的方法。 二、实验内容 1. 管道通信 使用系统调用pipe( )建立一个管道,然后使用系统调用fork( )创建2个子进程p1和p2。这2个子进程分别向管道中写入字符串:“Child process p1 is sending message!”和“Child process p2 is sending message!”,而父进程则从管道中读出来自两个子进程的信息,并显示在屏幕上。 2. 软中断通信 使用系统调用fork( )创建2个子进程p1和p2,在父进程中使用系统调用signal( )捕捉来自键盘上的软中断信号SIGINT(即按Ctrl-C),当捕捉到软中断信号SIGINT后,父进程使用系统调用kill( )分别向2个子进程发出软中断信号SIGUSR1和SIGUSR2,子进程捕捉到信号后分别输出信息“Child process p1 is killed by parent!”和“Child process p2 is killed by parent!”后终止。而父进程等待2个子进程终止后,输出信息“Parent process is killed!”后终止。 三、实验要求 1. 根据实验内容编写C程序。 2. 上机调试程序。 3. 记录并分析程序运行结果。

操作系统实验报告

实验报告 实验课程名称:操作系统 实验地点:南主楼七楼机房 2018—2019学年(一)学期 2018年 9月至 2019 年 1 月 专业: 班级: 学号: 姓名: 指导老师:刘一男

实验一 实验项目:分时系统模拟 实验学时:2实验日期: 2018-10-25 成绩: 实验目的利用程序设计语言模拟分时系统中多个进程按时间片轮转调度算法进行进程调度的过程; 假设有五个进程A,B,C,D,E,它们的到达时间及要求服务的时间分别为:进程名 A B C D E 到达时间0 1 2 3 4 服务时间 4 3 4 2 4 时间片大小为1,利用程序模拟A,B,C,D,E五个进程按时间片轮转的调度及执行过程并计算各进程的周转时间及带权周转时间。 执行过程并计算各进程的周转时间及带权周转时间。 轮转调度:BDACE

(1)修改时间片大小为2,利用程序模拟A,B,C,D,E五个进程按时间片轮转的调度及执行过程并计算各进程的周转时间及带权周转时间。 轮转调度:ADBCE (2)修改时间片大小为4,利用程序模拟A,B,C,D,E五个进程按时间片轮转的调度及执行过程并计算各进程的周转时间及带权周转时间.

顺序:ABCDE 1、思考 时间片的大小对调度算法产生什么影响?对计算机的性能产生什么影响?答:通过对时间片轮转调度算法中进程最后一次执行时间片分配的优化,提出了一种改进的时间片轮转调度算法,该算法具有更好的实时性,同时减少了任务调度次数和进程切换次数,降低了系统开销,提升了CPU的运行效率,使操作系统的性能得到了一定的提高。 A B C D E 时间片为1 周转时间12 9 14 8 13 3 3 3.5 4 3.25 带权周转 时间 时间片为2 周转时间8 12 13 7 13 2 4 3.25 3.5 3.25 带权周转 时间 时间片为4 周转时间 4 6 9 10 13 1 2 2.25 5 3.25 带权周转 时间

操作系统实验报告1

操作系统 实验报告 班号:1303107 学号:1130310726 姓名:蔡鹏

1.请简述head.s 的工作原理。 head.s实在32位保护模式下运行的。我认为这段程序主要包括两个部分:1.初始化设置。2.任务执行与切换。 初始设置主要包括了:1.设置GDT表2.设置系统定时芯片3. 设置IDT表(0x08时钟中断和0x80系统调用中断)4.切换到任务0执行 任务切换和执行包括了:1.任务0和任务1 , 2.时钟中断, 3.系统中断 两个任务的在LDT中代码段和数据段描述符的内容都设置为:基地址0x0000;段限长值为0x03ff,实际段长度为4MB。因此在线性地址空间中这个?内核?的代码和数据段与任务的代码和数据段都从线性地址0开始并且由于没有采用分页机制,所以他们都直接对应物理地址0开始处。 为了每隔10毫秒切换运行的任务,head.s程序中把定时器芯片8253的通道0设置成每隔10毫秒就向中断控制芯片8259A发送一个时钟中断请求信号。PC机的ROM BIOS开机时已经在8259A中把时钟中断请求信号设置成中断向量8,因此我们需要在中断8的处理过程中执行任务切换操作。任务切换的实现是查看current变量中的当前运行的任务号,如果为0,就利用任务1的TSS选择符作为操作数执行远跳转指令,从而切换到任务1中,否则反之。

每个任务在执行时,会首先把一个字符的ASCII码放入寄存器AL中,然后调用系统中断调用int 0x80,而该系统调用处理过程则会调用一个简单的字符写屏子程序,把寄存器AL中的字符显示在屏幕上,同时把字符显示的屏幕的下一个位置记录下来,作为下一次显示字符用。在显示过一个字符后,任务代码会使用循环语句延迟一段时间,然后又跳转到任务代码开始处继续循环执行,直到运行了10毫秒而发生了定时中断,从而代码会切换到另一个任务执行。对于任务A,寄存器AL中始终存放字符‘A’,而任务B运行时AL中始终存放字符‘B’。因此程序运行时我们将看到一连串的‘A’和一连串的‘B’间隔的连续不断的显示在屏幕上。若出现了一个‘C’,是由于PC机偶然产生了一个不是时钟中断和系统调用中断的其他中断。因为我们已经在程序中给所有其他中断安装了一个默认中断处理程序。当出现一个其他中断时,系统就会运行这个中断处理程序,于是就会在屏幕上显示一个‘C’,然后退出中断。 4.请记录head.s 的内存分布状况,写明每个数据段,代码段,栈段 的起始与终止的内存地址。

相关主题
文本预览
相关文档 最新文档