华科操作系统课设报告

华科操作系统课设报告
华科操作系统课设报告

华中科技大学操作系统课程设计实验报告

专业:计算机科学与技术

班级:1101

姓名:许阳

学号:U201014241

一、实验目的

掌握Linux操作系统的使用方法;

了解Linux系统内核代码结构;

掌握实例操作系统的实现方法。

二、实验要求

1、掌握Linux操作系统的使用方法,包括键盘命令、系统调用;掌握在Linux

下的编程环境。

●编一个C程序,其内容为实现文件拷贝的功能;

●编一个C程序,其内容为分窗口同时显示三个并发进程的运行结

果。要求用到Linux下的图形库。

2、掌握系统调用的实现过程,通过编译内核方法,增加一个新的系统调用。

另编写一个应用程序,调用新增加的系统调用。

实现的功能是:文件拷贝;

3、掌握增加设备驱动程序的方法。通过模块方法,增加一个新的设备驱动

程序,其功能可以简单。

实现字符设备的驱动;

4、了解和掌握/proc文件系统的特点和使用方法

●了解/proc文件的特点和使用方法

●监控系统状态,显示系统中若干部件使用情况

●用图形界面实现系统监控状态。

5、设计并实现一个模拟的文件系统(选作)

三、实验一

1、编一个C程序,其内容为实现文件拷贝的功能

要实现文件拷贝功能,主要用到的函数是open、write、read。

以前在windows下写C语言打开文件常用的fopen,此时不能用,因为fopen是ANSIC标准中的C语言库函数,在不同的系统中应该调用不

同的内核api ;所以应该直接使用linux中的系统函数open。

主要用到的头文件:

Unistd.h \\包含了许多Linux系统服务的函数原型,如:read、write

Fcntl.h \\定义了很多宏和open,fcntl函数原型

Stdio.h \\标准输入输出头文件

sys/types.h \\此头文件包含适当时应使用的多个基本派生类型sys/stat.h \\包含了获取文件属性的一些函数

errno.h \\用于调试错误代码是所需要的一些errno变量

string.h \\包含了处理字符串的一些函数

设计思路:由命令行参数获取2个文件名,根据其文件名和路径分别打开该2个文件,设置一个循环,从源文件复制N个字节到目的文件,直到源文件指针到文件尾,最后关闭2个文件。

在可能出错的地方需要加上相应的报错代码和中断,并输出错误信息,以方便调试或是往后应用在第2小题中可能发生的错误。

理清楚设计思路后,根据需求写出相应的源代码见后页源程序代码scopy.c;在Linux终端使用编译命令gcc –o scopy scopy.c将程序编译并生产exe可执行文件。

然后手动创建一个测试文件test.txt ,在终端输入命令

./scopy test.txt target.txt

这样就能将源文件test.txt复制到目标文件target.txt

程序源代码scopy.c:

#include

#include

#include

#include

#include

#include

#include

#define BUFFER_SIZE 1024 //缓冲区大小

int main(int argc,char **argv)

{

int from_fd,to_fd;

int bytes_read,bytes_write;

char buffer[BUFFER_SIZE]; //设定一个缓冲区

char *ptr;

if(argc!=3) //三个参数

{

fprintf(stderr,"Usage:%s fromfile tofile\n\a",argv[0]);

return(-1);

}

/* 打开源文件*/

if((from_fd=open(argv[1],O_RDONL Y))==-1)

{

fprintf(stderr,"Open %s Error:%s\n",argv[1],strerror(errno));

return(-1);

}

/* 创建目的文件*/

if((to_fd=open(argv[2],O_WRONL Y|O_CREAT,S_IRUSR|S_IWUSR))==-1) {

fprintf(stderr,"Open %s Error:%s\n",argv[2],strerror(errno));

return(-1);

}

while(bytes_read=read(from_fd,buffer,BUFFER_SIZE))

{

/* 出错*/

if((bytes_read==-1)&&(errno!=EINTR)) break;

else if(bytes_read>0)

{

ptr=buffer;

while(bytes_write=write(to_fd,ptr,bytes_read))

{

/* 出错*/

if((bytes_write==-1)&&(errno!=EINTR))break;

/* 写完了所有读的字节*/

else if(bytes_write==bytes_read) break;

/* 只写了一部分,继续写*/

else if(bytes_write>0)

{

ptr+=bytes_write;

bytes_read-=bytes_write;

}

}

/* 写的时候出错*/

if(bytes_write==-1)break;

}

}

close(from_fd);

close(to_fd);

return(1);

}

2、编一个C程序,其内容为分窗口同时显示三个并发进程的运行结果。要

求用到Linux下的图形库。

安装Linux下的GTK+:

首先要在Linux下载GTK+相关库文件并安装。

在终端输入sudo apt-get install gnome-core-devel ,然后根据提示操作,就会安装libgtk2.0-dev libglib2.0-dev 等开发所需的相关库文件。

$sudo apt-get install build-essential

$sudo apt-get install gnome-core-devel

$sudo apt-get install pkg-config

