操作系统实验题目及实验报告要求_第1页
操作系统实验题目及实验报告要求_第2页
操作系统实验题目及实验报告要求_第3页
操作系统实验题目及实验报告要求_第4页
操作系统实验题目及实验报告要求_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实 验 报 告实验课程: 计算机操作系统 学生姓名: 余长华 学 号: 专业班级: 管理科学与工程类093班 2011年 5月 18日 目 录(二号宋体)一、 实验一 页码二、 实验二 页码三、 实验三 页码四、 实验四 页码五、 实验五 页码南昌大学实验报告 -(1)操作系统安装及其接口环境学生姓名: 余长华 学号: 专业班级: 管理科学与工程类093班 实验类型: 验证 综合 设计 创新 实验日期: 实验成绩: 一、实验目的熟悉Windows/Linux操作系统的安装过程与安装方法,并掌握该操作系统所提供的用户接口环境,并为后续实验做好编程环境准备。二、实验内容1、熟悉Windows/Li

2、nux操作系统的安装过程与安装方法,并掌握该操作系统所提供的用户接口环境,通过系统提供的用户管理程序、查看系统中的用户情况、进程、线程、内存使用情况等,学会使用它进行监视进程的状况、系统资源的使用情况及用户情况。并为后续实验做好编程环境准备。2、用C语言编写一小段程序,使其可以通过某个系统调用来获得OS提供的某种服务。三、实验要求1 了解所安装的操作系统对软硬件资源的具体要求;2 机器最低硬件配置要求;3 操作系统所提供的用户接口环境的熟悉;4 了解主要BIOS CMOS参数的含义及其设置方法;5 掌握程序编写中系统调用的方法。四、主要实验步骤 1准备安装缩所需软件等物品资料2打开VWARE软

3、件,点击文件新建虚拟机,弹出如下对话框,选择并设定磁盘存储大小,点击完成3编辑虚拟机设置,弹出下列对话框,选择点击OK 4启动虚拟机,进入安装界面 选择语言选择时区选择键盘布局,一般默认U.S.A就可以准备分区,弹出如下对话框,进行选择双击分区,选择挂载点进入文件迁移向导填写用户信息最后检验,点击安装在WINDOWS下直接执行Ubuntu8.04liveCd光盘中wubi.exe程序,会出现以下对话框点击安装,完成五、实验数据及处理结果六、实验体会或对改进实验的建议 安装过程操作繁琐,对于某些应用需求要谨慎选择六、 参考资料计算机操作系统教材七、参考资料南昌大学实验报告 -(2)编程模拟进程间

4、的同步和互斥学生姓名: 余长华 学号: 专业班级: 管理科学与工程类093班 实验类型: 验证 综合 设计 创新 实验日期: 实验成绩: 一、实验目的通过实验加强对进程同步和互斥的理解,并掌握进程(线程)的创建和调用方法。学会使用信号量解决资源共享问题。学生可以自己选择在Windows或Linux系统下编写。二、实验内容1以下为Linux系统下参考程序,请编译、运行并观察程序的输出,并分析实验结果,写出实验报告。#include#include#include#include#include#include#include#define NUM_PROCS 5#define SEM_ID 25

5、0#define FILE_NAME /tmp/sem_aaa#define DELAY void update_file(int sem_set_id, char *file_path, int number)struct sembuf sem_op;FILE *file;/等待信号量的数值变为非负数,此处设为负值,相当于对信号量进行P操作sem_op.sem_num=0;sem_op.sem_op=-1;sem_op.sem_flg=0;semop(sem_set_id,&sem_op,1);/写文件,写入的数值是当前进程的进程号file=fopen(file_path,w);if(fil

