《2022年操作系统上机实验》由会员分享,可在线阅读,更多相关《2022年操作系统上机实验(9页珍藏版)》请在金锄头文库上搜索。
1、实验一编程接口实验目的本实验通过使用系统调用编制程序,加深对操作系统提供的编程接口的理解。实验预备内容复习 c 语言的五个常用函数的功能和使用方法,汇编语言5 各系统调用的功能和使用方法。实验内容利用 c语言五个常用函数和汇编语言5 各系统调用分别编写一段程序,使用的函数 (系统调用)不限,完成的功能也不限。实例用 5 个库函数完成三字符串的输入、比较大小、计算最大字符串的长度,并输出最大字符串和其长度。从键盘上获取字符串函数:gets();字符串比较函数:strcmp();字符串复制函数:strcpy();求字符串长度函数:strlen();往标准输出设备上输出数据函数:printf().
2、程序:#include #include void main() char str110,str210,str310; int length; gets(str1); gets(str2); gets(str3); length=strlen(str1); printf(%dn,length); printf(%sn,strcat(str1,str2); if(strcmp(str3,China)=0) printf(yesn); else printf(non); 实验二作业(进程)调度实验实验目的与要求本实验的目的是通过作业或进程调度算名师资料总结 - - -精品资料欢迎下载 - - -
3、- - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 9 页 - - - - - - - - - 法模拟设计,进一步加深对作业或进程调度算法的理解,通过计算平均周转时间和带权平均周转时间,进一步加深对算法的评价方法的理解。实验预备内容(1)预习作业或进程调度算法。(2)预习平均周转时间和带权平均周转时间计算。实验内容设定一组作业或进程,给定相关参数,对这组进程或作业按调度算法实施调度,输出调度次序,并计算平均周转时间和带权平均周转时间。要求实现的调度算法有:(1)先来先服务调度算法。(2)优先级调度算法。(3)短作业(或进程)优先
4、调度算法。(4)响应比高优先调度算法。使用的主要数据结构:1定义一个结构体。结构体的主要成员有:序号作业(进程)号或名称提交时间运行时间优先数进入输入井时间开始运行时间尚需运行时间运行结束时间周转时间带权周转时间运行次序等。2利用定义的结构体,定义一个结构体数组,用来记录系统中的作业或进程。程序:/* 没有进行数据清除操作*/ #include #include #define MAX 10 struct task_struct int number; /* 进程编号 */ char name10; /* 进程名称 */ float come_time; /* 到达时间 */ float ru
5、n_begin_time; /* 开始运行时间 */ float run_time; /* 运行时间 */ float run_end_time; /* 运行结束时间 */ int priority; /* 优先级 */ int order; /* 运行次序 */ int flag; /* 调度标志 */ 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 9 页 - - - - - - - - - tasksMAX; int counter; /* 实际进程个数*/ int
6、 fcfs(); /* 先来先服务 */ /int rr(); /* 轮转调度 */ int ps(); /* 优先级调度 */ /*int mlqs(); /* 分级轮转调度*/*/ /*int mlfqs(); /* 分级反馈轮转调度*/*/ int sjf(); /* 短作业优先 */ int hrrn(); /* 响应比高优先 */ int pinput(); /* 进程参数输入*/ int poutput(); /* 调度结果输出*/ void main() int option; pinput(); while(1) printf( 请选择调度算法(07):n); printf(1
7、. 先来先服务 n); printf(2. 轮转调度 n); printf(3. 优先级调度 n); printf(4. 短作业优先 n); printf(5. 响应比高优先 n); printf(6. 分级轮转调度 n); printf(7. 分级反馈轮转调度n); printf(0. 退出 n); scanf(%d,&option); printf(%dn,option); switch (option) case 0: printf( 运行结束。 n); return; case 1: printf( 对进程按先来先服务调度。n); fcfs(); poutput(); break; c
8、ase 2: printf( 轮转调度。 n); printf( 感兴趣自己编!n); break; case 3: printf( 优先级调度。n); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 9 页 - - - - - - - - - ps(); poutput(); break; case 4: printf( 短作业优先。n); sjf(); poutput(); break; case 5: printf( 响应比高优先。n); hrrn(); poutp
9、ut(); break; case 6: printf( 分级轮转调度。n); printf( 感兴趣自己编!n); break; case 7: printf( 分级反馈轮转调度。n); printf( 感兴趣自己编!n); break; default: printf( 选择错误,请重选。n); break; int fcfs() /* 先来先服务 */ float time_temp=0; int i; time_temp=e_time; for(i=0;icounter;i+) tasksi.run_begin_time=time_temp; tasksi.run_end_time=t
10、asksi.run_begin_time+tasksi.run_time; tasksi.flag=1; time_temp=tasksi.run_end_time; tasksi.order=i+1; return 0; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 9 页 - - - - - - - - - int ps() /* 优先级调度 */ float temp_time=0; int i=0,j; int number_schedul,temp_count
11、er; int max_priority; max_priority=tasksi.priority; j=1; while (jtasksi.priority) ) max_priority=tasksi.priority; i=j; j+; /* 查找第一个被调度的进程*/ /* 对第一个被调度的进程求相应的参数*/ number_schedul=i; tasksnumber_schedul.run_begin_time=tasksnumber_e_time; tasksnumber_schedul.run_end_time=tasksnumber_schedul.run_begin_ti
12、me+tasksnumber_schedul.run_time; tasksnumber_schedul.flag=1; temp_time=tasksnumber_schedul.run_end_time; tasksnumber_schedul.order=1; temp_counter=1; while (temp_countercounter) max_priority=0; j=0,i=0; while(jcounter) if(!(tasksj.flag)& (e_time max_priority) max_priority=tasksj.priority; i=j; j+; /
13、* 查找下一个被调度的进程*/ /* 对找到的下一个被调度的进程求相应的参数*/ number_schedul=i; tasksnumber_schedul.run_begin_time=temp_time; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 9 页 - - - - - - - - - tasksnumber_schedul.run_end_time=tasksnumber_schedul.run_begin_time+tasksnumber_schedul
14、.run_time; tasksnumber_schedul.flag=1; temp_time=tasksnumber_schedul.run_end_time; temp_counter+; tasksnumber_schedul.order=temp_counter; return 0; /* 短作业优先 */ int sjf() float run_time,temp_time=0; int i=0,j,number_schedul,temp_counter; run_time=tasksi.run_time; j=1; while (jcounter) if(e_time=e_tim
15、e)& (tasksj.run_timetasksi.run_time) ) run_time=tasksi.run_time; i=j; j+; /* 查找第一个被调度的进程*/ /* 对第一个被调度的进程求相应的参数*/ number_schedul=i; tasksnumber_schedul.run_begin_time=tasksnumber_e_time; tasksnumber_schedul.run_end_time=tasksnumber_schedul.run_begin_time+tasksnumber_schedul.run_time; tasksnumber_sche
16、dul.flag=1; temp_time=tasksnumber_schedul.run_end_time; tasksnumber_schedul.order=1; temp_counter=1; while (temp_countercounter) number_schedul =0; while (number_schedul counter)&(tasksnumber_schedul.flag) number_schedul +; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - -
17、- 第 6 页,共 9 页 - - - - - - - - - run_time=tasksnumber_schedul.run_time; j=0; while (jcounter) if (!tasksj.flag)& (e_time=temp_time)&(tasksj.run_timerun_time) run_time=tasksj.run_time; number_schedul=j; j+; /* 查找下一个被调度的进程*/ /* 对找到的下一个被调度的进程求相应的参数*/ tasksnumber_schedul.run_begin_time=temp_time; tasksnu
18、mber_schedul.run_end_time=tasksnumber_schedul.run_begin_time+tasksnumber_schedul.run_time; tasksnumber_schedul.flag=1; temp_time=tasksnumber_schedul.run_end_time; temp_counter+; tasksnumber_schedul.order=temp_counter; return 0; int hrrn() /*响应比高优先 */ int j,number_schedul,temp_counter; float temp_tim
19、e,respond_rate,max_respond_rate; /* 第一个进程被调度*/ tasks0.run_begin_time=e_time; tasks0.run_end_time=tasks0.run_begin_time+tasks0.run_time; temp_time=tasks0.run_end_time; tasks0.flag=1; tasks0.order=1; temp_counter=1; /* 调度其他进程*/ while(temp_countercounter) max_respond_rate=0; for(j=0; jcounter ;j+) if(e
20、_timemax_respond_rate) max_respond_rate=respond_rate; number_schedul=j; /* 找响应比高的进程*/ tasksnumber_schedul.run_begin_time=temp_time; tasksnumber_schedul.run_end_time=tasksnumber_schedul.run_begin_time+tasksnumber_schedul.run_time; temp_time=tasksnumber_schedul.run_end_time; tasksnumber_schedul.flag=1
21、; temp_counter+=1; tasksnumber_schedul.order=temp_counter; return 0; int pinput() /* 进程参数输入*/ int i; printf( 请输入进程个数:); scanf(%d,&counter); for(i=0;icounter;i+) printf( 请输入进程名:); scanf(%s,tasksi.name); printf( 请输入进程号:); scanf(%d,&tasksi.number); printf( 请输入到达时间:); scanf(%f,&e_time); printf( 请输入运行时间:
22、); scanf(%f,&tasksi.run_time); printf( 请输入优先级:); scanf(%d,&tasksi.priority); tasksi.run_begin_time=0; tasksi.run_end_time=0; tasksi.order=0; tasksi.flag=0; return 0; int poutput() /* 调度结果输出*/ 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 9 页 - - - - - - - - -
23、int i; float turn_round_time=0,f1,w=0; printf( 进程进程到达开始运运行运行结优先执行周转带权周n); printf( 名号时间行时刻时间束时刻级次序时间周时间 n ); for(i=0;icounter;i+) f1=tasksi.run_end_time-e_time; turn_round_time+=f1; w+=(f1/tasksi.run_time); if(i=0) printf(n); printf( %s %d %5.2f %5.2f %5.2f %5.2f %d %d %5.2f %5.2fn,tasksi.name, tasks
24、i.number,e_time,tasksi.run_begin_time, tasksi.run_time,tasksi.run_end_time,tasksi.priority, tasksi.order,f1, f1/tasksi.run_time); printf( 平均周转时间 =%5.2fn,turn_round_time/counter); printf( 平均带权周转时间=%5.2fn,w/counter); return 0; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 9 页 - - - - - - - - -