$sudo apt-get install libgtk2.0*

编译GTK+代码时需要包含的头文件是gtk/gtk.h,此外,还必须连接若干库;比如编译test.c时用以下命令。

gcc –o test test.c `pkg-config --cflags --libs gtk+-2.0`

在编写代码时需要用到的控件、窗口等视窗物件形态,用类GtkWidget 定义其为指针类型。

编写一个GTK+程序的基本步骤如下:

●初始化Gtk

●建立控件

●登记消息与消息处理函数

●执行消息循环函数gtk_main()

之后所设计的3个进程,基本上都是以这样的方式编写代码的,因为之前曾用过OpenGL,所以在这方面掌握的比较快。

初始化主要使用的函数有

gtk_init(&argc,&argv); //启动GTK

gtk_window_new(GTK_WINDOW_TOPLEVEL); //创建窗口

gtk_window_set_title(GTK_WINDOW(window),"标题名"); //设置窗口标题名

gtk_widget_set_usize(window, 200, 200); //设置窗口大小

gtk_widget_show(window); //显示窗口

建立控件的一般流程

/*创建表格准备封装*/

gtk_table_new ( //创建多少列

gint rows, //创建多少栏

gint columns, //用来决定表格如何来定大小

gint homogeneous);

/*这个函数是将表格table,结合到窗口window里*/

gtk_container_add(GTK_CONTAINER(window),table);

gtk_widget_show(table); // 显示该表格

/*要把物件放进box中,可用以下函数*/

void gtk_table_attach_defaults (

GtkTable*table, //参数("table")是选定某表格

GtkWidget*widget, //("child")是想放进去的物件

gintleft_attach, //以下参数是指定把物件放在哪里, 及用多少个boxes

gintright_attach,

ginttop_attach,

gintbottom_attach);

实验截图:

实验源代码:process.c:

#include

#include

#include

gint progress_timeout( gpointer pbar )

{

gdouble new_val;

char s[10];

new_val = gtk_progress_bar_get_fraction (GTK_PROGRESS_BAR (pbar)) +

0.01;

if (new_val > 1.0)

new_val = 0.0;

sprintf (s, "%.0f%%", new_val*100);

gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (pbar), new_val);

gtk_progress_bar_set_text (GTK_PROGRESS_BAR (pbar),s);

return TRUE;

}

void destroy_progress( GtkWidget *widget)

{

gtk_main_quit ();

}

void show(int argc,char *argv[],char *title )

{

GtkWidget *window;

GtkWidget *vbox;

GtkWidget *pbar;

GtkWidget *pbar2;

GtkWidget *button;

GtkWidget *label;

int timer;

char id_char[50];

gtk_init (&argc, &argv);

window = gtk_window_new (GTK_WINDOW_TOPLEVEL);

gtk_window_set_resizable (GTK_WINDOW (window), TRUE);

gtk_window_set_position(GTK_WINDOW(window),

GTK_WIN_POS_CENTER);

g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (destroy_progress), NULL);

gtk_window_set_title (GTK_WINDOW (window), title);

gtk_container_set_border_width (GTK_CONTAINER (window), 0);

vbox = gtk_vbox_new (FALSE, 10);

gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);

gtk_container_add (GTK_CONTAINER (window), vbox);

gtk_widget_show (vbox);

sprintf (id_char, "本进程ID:%d", getpid ());

label = gtk_label_new (id_char);

gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);

gtk_widget_show (label);

sprintf (id_char, "父进程ID:%d", getppid ());

label = gtk_label_new (id_char);

gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);

gtk_widget_show (label);

pbar = gtk_progress_bar_new ();

gtk_box_pack_start (GTK_BOX (vbox), pbar, FALSE, FALSE, 0);

gtk_widget_show (pbar);

timer = gtk_timeout_add (100, progress_timeout, pbar);

button = gtk_button_new_with_label ("close");

g_signal_connect_swapped (G_OBJECT (button), "clicked", G_CALLBACK (gtk_widget_destroy), window);

gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);

GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);

gtk_widget_grab_default (button);

gtk_widget_show (button);

gtk_widget_show (window);

gtk_main ();

}

int main(int argc, char *argv[])

{

int pid = fork ();

if (pid < 0)

printf ("error!\n");

else if (pid == 0)

{

int pid = fork ();

if (pid < 0)

printf ("error!\n");

else if (pid == 0)

show (argc,argv,"process3");

else

show (argc,argv,"process2"); }

else

show (argc,argv,"process1");

}

四、实验二

Linux内核,简单来说就是一套用来控制计算机最底层的硬件设备,如处理器、内存、硬盘等的一种软件,一般称为操作系统,在Linux术语中称为内核。其中包含的模块有存储管理、CPU和进程管理、文件系统、设备管理和驱动、网络通信,以及系统的初始化(引导)、系统调用等。

这次题目就是要更改Linux内核中的”系统调用”模块,在其中添加自定义的函数,实现功能是文件拷贝。

工作流程基本如下:

1.下载并解压内核

