2016数媒操作系统课程设计-黄宇达2014329700042、沈宁2014329700046
浙江理工大学《操作系统课程设计》
课程设计报告
2016~2017学年第1学期
学院信息学院
班级14数字媒体技术2班
姓名黄宇达、沈宁
2014329700042
学号
2014329700046
任课教师桂宁
数字媒体技术专业
2017年1月
·用JAVA语言模仿“生产者—消费者问题”
1.通过Java语言中的wait()和notify()命令模拟操作系统中的P/V操作;
2.为每个生产者/消费者产生一个线程,设计正确的同步算法
3.每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的当前全部内容、
当前指针位置和生产者/消费者线程的自定义标识符。
4.生产者和消费者各有两个以上。
多个生产者或多个消费者之间须共享对缓冲区进行操作的函数代码。
三、源代码
1.基于java虚拟机的线程调度
/*起始化类*/
import java.util.ArrayList;
import java.util.List;
public class Process {
public static List
public static int task_num=5;//进程数
public static void init_task()//初始化进程列表
{
for(int i=0;i { double[] t=new double[4]; t[0]=i;//进程号 t[1]=0;//到达时间 t[2]=0;//响应比 t[3]=(int)(Math.random()*100)%20+1;//需要运行时间 task_info.add(t); } } public static void main(String arg[]) { Process.init_task();//初始化进程列表 System.out.println("\n\n==========================时间片轮转======================"); RR.init_task(task_info,task_num); RR.CircleTime();//时间片轮转 } } /*主类*/ import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.concurrent.ArrayBlockingQueue; /** * Created by 32706 on 2016/12/8. * 时间片轮转调度算法 */ public class RR { private static SimpleDateFormat tm= new SimpleDateFormat("HH:mm:ss"); private static int task_num=5; private static int Circle_size=4;//定义时间片大小 public static ArrayBlockingQueue task_q=new ArrayBlockingQueue(task_num);//进程队列 private static List public static void CircleTime() { try { while (true) { double[] t = new double[4]; t = (double[])task_q.take(); int current_task_time=(int)t[3]; int task_NO=(int)t[0]; System.out.print(tm.format(new Date())+"第" +task_NO+"号进程开始运行===="); if(current_task_time<=Circle_size)//如果能够在本时间片中运行完成 { Thread.sleep((long) current_task_time*1000);//模拟运行所需时间 System.out.println(tm.format(new Date())+"结束执行=====本次用时"+current_task_time+"S"); double[] exe_t=new double[2]; exe_t[0]=task_NO; exe_t[1]=System.currentTimeMillis()-t[1];//计算该进程所用的周转时间 execute_time.add(exe_t);//加入到周转时间队列 } else {//如果不能再本次时间片中运行完 t[3]=t[3]-Circle_size; task_q.put(t); Thread.sleep(Circle_size*1000); System.out.println(tm.format(new Date())+"本次时间片用完~~~~~进 程等待"); } if(task_q.size()==0)//如果进程队列为空了,就退出循环 break; } } catch (Exception e) { } show_time();//显示每个进程的调度时间 } public static void show_time()//显示每个进程的调度时间 { double sum_time=0; for(int i=0;i { double[] t=execute_time.get(i); System.out.println("task:"+t[0]+":周转时间="+(int)(t[1]/1000)+"S"); sum_time+=t[1]; } System.out.println("使用时间片轮转的策略,平均周转时间为:"+(int)(sum_time/execute_time.size()/1000)+"S"); } static void init_task(List { task_num=tn; for(int i=0;i { double [] t=in.get(i); t[1] = System.currentTimeMillis();//获得进程到达时间 try { task_q.put(t); } catch (InterruptedException e) { e.printStackTrace(); } } } } ·用JAVA语言模仿“生产者—消费者问题” import java.util.LinkedList; public class Storage { // 仓库最大存储量 private final int MAX_SIZE = 100; // 仓库存储的载体 private LinkedList // 生产num个产品 public void produce(int num) { // 同步代码段 synchronized (list) { // 如果仓库剩余容量不足 while (list.size() + num > MAX_SIZE) { System.out.println("【要生产的产品数量】:" + num + "/t【库存量】:" + list.size() + "/t暂时不能执行生产任务!"); try { // 由于条件不满足,生产阻塞 list.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } // 生产条件满足情况下,生产num个产品 for (int i = 1; i <= num; ++i) { list.add(new Object()); } System.out.println("【已经生产产品数】:" + num + "/t【现仓储量为】:" + list.size()); list.notifyAll(); } } // 消费num个产品 public void consume(int num) { // 同步代码段 synchronized (list) { // 如果仓库存储量不足 while (list.size() < num) { System.out.println("【要消费的产品数量】:" + num + "/t【库存量】:" + list.size() + "/t暂时不能执行生产任务!"); try { // 由于条件不满足,消费阻塞 list.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } // 消费条件满足情况下,消费num个产品 for (int i = 1; i <= num; ++i) { list.remove(); } System.out.println("【已经消费产品数】:" + num + "/t【现仓储量为】:" + list.size()); list.notifyAll(); } } // get/set方法 public LinkedList { return list; } public void setList(LinkedList { this.list = list; } public int getMAX_SIZE() { return MAX_SIZE; } } public class Producer extends Thread { // 每次生产的产品数量 private int num; // 所在放置的仓库 private Storage storage; // 构造函数,设置仓库 public Producer(Storage storage) { this.storage = storage; } // 线程run函数 public void run() { produce(num); } // 调用仓库Storage的生产函数 public void produce(int num) { storage.produce(num); } // get/set方法 public int getNum() { return num; } public void setNum(int num) { this.num = num; } public Storage getStorage() { return storage; } public void setStorage(Storage storage) { this.storage = storage; } } public class Consumer extends Thread { // 每次消费的产品数量 private int num; // 所在放置的仓库 private Storage storage; // 构造函数,设置仓库 public Consumer(Storage storage) { this.storage = storage; } // 线程run函数 public void run() { consume(num); } // 调用仓库Storage的生产函数 public void consume(int num) { storage.consume(num); } // get/set方法 public int getNum() { return num; } public void setNum(int num) { this.num = num; } public Storage getStorage() { return storage; } public void setStorage(Storage storage) { this.storage = storage; } } public class Test { public static void main(String[] args) { // 仓库对象 Storage storage = new Storage(); // 生产者对象 Producer p1 = new Producer(storage); Producer p2 = new Producer(storage); Producer p3 = new Producer(storage); Producer p4 = new Producer(storage); Producer p5 = new Producer(storage); Producer p6 = new Producer(storage); Producer p7 = new Producer(storage); // 消费者对象 Consumer c1 = new Consumer(storage); Consumer c2 = new Consumer(storage); Consumer c3 = new Consumer(storage); // 设置生产者产品生产数量 p1.setNum(10); p2.setNum(10); p3.setNum(10); p4.setNum(10); p5.setNum(10); p6.setNum(10); p7.setNum(80); // 设置消费者产品消费数量 c1.setNum(50); c2.setNum(20); c3.setNum(30); // 线程开始执行 c1.start(); c2.start(); c3.start(); p1.start(); p2.start(); p3.start(); p4.start(); p5.start(); p6.start(); p7.start(); } } 四、实验结果测试、收获与体会: 1.组内分工 黄宇达:主要负责用JA V A语言模仿“生产者—消费者问题”,进行工作安排,代码完善以及修改,完善实验报告。 沈宁:主要基于java虚拟机的线程调度。分析实验过程。代码完善以及修改。 小组答辩时间:1月6日 2.基于java虚拟机的线程调度 根据要求,设置了0~4五个进程。实时任务调度策略,时间片轮转。将时间片设置为4s。当任务的时间片用完,系统将重新分配时间片,并置于就绪队列尾。放在队列尾。 保证了所有具有相同优先级的RR任务的调度公平。 最终输出每个进程的周转时间和总平均周转时间。 设计思路主要围绕着时间片为中心,规划好进程列表,并随机生成每个进程完成所需要的时间。进行时间轮转。当时间片用完,将进程放置于就绪队列的尾部进行排列。 并用Thread.sleep将进程进行休眠,以达到真实的模拟效果。 在真实系统中这种调度策略是从所有处于就绪状态的线程中选择优先级最高的线程分配一定的CPU时间运行。该时间过后再选择其他线程运行。只有当线程运行结束、放弃(yield)CPU或由于某种原因进入阻塞状态,低优先级的线程才有机会执行。如果有两个优先级相同的线程都在等待CPU,则调度程序以轮转的方式选择运行的线程。 3用JAVA语言模仿“生产者—消费者问题” 实验结果演示: 首先在实验开始之前,必须搞清楚概念。 生产者消费者问题,也称有限缓冲问题,是一个多线程同步问题的经典案例。该问题描述了两个共享固定大小缓冲区的线程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。 生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。 该问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中空时消耗数据。 要解决这个问题,就必须让生产者在缓冲区满时休眠(要么干脆就放弃数据),等到下次消费者消耗缓冲区中的数据的时候,生产者才能被唤醒,开始往缓冲区添加数据。同样,也可以让消费者在缓冲区空时进入休眠,等到生产者往缓冲区添加数据之后,再唤醒消费者。 当概念清楚之后,设计思路也就很清晰了。我们需要的是一个虚拟的缓冲区,并且要有一定量的消费者和生产者来对缓冲区添加数据和消耗数据。 课程设计报告 2015~2016学年第一学期 操作系统综合实践课程设计 实习类别课程设计 学生姓名李旋 专业软件工程 学号130521105 指导教师崔广才、祝勇 学院计算机科学技术学院 二〇一六年一月 - 1 - - 2 - 一、概述 一个目录文件是由目录项组成的。每个目录项包含16B,一个辅存磁盘块(512B)包含32个目录项。在目录项中,第1、2字节为相应文件的外存i节点号,是该文件的内部标识;后14B为文件名,是该文件的外部标识。所以,文件目录项记录了文件内、外部标识的对照关系。根据文件名可以找到辅存i节点号,由此便得到该文件的所有者、存取权、文件数据的地址健在等信息。UNIX 的存储介质以512B为单位划分为块,从0开始直到最大容量并顺序加以编号就成了一个文件卷,也叫文件系统。UNIX中的文件系统磁盘存储区分配图如下: 本次课程设计是要实现一个简单的模拟Linux文件系统。我们在内存中开辟一个虚拟磁盘空间(20MB)作为文件存储器,并将该虚拟文件系统保存到磁盘上(以一个文件的形式),以便下次可以再将它恢复到内存的虚拟磁盘空间中。文件存储空间的管理可采用位示图方法。 二、设计的基本概念和原理 2.1 设计任务 多用户、多级目录结构文件系统的设计与实现。可以实现下列几条命令login 用户登录 logout 退出当前用户 dir 列文件目录 creat 创建文件 delete 删除文件 open 打开文件 close 关闭文件 - 3 - read 读文件 write 写文件 mkdir 创建目录 ch 改变文件目录 rd 删除目录树 format 格式化文件系统 Exit 退出文件系统 2.2设计要求 1) 多用户:usr1,usr2,usr3,……,usr8 (1-8个用户) 2) 多级目录:可有多级子目录; 3) 具有login (用户登录)4) 系统初始化(建文件卷、提供登录模块) 5) 文件的创建:create (用命令行来实现)6) 文件的打开:open 7) 文件的读:read8) 文件的写:write 9) 文件关闭:close10) 删除文件:delete 11) 创建目录(建立子目录):mkdir12) 改变当前目录:cd 13) 列出文件目录:dir14) 退出:logout 新增加的功能: 15) 删除目录树:rd 16) 格式化文件系统:format 2.3算法的总体思想 - 4 - 题目1 连续动态内存管理模拟实现 1.1 题目的主要研究内容及预期达到的目标 (1)针对操作系统中内存管理相关理论进行设计,编写程序并进行测试,该程序管理一块虚拟内存。重点分析三种连续动态内存分配算法,即首次适应算法、循环首次适应算法和最佳适应算法。 (2)实现内存分配和回收功能。 1.2 题目研究的工作基础或实验条件 (1)硬件环境:PC机 (2)软件环境:Windows XP,Visual C++ 6.0 1.3 设计思想 首次适应算法的实现:从空闲分区表的第一个表目起查找该表,把最先能够满足要求的空闲区分配给作业,这种方法的目的在于减少查找时间。为适应这种算法,空闲分区表中的空闲分区要按地址由低到高进行排序。该算法优先使用低址部分空闲区,在低址空间造成许多小的空闲区,在高址空间保留大的空闲区。 循环首次适应算法的实现:在分配内存空间时,不再每次从表头开始查找,而是从上次找到空闲区的下一个空闲开始查找,直到找到第一个能满足要求的的空闲区为止,并从中划出一块与请求大小相等的内存空间分配给作业。该算法能使内存中的空闲区分布得较均匀。 最佳适应算法的实现:从全部空闲区中找到能满足作业要求的、且最小的空闲分区,这种方法能使碎片尽量小。为适应此算法,空闲分区表中的空闲分区要按从小到大进行排序,从表头开始查找第一个满足要求的自由分配。 1.4 流程图 内存分配流程图,如图1-1所示。 图1-1 内存分配流程图内存回收流程图,如1-2所示。 图1-2 内存回收流程图 1.5 主要程序代码 (1)分配内存 void allocate(char z,float l) { int i,k; float ad; k=-1; for(i=0;i 操作系统课程设计报告 ——页式存储 姓名:陈锡鹏 班级:J计算机1302 学号:4131110044 指导老师:刘金平 日期:2016/1/12 一、目的和要求 1.理解页式存储的基本概念 2.通过请求页式存储管理中页面置换算法模拟设计,了解虚拟存储技术的特 点,掌握请求页式存储管理的页面置换算法。 3. 3.根据模拟的页式管理设计,掌握在页式存储管理中最基本的两种种页面 调度算法FIFO、LRU。但在两种种算法中均要求在调度程序中产生的页面序列是随机产生的,而不是人为的输入,在执行时只需改变页面的大小及内存容量就可以得到不同的页面序列,另外还需要说明随机的性能和其性能可能对算法的影响,并对随机性要有一定的参数控制能力。此外,计算并输出FIFO、LRU算法在不同内存容量下的命中率。 具体参数:访问串的长度,访问串,页面个数。 分别用2种不同的方法实现页面的置换,并输出相关信息。 二、基本原理 1.页式存储基本原理 将各进程的虚拟空间划分成若干个长度相等的页(page),页式管理把内存空间按页的大小 划分成片或者页面(page frame),然后把页式虚拟地址与内存地址建立一一对应页表,并用相应的硬件地址变换机构,来解决离散地址变换问题。页式管理采用请求调页或 预调页技术实现了内外存储器的统一管理。 页的划分: 2.静态/虚拟分页管理 页式管理是一种内存空间存储管理的技术,页式管理分为静态分页管理和虚拟分页管理。 ①静态页式存储管理: 用户在作业开始执行之前,讲改作业的程序和数据全部装入到主存中,然后,操作系统统通过页表和硬件地址变换实现逻辑地址到屋里地址的转换,从而执行用户程序。 静态分页管理的第一步是为要求内存的作业或进程分配足够的页面。系统通过存储页面表、请求表以及页表来完成内存的分配工作。 页表:内存中的一块固定存储区。页式管理时每个进程至少有一个页表。 请求表:用来确定作业或进程的虚拟空间的各页在内存中的实际对应位置; 存储页面表:整个系统有一个存储页面表,其描述了物理存储空间的分配使用状况。 ②虚拟页式存储管理 当系统在运行时,经常会出现主存容量不能满足用户程序的要求,一种解决方法是:从逻辑上扩充主存的容量。这便是虚拟存储技术。 操作系统课程设计报告 东莞理工学院 操作系统课程设计报告 学院:计算机学院 专业班级: 13软件工程1班 提交时间: 2015/9/14 指导教师评阅意见: . 项目名称:进程与线程管理功能 一、设计目的 用语言来模拟进程和线程管理系统,加深对进程和线程的理解,掌握对进程和线程各种状态和管理的算法原理。 二、环境条件 系统: WindowsXP、VMWare、Ubuntu Linux 语言:C/C++ 开发工具:gcc/g++、Visual C++ 6.0 三、设计内容 1. 项目背景 计算机的硬件资源有限,为了提高内存的利用率和系统的吞吐量,就要根据某种算法来管理进程和线程的状态从而达到目的。 进程与线程管理功能完成基于优先级的抢占式线程调度功能,完成进程虚拟内存管理功能。 进程与线程管理功能 基本要求:完成基于优先级的抢占式线程调度功能,完成进程虚拟内存管理功能。 提高要求:(增加1项就予以加分) (1) 实现多种线程调度算法; (2)通过“公共信箱”进行通信的机制,规定每一封信的大小为128字节,实现两个用户进程之间通过这个“公共信箱”进行通信。 (3) 实现多用户进程并发的虚拟内存管理功能。 (4) 实现用户进程间通信功能,并用生产者/消费者问题测试进程间通信功能的正确性。 (5) 实现改进型Clock页面置换算法。 (6) 实现Cache功能,采用FIFO替换算法。 2. 扩展内容 实现多种线程调度算法:时间片轮转调度算法 四、人员分工 优先级调度算法:钟德新,莫友芝 时间片轮转调度算法:张德华,袁马龙 设计报告由小组队员共同完成。小组成员设计的代码分工如下:钟德新编写的代码:void Prinft(){ PCB *p; system("cls");//清屏 p=run; //运行队列 if(p!=NULL) { p->next=NULL; } cout<<"当前正在运行的进程:"< 操作系统课程设计LRU页面调度算法 学号: 姓名: 学院: 专业: 班级: 指导老师: 日期: 目录 一、实验题目 (1) 二、课程设计的目的 (1) 三、设计内容 (1) 四、设计要求 (1) 五、设计思想 (1) 六、主要数据结构及其说明 (2) 七、硬件支持 (3) 八、源程序文件 (3) 九、程序运行结果 (7) 十、实验体会 (8) 一实验题目 LRU页面调度算法 二课程设计的目的 操作系统课程设计是计算机专业重要的教学环节,它为学生提供了一个既动手又动脑,将课本上的理论知识和实际有机的结合一起,独立分析和解决实际问题的机会。 1.进一步巩固和复习操作系统的基础知识。 2. 培养学生结构化程序、模块化程序设计的方法和能力。 3.提高学生调试程序的技巧和软件设计的能力。 4.提高学生分析问题、解决问题以及综合利用C语言进行程序设计的能力。 三设计内容 程序应模拟实现LRU算法思想,对n个页面实现模拟调度。 四设计要求 1.不同的功能使用不同的函数实现(模块化),对每个函数的功能和调用接口要注释清楚。对程序其它部分也进行必要的注释。 2.对系统进行功能模块分析、画出总流程图和各模块流程图。 3.用户界面要求使用方便、简洁明了、美观大方、格式统一。所有功能可以反复使用,最好使用菜单。 4.通过命令行相应选项能直接进入某个相应菜单选项的功能模块。 5.所有程序需调试通过。 五设计思想 最近最久未使用(LRU)页调度算法是选择最近最久未使用的页面予以淘汰。 算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间,当所要访问的页面在内存块中时,就不淘汰页面,否则,淘汰页面中时间最长的,即淘汰最近最久未使用的页面。 上海电力学院 计算机操作系统原理 课程设计报告 题目名称:编写程序模拟虚拟存储器管理 姓名:杜志豪.学号: 班级: 2012053班 . 同组姓名:孙嘉轶 课程设计时间:—— 评语: 成绩: 目录 一、设计内容及要求 (4) 1. 1 设计题目 (4) 1.2 使用算法分析: (4) 1. FIFO算法(先进先出淘汰算法) (4) 1. LRU算法(最久未使用淘汰算法) (5) 1. OPT算法(最佳淘汰算法) (5) 分工情况 (5) 二、详细设计 (6) 原理概述 (6) 主要数据结构(主要代码) (6) 算法流程图 (9) 主流程图 (9) Optimal算法流程图 (10) FIFO算法流程图 (10) LRU算法流程图 (11) .1源程序文件名 (11) . 2执行文件名 (11) 三、实验结果与分析 (11) Optimal页面置换算法结果与分析 (11) FIFO页面置换算法结果与分析 (16) LRU页面置换算法结果与分析 (20) 四、设计创新点 (24) 五、设计与总结 (27) 六、代码附录 (27) 课程设计题目 一、设计内容及要求 编写程序模拟虚拟存储器管理。假设以M页的进程分配了N 块内存(N 操作系统实验报告附思 考题 文档编制序号:[KKIDT-LLE0828-LLETD298-POI08] 课程设计(综合实验)报告 ( 2015 -- 2016 年度第 1 学期) 名称:操作系统综合实验 题目: oslab综合实验 院系:计算机系 班级: 学号: 学生姓名: 指导教师: 设计周数:分散进行 成绩: 日期: 2015 年 10 月 29 日 实验1 实验环境的使用 一、综合实验的目的与要求 熟悉操作系统集成实验环境OS Lab 的基本使用方法。 练习编译、调试EOS 操作系统内核以及EOS 应用程序。 二、实验正文 1.启动 OS Lab 执行项目 Windows 控制台窗口内容显示 调试项目 使用断点中断执行 单步调试 .3单步调试结果显示: 练习使用“逐语句”功能和“跳出”功能 查看变量的值 快速监视 添加监视 调用堆栈 调用堆栈显示内容 进入Func 函数 双击 main 函数所在的行表示此函数是当前调用堆栈中的活动函数。 3 新建EOS 内核项目 4 EOS 应用程序项目的生成和调试 新建EOS 应用程序项目 调试项目 添加断点后单步调试结果显示 查看软盘镜像文件中的内容 修改EOS 应用程序项目名称 5 退出OS Lab 6 保存EOS 内核项目 三、综合实验总结或结论 思考与练习: 1.在哪些情况下应该使用“逐过程”调试,在哪些情况下应该使用“逐语句”调试。 答:逐语句为每执行一行语句,如果碰到函数调用它就会进入到函数里面。而逐过程碰到函数时不进入函数,把函数调用当成一条语句去执行。 2. 生成EOS SDK 文件夹的目的和作用。明白文件夹的组织结构和各个文件的来源和作用。查看EOS 应用程序包含了SDK 文件夹中的哪些头文件,是如何包含的 (1)EOSSDK为应用程序调用系统API提供服务,可作为用户编程中使用的工具包集合。(2)其主要包括INC头文件LIB文件夹、导入库文件和BIN文件夹、动态链接库、可执行程序、二进制文件。 (3)包含的头文件有:负责导出API函数,声明负责导出函数类型的定义,负责导出错误码。 (4)EOS应用程序在项目的头文件中只是包含了文件,在文件中又包含了和文件。 实验 2 操作系统的启动 一、综合实验的目的与要求 跟踪调试 EOS 在 PC 机上从加电复位到成功启动全过程,了解操作系统的启动过程。 查看 EOS 启动后的状态和行为,理解操作系统启动后的工作方式。 二、实验正文 1. 准备实验 新建一个 EOS Kernel 项目。打开和两个汇编文件。生成项目。找到文件,记录下此文件的大小 1566 字节。 2 调试 EOS 操作系统的启动过程 使用 Bochs 做为远程目标机 找到“远程目标机”属性,将此属性值修改为“BochsDebug” 调试 BIOS 程序 在 Console 窗口中输入调试命令 sreg 后按回车,其中 CS 寄存器信息行中的 “ s=0xf000”表示 CS 寄存器的值为 0xf000。 输入调试命令 r 后按回车,显示当前 CPU 中各个通用寄存器的值。其中 “ rip:0x00000000:0000fff0”表示 IP 寄存器的值为 0xfff0。 输入调试命令 xp /1024b 0x0000,查看开始的 1024 个字节的物理内存。在 Console 中输出的这1K 物理内存的值都为 0,说明 BIOS 中断向量表还没有被加载到此处。 输入调试命令 xp /512b 0x7c00,查看软盘引导扇区应该被加载到的内存位置。输出的内存值都为 0,说明软盘引导扇区还没有被加载到此处。 可以验证 BIOS 第一条指令所在逻辑地址中的段地址和 CS 寄存器值是一致的,偏移地址和 IP 寄存器值是一致的。由于内存还没有被使用,所以其中的值都为 0。 调试软盘引导扇区程序 课程设计说明书 设计题目:操作系统课程设计 班级:信息学管理与信息系统2011级 学号: 2 姓名:克乾 山东科技大学2013年12 月11 日 课程设计任务书 学院信息科学与工程专业信息学管理与信息系统班级2011-2 克乾 一、课程设计题目:操作系统课程设计 二、课程设计主要参考资料 (1)Abraham Silberschatz & Peter Baer Galvin & Greg Gagne. Operating System Concepts(第七版影印版). 高等教育. 2007.3. (2)c++面向对象程序设计电子工业 (3)计算机操作系统(第三版)电子科技大学 三、课程设计应解决的主要问题: (1)CPU调度算法的模拟实现 (2)死锁相关算法的实现 (3)磁盘调度算法的实现 四、课程设计相关附件(如:图纸、软件等): (1)程序源代码 (2) 五、任务发出日期:2013-10-1 课程设计完成日期:2014-1-1 指导教师签字: 指导教师对课程设计的评语成绩: 指导教师签字: 年月日 设计1 CPU调度算法的模拟实现一、设计目的 利用C++编写CPU调度算法,实现先来先服务调度算法FCFS、优先级调度算法PS、短作业优先调度算法SJF、时间片轮转调度算法RR的运行过程和实现的结果,针对模拟进程,利用编写的CPU调度算法对需要运行的进程进行调度。进行算法评价,计算平均周转时间和平均等待时间。 二、设计要求 针对模拟进程,利用CPU调度算法进行调度,最后要进行算法评价,计算平均周转时间和平均等待时间,并且输出调度结果和输出算法评价指标。 调度所需的进程参数由输入产生(手工输入或者随机数产生)。 三、设计说明 时间片轮转算法需要输入相应的时间片,所以独立编写一个程序,系统主体结构如下: Linux操作系统课程设计任务书 一、设计题目 每个人完成在linux上面的J2EE环境部署,并且开发出简单的个人网站(基于J2EE)。 二、设计目的 Linux操作系统课程设计是信息管理类专业的集中实践性环节之一,是学习完《Linux操作系统》课程后进行的一次全面的综合练习。其目的在于加深对Linux操作系统的基础理论和基本知识的理解,在此基础上掌握linux环境下部署与开发软件系统的能力(基于J2EE),提高在Linux操作系统上解决实际问题的能力。 三、设计任务 每人需单独完成,严禁抄袭 四、时间安排 五、设计内容 分为多个步骤。 1、在linux上部署jdk。参考步骤如下: Step1: # 将解压好的jdk1.7.0_04文件夹用最高权限复制到/usr/lib/jvm目录里 sudocp -r ~/jdk1.7.0_04/ /usr/lib/jvm/ Step2: # 配置环境变量 sudogedit ~/.profile 在末尾加上: export JAVA_HOME=/usr/lib/jvm/jdk1.7.0_04 然后保存关闭,使用source更新下 $ source ~/.profile 使用env命令察看JAVA_HOME的值 $ env 如果JAVA_HOME=/usr/lib/jvm/jdk1.7.0_04,说明配置成功。 Step3: # 将系统默认的jdk修改过来 $ sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk1.7.0_04/bin/java 300 输入sun jdk前的数字就好了 $ sudo update-alternatives --install /usr/bin/javacjavac /usr/lib/jvm/jdk1.7.0_04/bin/javac 300 $ sudo update-alternatives --config java $ sudo update-alternatives --configjavac Step4: 然后再输入java -version,看到如下信息,就说明改成sun的jdk了: java version "1.7.0_04" Java(TM) SE Runtime Environment (build 1.7.0_04-b20) Java HotSpot(TM) Server VM (build 23.0-b21, mixed mode) 2、安装部署Mysql,源码安装方式参考步骤如下,也可以下载安装包,此安装相对简单。 (1) -------------预备工作---------- 1:假如下载的文件名为:mysql-5.0.45.tar.gz 2:假如copy到/home下 3:groupaddmysql #添加mysql组 4:useradd -gmysqlmysql #添加一个mysql用户 5:cd /home #进入到该目录 -----------------------编译过程----------------------- 6:tar zxvf mysql-5.0.45.tar.gz #解压后,在该目录下会出现一个同名的文件夹 7:cd /home/mysql-5.0.45 8:./configure --prefix=/usr/local/mysql --with-charset=utf8 --with-collation=utf8_general_ci --with-extra-charsets=latin1 #参数设置,可以先不明白,以后再修改配置 9:make 10:make install 东莞理工学院 操作系统课程设计报告学院:计算机学院 专业班级:13软件工程1班 提交时间:2015/9/14 指导教师评阅意见: . 项目名称:进程与线程管理功能 一、设计目的 用语言来模拟进程和线程管理系统,加深对进程和线程的理解,掌握对进程和线程各种状态和管理的算法原理。 二、环境条件 系统:WindowsXP、VMWare、Ubuntu Linux 语言:C/C++ 开发工具:gcc/g++、Visual C++ 6.0 三、设计内容 1. 项目背景 计算机的硬件资源有限,为了提高内存的利用率和系统的吞吐量,就要根据某种算法来管理进程和线程的状态从而达到目的。 进程与线程管理功能完成基于优先级的抢占式线程调度功能,完成进程虚拟内存管理功能。 进程与线程管理功能 基本要求:完成基于优先级的抢占式线程调度功能,完成进程虚拟内存管理功能。 提高要求:(增加1项就予以加分) (1) 实现多种线程调度算法; (2)通过“公共信箱”进行通信的机制,规定每一封信的大小为128字节,实现两个用户进程之间通过这个“公共信箱”进行通信。 (3) 实现多用户进程并发的虚拟内存管理功能。 (4) 实现用户进程间通信功能,并用生产者/消费者问题测试进程间通信功能的正确性。 (5) 实现改进型Clock页面置换算法。 (6) 实现Cache功能,采用FIFO替换算法。 2. 扩展内容 实现多种线程调度算法:时间片轮转调度算法 四、人员分工 优先级调度算法:钟德新,莫友芝 时间片轮转调度算法:张德华,袁马龙 设计报告由小组队员共同完成。小组成员设计的代码分工如下: 钟德新编写的代码:void Prinft(){ PCB *p; system("cls");//清屏 p=run; //运行队列 if(p!=NULL) { p->next=NULL; } cout<<"当前正在运行的进程:"< 湖南科技大学计算机科学与工程学院 操作系统课程设计报告 ******** *** 目录 实验一 Windows 进程管理 实验二 Linux 进程管理 实验三 互斥与同步 实验四 银行家算法的模拟与实现 实验五 内存管理 指导老师: *** 完成时间: **** ** ** 实验六磁盘调度 实验七进程间通信 实验一 Windows进程管理 一、实验目的 1 )学会使用VC编写基本的Win3 2 Consol Application (控制台应用程序)。 2)2)通过创建进程、观察正在运行的进程和终止进程的程序设计和调试操作,进一步熟 悉操作系统的进程概念,理解Windows进程的"一生”。 3)3)通过阅读和分析实验程序,学习创建进程、观察进程、终止进程以及父子进程同步 的基本程序设计方法。 二、实验内容和步骤 (1)编写基本的 Win32 Consol Application 步骤1:登录进入 Windows系统,启动VC++ 6.0。 步骤2:在“ FILE”菜单中单击“ NEW”子菜单,在“ projects ”选项卡中选择 “Win32 ConsolApplication ”,然后在“ Project name 处输入工程名,在“Location ”处输入工程目录。创建一个新的控制台应用程序工程。 步骤3:在“ FILE”菜单中单击“ NEW”子菜单,在“ Files ”选项卡中选择“ C++ Source File ” ,然后在“ File ”处输入C/C++源程序的文件名。 步骤4:将清单1-1所示的程序清单复制到新创建的C/C++源程序中。编译成可执行文件。 步骤5 :在“开始”菜单中单击“程序” -“附件”-“命令提示符”命令,进入Windows“命令提示符”窗口,然后进入工程目录中的 debug子目录,执行编译好的可执行程序,列出运行结果(如果运行不成功,则可能的原因是什么?) 如果运行不成功可能是路径有问题或者没有通过编译。 操作系统实验报告 实验一:用户接口实验 一.实验目的 1.理解面向操作命令的接口Shell。 2.学会简单的shell编码。 3.理解操作系统调用的运行机制。 4.掌握创建系统调用的方法。 操作系统给用户提供了命令接口和程序接口(系统调用)两种操作方式。用户接口实验也因此而分为两大部分。首先要熟悉Linux的基本操作命令,并在此基础上学会简单的shell编程方法。然后通过想Linux内核添加一个自己设计的系统调用,来理解系统调用的实现方法和运行机制。在本次实验中,最具有吸引力的地方是:通过内核编译,将一组源代码变成操作系统的内核,并由此重新引导系统,这对我们初步了解操作系统的生成过程极为有利。 二.实验内容 1)控制台命令接口实验 该实验是通过“几种操作系统的控制台命令”、“终端处理程序”、“命令解释程序”和“Linux操作系统的bash”来让实验者理解面向操作命令的接口shell 和进行简单的shell编程。 查看bash版本。 编写bash脚本,统计/my目录下c语言文件的个数 2)系统调用实验 该实验是通过实验者对“Linux操作系统的系统调用机制”的进一步了解来理解操作系统调用的运行机制;同时通过“自己创建一个系统调用mycall()” 和“编程调用自己创建的系统调用”进一步掌握创建和调用系统调用的方法。 编程调用一个系统调用fork(),观察结果。 编程调用创建的系统调用foo(),观察结果。 自己创建一个系统调用mycall(),实现功能:显示字符串到屏幕上。 编程调用自己创建的系统调用。 三.实验步骤 系统调用实验: 1.首先将Linux-3.0.tar.bz2拷贝到/usr/src目录下 ——命令:cp linux-3.0.tar.bz2 /usr/src/ 2.打开终端,获得root权限 ——命令:sudo –s 3.进入/usr/src目录 ——命令:cd /usr/src 4.解压linux源码 ——命令:tar xvzf linux-3.0.tar.bz2 5.进入目录linux-3.0.5 ——命令:cd linux-3.0 6.添加系统调用 ——操作:gedit kernel/myservice.c 在文本编辑器中添加 #include 东莞理工学院 操作系统课程设计报告 学院:计算机学院 专业班级:13软件工程1班 提交时间:2015/9/14 指导教师评阅意见: . 项目名称:进程与线程管理功能 一、设计目的 用语言来模拟进程和线程管理系统,加深对进程和线程的理解,掌握对进程和线程各种状态和管理的算法原理。 二、环境条件 系统:WindowsXP、VMWare、Ubuntu Linux 语言:C/C++ 开发工具:gcc/g++、Visual C++ 6.0 三、设计内容 1. 项目背景 计算机的硬件资源有限,为了提高内存的利用率和系统的吞吐量,就要根据某种算法来管理进程和线程的状态从而达到目的。 进程与线程管理功能完成基于优先级的抢占式线程调度功能,完成进程虚拟内存管理功能。 进程与线程管理功能 基本要求:完成基于优先级的抢占式线程调度功能,完成进程虚拟内存管理功能。 提高要求:(增加1项就予以加分) (1) 实现多种线程调度算法; (2)通过“公共信箱”进行通信的机制,规定每一封信的大小为128字节,实现两个用户进程之间通过这个“公共信箱”进行通信。 (3) 实现多用户进程并发的虚拟内存管理功能。 (4) 实现用户进程间通信功能,并用生产者/消费者问题测试进程间通信功能的正确性。 (5) 实现改进型Clock页面置换算法。 (6) 实现Cache功能,采用FIFO替换算法。 2. 扩展内容 实现多种线程调度算法:时间片轮转调度算法 四、人员分工 优先级调度算法:钟德新,莫友芝 时间片轮转调度算法:张德华,袁马龙 设计报告由小组队员共同完成。小组成员设计的代码分工如下:钟德新编写的代码:void Prinft(){ PCB *p; system("cls");//清屏 p=run; //运行队列 if(p!=NULL) { p->next=NULL; } cout<<"当前正在运行的进程:"< 南通大学计算机科学与技术学院操作系统课程设计报告 专业: 学生姓名: 学号: 时间: 操作系统模拟算法课程设计报告 设计要求 将本学期三次的实验集成实现: A.处理机管理; B.存储器管理; C.虚拟存储器的缺页调度。 设计流程图 主流程图 开始的图形界面 处理机管理存储器管理缺页调度 先来先服务时 间 片 轮 转 首 次 适 应 法 最 佳 适 应 法 先 进 先 出 L R U 算 法 A.处理机调度 1)先来先服务FCFS N Y 先来先服务算法流程 开始 初始化进程控制块,让进程控制块按进程到达先后顺序让进程排队 调度数组中首个进程,并让数组中的下一位移到首位 计算并打印进程的完成时刻、周转时间、带权周转时间 其中:周转时间 = 完成时间 - 到达时间 带权周转时间=周转时间/服务时间 更改计时器的当前时间,即下一刻进程的开始时间 当前时间=前一进程的完成时间+其服务时间 数组为空 结束 2)时间片轮转法 开始 输入进程总数 指针所指的进程是 否结束 输入各进程信息 输出为就绪状态的进程的信息 更改正在运行的进程的已运行时间 跳过已结束的程序 结束 N 指向下一个进程 Y 如果存在下一个进程的话 Y N 输出此时为就绪状态的进程的信息 时间片轮转算法流程图 B.存储器管理(可变式分区管理) 1)首次适应法 分配流程图 申请xkb内存 由链头找到第一个空闲区 分区大小≥xkb? 大于 分区大小=分区大小-xkb,修改下一个空闲区的后向指针内容为(后向指针)+xkb;修改上一个空闲区的前向指针为(前向指针)+xkb 将该空闲区从链中摘除:修改下一个空闲区的后向地址=该空闲区后向地址,修改上一个空闲区的前向指针为该空闲区的前向指针 等于 小于延链查找下 一个空闲区 到链尾 了? 作业等待 返回是 否 登记已分配表 返回分配给进程的内存首地址 开始 西安电子科技大学 操作系统课程设计 (2016年度) 实 验 报 告 实验名称:Alarm-Clock 班级:1403018 姓名:张可心 学号:14030188030 一实验内容 源代码devices/timer.c中有一个timer_sleep()函数。定义如图1所示 图1 timer_sleep()函数的定义 该函数的功能是让调用它的线程睡眠一段时间(ticks),然后唤醒。事实上,品同时已经实现该函数,只是使用的是“忙等待”的方法。 任务要求:重新实现timer_sleep()函数,避免“忙等待”的发生,设计一种策略并实现。 二分析及设计 1. 阅读相关的源代码文件,并了解其中关键的数据结构和函数的含义:在xd/os/pintos/src/threads目录下的thread.h,thread.c文件,它们是有关线程初始化、阻塞、解除阻塞,线程调度等内容。xd/os/pintos/src/devices/目录下的timer.h,timer.c文件,本实验要修改的timer_sleep()函数就在其中。同时还要注意定时器中断的处理过程。 2. Thread.h中定义了一个结构体struct thread,这个结构体中用于存放线程的基本信息,如图2所示 图2线程的基本信息 3. Pintos中线程的状态有四种,在thread.h函数中的定义如图3 图 3 线程的状态定义 4.系统的驱动:驱动力为定时器中断函数,定时器中断频率在timer.h中定义如 图4所示 图4 定时器中断频率 由此可知一个定时器中断的时长大约为10ms,这里称为一个ticks。 5.中断处理过程 中断处理函数的调用过程如图5所示 图5中断处理函数的调用过程 原线程中这个timer_sleep函数执行过程是不断地循环检测这个函数执行以及执行过后等待时长是否小于cpu的时钟周期,如果是,则重复循环等待,直至等待时间大于等于ticks,则执行线程后续代码。此方法的缺点是,函数不断循环试探,占用cpu。 设计方案从去掉循环测试时间开始,将在thread结构体中添加一个变量block_ticks(线程阻塞时间),来标记时间的变化。当线程度过了ticks,就唤醒它,进入ready状态。 三详细实现 1 改造timer_sleep,如图6所示 操作系统课程设计实验报告 实验名称:进程控制 姓名/学号: 一、实验目的 学习、理解和掌握Linux与windows的进行控制系统调用的功能,熟悉主要的几个系统调用命令的格式和如何利用系统调用命令进行编程。通过学习,理解如何创建一个进程、改变进程执行的程序、进程和线程终止以及父子进程的同步等,从而提高对进程和线程控制系统调用的编程能力。 二、实验内容 设计并实现Unix的“time”命令。“mytime”命令通过命令行参数接受要运行的程序,创建一个独立的进程来运行该程序,并记录程序运行的时间。 三、实验环境 CPU: Inter ×2 2.10GHz RAM: 3.00GB Windows 7 旗舰版 Linux Ubuntu 10.04 编译: VS2010 四、程序设计与实现 4.1进程控制系统的调用 4.1.1 windows进程控制调用程序中使用的数据结构及主要符号说明 SYSTEMTIME starttime,endtime; //进程开始时间和结束时间 PROCESS_INFORMATION pi //该结构返回有关新进程及 //其主线程的信息 STARTUPINFO si //该结构用于指定新进程的主窗口特性4.1.2 linux进程控制调用程序中使用的数据结构及主要符号说明 struct timeval starttime,endtime //进程开始时间和结束时间 pid_t pid //进程标志符 4.2 程序流程图 图1 windows进程控制调用图2 linux进程控制调用程序运行流程图程序运行流程图 五、实验结果和分析 5.1 windows实验结果和分析 计算机科学技术学院 操作系统原理课程设计报告 题目:进程管理系统 专业: 班级: 姓名: 学号: 指导老师: 年月日 《操作系统原理》课程设计任务书 一、课程设计题目(任选一个题目) 1.模拟进程管理 2.模拟处理机调度 3.模拟存储器管理 4.模拟文件系统 5.模拟磁盘调度 二、设计目的和要求 1.设计目的 《操作系统原理》课程设计是网络工程专业实践性环节之一,是学习完《操作系统原理》课程后进行的一次较全面的综合练习。其目的在于加深对操作系统的理论、方法和基础知识的理解,掌握操作系统结构、实现机理和各种典型算法,系统地了解操作系统的设计和实现思路,培养学生的系统设计能力,并了解操作系统的发展动向和趋势。 2.基本要求: (1)选择课程设计题目中的一个课题,独立完成。 (2)良好的沟通和合作能力 (3)充分运用前序课所学的软件工程、程序设计、数据结构等相关知识 (4)充分运用调试和排错技术 (5)简单测试驱动模块和桩模块的编写 (6)查阅相关资料,自学具体课题中涉及到的新知识。 (7)课题完成后必须按要求提交课程设计报告,格式规范,内容详实。 三、设计内容及步骤 1.根据设计题目的要求,充分地分析和理解问题,明确问题要求做什么。 2.根据实现的功能,划分出合理的模块,明确模块间的关系。 3.编程实现所设计的模块。 4.程序调试与测试。采用自底向上,分模块进行,即先调试低层函数。能够熟练掌握调试工具的各种功能,设计测试数据确定疑点,通过修改程序来证实它或绕过它。调试正确后,认真整理源程序及其注释,形成格式和风格良好的源程序清单和结果; 5.结果分析。程序运行结果包括正确的输入及其输出结果和含有错误的输入及其输出结果。 6.编写课程设计报告; 设计报告要求:A4纸,详细设计部分主要叙述本人的工作内容 设计报告的格式: (1)封面(题目、指导教师、专业、班级、姓名、学号) (2)设计任务书 (3)目录 (4)需求分析 (5)概要设计 (6)详细设计(含主要代码) (7)调试分析、测试结果 (8)用户使用说明 (9)附录或参考资料 四、进度安排 设计在学期的第15、16周进行,时间安排如下:操作系统课程设计
操作系统课程设计报告书
操作系统课程设计页式存储
操作系统课程设计报告
操作系统课程设计完整版内含代码
操作系统课程设计报告
操作系统实验报告附思考题
操作系统课程设计报告
Linux操作系统课程设计任务书
操作系统课程设计报告
操作系统课程设计
2016西安交通大学操作系统实验报告
操作系统课程设计报告
操作系统(一个小型操作系统的设计与实现)课程设计
操作系统课程设计报告Alarm-Clock
操作系统课程设计报告
操作系统课程设计