合肥工业大学操作系统课程设计报告
操作系统课程设计报告

操作系统课程设计报告概述:本课程设计旨在使学生熟悉文件管理系统的设计方法,加深对所学各种文件操作的了解及其操作方法的特点。
通过模拟文件系统的实现,深入理解操作系统中文件系统的理论知识,加深对教材中的重要算法的理解。
同时通过编程实现这些算法,更好地掌握操作系统的原理及实现方法,提高综合运用各专业课知识的能力。
主要任务:本课程设计的主要任务是设计和实现一个简单的文件系统,包括建立文件存储介质的管理机制、建立目录(采用一级目录结构)、文件系统功能(显示目录、创建、删除、打开、关闭、读、写)和文件操作接口(显示目录、创建、删除、打开、关闭、读、写)。
系统设计:本系统模拟一个文件管理系统,要完成对文件的基本操作,包括文件、文件夹的打开、新建、删除和读取写入文件,创建更改目录,列出目录内容等信息。
系统建立了文件目录树,存储文件系统中的所有文件。
对于用户名下的文件,用文件目录树的分支来存储。
采用命令行操作界面很直观,也方便用户进行操作,用户只要按照操作界面所显示的命令来操作即可。
整体设计框架:系统初始化界面由创建用户存储空间、管理文件、退出系统三个模块组成。
用户创建由创建用户存储空间、进入目录、删除用户存储空间、显示所有用户存储空间等模块组成。
然后各个模块再由一些小模块组成。
其中创建文件、打开关闭文件、读写文件等文件操作模块包括在进入目录模块里面。
系统实现:以下是本课程设计的主要内容的实现程序代码:cincludeincludeincludetypedef struct file{ char name[10];struct file *next; File;typedef struct content{ char name[10];File *file;int f_num;struct content *next; Content;typedef struct user{ char name[10];char psw[10]; Content *con;struct user *next; User;char cur_user[20];XXX;int user_num=0;添加文件:在该函数中,我们首先需要获取文件名,然后检查是否已经存在该文件。
合肥工业大学操作系统实验报告

操作系统实验报告班级:计算机科学与技术姓名:学号:实验3 进程的创建一、实验目的练习使用EOS API 函数CreateProcess 创建一个进程,掌握创建进程的方法,理解进程和程序的区别。
调试跟踪CreateProcess 函数的执行过程,了解进程的创建过程,理解进程是资源分配的单位。
二、实验过程记录1./*Hello.c*/#include "EOSApp.h"int main(int argc, char* argv[]){int i;for (i = 1; i <= 5; i++) {printf("Hello,world! %d\n", i);Sleep(1000);}printf("Bye-bye!\n");return 0;}作用:测试软盘镜像中的程序。
输出"Hello,world! I”并循环输出五次,每次挂起1000ms,最后输出” Bye-b ye!”。
结果:2./*NewProc.c*/#include "EOSApp.h"int main(int argc, char* argv[]){STARTUPINFO StartupInfo;PROCESS_INFORMATION ProcInfo;ULONG ulExitCode; // 子进程退出码INT nResult = 0; // main 函数返回值。
0 表示成功,非0 表示失败。
#ifdef _DEBUG__asm("int $3\n nop");#endifprintf("Create a process and wait for the process exit...\n\n");//// 使子进程和父进程使用相同的标准句柄。
//StartupInfo.StdInput = GetStdHandle(STD_INPUT_HANDLE);StartupInfo.StdOutput = GetStdHandle(STD_OUTPUT_HANDLE);StartupInfo.StdError = GetStdHandle(STD_ERROR_HANDLE);//// 创建子进程。
合肥工业大学操作系统课程设计报告

一.设计题目第9题:进程死锁的检测:绘制资源分配图要求:1)建立资源分配图的数据结构描述;2)建立绘制资源分配图的历程,包括结点和有向边;3)可以删除、添加节点或有向边。
4)可以鼠标在串口的任意位置指点,确定结点或者有向边的位置;5)可以拖动现有结点的位置,使之相关的结点移动6)可以存入文件和从文件中读取。
二.设计原理及算法描述UNIX命令:ls [选项]列出文件信息(默认为当前目录)ls无参显示一个目录中的文件和子目录ls -l每行仅显示一个目录或名称ls --help 显示此帮助信息并离开mkdir目录若目录不存在则创建目录mkdir --help显示此帮助信息并离开rmdir目录若目录没有数据则删除目录rmdir --help显示此帮助信息并离开cp来源文件目的文件将来源文件复制到目的文件cp --help显示此帮助信息并离开cat文件或:cat 文件1 >> 文件2显示文件内容或连接两个文件,并将结果输出到显示屏上cat文件将文件的内容输出到显示屏上cat 文件1 >> 文件2将文件1连接到文件2的结尾,并输出到显示屏上cat --help 显示此帮助信息并离开more文件使文件能逐行(回车键)或逐页(空格键)显示并显示当前文件所占总文件的百分比more --help显示此帮助信息并离开mv文件1 文件2或:mv 文件目录重命名或移动文件mv 文件1 文件2将文件1名字改为文件2的名字mv 文件目录将指定文件移动到指定目录下mv --help显示此帮助信息并离开sort文件将文本文件内容加以排序sort --help显示此帮助信息并离开按照每个命令的功能编写一个实现函数。
通过c++字符串操作从输入流获得指令以及参数,通过对指令以及参数的判别调用对应指令的函数,实现对windows内文件的各项操作。
三.开发环境硬件环境:个人PC机软件环境:Microsoft Windows XPMicrosoft Visual C++ 6.0四.重要算法和设计思路描述命令以及参数的获取:由于命令加参数最多能有四部分,所以申请4个字符串数组。
合工大操作系统课程设计