到官方网站https://www.360docs.net/doc/fd41148.html,/下载内核linux-2.6.37.4,打开终端,

使用下列命令对其解压到目录/usr/src:

sudo tar -xjvf linux-2.6.37.4.tar.bz2 -C /usr/src

该目录用来存放内核的源码。

2.修改内核

首先要对系统调用模块的源码添加一个自定义函数,即对

/usr/src/linux-2.6.37.4/kernel/sys.c进行修改,在该源码的最后添

加下列函数的源码:

asmlinkage int sys_mycall(char* sourceFile,char* destFile)

{

int source=sys_open(sourceFile,O_RDONLY,0);

int

dest=sys_open(destFile,O_WRONL Y|O_CREAT|O_TRUNC,0600);

char buf[4096];

mm_segment_t fs;

fs = get_fs();

set_fs(get_ds());

int i;

if(source>0 && dest>0)

{

do

{

i=sys_read(source,buf,4096);

sys_write(dest,buf,i);

}while(i);

}

else

{

printk("Error!");

}

sys_close(source);

sys_close(dest);

set_fs(fs);

return 10;

}

修改完函数之后,接下来要修改系统调用号所对应的函数名,即修改/usr/src/linux-2.6.32.10/arch/x86/include/asm/unistd_32.h

该文件定义了系统调用号,我们只要找一没被使用的系统调用号,用该号给我们自定义函数使用,比如

#define __NR_sys_mycall 337

/*定义系统调用sys_mycall 的系统调用号为337*/

修改完系统调用号后,接下来要修改系统调用表,即/usr/src/linux-2.6.32.10/arch/x86/kernel/syscall_table_32.S,这个文件是用汇编语言编写的,因此要让自定义的系统调用相对于其他系统调用的顺序337个,写上.long sys_mycall /*337*/

基本修改完以上源码后,接下来对其进行默认的净化、设置等。

使用下列代码对其源码进行处理

sudo make mrproper 净化解压后的源代码

sudo make menuconfig 对内核选项进行配置

如果这一步有错误可能是正在使用的系统没有安装必要的库文件,如ncurses、libncurses*,这时候需要输入如下指令来安装

首先回到系统根目录

sudo apt-get install ncurses

sudo apt-get install libncurses*

依照提示就能安装好必要的库文件了。然后再回到内核源码的目录下尝试使用sudo make menuconfig对内核选项进行配置。

sudo make dep 建立模块间的依赖信息

sudo make clean 删除配置时留下的一些不用的文件

3.编译内核

接下来是最费时间的环节,少则2个小时,多则3个小时的编译,需要再三确保前面步骤是否正确后再进行下一步。

sudo make bzImage编译内核

这个过程大概是20多分钟

sudo make modules编译内核模块

这个过程大概要100分钟~150分钟左右,一般如果有错误,会在前十几分钟就停止编译并报错。

4.安装内核

比较简单,只需要两条指令

sudo make modules_install 安装内核模块

sudo make install 安装内核

安装完毕后,需要开机时选择使用新的Linux核心,要做下列修改:1)复制内核到系统启动引导目录

cp /usr/src/linux-2.6.37.4/arch/i386/boot/bzImage /boot/vmlinuz-2.6.37.4-mykernel

2)创建初始RAM磁盘——initrd

在创建之前先安装必要的程序

apt-get install bootcd-mkinitramfs

mkinitramfs -o /boot/initrd.img-2.6.37.4

3)更新grub

在/boot/grub/grub.cfg中, 复制一段旧的核心代码,并将里面linux和initrd中的路径改为新增的,注意不能用update-grub2

在/boot中复制一个旧的config-xxxxxx做为自己的

4)cd /boot

cp initrd.img-2.6.37.4 initrd-2.6.37.4.old

以上是备份initrid,下面是修改

depmod –a

update-initramfs -k 2.6.37.4 –c

cd /tmp

gzip -dc /boot/initrd.img-2.6.37.4| cpio -id

touch lib/modules/2.6.37.4/modules.dep

find ./ | cpio -H newc -o > /boot/initrd.img-2.6.37.4.new

gzip /boot/initrd.img-2.6.37.4.new

cd /boot

mv initrd.img-2.6.37.4.new.gz initrd.img-2.6.37.4

5)重开机测试

5.测试功能

用C语言编写测试程序testsys.c,源代码如下:

#include

#include

#include

int main(int argc,char**argv)

{

int i=syscall(349,argv[1],argv[2]); /*337为系统调用号*/

printf("successfully!\r\n");

printf("%d",i);

return 1;

}

编译gcc –o testsys testsys.c

运行./testsys test.txt target.txt

系统调用337号功能,拷贝文件test.txt到target.txt

运行结果截图如下:

.

【实验心得】

由于上学期操作系统

学习的并不太好,所以这学期做课设还是遇到

了很大的困难,制作出了前二步,最终还是靠

着网上的一些代码才实现了完整的功能,不过

从看、这次课程设计中,我还是学到了很有用

的知识,比如linux内核的编译,GTK的使用

