操作系统课程设计报告

西安郵電大學

操作系统课程设计 院系名称

学生姓名

专业名称

班 级

学号

时间 报 告 书 2015 年4月 13 日 至 2015 年 4月 24 日

::::::

1 实验目的

操作系统是控制和管理计算机硬件和软件资源的虚拟机,其中的文件系统是对软件和设备进行管理的系统,文件系统是操作系统中非常重要的一个模块,它的实现占用了操作系统源码的最大编码量,其好坏也直接影响着用户对操作系统的感受程度。通过对操作系统课程设计的实践,进一步加深对文件系统的认识和理解,并在此基础上培养学生的工程应用能力。实验分别从用户态和内核态两个层次实践文件系统的部分功能。

2 实验任务

2.1 ls实现

在linux下编程实现带参数的shell命令 ls,ls命令必须支持如下功能。

1.基本要求

(1) 支持 -l 参数;

(2) 输出结果按字典排序;

(3) 列出“.”文件,支持-a参数,在没有-a时候不显示隐藏文件;

(4) 显示记录总数。

2.高级要求

(1) 支持对给定的目录进行操作,如 ls /tmp;

(2) 输出结果分栏排序,每栏的宽度由这一栏最长的文件名决定,显示的栏数还受终端显示器的宽度影响,每一列尽可能的等宽;

(3) 正确显示文件特殊属性suid、sgid和sticky,参见联机帮助确保程序能处理各种情况;

(4) 支持标准的ls支持选项-R,它的功能是递归地列出目录中所有的文件包含子目录中的文件;

(5) 支持标准的ls支持选项-u,它会显示出文件的最后访问时间,如果用了-u而不用-l,会有什么结果?;

(6) 当关掉一个文件的读权限,就不能打开这个文件来读。如果从一个终端登录,打开一个文件,保持文件的打开状态,然后从另外的终端登录,去掉文件的读权限,这时有什么事情会发生?编写一个程序,先用open()打开一个文件,用read()读一些内容,调用sleep()等待20s以后,再读一些内容,从另外的终端,再等待的20s内去掉文件的读权限,这样会有什么结果?。

2.2编写内核模块显示目录或文件的信息。

(1) 使用内核模块编程;

(2) 调试《Linux操作系统原理与应用》第8章文件系统P215 的例子;

(3) 练习给内核模块传入参数,参考关于带参数的模块编程/uid-796091-id-3206153.html;

(4) 给内核模块传入参数path,其中path为绝对路径;

1) 当path为目录时,显示目录对应的dentrey结构中的相关信息(可打印的信息);

2) 当path为文件时,显示文件对应的indoe结构中的相关信息(可打印的信息);

3) 当路径错误时,有错误提示信息。

3 开发环境

操作系统课程设计报告

操作系统课程设计报告

4 测试环境

5 总体设计

5.1功能组织图

⑴实现ls命令功能

操作系统课程设计报告

操作系统课程设计报告

⑵编写内核模块

①编写内核模块,打印super_block结构中一些域的值。(课本上的例子)

②给内核模块传入参数path,其中path为绝对路径

操作系统课程设计报告

操作系统课程设计报告

5.2原理

linux 文件系统

linux下有普通文件、目录文件、链接文件、设备文件、管道文件这几

种类型。但链接文件、设备文件、管道文件都可以当做普通文件看待,那实际也就只要区分普通文件和目录文件这两种了。而目录文件的内容就是它所包含所有文件和子目录的一个列表,所以只要打开目录文件并读取对应目录块里的那个列表数据,就可以得到些目录下所有文件和子目录的名称了。其实这个流程简单,就是:打开目录->读取内容->显示文件名称->关闭打开的目录。

Linux系统中会有很多目录。每个目录中又会有很多文件。如果要列出一个非当前目录的内容或者是一个特定文件的信息,则需要在参数中给出目录名或文件名。如:

ls /tmp //列出/tmp目录中各文件的文件名

ls – docs //列出docs目录中各文件的属性

ls *.c //列出当前目录下与*.c匹配的文件,即当前目录下所有以.c为后缀的 经常用到的命令行选项

ls -l 在前面已经提到过,-l就是输出文件详细的信息。也叫长格式; ls -a 列出的内容包含以“.“开头的让文件,即所谓有隐藏文件