合工大操作系统课程设计一、课程目标知识目标:1. 理解操作系统的基本概念,掌握操作系统的发展历程、功能及分类。
2. 学会分析操作系统的核心组成部分,如进程管理、内存管理、文件系统、设备管理。
3. 掌握操作系统的基本原理,如进程调度、内存分配、文件权限控制等。
技能目标:1. 能够运用进程管理的基本方法,编写简单的进程同步与互斥程序。
2. 学会使用操作系统提供的API进行文件操作和设备控制。
3. 能够分析并优化操作系统的性能,提高系统资源利用率。
情感态度价值观目标:1. 培养学生对操作系统的学习兴趣,激发他们探索计算机科学领域的热情。
2. 培养学生的团队协作精神,提高他们在项目实践中的沟通与协作能力。
3. 培养学生具备良好的计算机伦理道德观念,尊重知识产权,遵循法律法规。
本课程针对合肥工业大学高年级本科生,课程性质为专业核心课。
结合学生特点,课程目标注重理论与实践相结合,培养学生具备扎实的操作系统能力。
在教学过程中,要求学生积极参与讨论、实践,达到学以致用的目的。
课程目标分解为具体学习成果,以便后续教学设计和评估,确保学生能够全面掌握操作系统知识,提高实践能力。
二、教学内容本课程教学内容主要包括以下几部分:1. 操作系统概述:介绍操作系统的发展历程、功能、分类及其在计算机系统中的作用。
2. 进程管理:讲解进程与线程的概念、进程调度算法、进程同步与互斥、死锁与饥饿问题。
3. 内存管理:阐述内存分配策略、虚拟内存技术、页式和段式存储管理、内存碎片问题。
4. 文件系统:介绍文件和目录结构、文件权限控制、文件系统性能优化、磁盘空间分配策略。
5. 设备管理:讲解设备驱动程序、I/O调度策略、中断处理、设备分配与回收。
6. 操作系统实例分析:以Linux操作系统为例,分析其内核架构、进程管理、内存管理、文件系统等关键技术。
7. 操作系统性能评价与优化:介绍操作系统性能指标、性能评价方法、常用优化策略。
教学内容根据课程目标和教材章节进行合理安排,保证教学内容的科学性和系统性。
操作系统课程设计报告