等等,也请教了许多同学也和他们一起探讨过,

从中受益匪浅。最后也谢谢老师对我一学期以来的指导!

操作系统课程设计

课程设计报告 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、设计进程控制块PCB的结构(PCB结构通常包括以下信息:进程名(进程ID)、进程优先数、轮转时间片、进程所占用的CPU时间、进程的状态、当前队列指针等。可根据实验的不同,PCB结构的内容可以作适当的增删)。为了便于处理,程序中的某进程运行时间以时间片为单位计算。各进程的轮转时间数以及进程需运行的时间片数的初始值均由用户给定。 2、系统资源(r1…r w),共有w类,每类数目为r1…r w。随机产生n进程P i(id,s(j,k),t),0<=i<=n,0<=j<=m,0<=k<=dt为总运行时间,在运行过程中,会随机申请新的资源。 3、每个进程可有三个状态(即就绪状态W、运行状态R、等待或阻塞状态B),并假设初始状态为就绪状态。建立进程就绪队列。 4、编制进程调度算法:时间片轮转调度算法 本程序用该算法对n个进程进行调度,进程每执行一次,CPU时间片数加1,进程还需要的时间片数减1。在调度算法中,采用固定时间片(即:每执行一次进程,该进程的执行时间片数为已执行了1个单位),这时,CPU时间片数加1,进程还需要的时间片数减1,并排列到就绪队列的尾上。 三、实验环境 操作系统环境:Windows系统。 编程语言:C#。 四、实验思路和设计 1、程序流程图

2、主要程序代码 //PCB结构体 struct pcb { public int id; //进程ID public int ra; //所需资源A的数量 public int rb; //所需资源B的数量 public int rc; //所需资源C的数量 public int ntime; //所需的时间片个数 public int rtime; //已经运行的时间片个数 public char state; //进程状态,W(等待)、R(运行)、B(阻塞) //public int next; } ArrayList hready = new ArrayList(); ArrayList hblock = new ArrayList(); Random random = new Random(); //ArrayList p = new ArrayList(); int m, n, r, a,a1, b,b1, c,c1, h = 0, i = 1, time1Inteval;//m为要模拟的进程个数,n为初始化进程个数 //r为可随机产生的进程数(r=m-n) //a,b,c分别为A,B,C三类资源的总量 //i为进城计数,i=1…n //h为运行的时间片次数,time1Inteval为时间片大小(毫秒) //对进程进行初始化,建立就绪数组、阻塞数组。 public void input()//对进程进行初始化,建立就绪队列、阻塞队列 { m = int.Parse(textBox4.Text); n = int.Parse(textBox5.Text); a = int.Parse(textBox6.Text); b = int.Parse(textBox7.Text); c = int.Parse(textBox8.Text); a1 = a; b1 = b; c1 = c; r = m - n; time1Inteval = int.Parse(textBox9.Text); timer1.Interval = time1Inteval; for (i = 1; i <= n; i++) { pcb jincheng = new pcb(); jincheng.id = i; jincheng.ra = (random.Next(a) + 1); jincheng.rb = (random.Next(b) + 1); jincheng.rc = (random.Next(c) + 1); jincheng.ntime = (random.Next(1, 5)); jincheng.rtime = 0;

操作系统课程设计报告书

题目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= l && free_table[i].flag == 1) if(k==-1 || free_table[i].length

嵌入式操作系统实验报告

中南大学信息科学与工程学院实验报告 姓名:安磊 班级:计科0901 学号: 0909090310

指导老师:宋虹

目录 课程设计内容 ----------------------------------- 3 uC/OS操作系统简介 ------------------------------------ 3 uC/OS操作系统的组成 ------------------------------ 3 uC/OS操作系统功能作用 ---------------------------- 4 uC/OS文件系统的建立 ---------------------------- 6 文件系统设计的原则 ------------------------------6 文件系统的层次结构和功能模块 ---------------------6 文件系统的详细设计 -------------------------------- 8 文件系统核心代码 --------------------------------- 9 课程设计感想 ------------------------------------- 11 附录-------------------------------------------------- 12

课程设计内容 在uC/OS操作系统中增加一个简单的文件系统。 要求如下: (1)熟悉并分析uc/os操作系统 (2)设计并实现一个简单的文件系统 (3)可以是存放在内存的虚拟文件系统,也可以是存放在磁盘的实际文件系统 (4)编写测试代码,测试对文件的相关操作:建立,读写等 课程设计目的 操作系统课程主要讲述的内容是多道操作系统的原理与技术,与其它计算机原理、编译原理、汇编语言、计算机网络、程序设计等专业课程关系十分密切。 本课程设计的目的综合应用学生所学知识,建立系统和完整的计算机系统概念,理解和巩固操作系统基本理论、原理和方法,掌握操作系统开发的基本技能。 I.uC/OS操作系统简介 μC/OS-II是一种可移植的,可植入ROM的,可裁剪的,抢占式的,实时多任务操作系统内核。它被广泛应用于微处理器、微控制器和数字信号处理器。 μC/OS 和μC/OS-II 是专门为计算机的嵌入式应用设计的,绝大部分代码是用C语言编写的。CPU 硬件相关部分是用汇编语言编写的、总量约200行的汇编语言部分被压缩到最低限度,为的是便于移植到任何一种其它的CPU 上。用户只要有标准的ANSI 的C交叉编译器,有汇编器、连接器等软件工具,就可以将μC/OS-II嵌入到开发的产品中。μC/OS-II 具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点,最小内核可编译至2KB 。μC/OS-II 已经移植到了几乎所有知名的CPU 上。 严格地说uC/OS-II只是一个实时操作系统内核,它仅仅包含了任务调度,任务管理,时间管理,内存管理和任务间的通信和同步等基本功能。没有提供输入输出管理,文件系统,网络等额外的服务。但由于uC/OS-II良好的可扩展性和源码开放,这些非必须的功能完全 可以由用户自己根据需要分别实现。 uC/OS-II目标是实现一个基于优先级调度的抢占式的实时内核,并在这个内核之上提供最基本的系统服务,如信号量,邮箱,消息队列,内存管理,中断管理等。 uC/OS操作系统的组成 μC/OS-II可以大致分成核心、任务处理、时间处理、任务同步与通信,CPU的移植等5个部分。如下图:

操作系统课程设计报告

操作系统课程设计报告

东莞理工学院 操作系统课程设计报告 学院:计算机学院 专业班级: 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<<"当前正在运行的进程:"<procname<<"\t\t"<pri<<"\t"<needOftime<<"\t\t"<runtime<<"\t\t"<state<next; } cout<