ls –t 输出时按时间排序

ls –F 显示文件类型 ls –lu 显示最后访问时间

6 详细设计

6.1 模块一ls

1.功能

ls –l 输出文件详细的信息。也叫长格式;

ls -a 列出的内容包含以“.“开头的让文件,即所谓有隐藏文件;

ls –al 输出包含隐藏文件的文件详细信息;

2.算法/流程图

根据命令行参数和完整路径名显示目标文件

操作系统课程设计报告

3.运行结果 Ls -l

操作系统课程设计报告

ls -a

操作系统课程设计报告

4.模块使用的主要函数、数据类型和宏

(1)主要函数说明

1)函数一

原型:void cmd_ls(char *cmd_name,char *pathname,int cmd_bit) 功能:打印文件信息

参数:char *cmd_name,char *pathname,int cmd_bit 原型:void ls_long_format(char * filename) 功能:实现ls –l列出文件详细信息

参数:char * filename

(2)数据类型

1)数据类型1

名称:*cmd_p

操作系统课程设计报告

类型:char

含义:指向输入的参数

7 测试方法与测试结果

7.1测试方法

黑盒测试

又称功能测试或者数据驱动测试。黑盒测试是根据软件的规格对软件进行的测试,这类测试不考虑软件内部的运作原理,因此软件对用户来说就像一个黑盒子。软件测试人员以用户的角度,通过各种输入和观察软件的各种输出结果来发现软件存在的缺陷,而不关心程序具体如何实现的一种软件测试方法。

测试用例如下:

./ls

./ls –a

./ls –l

./ls –a –l

./ls -h

./ls –xxx

./ls /tempt

7.2测试结果

./ls –l

操作系统课程设计报告

./ls -a

./ls -al

./ls –

操作系统课程设计报告

操作系统课程设计报告

a -l

操作系统课程设计报告

给内核模块传入参数path,path为目录或文件

操作系统课程设计报告

8 调试情况,设计技巧及体会

本次课程设计我写的是Linux下的ls命令,通过这次课程设计,不仅使我对ls命令有了更深一层的认识,还认识到了系统提供的命令实现的途径和方法。之前总是使用系统命令,如今自己编程实现了一些命令,每次使用系统提供的命令和调用自己编写的命令感觉大不相同。

9 参考资料

[1] DANIEL P.BOVET&MARCO CESATI. 深入理解LINUX内核[M]. 陈莉君,张琼声,张宏伟,译.第三版. 北京:中国电力出版社,2007:825-831.

[2]Documentation/x86/boot.txt

[3 ]鸟哥. 鸟哥的Linux私房菜[M]. 王世江,改编. 第三版. 北京:人民邮电出版社,2011:293-399,596-608.

[4] Richard Blum. 汇编语言程序设计[M]. 马朝晖 译. 北京:机械工业出版社,2006.

[5] http://elinux.org/images/d/d2/Tools-and-technique-for-reducing-bootup-time.pdf

10 源程序清单

 

第二篇:操作系统课程设计报告.doc

肇庆学院计算机科学与软件学院

《操作系统》课程设计报告

设计题目:采用优先数算法模拟进程调度程序

完成日期:20xx年6月3日

操作系统课程设计报告doc

操作系统课程设计报告doc

采用优先数算法模拟进程调度程序分析、设计与实现

一、设计理论描述

进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。另有一种定义方法是“程序在处理器上的执行”。为了模拟的方便,本设计采用这种定义。

简单地说,进程包括三种状态:运行状态、就绪状态、完成状态。

通常操作系统用一个称为进程控制块(PCB)的数据结构来记录进程的属性信息。PCB一般应包含以下信息:进程标识信息(本进程的标志ID、父进程的标志ID、用户标识);处理机状态信息(用户使用的寄存器、控制和状态寄存器、堆栈指针);进程调度和控制信息(进程的状态、进程的调度优先级、程序和数据的地址、进程同步和通信机制、进程已等待时间、已使用的处理器时间、进程在有关队列中的链接指针、分给进程的主存大小和位置、进程使用的其他资源信息、进程得到有关服务的优先级、进程调度所需的其他信息)。

