操作系统实验报告
实验1
分析实验结果参照实验指导书回答下面的问题:
5:
6:
从实验中得到了两次不同的结果
原因是程序采用了多线程的写法 , 两个线程同时抢占CPU资源, CPU并发处理该程序。
10:
11:
CPU并发处理程序
第一次
先运行func2()中的 x=x+2 再输出x=2 接着执行func2()中的y=3,然后执行func1() x=3 y=y+x, 输出y 所以 结果为 x=2 y=7
第二次
先运行 func1()中的 x=4 y=4 再运行 func2()中y=3 x=x+2
得到 x=6 y=3
15:
CPU 并发执行程序 使得在完成整个循环之前 输出 x的值
19:
通过 控制 turn变量 使得程序先完成func2()的完整循环 再完成func1()的完整循环最后
得到结果100
23:
由于信号量s 的出现 通过wai(s)和 signal(s)语句避免了在未完成循环前推出的情况
实验2
分析实验结果参照实验指导书回答下面的问题:
5:
11:
发生死锁
交换p()函数中wait(e)与wait(s)的顺序之后
消费者进入缓冲池后没能够出去,一直占用缓冲池,使得生产者无法进入缓冲池生产.
使得进程陷入死锁
不剥夺.
17:
发生死锁:
c()函数中wait(n)与wait(s)的顺序后.
会导致生产者处于一直生产的状态.当缓冲池满后,生产者在缓冲池中,出不去,消费者也进不了缓冲池.仅使进程处于请求保持状态 ,还有不剥夺,环路等待状态.
实验3(该实验为期中考试项目,按照期中考试要求提交报告)
实验4
问题1:描述内存控制块结构;描述内存控制块与内存分区和内存块的关系
¦ 只有当把内存控制块与分区关联起来之后,系统才能对其进行相应的管理和控制。它才是一个真正的动态内存区。
问题2:应用程序的源代码(请对内存操作给出注释)
#include "includes.h"
#define TASK_STK_SIZE 512 //任务堆栈长度
OS_STK StartTaskStk[TASK_STK_SIZE];
OS_STK MyTaskStk[TASK_STK_SIZE];
OS_STK YouTaskStk[TASK_STK_SIZE];
OS_STK HerTaskStk[TASK_STK_SIZE];
INT16S key; //用于退出uCOS_II的键
char *s;
char *s1="MyTask--ZYS";
char *s2="YouTask-ZYS";
char *s3="HerTask-ZYS";
INT8U err;
INT8U y=0; //字符显示位置
INT8U Times=0;
OS_MEM *IntBuffer; //定义内存控制块指针
INT8U IntPart[8][6]; //划分分区及内存块
INT8U *IntBlkPtr;
OS_MEM_DATA MemInfo;
void StartTask(void *pdata);
void MyTask(void *pdata);
void YouTask(void *pdata);
void HerTask(void *pdata);
/************************主函数******************************************/
void main (void)
{
OSInit(); //初始化uCOS_II
PC_DOSSaveReturn(); //保存Dos环境
PC_VectSet(uCOS, OSCtxSw); //安装uCOS_II中断
IntBuffer=OSMemCreate(IntPart,8,6,&err);
OSTaskCreate(StartTask,(void*)0,&StartTaskStk[TASK_STK_SIZE - 1], 0);
OSStart();
}
/****************************任务 StartTask *************************************************/
void StartTask (void *pdata)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif
pdata = pdata;
OS_ENTER_CRITICAL();
PC_VectSet(0x08, OSTickISR);
PC_SetTickRate(OS_TICKS_PER_SEC);
OS_EXIT_CRITICAL();
OSStatInit();
OSTaskCreate(MyTask,(void*)0,&MyTaskStk[TASK_STK_SIZE - 1], 3);
OSTaskCreate(YouTask,(void*)0,&YouTaskStk[TASK_STK_SIZE - 1], 4);
OSTaskCreate(HerTask,(void*)0,&HerTaskStk[TASK_STK_SIZE - 1], 5);
// 按 ESC 退出 ucos
for (;;)
{
if (PC_GetKey(&key) == TRUE) {
if (key == 0x1B) {
PC_DOSReturn();
}
}
OSTimeDlyHMSM(0, 0, 3, 0);
}
}
/****************************任务 MyTask *************************************************/
void MyTask(void *pdata)
{
#if OS_CRITICAL_METHOD==3
OS_CPU_SR cpu_sr;
#endif
pdata=pdata;
for(;;)
{
PC_DispStr(10,++y,s1,DISP_BGND_BLACK+DISP_FGND_WHITE);
IntBlkPtr=OSMemGet(IntBuffer,&err); //请求内存块,分区指针,错误信息
OSMemQuery(IntBuffer,&MemInfo); //查询内存控制块信息,待查询内存控制块指针
sprintf(s,"%0x",MemInfo.OSFreeList); // 头指针
PC_DispStr(30,y,s,DISP_BGND_BLACK+DISP_FGND_WHITE);
sprintf(s,"%d",MemInfo.OSNUsed); //显示已用数目
PC_DispStr(40,y,s,DISP_BGND_BLACK+DISP_FGND_WHITE);
if(Times>4)
{
OSMemPut(IntBuffer,IntBlkPtr); //释放内存块,
}
Times++;
OSTimeDlyHMSM(0,0,1,0); //等待1s
}
}
/**********************************任务YouTask*************************************/
void YouTask(void *pdata)
{
#if OS_CRITICAL_METHOD==3
OS_CPU_SR cpu_sr;
#endif
pdata=pdata;
for(;;)
{
PC_DispStr(10,++y,s2,DISP_BGND_BLACK+DISP_FGND_YELLOW);
IntBlkPtr=OSMemGet(IntBuffer,&err); //请求内存块,分区指针,错误信息
OSMemQuery(IntBuffer,&MemInfo); //查询内存控制块信息,待查询内存控制块指针
sprintf(s,"%0x",MemInfo.OSFreeList); // 头指针
PC_DispStr(30,y,s,DISP_BGND_BLACK+DISP_FGND_YELLOW);
sprintf(s,"%d",MemInfo.OSNUsed); //显示已用数目
PC_DispStr(40,y,s,DISP_BGND_BLACK+DISP_FGND_YELLOW);
OSMemPut(IntBuffer,IntBlkPtr); //释放内存块,
OSTimeDlyHMSM(0,0,2,0); //等待2s
}
}
/**************************任务 HerTask******************************/
void HerTask(void *pdata)
{
#if OS_CRITICAL_METHOD==3
OS_CPU_SR cpu_sr;
#endif
pdata=pdata;
for(;;)
{
PC_DispStr(10,++y,s3,DISP_BGND_BLACK+DISP_FGND_RED);
IntBlkPtr=OSMemGet(IntBuffer,&err); //请求内存块,分区指针,错误信息
OSMemQuery(IntBuffer,&MemInfo); //查询内存控制块信息,待查询内存控制块指针
sprintf(s,"%0x",MemInfo.OSFreeList); // 头指针
PC_DispStr(30,y,s,DISP_BGND_BLACK+DISP_FGND_RED);
sprintf(s,"%d",MemInfo.OSNUsed); //显示已用数目
PC_DispStr(40,y,s,DISP_BGND_BLACK+DISP_FGND_RED);
OSMemPut(IntBuffer,IntBlkPtr); //释放内存块,
OSTimeDlyHMSM(0,0,1,0); //等待1s
}
}
问题3:上述程序输出结果的截屏画面
实验5
FCFS磁盘调度算法的实现
#include<stdio.h>
#include<math.h>
int i,j,t;
int point=100,distance=0;
float sum=0,average=0;
int array[9]={55,58,39,18,90,160,150,38,184};
int fcfs(int array[9])
{
int count=0;
printf("从100号磁道开始");
printf("\n");
printf("被访问的下一个磁道号 移动磁道数");
printf("\n");
for(i=0;i<9;i++)
{
count = count+1;
printf(" %d ",array[i]);
distance= fabs(point-array[i]);
point=array[i];
sum=sum+distance;
printf(" %d ",distance);
printf("\n");
}
average=sum/count;
printf("sum= %2f",sum);
printf("\n");
printf("average= %f",average);
printf("\n");
}
void main()
{
fcfs(array);
}
班 级 R工商102
大连交通大学 姓 名 吴燚(11号)
实 验 报 告 同 组 人 李沛瑾 张文琬
课程名称: 操作系统(CE) 成 绩
实验名称: 模拟时间片调度 指导老师 郭金令
《计算机操作系统》实验报告班级:姓名:学号:实验一进程控制与描述一、实验目的通过对Windows2000编程,进一步熟悉操作系统的…
操作系统实验报告实验名称理解UNIXLINUXShell及UNIX的进程树成绩专业班级计科姓名学号联系电话实验日期20xx年12月…
目录实验一进程的创建2实验二进程控制3实验三进程的管道通信4实验四消息通信6实验五进程调度算法8实验六FIFO页面置换算法12实验…
操作系统实验报告学号姓名班级实验一实验报告实验名称并发程序设计实验1实验目的掌握在程序中创建新进程的方法观察并理解多道程序并发执行…
《操作系统原理》实验报告院(部):管理工程学院专业:信息管理与信息系统实验项目:实验一二三五班级:信管102姓名:学号:目录引言.…
课程设计报告课程设计名称:制作网站系别:计算机班级:2班学号:****成绩:开课时间:8月29日9月9日课程设计题目一、功能描述1…
电子商务系统设计班级学号姓名教师实验报告实验1电子商务系统案例分析2学时一实验目的使学生了解电子商务系统的主要作用及其与一般管理信…
课程设计任务书一设计题目基于微程序控制器的简单计算机系统设计与实现二设计内容设计模型机系统的总体结构指令系统和时序信号充分利用FP…
实验报告课程名称软件工程导论课题名称图书管理系统详细设计报告专业计算机科学与技术班级计算机0903学号姓名指导教师20##年5月2…
百货商店业务管理信息系统系统设计报告1系统硬软件配置1系统处理方式百货商店业务管理信息系统采用分布式处理采购销售会计三个部门各配置…
《计算机操作系统》实验报告班级:姓名:学号:实验一进程控制与描述一、实验目的通过对Windows2000编程,进一步熟悉操作系统的…