华中科技大学数据库实验报告

数据库实验报告 一.实验目的 运用所学知识设计并实现一个最小应用系统,初步了解数据库系统的开发过程,积累实际开发经验,为进一步的提高打下必备的基础 二.实验内容 实验一 1.建立数据库”选课信息” 2.在数据库中建立以下三张表 学生表(学号,姓名,性别,院系) 课程表(课程号,课程名,考试方式) 选课表(选课号,学号,课程号,成绩) 3.在JManager中直接插入、修改、删除记录 4.对所建立的三张表定义完整性约束及外键约束 5.采用 insert语句插入新记录 6.采用update语句修改元组信息 7.采用delete语句删除记录 实验二 1.采用sql语句完成对单表的简单查询 2.采用sql语句完成对单表的组合查询,适当引入集函数 3.采用sql语句完成对两表的简单联合查询 4.采用sql语句完成对三表的简单联合查询 5.定义视图并执行简单的查询操作 三. 实验过程 首先创建一个新数据库命名为CW,创建一个新用户,并且将CW的权限赋予给新用 户user1 CREATE DATABASE cw DATAFILE 'cw.dbf' SIZE 128; CREATE LOGIN USER1 IDENTIFIED BY USER11; CREATE USER user1 AT cw; ALTER USER https://www.360docs.net/doc/fd41148.html,er1 RELATED BY user1; GRANT RESOURCE TO user1 AT cw; 实验一 创建用户表STU,其中约束条件:学号SNO为主码,性别SEX默认为男 CREATE TABLE STU ( SNO VARCHAR(10) NOT NULL PRIMARY KEY, SEX VARCHAR(2) NOT NULL DEFAULT '男', DEP VARCHAR(20) NOT NULL, NAME VARCHAR(10) )

操作系统课程设计报告

上海电力学院 计算机操作系统原理 课程设计报告 题目名称:编写程序模拟虚拟存储器管理 姓名:杜志豪.学号: 班级: 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

实时操作系统报告

实时操作系统课程实验报告 专业:通信1001 学号:3100601025 姓名:陈治州 完成时间:2013年6月11日

实验简易电饭煲的模拟 一.实验目的: 掌握在基于嵌入式实时操作系统μC/OS-II的应用中,基于多任务的模式的编程方法。锻炼综合应用多任务机制,任务间的通信机制,内存管理等的能力。 二.实验要求: 1.按“S”开机,系统进入待机状态,时间区域显示当前北京时间,默认模式“煮饭”; 2.按“C”选择模式,即在“煮饭”、“煮粥”和“煮面”模式中循环选择; 3.按“B”开始执行模式命令,“开始”状态选中,时间区域开始倒计时,倒计时完成后进入“保温”状态,同时该状态显示选中,时间区域显示保温时间; 4.按“Q”取消当前工作状态,系统进入待机状态,时间区域显示北京时间,模式为当前模式; 5.按“X”退出系统,时间区域不显示。 6.煮饭时长为30,煮粥时长为50,煮面时长为40. 三.实验设计: 1.设计思路: 以老师所给的五个程序为基础,看懂每个实验之后,对borlandc的操作有了大概的认识,重点以第五个实验Task_EX为框架,利用其中界面显示与按键扫描以及做出相应的响应,对应实现此次实验所需要的功能。 本次实验分为界面显示、按键查询与响应、切换功能、时钟显示与倒计时模块,综合在一起实验所需功能。 2.模块划分图: (1)界面显示: Main() Taskstart() Taskstartdispinit() 在TaskStartDispInit()函数中,使用PC_DispStr()函数画出界面。

