操作系统实验报告
97. insert(int q) 98. { 99. int p,s; 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. } 110. insert2() 111. { 112. 113. 114. 115. } 116. 117. init() 118. { 119. 120. 121. 122. 123. 124. 125. int i; head=0; if (algo==2) { } p=head;
prochain[tail].next=run; tail=run; prochain[run].next=0;
/*CREATE A WAITING QUEUE*/
进程时 间片数 为 0?
否
优先数 大于链 首进程?
占用处 理机时 间片到?
否
进程时 间片数 为 0?
是 撤消该进程 从链首取一个 进程投入运行 否 进程队列空? 是 结束
否 运行进程退出,按 优先数插入进程链
是 运行进程退出, 排到进程链尾部
是 撤消该进程 从链首取一个 进程投入运行 否
进程队列空? 是 结束 图 2-2 进程调度框图
13. }[furthest-1];
18. main()
32. 33. 34. 35. 36. 37. 38. 39. } 40. 41. { 42. 43. } 44. 45. 46. { 47. 48. } 49. 50. 51. 52. } 53. print() 54. 55. { 56. int k,p; 57. 58. 59. 60. 61. 62. 63. 64. { 65. 66. 67. } 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. } }else {
for (k=1;k<=40;k++) printf("="); printf("\nrunning proc. printf("waiting queue."); printf("\n p=head; while(p!=0) printf("%5d",p); p=prochain[p].next; printf("\n"); for (k=1;k<=40;k++) printf("="); printf("\n"); printf(" id "); for (k=1;k<furthest+1;k++) printf("%5d",prochain[k].id); printf("\n"); printf("priority "); for (k=1;k<furthest+1;k++) printf("%5d",prochain[k].priority); %d ",prochain[run].id); ");
79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. }
printf("\n"); printf("cputime "); for (k=1;k<furthest+1;k++) printf("%5d",prochain[k].cputime); printf("\n"); printf("alltime "); for (k=1;k<furthest+1;k++) printf("%5d",prochain[k].alltime); printf("\n"); printf("state "); for (k=1;k<furthest+1;k++) printf("%5c",prochain[k].state); printf("\n"); printf("next "); for (k=1;k<furthest+1;k++) printf("%5d",prochain[k].next); printf("\n"); /*INSERT A PROCESS*/
2. 熟悉系统实用程序的调用方法和各种系统调用模块的功能和作用 二、内容
(一)实验步骤 在某种操作系统的环境下建立、修改、运行、打印源程序和结果,最后撤消一个完整的程序。 提示:可按下述步骤进行 1. 编写一个完整的源程序,通过编辑命令送入机器,建立源程序文件; 2. 编译该源文件,建立相应的目标文件; 3. 编译有错时,再用编辑命令修改源文件,消除全部词法和语法错误; 4. 连接目标文件,形成可执行文件; 5. 执行该文件,得到结果; 6. 打印输出源程序和运行结果; 7. 撤消本次实验中形成的所有文件。 (二)实验内容 1,在 vc++中输入 #include <stdio.h> #include <conio.h> int main() { int l; printf("岳智岫操作系统实验报告!\n"); printf("简单加法运算 \n"); printf("输入一个数:"); scanf("%d",&l); l=l++; printf("加一以后得:%d \n",&l);
《操作系统 B》 实验报告
学院:软件学院 专业:计算机科学与技术 姓名:岳智岫 班级:软件 1214 班 学号:2012005361 指导教师:杨丽凤 时间: 2014 年 11 月
实验一
一、目的和要求
(一)目的
几种操作系统的界面
本实验的目的是使学生熟悉 1—2 种操作系统的界面,在熟练使用机器的基础上,能了解各种 操作命令和系统调用在系统中的大致工作过程。 也就是通过操作系统的外部特征, 逐步深入到操作 系统的内部实质内容中去。 (二)要求 1. 能熟练的在 1—2 种操作系统的环境下工作,学会使用各种命令,熟悉系统提供的各种功 能,主动而有效地使用计算机。
开始 输入调度算法 alog priority alog=priority/round robin? 生成并按优先数大小 排列进程控制块链 链首进程投入运行 生成并按进入次序 排列进程控制块链 链首进程投入运行 round robin
时间片到,进程时间片 数减 1,优先数减 3 是 否
时间片到,进程时间片数 减 1,占用 CPU 时间加 1
二、实验内容
(一) 实验原理 1. 本程序可选用优先数法或简单轮转法对五个进程进行调度。每个进程处于运行 R(run)、 就绪 W(wait)和完成 F(finish)三种状态之一,并假定起始状态都是就绪状态 W。 为了便于处理,程序中进程的运行时间以时间片为单位计算。各进程的优先数或轮转时间片 数、以及进程需要运行的时间片数,均由伪随机数发生器产生。 进程控制块结构如表 2-1 所示:
s=prochain[head].next; while((prochain[q].priority<prochain[s].priority)&&(s!=0)) { p=s; s=prochain[s].next; prochain[p].next=q; prochain[q].next=s; /*PUT A PROCESS ONTO THE TAIL OF THE QUEUE*/
表 2-1 PCB 进程标识符 链指针 优先数/轮转时间片数 占用 CPU 时间片数 进程所需时间片数 进程状态
进程控制块链结构如图 2-1 所示:
RUN
1
HEAD
3
5
TAIL
2
0
┇ ┇ ┇ ┇
图 2-1
进程控制块链结构
其中:RUN—当前运行进程指针; HEAD—进程就绪链链首指针; TAIL—进程就绪链链尾指针。 2. 算法与框图 程序框图如图 2-2 所示。
(1)优先数法。 进程就绪链按优先数大小从大到小排列,链首进程首先投入运行。每过一个 时间片,运行进程所需运行的时间片数减 1,说明它已运行了一个时间片,优先数也减 3。理由是 该进程如果在一个时间片中完成不了, 优先级应降低一级。 接着比较现行进程和就绪链链首进程的 优先数,如果仍是现行进程高或者相同,就让现行进程继续运行,否则,调度就绪链链首进程投入 运行。原运行进程再按其优先数大小插入就绪链,且改变它们对应的进程状态,直至所有进程都运 行完各自的时间片数。 (2)简单轮转法。 进程就绪链按各进程进入的先后次序排列,链首进程首先投入运行。进程 每次占用处理机的轮转时间按其重要程度登入进程控制块中的轮转时间片数记录项 (相应于优先数 法的优先数记录项位置) 。每过一个时间片,运行进程占用处理机的时间片数加 1,然后比较占用 处理机的时间片数是否与该进程的轮转时间片数相等, 若相等说明已到达轮转时间, 应将现运行进 程排到就绪链末尾,调度链首进程占用处理机,且改变它们的进程状态,直至所有进程完成各自的 时间片。 (二) 实验步骤 1. 根据实验原理图设计调度源码,如下:
return 0; }
2,链接,形成可执行文件
3,实验结果
三、总结
1.本次实验用到的 软硬件是 Visual C++ 处理器:Intel(R) Core(TM) i5-3210M CPU @ 2.5GHz、 内存:4GB 硬盘大小:500GB 操作系统:Windows 7 旗舰版 2.本次试验要求也不是很明确,整个演示系统,自己不仅要考虑具体实现哪些功能,同时还要 考虑如何布局,便于实现一定程度上的交互性,而不是像以前得到固定结果,毫无交互性。 3.因此,在本次实验中,在程度构思及设计方面,得到了较大的锻炼,能力也得到了一定的提 高。