优先级调度算法:按照进程的优先级大小来调度,是高优先级进程得到优先的处理的调度策略,可使用非抢占或可抢占两种策略。

二、设计思想、设计分析及数据结构模型

这个设计需要考虑两个问题:如何组织进程、如何实现进程模拟调度。 考虑如何组织进程,首先就要设置进程控制块的内容。进程控制块PCB记录各个进程执行时的情况。不同的操作系统,进程控制块记录的信息内容不一样。操作系统功能越强,软件也越庞大,进程控制块记录的内容也就越多。这里的设计只使用了必不可少的信息。一般操作系统中,无论进程控制块中信息量多少,信息都可以大致分为以下四类:

(1)标识信息

每个进程都要有一个唯一的标识符,用来标识进程的存在和区别于其他进程。这个标识符是必不可少的,可以用符号或编号实现,它必须是操作系统分配的。在后面给出的参考程序中,采用符号方式,也就是为每个进程依次分配一个不相同符号。

(2)说明信息

用于记录进程的基本情况,例如,进程的状态、等待原因、进程程序存放位

置、进程数据存放位置等。设计中,因为进程没有数据和程序,仅使用进程控制块模拟进程,所以这部分内容仅包括进程状态。

(4)管理信息

管理信息记录进程管理和调度的信息。例如进程优先数和进程队列指针等。设计中,包括队列指针、进程优先数、已运行时间、还需运行时间。

因此可将进程控制块结构定义如下:

Class PCB

{

String proname; //进程标识符

String state; //进程状态

Int pri; //进程优先数

Int runtime; //进程已运行时间

Int needtime; //还需要运行时间

PCB *next; //下一个进程控制块的指针

}

确定进程控制块内容后,要考虑的就是如何将进程控制块组织在一起。多道程序设计系统,往往同时创建多个进程。在单处理机的情况下,每次只能有一个进程处于运行态,其他的进程处于就绪状态或等待状态。为了便于管理,通常把处于相同状态的进程的进程控制块链接在一起。单处理机系统中,正在运行的进程只有一个,因此,单处理机系统中进程控制块分成一个正在运行进程的进程控制块、就绪进程的进程控制块组织成的就绪队列和等待进程的进程控制块组成的等待队列。由于设计模拟的是进程调度,没有对等待队列的操作,所以设计中只有一个指向正在运行进程的进程控制块指针和一个就绪进程的进程控制块队列指针和一个指向已完成进程的进程控制块队列指针。

这样,进程控制块的链表实际上是数据结构中使用的静态链表。进程控制块的链接方式可以采用单向和双向链表,设计中,进程控制块队列采用单向不循环静态链表。

在各队列中,各进程按照进程的优先数进行排列,队首指向的是优先数最高的进程,每次向各队列中插入一个进程时都会先按照插入排序法按优先数从高到低把进程插入到队列的相应位置。

以上是如何组织进程,下面考虑如何调度进程,一开始,调度程序将就绪队列的队首进程加入到运行队列,运行一周期后用当前正在运行的进程的优先数与就绪队列队首进程的优先数对比,如果当前运行的进程的优先数小于就绪队列队首的进程,则把当前运行的进程按照按优先数的顺序插入到就绪队列的相应位置,把就绪队列队首的进程加入到运行队列中。

三、程序流程图

四、源代码

操作系统课程设计报告doc

#include "stdafx.h"

#include <iostream>

#include <time.h>

#include <string>

using namespace std;

int n;

class PCB

{

public:

string procname;//进程名

int pri;//进程优先数

string state;//进程状态

int runtime;//进程已运行CPU时间 int needOftime;//还需要时间 PCB *next;//指针

};

PCB *run = NULL; //运行队列头指针 PCB *ready = NULL;//就绪队列头指针 PCB *finish = NULL;//完成队列头指针 void Dtime(int t)

{

time_t current_time;

time_t start_time;

time(&start_time);

do

{

time(& current_time);

}while((current_time-start_time)<t); }

void Prinft()