(2)按键查询与响应: Main() Taskstart() 在TaskStart()函数中,用if (PC_GetKey(&key) == TRUE)判断是否有按键输入。然后根据key 的值,判断输入的按键是哪一个;在响应中用switch语句来执行对应按键的响应。 (3)切换功能: l计数“C”按 键的次数 M=l%3 Switch(m) M=0,1,2对应于煮饭,煮粥,煮面,然后使用PC_DispStr()函数在选择的选项前画上“@”指示,同时,在其余两项钱画上“”以“擦出”之前画下的“@”,注意l自增。 四.主要代码: #include "stdio.h" #include "includes.h" #include "time.h" #include "dos.h" #include "sys/types.h" #include "stdlib.h" #define TASK_STK_SIZE 512 #define N_TASKS 2 OS_STK TaskStk[N_TASKS][TASK_STK_SIZE]; OS_STK TaskStartStk[TASK_STK_SIZE]; INT8U TaskData[N_TASKS];

数据库课程设计报告案例2015

《数据库原理及应用课程设计》 系统开发报告 学号: 姓名: 题目:医院门诊管理系统 指导教师: 提交时间:2015年12月 计算机工程系

目录 目录 1绪论 (1) 2 医院门诊管理系统概述 (1) 2.1现状分析 (1) 2.2系统目标 (1) 2.3系统特点 (2) 3 医院门诊管理系统数据库设计 (2) 3.1需求分析 (2) 3.2数据库物理结构分析 (2) 3.2.1 设计策略 (3) 3.2.2 系统总体结构图 (3) 图2-1 系统总体结构图 (4) 3.2.3系统详细设计说明 (4) 3.3数据库概念结构设计 (5) 3.4数据库逻辑结构设计 (6) 3.4.1 实体 (6) 3.4.2 完整性约束................................................................................... 错误!未定义书签。 4 医院门诊管理系统数据库功能模块的创建 (7) 4.1 建立病人表,医生表,科室表 (7) 4.2 数据库的连接 (9) 4.3系统功能模块设置 (10) 5 总结 (11)

1绪论 在现代信息技术的基础上,随着人类对各种工程研究成果的逐步推广应用,不久的将来,医疗卫生领域对信息技术的依赖程度将远远超过目前电信、银行、航空业。医院信息化必将得到充分的重视和发展,而医院门诊收费系统就是医院信息化中的重要的一部分。随着计算机性能不断提高,价格不断下降,计算机已在医院医疗、教学、科研、管理等方面得到越来越广泛的应用。计算机化的医院信息系统已成为现代化医院运营过程中必不可少的基础设施与技术支撑环境。 计算机信息管理技术的应用,除了能在相当大的程度上代替人工作业,从而减少人员工作量,减轻工作负担,减少工作中因人为原因而产生的错误从而避免不必要的损失外,更重要的是能建立准确畅通、简便的信息流通渠道,为工作提供所需要的准确、及时的信息以帮助做出正确而及时的选择与决定,从而给采用这门技术的单位带来了巨大的可见或不可见的利益与效益。 2 医院门诊管理系统概述 2.1现状分析 医院的门诊每天都会接待大量的患者,使用医院门诊收费系统可以大大地提高工作效率,减少工作中可能出现的错误,是提高医院办公自动化水平的重要手段之一。其开发主要包括后台数据库的建立和维护以及前端应用程序界面开发两个方面。对于后台数据库的建立和维护要求建立起数据的一致性和完整性强、数据安全性好、符合3NF范式库。而前端应用程序的开发则要求应用程序能提供强大的数据操纵功能,界面友好、使 用简单方便等特点。在中国软件行业日益进步的今天,如何利用这些资源来帮助减轻医生和病人的负担,让医生们利用更多的时间去从事其他的事情。因而设计一个好的门诊收费信息系统,能提高医院的社会效益与经济效益。论文旨在论述医院门诊收费系统的设计与开发。 2.2系统目标 通过医院门诊收费系统的设计,熟练掌握Visual C++、SQL Server 2000等工具软件,系统地掌握需求分析、数据库设计、编码实现、测试等软件开发的流程,提高自身分析问题、解决问题的能力。

操作系统课程设计报告

东莞理工学院 操作系统课程设计报告学院:计算机学院 专业班级: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<<"当前正在运行的进程:"<procname<<"\t\t"<pri<<"\t"<needOftime<<"\t\t"<runtime<<"\t\t"<state<next; } cout<procname<<"\t\t"<pri<<"\t"<needOftime<<"\t\t"<runtime<<"\t\t"<state<next; } cout<

Oracle数据库课程设计报告

课程设计报告书