6、e)/临界区fprintf(file,%dn,number);printf(%dn,number);fclose(file);/发送信号,把信号量的数值加1,此处相当于对信号量进行V操作sem_op.sem_num=0;sem_op.sem_op=1;sem_op.sem_flg=0;semop(sem_set_id,&sem_op,1);/子进程写文件void do_child_loop(int sem_set_id,char *file_name)pid_t pid=getpid();int i,j;for(i=0;i3;i+)update_file(sem_set_id,file_nam

7、e,pid);for(j=0;j;j+);int main(int argc,char *argv)int sem_set_id; /信号量集的IDunion semun sem_val; /信号量的数值,用于semctl()int child_pid;int i;int rc;/ 建立信号量集,ID是250,其中只有一个信号量sem_set_id=semget(SEM_ID,1,IPC_CREAT|0600);if(sem_set_id=-1)perror(main: semget);exit(1);/把第一个信号量的数值设置为1sem_val.val=1;rc=semctl(sem_set

8、_id,0,SETVAL,sem_val);if(rc=-1)perror(main:semctl);exit(1);/建立一些子进程,使它们可以同时以竞争的方式访问信号量for(i=0;iNUM_PROCS;i+)child_pid=fork();switch(child_pid)case -1: perror(fork);case 0: /子进程do_child_loop(sem_set_id,FILE_NAME);exit(0);default: /父进程接着运行break;/等待子进程结束for(i=0;iNUM_PROCS;i+)int child_status;wait(&chil

9、d_status);printf(main:were donen);fflush(stdout);return 0;2模拟PV操作同步机构,且用PV操作解决生产者消费者问题。模拟PV操作同步机构,且用PV操作解决生产者消费者问题。提示:(1) PV操作同步机构,由P操作原语和V操作原语组成,它们的定义如下:P操作原语P(s):将信号量s减去1,若结果小于0,则执行原语的进程被置成等待信号量s的状态。V操作原语V(s):将信号量s加1,若结果不大于0,则释放一个等待信号量s的进程。这两条原语是如下的两个过程:procedure p (var s: semaphore);begin s:=s-1;

10、if s0 then W(s)end pprocedure v (var s: semaphore);begin s: =s+1;if sPC结束保护现场,PC=当前进程PCB的断点有就绪进程?否是图4-5处理器调度程序流程P(s)GOTO空操作PutGETproduceconsumeV(s)开始j:=PC按j转向各模拟指令对应的过程现行进程为生产者?否是j:=SAij:=PAiPC:=i+1置现行进程为就绪态返回生产者运行结束?置生产者进程为完成态是否图 4-6 模拟处理器指令执行开始SS+1将调用V(s)过程的进程置为就绪找一个等待s信号量的进程置为就绪态S0返回否是开始SS-1将调用P(

11、s)过程的进程置为就绪将调用P(s)过程的进程置为等待信号量s的状态S0返回否是(1)模拟P(S) (2)模拟V(S)图 4-7 模拟PV操作的执行三、实验要求1、 linux操作系统2、 Windows操作系统四、主要实验步骤linux操作系统下的操作步骤: gedit semaphore.c (编辑程序)gcc o semaphore semaphore.c (编译、链接程序)./semaphore(执行程序)五、实验数据及处理结果代码#include #include const unsigned short SIZE_OF_BUFFER = 10; /缓冲区长度unsigned sho

12、rt ProductID = 0; /产品号unsigned short ConsumeID = 0; /将被消耗的产品号unsigned short in = 0; /产品进缓冲区时的缓冲区下标unsigned short out = 0; /产品出缓冲区时的缓冲区下标int g_bufferSIZE_OF_BUFFER; /缓冲区是个循环队列bool g_continue = true; /控制程序结束HANDLE g_hMutex; /用于线程间的互斥HANDLE g_hFullSemaphore; /当缓冲区满时迫使生产者等待HANDLE g_hEmptySemaphore; /当缓冲

13、区空时迫使消费者等待DWORD WINAPI Producer(LPVOID); /生产者线程DWORD WINAPI Consumer(LPVOID); /消费者线程int main() /创建各个互斥信号 g_hMutex = CreateMutex(NULL,FALSE,NULL); g_hFullSemaphore = CreateSemaphore(NULL,SIZE_OF_BUFFER-1,SIZE_OF_BUFFER-1,NULL); g_hEmptySemaphore = CreateSemaphore(NULL,0,SIZE_OF_BUFFER-1,NULL); /调整下面的

14、数值,可以发现,当生产者个数多于消费者个数时, /生产速度快,生产者经常等待消费者;反之,消费者经常等待 const unsigned short PRODUCERS_COUNT = 3; /生产者的个数 const unsigned short CONSUMERS_COUNT = 1; /消费者的个数 /总的线程数 const unsigned short THREADS_COUNT = PRODUCERS_COUNT+CONSUMERS_COUNT; HANDLE hThreadsPRODUCERS_COUNT; /各线程的handle DWORD producerIDCONSUMERS_