操作系统课程设计报告1. 引言操作系统是计算机系统中最核心的软件之一,它负责管理和优化计算机资源的分配和调度,为用户和应用程序提供一个可靠、高效的执行环境。
在操作系统课程设计中,我们通过设计一个简单的操作系统,深入理解操作系统的原理和功能,提升对操作系统的理解和实践能力。
本报告将详细介绍我们小组在操作系统课程设计过程中所完成的工作和实现的目标。
2. 设计目标在本次操作系统课程设计中,我们的设计目标包括:•实现一个基本的中断处理、进程调度和内存管理机制;•设计一个简单的文件系统;•确保操作系统的稳定性和可靠性;•实现用户命令解析和执行功能。
3. 系统架构我们的操作系统设计采用了经典的分层结构,主要由硬件抽象层、内核和用户接口层组成。
1.硬件抽象层:负责与硬件进行交互,提供基本的底层硬件接口,如处理器管理、中断处理、设备控制等。
2.内核:实现操作系统的核心功能,包括进程管理、内存管理、文件系统管理等。
这一层是操作系统的核心,负责管理和调度系统资源。
3.用户接口层:为用户提供简单友好的界面,解析用户输入的命令并调用内核功能进行处理。
用户可以通过命令行或图形界面与操作系统进行交互。
4. 功能实现4.1 中断处理中断是操作系统与外部设备通信的重要机制,我们的操作系统设计中实现了基本的中断处理功能。
通过在硬件抽象层中捕获和处理硬件的中断信号,内核可以对中断进行相应的处理,保证系统的响应能力和稳定性。
4.2 进程调度进程调度是操作系统中的重要任务之一,它决定了系统如何分配和调度上下文切换。
我们的操作系统设计中实现了一个简单的进程调度算法,通过时间片轮转算法和优先级调度算法来管理多个进程的执行顺序,以提高系统的吞吐量和响应性能。
4.3 内存管理内存管理是操作系统中必不可少的功能,它负责对系统内存的分配和回收。
我们的操作系统设计中实现了基本的内存管理功能,包括内存分区、内存空闲管理和地址映射等。
通过合理的内存管理,可以提高系统的内存利用率和性能。
操作系统课程设计报告

实践课设计报告课程名称操作系统课程设计模拟设计内存管理中的地址题目转换(动态分区、页式十进制)学院班级学号姓名指导教师年月日课程设计任务书学生姓名:专业班级:指导教师:工作单位:题目: 模拟设计内存管理中的地址转换(动态分区、页式十进制)初始条件:1.预备内容:阅读操作系统的内存管理章节内容,理解动态分区、页式、段式和段页式存储管理的思想及相应的分配主存的过程。
2.实践准备:掌握一种计算机高级语言的使用。
要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1.下列内部存储器管理中地址转换,在完成指定存储管理技术中的地址转换基础上还可以选择其它内部存储器管理中的地址转换进行模拟设计并实现:⑴动态分区方案,用最先适用算法对作业实施内存分配,然后把作业地址空间的某一逻辑地址转换成相应的物理地址。
能够处理以下的情形:输入某一逻辑地址,程序能判断地址的合法性,如果合法,计算并输出相应的物理地址。
如果不能计算出相应的物理地址,说明原因。
⑵页式存储管理中逻辑地址到物理地址的转换(十进制)。
能够处理以下的情形:输入某一十进制逻辑地址,能检查地址的合法性,如果合法进行转换,否则显示“地址非法”;物理地址用十进制表示。
⑶页式存储管理中逻辑地址到物理地址的转换(八进制)。
能够处理以下的情形:输入某一八进制逻辑地址,能检查地址的合法性,如果合法进行转换,否则显示“地址非法”;物理地址用八进制表示。
⑷页式存储管理中逻辑地址到物理地址的转换(十六进制)。
能够处理以下的情形:输入某一十六进制逻辑地址,能检查地址的合法性,如果合法进行转换,否则显示“地址非法”;物理地址用十六进制表示。
⑸段式存储管理中逻辑地址到物理地址的转换。
能够处理以下的情形:指定内存的大小,进程的个数,每个进程的段数及段大小;能检查地址的合法性,如果合法进行转换,否则显示地址非法的原因。
⑹段页式存储管理中逻辑地址到物理地址的转换。
合肥工业大学操作系统绘制前驱图