目录 第1章引言 (3) 第2章概要设计 (5) 2.1系统需求分析 (5) 2.2系统结构设计 (5) 2.3系统功能模块 (6) 第3章数据库分析 (7) 3.1 数据库总体设计 (7) 3.2 数据表设计 (7) 3.3 数据库的创建 (8) 3.4存储过程和触发器 (10) 第4章详细设计及测试 (12) 4.1 系统界面 (12) 4.2 主要代码设计 (15) 4.3 功能整体链接测试 (18) 第5章课程设计心得 (19)

第1章引言 1.设计目的 使用VC,C++,C#等作为前台开发工具,使用Oracle作为后台数据库,所设计的管理系统应包含输入输出、查询、插入、修改、删除等基本功能。根据题目的基本需求,设计系统界面、数据库、编写程序(Oracle),并写出课程设计报告 1、阅读资料:每个人必须提前阅读教材有关Oracle、VC、C++、C#应用方面的内容以及其它相关书籍。 2、需求分析:题目要求达到的功能,所提供的原始数据,需要输出的数据及样式等。 3、数据库的设计:根据要求设计数据库的结构,包括:表、数据完整性、关系、视图。 4、数据库的安全性设计:登录用户、数据库用户、数据库角色、命令许可等方面 涉及到数据的所有操作要求采用存储过程的方式进行。 2.设计要求 1.选好题目:先分组,每组两个人(或单独完成),必须确保每题有两组人员选做,班长将本班同学的选题情况汇总后于16周之前交。 2.独立思考,独立完成:课程设计中各任务的设计和调试要求独立完成,遇到问题可以讨论,但不可以拷贝,否则不管是抄袭还是被抄袭,雷同的全部直接评定为不及格。 3.做好上机准备:每次上机前,要事先编制好准备调试的程序,认真想好调试步骤和有关环境的设置方法,准备好有关的文件。 4.根据编程实现的结果,按课程设计报告的撰写规范完成数据库系统课程设计报告(课程设计报告中必须有相关原理分析、程序设计、程序实现和程序调试等内容);课程设计报告的具体要求如下: 1)课设报告按照规定用A4纸张进行排版打印,否则要求返工; 2)课设报告的内容顺序如下:封面—任务书—中文摘要—目录—正文—附录; 3)正文不少于4000字,正文部分至少包含以下内容,并可大致作如下安排 1.引言(包括设计目的、要求、设计环境、同组人员及分工等内容)

嵌入式实时操作系统实验报告

嵌入式实时操作系统实验报告 任务间通信机制的建立 系别计算机与电子系 专业班级***** 学生姓名****** 指导教师 ****** 提交日期 2012 年 4 月 1 日

一、实验目的 掌握在基于嵌入式实时操作系统μC/OS-II的应用中,任务使用信号量的一般原理。掌握在基于优先级的可抢占嵌入式实时操作系统的应用中,出现优先级反转现象的原理及解决优先级反转的策略——优先级继承的原理。 二、实验内容 1.建立并熟悉Borland C 编译及调试环境。 2.使用课本配套光盘中第五章的例程运行(例5-4,例5-5,例5-6),观察运行结果,掌握信号量的基本原理及使用方法,理解出现优先级反转现象的根本原因并提出解决方案。 3.试编写一个应用程序,采用计数器型信号量(初值为2),有3个用户任务需要此信号量,它们轮流使用此信号量,在同一时刻只有两个任务能使用信号量,当其中一个任务获得信号量时向屏幕打印“TASK N get the signal”。观察程序运行结果并记录。 4. 试编写一个应用程序实现例5-7的内容,即用优先级继承的方法解决优先级反转的问题,观察程序运行结果并记录。 5.在例5-8基础上修改程序增加一个任务HerTask,它和YouTask一样从邮箱Str_Box里取消息并打印出来,打印信息中增加任务标识,即由哪个任务打印的;MyTask发送消息改为当Times为5的倍数时才发送,HerTask接收消息采用无等待方式,如果邮箱为空,则输出“The mailbox is empty”, 观察程序运行结果并记录。 三、实验原理 1. 信号量 μC/OS-II中的信号量由两部分组成:一个是信号量的计数值,它是一个16位的无符号整数(0 到65,535之间);另一个是由等待该信号量的任务组成的等待任务表。用户要在OS_CFG.H中将OS_SEM_EN开关量常数置成1,这样μC/OS-II 才能支持信号量。

操作系统课程设计报告

东莞理工学院 操作系统课程设计报告 学院:计算机学院 专业班级: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<<"当前正在运行的进程:"<procname<<"\t\t"<pri<<"\t"<needOftime<<"\t\t"<runtime<<"\t\t"<state<next; } cout<procname<<"\t\t"<pri<<"\t"<needOftime<<"\t\t"<runtime<<"\t\t"<state<next; } cout<procname<<"\t\t"<pri<<"\t"<needOftime<<"\t\t"<runtime<<"\t\t"<state<

数据库课程设计报告完整版

数据库课程设计报告 HEN system office room 【HEN16H-HENS2AHENS8Q8-HENH1688】