15、COUNT; /生产者线程的标识符 DWORD consumerIDTHREADS_COUNT; /消费者线程的标识符 /创建生产者线程 for (int i=0;iPRODUCERS_COUNT;+i) hThreadsi=CreateThread(NULL,0,Producer,NULL,0,&producerIDi); if (hThreadsi=NULL) return -1; /创建消费者线程 for (int j=0;jCONSUMERS_COUNT;+j) hThreadsPRODUCERS_COUNT+j=CreateThread(NULL,0,Consumer,NULL,0,

16、&consumerIDj); if (hThreadsj=NULL) return -1; while (g_continue) if (getchar() /按回车后终止程序运行 g_continue = false; return 0;/生产一个产品。简单模拟了一下,仅输出新产品的ID号void Produce() std:cerr Producing +ProductID . ; std:cerr Succeed std:endl;/把新生产的产品放入缓冲区void Append() std:cerr Appending a product . ; g_bufferin = Produc

17、tID; in = (in+1)%SIZE_OF_BUFFER; std:cerr Succeed std:endl; /输出缓冲区当前的状态 for (int i=0;iSIZE_OF_BUFFER;+i) std:cout i : g_bufferi; if (i=in) std:cout - 生产; if (i=out) std:cout - 消费; std:cout std:endl; /从缓冲区中取出一个产品void Take() std:cerr Taking a product . ; ConsumeID = g_bufferout; out = (out+1)%SIZE_OF_

18、BUFFER; std:cerr Succeed std:endl; /输出缓冲区当前的状态 for (int i=0;iSIZE_OF_BUFFER;+i) std:cout i : g_bufferi; if (i=in) std:cout - 生产; if (i=out) std:cout - 消费; std:cout std:endl; /消耗一个产品void Consume() std:cerr Consuming ConsumeID . ; std:cerr Succeed std:endl;/生产者DWORD WINAPI Producer(LPVOID lpPara) whil

19、e (g_continue) WaitForSingleObject(g_hFullSemaphore,INFINITE); WaitForSingleObject(g_hMutex,INFINITE); Produce(); Append(); Sleep(1500); ReleaseMutex(g_hMutex); ReleaseSemaphore(g_hEmptySemaphore,1,NULL); return 0;/消费者DWORD WINAPI Consumer(LPVOID lpPara) while (g_continue) WaitForSingleObject(g_hEmp

20、tySemaphore,INFINITE); WaitForSingleObject(g_hMutex,INFINITE); Take(); Consume(); Sleep(1500); ReleaseMutex(g_hMutex); ReleaseSemaphore(g_hFullSemaphore,1,NULL); return 0;6、 实验体会或对改进实验的建议1、实验程序复杂,很容易出现错误;2、在运行的时候,刚开始程序中出现了一个错误,就是重复用了i来定义变量,后来出错,就给变成j;3、运行结果时,如果没有按回车键,此程序会一直运行下去,类似一个死循环;七、参考资料南昌大学实验报

21、告 -(3)编程实现银行家安全算法学生姓名: 余长华 学号: 专业班级: 管理科学与工程类093班 实验类型: 验证 综合 设计 创新 实验日期: 实验成绩: 一、实验目的通过实验加强对银行家安全算法的理解和掌握。二、实验内容熟悉避免死锁发生的方法,死锁与安全序列的关系,编程实现银行家算法,要求输出进程的安全序列。三、实验要求1、需写出设计说明;2、设计实现代码及说明3、运行结果;四、主要实验步骤#include malloc.h #include stdio.h #include stdlib.h #define alloclen sizeof(struct allocation) #def

22、ine maxlen sizeof(struct max) #define avalen sizeof(struct available) #define needlen sizeof(struct need) #define finilen sizeof(struct finish) #define pathlen sizeof(struct path) struct allocation int value; struct allocation *next; ; struct max int value; struct max *next; ; struct available /*可用资

23、源数*/ int value; struct available *next; ; struct need /*需求资源数*/ int value; struct need *next; ; struct path int value; struct path *next; ; struct finish int stat; struct finish *next; ; int main() int row,colum,status=0,i,j,t,temp,processtest; struct allocation *allochead,*alloc1,*alloc2,*alloctemp

24、; struct max *maxhead,*maxium1,*maxium2,*maxtemp; struct available *avahead,*available1,*available2,*workhead,*work1,*work2,*worktemp,*worktemp1; struct need *needhead,*need1,*need2,*needtemp; struct finish *finihead,*finish1,*finish2,*finishtemp; struct path *pathhead,*path1,*path2; printf(n请输入系统资源

25、的种类数:); scanf(%d,&colum); printf(请输入现时内存中的进程数:); scanf(%d,&row); printf(请输入已分配资源矩阵:n); for(i=0;irow;i+) for (j=0;jnext=alloc2-next=NULL; scanf(%d,&allochead-value); status+; else alloc2=(struct allocation *)malloc(alloclen); scanf(%d,%d,&alloc2-value); if(status=1) allochead-next=alloc2; status+; al

26、loc1-next=alloc2; alloc1=alloc2; alloc2-next=NULL; status=0; printf(请输入最大需求矩阵:n); for(i=0;irow;i+) for (j=0;jnext=maxium2-next=NULL; scanf(%d,&maxium1-value); status+; else maxium2=(struct max *)malloc(maxlen); scanf(%d,%d,&maxium2-value); if(status=1) maxhead-next=maxium2; status+; maxium1-next=max

27、ium2; maxium1=maxium2; maxium2-next=NULL; status=0; printf(请输入现时系统剩余的资源矩阵:n); for (j=0;jnext=available2-next=NULL; work1-next=work2-next=NULL; scanf(%d,&available1-value); work1-value=available1-value; status+; else available2=(struct available*)malloc(avalen); work2=(struct available*)malloc(avalen

28、); scanf(%d,%d,&available2-value); work2-value=available2-value; if(status=1) avahead-next=available2; workhead-next=work2; status+; available1-next=available2; available1=available2; work1-next=work2; work1=work2; available2-next=NULL; work2-next=NULL; status=0; alloctemp=allochead; maxtemp=maxhead

29、; for(i=0;irow;i+) for (j=0;jnext=need2-next=NULL; need1-value=maxtemp-value-alloctemp-value; status+; else need2=(struct need *)malloc(needlen); need2-value=(maxtemp-value)-(alloctemp-value); if(status=1) needhead-next=need2; status+; need1-next=need2; need1=need2; maxtemp=maxtemp-next; alloctemp=a

30、lloctemp-next; need2-next=NULL; status=0; for(i=0;inext=finish2-next=NULL; finish1-stat=0; status+; else finish2=(struct finish*)malloc(finilen); finish2-stat=0; if(status=1) finihead-next=finish2; status+; finish1-next=finish2; finish1=finish2; finish2-next=NULL; /*Initialization compleated*/ statu

31、s=0; processtest=0; for(temp=0;temprow;temp+) alloctemp=allochead; needtemp=needhead; finishtemp=finihead; worktemp=workhead; for(i=0;istat=0) for(j=0;jnext,worktemp=worktemp-next) if(needtemp-valuevalue) processtest+; if(processtest=colum) for(j=0;jvalue+=alloctemp-value; worktemp1=worktemp1-next;

32、alloctemp=alloctemp-next; if(status=0) pathhead=path1=path2=(struct path*)malloc(pathlen); path1-next=path2-next=NULL; path1-value=i; status+; else path2=(struct path*)malloc(pathlen); path2-value=i; if(status=1) pathhead-next=path2; status+; path1-next=path2; path1=path2; finishtemp-stat=1; else fo

33、r(t=0;tnext; finishtemp-stat=0; else for(t=0;tnext; alloctemp=alloctemp-next; processtest=0; worktemp=workhead; finishtemp=finishtemp-next; path2-next=NULL; finishtemp=finihead; for(temp=0;tempstat=0) printf(n系统处于非安全状态!n); exit(0); finishtemp=finishtemp-next; printf(n系统处于安全状态.n); printf(n安全序列为: n);

34、do printf(p%d ,pathhead-value); while(pathhead=pathhead-next); printf(n); return 0; 五;实验数据集处理结果;六、实验体会或对改进实验的建议七、参考资料南昌大学实验报告 -(4)进程调度算法的实现学生姓名: 余长华 学 号: 专业班级:管理科学与工程类093班 实验类型: 验证 综合 设计 创新 实验日期: 实验成绩: 一、实验目的通过实验加强对进程调度算法的理解和掌握。二、实验内容编写程序实现进程调度算法,具体可以编写程序实现先来先服务算法或优先度高者调度算法。三、实验要求1、需写出设计说明;2、设计实现代码及

35、说明3、运行结果;四、主要实验步骤#include struct fcfschar name10;float arrivetime;float servicetime;float starttime;float finishtime;float zztime;float dqzztime;fcfs a100;void input(fcfs *p,int N) int i;printf(intput the processs name & arrivetime & servicetime:nfor exmple: a 0 100n);for(i=0;i=N-1;i+)printf(input t

36、he %dth processs information:n,i+1);scanf(%s%f%f,&,&pi.arrivetime,&pi.servicetime);void Print(fcfs *p,float arrivetime,float servicetime,float starttime,float finishtime,float zztime,float dqzztime,int N)int k; printf(run order:); printf(%s,);for(k=1;k%s,);printf(nthe processs information:n); printf(nnametarrivetservicetstarttfinishtzztdqzzn); for(k=0;k=N-1;k+) printf(%st%-.2ft%-.2ft%-.2ft%-.2ft%-.2ft%-.2ft

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论