{

PCB *p;

system("cls");//清屏

p=run;

if(p!=NULL)

{

p->next=NULL;

}

cout<<"当前正在运行的进程:"<<endl;

cout<<"进程名称"<<"\t"<<"优先数"<<"\t"<<"还需要时间"<<"\t"<<"已运行时间"<<"\t"<<"状态:"<<endl;

while(p!=NULL)

{

cout<<p->procname<<"\t\t"<<p->pri<<"\t"<<p->needOftime<<"\t\t"<<p->runtime<<"\t\t"<<p->state<<endl;

p=p->next;

}

cout<<endl<<endl;

cout<<"当前的就绪队列:"<<endl;

cout<<"进程名称"<<"\t"<<"优先数"<<"\t"<<"还需要时间"<<"\t"<<"已运行时间"<<"\t"<<"状态:"<<endl;

p=ready;

while(p!=NULL)

{

cout<<p->procname<<"\t\t"<<p->pri<<"\t"<<p->needOftime<<"\t\t"<<p->runtime<<"\t\t"<<p->state<<endl;

p=p->next;

}

cout<<endl<<endl;

cout<<"当前已经完成的进程:"<<endl;

cout<<"进程名称"<<"\t"<<"优先数"<<"\t"<<"还需要时间"<<"\t"<<"已运行时间"<<"\t"<<"状态:"<<endl;

p=finish;

while(p!=NULL)

{

cout<<p->procname<<"\t\t"<<p->pri<<"\t"<<p->needOftime<<"\t\t"<<p->runtime<<"\t\t"<<p->state<<endl;

p=p->next;

}

}

void insert(PCB *p)//按Pri大小插入就绪队列

{

PCB *S1,*S2;

if(ready==NULL)

{

p->next = NULL;

ready = p;

}

else

{

S1 = ready;

S2 = S1;

while(S1!=NULL)

{

if(S1->pri >= p->pri)

{

S2 = S1;

S1 = S1->next;

}

else

break;

}

if(S2->pri >= p->pri)

{

S2->next = p;

p->next = S1;

}

else

{

p->next = ready;

ready = p;

}

}

}

void priority()

{

run = ready;

ready = ready->next;

run->state = "运行";

while(run!=NULL) /*当运行队列不空时,有进程正在运行*/ {

Dtime(1);//延时1秒

run->runtime=run->runtime+1;

run->needOftime=run->needOftime-1;

run->pri=run->pri-1; /*每运行一次优先数降低1个单位*/

if(run->needOftime==0) /*如所需时间为0将其插入完成队列*/ {

run->state = "完成";

run->next = finish;

finish = run;

run=NULL; /*运行队列头指针为空*/

if(ready!=NULL) /*如就绪队列不空*/ {

run = ready;

run->state = "运行";

ready = ready->next;

}

}

else if((ready!=NULL)&&(run->pri<ready->pri)) {

run->state="就绪";

insert(run);

run = ready;

run->state = "运行";

ready = ready->next;

}

Prinft(); /*输出进程PCB信息*/

}

}

void CTProcessOfPri()//创建进程

{

PCB * Node;

string c[5]={"P1","P2","P3","P4","P5"}; srand((int)time(0));

for(int j = 0;j < 5; j++)

{

Node = new PCB;

if(Node==NULL)

{

return;

}

else

{

Node->procname=c[j];

Node->needOftime=1+(int)(15.0*rand()/(RAND_MAX+1.0));//为进程随机分配占用CPU时间.

Node->runtime = 0;

Node->state ="就绪";

Node->pri =1+(int)(20.0*rand()/(RAND_MAX+1.0));//为进程随机分配优先数. }

insert(Node);

}

}

void main()

{

cout <<"*******************************************"<<endl;

cout <<"* 优先数调度算法 *"<<endl;

cout <<"*******************************************"<<endl;

cout <<"按任意键开始创建进程??"<<endl;

CTProcessOfPri();//新建进程

Prinft();

cout<<endl;

cout <<"按任意键开始运行进程模拟调度程序??"<<endl;

getchar();

priority();//运行模拟进程调度。

}

五、程序运行结果及分析

操作系统课程设计报告doc

图5.1系统运行的初始画面

操作系统课程设计报告doc

图5.2按任意键后开始执行的画面

操作系统课程设计报告doc

图5.3执行一段时间时的画面

操作系统课程设计报告doc

图5.4 执行完毕后的画面

六、课程设计心得与体会(包括对课程设计的改进建议)

附录

相关推荐