课 程 设 计绘制描述事件先后顺序的前驱图计算机科学与技术09-22010 年 6 月20日设计题目 学 号专业班级 学生姓名指导教师合肥工业大学课程设计任务书第一章课程设计概述1.1 设计任务:设计一个可以绘制前驱图的界面程序1.2 设计要求:建立前驱图的数据结构描述;建立绘制前驱图的例程,包括结点和有向边;可以删除、添加结点或有向边;可用鼠标在窗口的任意位置指点,确定结点或有向边位置;可以拖动现有结点的位置,与该结点相连的有向边也随之移动;可以将前驱图存入文件,从文件中取出;第二章开发环境Java jdk1.6,eclipse第三章程序算法与实现●绘制结点算法简述先绘制一个圆,将数字转化为字符,再在圆中绘制字符●绘制带剪头直线算法简述先绘制一条直线,在直线的一端绘制一个三角形第四章程序实现---数据结构Vector<Point>利用vector向量容器存放point数据结构第五章程序实现---程序清单Node.javapackage com.draw;import java.awt.Graphics2D;public class Node {/*绘制结点函数*/public void drawNode(int x,int y, int n,Graphics2D g){String str=Integer.toString(n);g.drawOval(x, y, 20, 20);g.drawString(str, x+7, y+15);}}Line.javapackage com.draw;import java.awt.Graphics2D;import java.awt.geom.GeneralPath;public class Line {/*绘制直线函数*/public void drawLine(int sx, int sy, int ex, int ey,Graphics2D g){double H = 10; // 箭头高度double L = 4; // 底边的一半int x3 = 0;int y3 = 0;int x4 = 0;int y4 = 0;double awrad = Math.atan(L / H); // 箭头角度double arraow_len = Math.sqrt(L * L + H * H); // 箭头的长度double[] arrXY_1 = rotateVec(ex - sx, ey - sy, awrad, true, arraow_len); double[] arrXY_2 = rotateVec(ex - sx, ey - sy, -awrad, true, arraow_len); double x_3 = ex - arrXY_1[0]; // (x3,y3)是第一端点double y_3 = ey - arrXY_1[1];double x_4 = ex - arrXY_2[0]; // (x4,y4)是第二端点double y_4 = ey - arrXY_2[1];Double X3 = new Double(x_3);x3 = X3.intValue();Double Y3 = new Double(y_3);y3 = Y3.intValue();Double X4 = new Double(x_4);x4 = X4.intValue();Double Y4 = new Double(y_4);y4 = Y4.intValue();// 画线g.drawLine(sx, sy, ex, ey);GeneralPath triangle = new GeneralPath();triangle.moveTo(ex, ey);triangle.lineTo(x3, y3);triangle.lineTo(x4, y4);triangle.closePath();//实心箭头g.fill(triangle);//非实心箭头//g.draw(triangle);}public static double[] rotateVec(int px, int py, double ang,boolean isChLen, double newLen) {double mathstr[] = new double[2];// 矢量旋转函数,参数含义分别是x分量、y分量、旋转角、是否改变长度、新长度 double vx = px * Math.cos(ang) - py * Math.sin(ang);double vy = px * Math.sin(ang) + py * Math.cos(ang);if (isChLen) {double d = Math.sqrt(vx * vx + vy * vy);vx = vx / d * newLen;vy = vy / d * newLen;mathstr[0] = vx;mathstr[1] = vy;}return mathstr;}}Recorder.javapackage com.recorder;import java.awt.Point;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.FileReader;import java.io.FileWriter;import java.util.Vector;import com.view.DrawPanel;public class Recorder {FileWriter fw=null;BufferedWriter bw=null;FileReader fr=null;BufferedReader br=null;//保存结点记录public void keepNodeRecord(){try {//创建fw=new FileWriter("D://myNodeRecording.txt");bw=new BufferedWriter(fw);for(int i=0;i<DrawPanel.nodes.size();i++){Point p=DrawPanel.nodes.get(i);String recode=p.x+" "+p.y;bw.write(recode+"\r\n");}} catch (Exception e) {e.printStackTrace();}finally{try {bw.close();fw.close();} catch (Exception e2) {e2.printStackTrace();}}}//重置nodes的值public void setNodes(){try {fr=new FileReader("D://myNodeRecording.txt");br=new BufferedReader(fr);String n="";DrawPanel.nodes.clear();while((n=br.readLine())!=null){String[] xy=n.split(" ");Point p=new Point(Integer.parseInt(xy[0]),Integer.parseInt(xy[1]));DrawPanel.nodes.add(p);}} catch (Exception e) {e.printStackTrace();}finally{try {br.close();fr.close();}catch (Exception e2) {e2.printStackTrace();}}}//保存point记录public void keepPointRecord(){try {//创建fw=new FileWriter("D://myPointRecording.txt");bw=new BufferedWriter(fw);for(int i=0;i<DrawPanel.point2.size();i++){Point p1=DrawPanel.point1.get(i);Point p2=DrawPanel.point2.get(i);String recode=p1.x+" "+p1.y+" "+p2.x+" "+p2.y;bw.write(recode+"\r\n");}} catch (Exception e) {e.printStackTrace();}finally{try {bw.close();fw.close();} catch (Exception e2) {e2.printStackTrace();}}}//设置point1的值public void setPoint(){try {fr=new FileReader("D://myPointRecording.txt");br=new BufferedReader(fr);String n="";DrawPanel.point1.clear();DrawPanel.point2.clear();while((n=br.readLine())!=null){String[] x1y1x2y2=n.split(" ");Point p1=new Point(Integer.parseInt(x1y1x2y2[0]),Integer.parseInt(x1y1x2y2[1]));DrawPanel.point1.add(p1);Point p2=new Point(Integer.parseInt(x1y1x2y2[2]),Integer.parseInt(x1y1x2y2[3]));DrawPanel.point2.add(p2);}} catch (Exception e) {e.printStackTrace();}finally{try {br.close();fr.close();}catch (Exception e2) {e2.printStackTrace();}}}}DrawPanel.javapackage com.view;import java.awt.Color;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.Point;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import java.awt.event.MouseMotionListener;import java.util.Vector;import javax.swing.JPanel;import com.draw.Line;import com.draw.Node;public class DrawPanel extends JPanel implements MouseMotionListener,MouseListener{ static int command;//被选中索引int selectNode=-1;int selectLine=-1;//定义结点向量组public static Vector<Point> nodes=new Vector<Point>();//第一直线点向量组public static Vector<Point> point1=new Vector<Point>();public static Vector<Point> point2=new Vector<Point>();ToolPanel toolPanel=new ToolPanel();Line l=new Line();Node n=new Node();DrawPanel(){addMouseMotionListener(this);addMouseListener(this);setBackground(Color.WHITE);//设置drawpanel背景色}public void paint(Graphics g) {super.paint(g);Graphics2D g2 = (Graphics2D) g;if(nodes!=null){for(int i=0;i<nodes.size();i++){Point nodestmp=nodes.get(i);n.drawNode(nodestmp.x, nodestmp.y,i, g2);}}if(point1!=null&&point2!=null){for(int j=0;j<point2.size();j++){Point linetmp1=point1.get(j);Point linetmp2=point2.get(j);l.drawLine(linetmp1.x, linetmp1.y, linetmp2.x, linetmp2.y, g2);}}repaint();}/*判断鼠标是否选中结点*/boolean isSelectedNode(int x,int y){boolean isSelected=false;for(int i=0;i<nodes.size();i++){int m=nodes.get(i).x;int n=nodes.get(i).y;if(x>=m&&x<=m+20&&y>=n&&y<=y+20){isSelected=true;selectNode=i;}}return isSelected;}/*判断鼠标是否选中直线*/boolean isSelectedLine(int x,int y){boolean isSelected=false;Point p=new Point(x, y);for(int i=0;i<point2.size();i++){Point start=point1.get(i);Point end=point2.get(i);if(isPointOnLine(p, start, end)){isSelected=true;selectLine=i;}}return isSelected;}/*判断点是否在直线上*/boolean isPointOnLine(Point p,Point start,Point end) {int div=10;int xEnd=end.x-start.x;int yEnd=start.y-end.y;int x2=p.x-start.x;int y1=start.y-p.y- div;int y2=start.y-p.y+div;double tan1=Math.atan2(yEnd,xEnd);double tan2=Math.atan2(y1,x2);double tan3=Math.atan2(y2,x2);return tan1>=tan2&&tan1<=tan3;}/*MouseListener*//*按下并释放触发*/public void mouseClicked(MouseEvent e) {int x=e.getX();int y=e.getY();Point p=new Point(x, y);if(command==toolPanel.drawNode){nodes.add(p);}if(command==toolPanel.deleteCommand){if(isSelectedNode(x, y)){nodes.remove(selectNode);// System.out.println(select+"isSelected");}if(isSelectedLine(x, y)){point1.remove(selectLine);point2.remove(selectLine);}}}/*按下鼠标键触发*/public void mousePressed(MouseEvent e) {if(command==toolPanel.drawLine){int x1 = e.getX();int y1 = e.getY();Point p1=new Point(x1, y1);point1.add(p1);}}/*释放鼠标键触发*/public void mouseReleased(MouseEvent e) {if(command==toolPanel.drawLine){int x2 = e.getX();int y2 = e.getY();Point p2=new Point(x2, y2);point2.add(p2);}}/*鼠标指针进入主键触发*/public void mouseEntered(MouseEvent e) {}/*鼠标指针离开触发*/public void mouseExited(MouseEvent e) {}ToolPanel.javapackage com.view;import java.awt.Button;import java.awt.Color;import java.awt.FileDialog;import java.awt.FlowLayout;import bel;import java.awt.TextField;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JPanel;import com.recorder.Recorder;public class ToolPanel extends JPanel implements ActionListener{//定义一个recorder对象Recorder recorder=new Recorder();/*命令值*/int clearCommand=0;int openCommand=1;int saveCommand=2;int drawNode=3;int drawLine=4;int moveCommand=5;int deleteCommand=6;FlowLayout flowLayou;//添加布局Label label1;//工具栏标签Label label2;//当前动作标签Button clear;Button open;Button save;Button node;Button line;Button move;Button delete;TextField field;//显示动作文本区//定义两个类对象,方便调用MainFrame frame;//定义对话框// FileDialog fileDialog_save=new FileDialog(frame, "保存文件对话框", FileDialog.SAVE);;// FileDialog fileDialog_load=new FileDialog(frame, "打开文件对话框", FileDialog.LOAD);ToolPanel(){FlowLayout flowLayout=new FlowLayout();setBackground(Color.LIGHT_GRAY);//设置toolpanel背景色//添加控件label1=new Label("工具栏:");clear=new Button("清空");open=new Button("打开");save=new Button("保存");node=new Button("结点");line=new Button("连线");move=new Button("移动");delete=new Button("删除");label2=new Label(" 当前动作:");field=new TextField(10);//控件添加到控件组件上add(label1);add(clear);add(open);add(save);add(node);add(line);add(move);add(delete);add(label2);add(field);//注册监听clear.addActionListener(this);open.addActionListener(this);save.addActionListener(this);node.addActionListener(this);line.addActionListener(this);move.addActionListener(this);delete.addActionListener(this);//布局定义flowLayout.setAlignment(flowLayout.LEADING);setLayout(flowLayout);}/*设置命令类型*/void setCommand(int style){mand=style;}public void actionPerformed(ActionEvent e) {if(e.getSource()==clear){field.setText(clear.getLabel());setCommand(clearCommand);DrawPanel.nodes.clear();DrawPanel.point1.clear();DrawPanel.point2.clear();}if(e.getSource()==open){field.setText(open.getLabel());setCommand(openCommand);//fileDialog_load.setVisible(true);recorder.setNodes();recorder.setPoint();}if(e.getSource()==save){field.setText(save.getLabel());setCommand(saveCommand);//fileDialog_save.setVisible(true);recorder.keepNodeRecord();recorder.keepPointRecord();// System.out.println("保存");}if(e.getSource()==node){field.setText(node.getLabel());setCommand(drawNode);}if(e.getSource()==line){field.setText(line.getLabel());setCommand(drawLine);}if(e.getSource()==move){field.setText(move.getLabel());setCommand(moveCommand);}if(e.getSource()==delete){field.setText(delete.getLabel());setCommand(deleteCommand);}}}MainFrame.javapackage com.view;import java.awt.BorderLayout;import javax.swing.JFrame;import javax.swing.border.Border;public class MainFrame extends JFrame{public static void main(String args[]){MainFrame mainFrame=new MainFrame("绘制前驱图");}MainFrame(String s){setTitle(s);//设置标题setDefaultCloseOperation(EXIT_ON_CLOSE);//设置window窗口上的关闭setBounds(100, 100, 900, 500);//设置frame大小setVisible(true);//设置frame为可见ToolPanel toolpanel=new ToolPanel();//创建toolpanel对象add(toolpanel,BorderLayout.NORTH);//添加panel到frame上DrawPanel drawPanel=new DrawPanel();//创建toolpanel对象add(drawPanel);//添加panel到frame上}}第六章总结通过这次课程设计,使我们更加熟悉的掌握了java语言。
操作系统课程设计报告

《操作系统课程设计》一、课程设计目的1、进程调度是处理机管理的核心内容。
2、本设计要求用C语言编写和调试一个简单的进程调度程序。
3、通过设计本可以加深理解有关进程控制块、进程队列的概念,并体会和了解最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法的具体实施办法。
二、课程设计主要内容1、项目名称设计一个有 N个进程共行的进程调度程序2、实验设备及环境:软件要求:WINDOWS NT 系列操作系统,VC、VB、TURBO C等多种程序设计开发工具。
硬件要求:P4 2.0以上CPU、256M、40G硬盘。
3、课程设计类型综合设计型4、课程设计内容与要求1)进程调度算法:采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法。
2)每个进程有一个进程控制块( PCB)表示。
进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。
3)进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。
进程的到达时间为进程输入的时间。
进程的运行时间以时间片为单位进行计算。
4)每个进程的状态可以是就绪 W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。
5)就绪进程获得 CPU后都只能运行一个时间片。
用已占用CPU时间加1来表示。
如果运行一个时间片后,进程的已占用 CPU 时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。
6)每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的 PCB,以便进行检查。
7)重复以上过程,直到所要进程都完成为止。
5、课程设计方法及步骤1)充分了解各项设计要求。
深入理解有关进程控制块、进程队列的概念,并体会和了解最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法的具体实施办法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一.设计题目
第9题:进程死锁的检测:绘制资源分配图
要求:
1)建立资源分配图的数据结构描述;
2)建立绘制资源分配图的历程,包括结点和有向边;
3)可以删除、添加节点或有向边。
4)可以鼠标在串口的任意位置指点,确定结点或者有向边的位置;
5)可以拖动现有结点的位置,使之相关的结点移动
6)可以存入文件和从文件中读取。
二.设计原理及算法描述
UNIX命令:
ls [选项]
列出文件信息(默认为当前目录)
ls无参显示一个目录中的文件和子目录
ls -l每行仅显示一个目录或名称
ls --help 显示此帮助信息并离开
mkdir目录
若目录不存在则创建目录
mkdir --help显示此帮助信息并离开
rmdir目录
若目录没有数据则删除目录
rmdir --help显示此帮助信息并离开
cp来源文件目的文件
将来源文件复制到目的文件
cp --help显示此帮助信息并离开
cat文件
或:cat 文件1 >> 文件2
显示文件内容或连接两个文件,并将结果输出到显示屏上
cat文件将文件的内容输出到显示屏上
cat 文件1 >> 文件2将文件1连接到文件2的结尾,并输出到显示屏上
cat --help 显示此帮助信息并离开
more文件
使文件能逐行(回车键)或逐页(空格键)显示并显示当前文件所占总文件的百分比
more --help显示此帮助信息并离开
mv文件1 文件2
或:mv 文件目录重命名或移动文件
mv 文件1 文件2将文件1名字改为文件2的名字
mv 文件目录将指定文件移动到指定目录下
mv --help显示此帮助信息并离开
sort文件
将文本文件内容加以排序
sort --help显示此帮助信息并离开
按照每个命令的功能编写一个实现函数。
通过c++字符串操作从输入流获得指令以及参数,通过对指令以及参数的判别调用对应指令的函数,实现对windows内文件的各项操作。
三.开发环境
硬件环境:
个人PC机
软件环境:
Microsoft Windows XP
Microsoft Visual C++ 6.0
四.重要算法和设计思路描述
命令以及参数的获取:由于命令加参数最多能有四部分,所以申请4个字符串数组。
并且将首地址都初始化为NULL,在后面的函数中用作判断输入参数的个数。
根据输入流中的空格来分割命令和参数
以及参数和参数。
每检测到一个空格,即将前面的输入字符加上字符串结束符一起存入申请到的字符串数组中。
命令以及参数的判断:strcmp。
参数个数的判断:观察后三个字符串数组首地址是否为NULL。
利用以下一些API函数实现unix命令要求实现的功能,对windows 里的文件进行操作。
BOOL WINAPI SetCurrentDirectory( __in LPCTSTR lpPathName); 切换当前进程的当前工作目录。
HANDLE FindFirstFile( LPCTSTR lpFileName, // file name LPWIN32_FIND_DATA lpFindFileData // data buffer ); 该函数到一个文件夹(包括子文件夹)去搜索指定文件如果要使用附加属性去搜索文件的话可以使用FindFirstFileEx函数
DWORD GetCurrentDirectory(
DWORD nBufferLength, // size of directory buffer
LPTSTR lpBuffer // directory buffer
); 获取当前进程的当前目录
BOOL CreateDirectory(LPCTSTR lpPathName,
LPSECURITY_ATTRIBUTES lpSecurityAttributes ); 创建一个新目录
HANDLE CreateFile(
LPCTSTR lpFileName, //指向文件名的指针
DWORD dwDesiredAccess, //访问模式(写/读)
DWORD dwShareMode, //共享模式
LPSECURITY_ATTRIBUTES lpSecurityAttributes, //指向安全属性的指针
DWORD dwCreationDisposition, //如何创建
DWORD dwFlagsAndAttributes, //文件属性
HANDLE hTemplateFile //用于复制文件句柄
); 这是一个全功能的例程,可打开和创建文件、管道、邮槽、通信服务、设备以及控制台缓冲区
五.程序实现——数据结构
doc.h中用#define 宏定义了各命令的帮助文档。
function.h中用API函数和一些简单的字符串操作实现了每个命令要求的功能。
cmd.cpp中定义了获取命令及参数的方法,用if…else…结构对命令及参数进行判断并调用对应的函数。
六.程序实现——程序清单
见程序包
七.课程设计总结
经过一个星期的课程设计,经历的困难一语难尽。
整个课程设计期间我们失落过,也曾一度热情高涨。
从开始时满富盛激情到最后汗水背后的复杂心情,点点滴滴无不令我们回味无长。
生活就是这样,汗水预示着结果也见证着收获。
劳动是人类生存生活永恒不变的话题。
通过实习,我才真正领略到“艰苦奋斗”这一词的真正含义。
我想说,设计确实有些辛苦,但苦中也有乐,在如今浮躁的生活中,很少有机会能静下心来做一个设计,但我们可以,一个团队的任务,一起的工作可以让我们有说有笑,相互帮助,配合默契。
在一次次的试验中,我们收获的不仅是程序设计的技能更加是耐心和经验,还有做课程设计的心态。
一行代码的错误直接影响着最后的结果,这就让我们每一个语句都编写的仔细。
最让人苦恼的是完全按设计原理的编程,执行结果却依然不对,这时候,我们需要分析错误的原因,逐步排查。
最终验收成功的时候我们由衷的高兴。
当然,这与老师的指导和示范十分不开的,正是有了老师耐心的指导和对于错误原因分析的帮助,才有了我们的对操作系统的接口的新认识。
对我而言,知识上的收获重要,精神上的丰收更加可喜。
挫折是一份财富,经历是一份拥有。
这次实习必将成为我人生旅途上一个非常美好的回忆!
再次感谢老师的教学与指导,老师您辛苦了。
八.参考文献
[1].汤子瀛,哲凤屏,汤晓丹.计算机操作系统[M].西安:西安电子科技大学出版社,2001
[2].龙晋元.UNIX操作系统教程[M].西安:西北电讯工程学院出版社,1995
[3].王刚.LINUX命令、编辑器与Shell编程[M].北京:清华大学出版社,2012
[4].罗宇,褚瑞.操作系统课程设计[M].北京:机械工业出版社,2005。