数据库课程设计 --JIA服装销售系统 指导老师:索剑 系名:计算机科学系 姓名:薛文科 班级:11计算机1班 目录 第一章绪论....................................................................... (3) 课题简介........................................................................ (3) 设计目的........................................................................ (3) 设计内容........................................................................ (3) 系统实验要求........................................................................ . (3) 第二章需求分析....................................................................... .. (3)

系统基本功能........................................................................ .. (3) 权限划分........................................................................ . (4) 系统运作流程........................................................................ . (4) 数据字典........................................................................ .. (5) 第三章概念结构设计 (7) 概念结构设计的方法与步骤 (7) 3.1.1概念结构设计的方法........................................................................ . (7) 3.1.2概念结构设计的步骤........................................................................ . (7) 数据抽象与局部视图设计........................................................................ . (8) 视图的集成........................................................................ (9) 第四章逻辑结构设计 (10) E-R图向关系模型的转换........................................................................ (10) 数据模型的优化........................................................................ (11) 数据库的结构........................................................................ . (11)

操作系统(一个小型操作系统的设计与实现)课程设计

南通大学计算机科学与技术学院操作系统课程设计报告 专业: 学生姓名: 学号: 时间:

操作系统模拟算法课程设计报告 设计要求 将本学期三次的实验集成实现: A.处理机管理; B.存储器管理; C.虚拟存储器的缺页调度。 设计流程图 主流程图 开始的图形界面 处理机管理存储器管理缺页调度 先来先服务时 间 片 轮 转 首 次 适 应 法 最 佳 适 应 法 先 进 先 出 L R U 算 法

A.处理机调度 1)先来先服务FCFS N Y 先来先服务算法流程 开始 初始化进程控制块,让进程控制块按进程到达先后顺序让进程排队 调度数组中首个进程,并让数组中的下一位移到首位 计算并打印进程的完成时刻、周转时间、带权周转时间 其中:周转时间 = 完成时间 - 到达时间 带权周转时间=周转时间/服务时间 更改计时器的当前时间,即下一刻进程的开始时间 当前时间=前一进程的完成时间+其服务时间 数组为空 结束

2)时间片轮转法 开始 输入进程总数 指针所指的进程是 否结束 输入各进程信息 输出为就绪状态的进程的信息 更改正在运行的进程的已运行时间 跳过已结束的程序 结束 N 指向下一个进程 Y 如果存在下一个进程的话 Y N 输出此时为就绪状态的进程的信息 时间片轮转算法流程图

B.存储器管理(可变式分区管理) 1)首次适应法 分配流程图 申请xkb内存 由链头找到第一个空闲区 分区大小≥xkb? 大于 分区大小=分区大小-xkb,修改下一个空闲区的后向指针内容为(后向指针)+xkb;修改上一个空闲区的前向指针为(前向指针)+xkb 将该空闲区从链中摘除:修改下一个空闲区的后向地址=该空闲区后向地址,修改上一个空闲区的前向指针为该空闲区的前向指针 等于 小于延链查找下 一个空闲区 到链尾 了? 作业等待 返回是 否 登记已分配表 返回分配给进程的内存首地址 开始

操作系统实验报告

实验报告 实验课程名称:操作系统 实验地点:南主楼七楼机房 2018—2019学年(一)学期 2018年 9月至 2019 年 1 月 专业: 班级: 学号: 姓名: 指导老师:刘一男

实验一 实验项目:分时系统模拟 实验学时:2实验日期: 2018-10-25 成绩: 实验目的利用程序设计语言模拟分时系统中多个进程按时间片轮转调度算法进行进程调度的过程; 假设有五个进程A,B,C,D,E,它们的到达时间及要求服务的时间分别为:进程名 A B C D E 到达时间0 1 2 3 4 服务时间 4 3 4 2 4 时间片大小为1,利用程序模拟A,B,C,D,E五个进程按时间片轮转的调度及执行过程并计算各进程的周转时间及带权周转时间。 执行过程并计算各进程的周转时间及带权周转时间。 轮转调度:BDACE

(1)修改时间片大小为2,利用程序模拟A,B,C,D,E五个进程按时间片轮转的调度及执行过程并计算各进程的周转时间及带权周转时间。 轮转调度:ADBCE (2)修改时间片大小为4,利用程序模拟A,B,C,D,E五个进程按时间片轮转的调度及执行过程并计算各进程的周转时间及带权周转时间.

顺序:ABCDE 1、思考 时间片的大小对调度算法产生什么影响?对计算机的性能产生什么影响?答:通过对时间片轮转调度算法中进程最后一次执行时间片分配的优化,提出了一种改进的时间片轮转调度算法,该算法具有更好的实时性,同时减少了任务调度次数和进程切换次数,降低了系统开销,提升了CPU的运行效率,使操作系统的性能得到了一定的提高。 A B C D E 时间片为1 周转时间12 9 14 8 13 3 3 3.5 4 3.25 带权周转 时间 时间片为2 周转时间8 12 13 7 13 2 4 3.25 3.5 3.25 带权周转 时间 时间片为4 周转时间 4 6 9 10 13 1 2 2.25 5 3.25 带权周转 时间

相关文档
最新文档