操作系统命令接口设计课程设计说明书

时间:2019-05-14 03:02:16下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《操作系统命令接口设计课程设计说明书》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《操作系统命令接口设计课程设计说明书》。

第一篇:操作系统命令接口设计课程设计说明书

佛山科学技术学院课程设计用纸

课程设计说明书

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

题目:操作系统命令接口设计

学生姓名: 专业: 班级: 学号: 指导教师:

日期: 2016 年 6 月 28 日 佛山科学技术学院课程设计用纸

课程设计任务书

网络工程专业年级班一、二、主要内容

利用C语言、DOS中断中21H与屏幕显示相关的中断调用完成设计,具体包括:

1、命令解释器

2、列目录命令

3、显示时间命令

4、显示日期命令

5、回显字符串命令

6、创建目录命令

7、删除目录命令

8、更改路径命令

9、显示当前工作目录命令

10、删除文件命令

11、打印文本命令

12、文件重新命名

13、显示文本命令

14、显示版本命令

15、显示目录结构命令

16、清除当前显示内容命令

上述内容中,所有命令通过命令解释器能够执行,即启动命令解释器以后,输入相应命令,按照输入指令执行相应功能,并在屏幕上显示相应结果。设计题目

操作系统命令接口设计

三、具体要求

本设计的目的是通过设计一些简单的操作系统的命令接口,使学生掌握操作系统接口的设计方法。要求学生在熟悉操作系统的命令接口及程序接口的基础上,利用C语言设计简单的命令接口。命令接口基于DOS的命令行接口。

佛山科学技术学院课程设计用纸

四、进度安排

1.要求讲解、资料查找、系统分析,概要设计(2天)2.系统详细设计、功能设计(2天)3.算法实现、编程调试(5天)

4.功能演示、资料整理、课程设计说明书编写。(1天)依照教学计划,课程设计时间为:2周。五、六、指导教师

签名日期 年 月 日

系主任

审核日期 年 月 日 完成后应上交的材料

课程设计说明书纸质文档

总评成绩 佛山科学技术学院课程设计用纸

目 录

一、程序概述...........................................................................................................................................................1 1.1完成的任务...............................................................................................................................................1 1.2解决的问题.............................................................................................................错误!未定义书签。

二、概念原理...........................................................................................................................................................1 2.1基本概念...................................................................................................................................................1 2.2基本原理...................................................................................................................................................1

三、总体设计...........................................................................................................................................................2

四、详细设计...........................................................................................................................................................3 4.1主要调用DOS的功能号...........................................................................................................................3 4.2主要函数...................................................................................................................................................3

五、完成情况...........................................................................................................................................................3

六、使用说明...........................................................................................................................................................4

七、设计总结...........................................................................................................................................................7 7.1系统特色...................................................................................................................................................7 7.2实践感受...................................................................................................................................................4 参考资料...................................................................................................................................................................5 附录(程序源代码)...............................................................................................................................................9

佛山科学技术学院课程设计用纸

一、程序概述

1.1完成的任务

本设计是要求编写一个简单的命令解释器,利用C语言、DOS中断中21H与屏幕显示相关的中断调用进行设计的,主要完成要求中所提到的功能如:可打开提示符,并获取用户输入的指令、可解析指令、可寻找命令文件、可执行基本的命令。在本设计中,设计了一个dos命令提示行,主要完成的功能有:显示系统时间和日期,显示系统版本号,删除文件,创建目录,删除目录,重命名目录或文件名,回显字符串,打印文件,清屏等功能。

1.2解决的问题

在设计过程中主要遇到了两个难题,一是如何理解和设计中断,对汇编和c语言的结合,如引入#include,#include;二是如何使用中断函数如int86(),int86x(),int dos(),int 等。里面主要的是结构体SREGS,联合体REGS,以及汇编语言int 21H系统调用中断,以及调用功能号的查询和设置。

二、概念原理

2.1基本概念

中断

当CPU(中央处理器)执行一条现行指令的时候,出现必须CPU立即执行处理的情况,CPU暂时停止当前程序的执行转而而执行新情况叫中断,此时如果外设向CPU发出中断请求,那么CPU在满足响应的情况下,将发出中断响应信号,与此同时关闭中断,表示CPU不在受理另外一个设备的中断。此次课程设计涉及有DOS中断和BIOS中断。

命令接口处理器

命令处理器是一个读入并解释你输入的命令的程序,它是介于使用者和操作系统之核心程序(kernel)间的一个接口。它是一个交互性命令解释器。命令处理器独立于操作系统,这种设计让用户可以灵活选择适合自己的命令处理器。命令处理器让你在命令行键入命令,经过命令处理器解释后传送给操作系统(内核)执行。

命令提示符

“命令提示符”也就是Windows 95/98 下的“MS-DOS方式”,虽然随着计算机产业的发展,Windows 操作系统的应用越来越广泛,DOS 面临着被淘汰的命运,但是因为它运行安全、稳定,有的用户还在使用,所以一般Windows 的各种版本都与其兼容,用户可以在Windows系统下运行DOS,中文版Windows XP 中的命令提示符进一步提高了与DOS下操作命令的兼容性,用户可以在命令提示符直接输入中文调用文件。

消息循环

通过这个循环机制应用程序从消息队列中检索消息,再把它分派给适当的窗口,然后继续从消息队列中检索下一条消息,再分派给适当的窗口,依次进行。

系统调用

系统调用,顾名思义,说的是操作系统提供给用户程序调用的一组“特殊”接口。用户程序可以通过这组“特殊”接口来获得操作系统内核提供的服务,比如用户可以通过文件系统相关的调用请求系统打开文件、关闭文件或读写文件,可以通过时钟相关的系统调用获得系统时间或设置定时器等。

从逻辑上来说,系统调用可被看成是一个内核与用户空间程序交互的接口,它好比一个中间人,把用户进程的请求传达给内核,待内核把请求处理完毕后再将处理结果送回给用户空间。

佛山科学技术学院课程设计用纸

2.2基本原理

首先进入一个消息循环,不断地接收消息,根据输入的命令进行解析,然后执行命令,遇exit命令退出。

基本流程图:

开始输入指令否判断指令是否存在或者输入正确?是命令解释器显示系统时间显示系统日期显示版本号删除文件创建目录删除目录重命名目录重命名文件回显字符串打印文件内容清除屏幕内容否退出?是结束

三、总体设计

程序主要通过文件来存储帐户信息。进入提示符后,在消息循环中运用了一个do while循环,2 佛山科学技术学院课程设计用纸

switch„case将dos条用编写的函数组合起来供用户选择使用。连续的获取用户输入,直到用户输入0退出循环,结束程序。在处理文件或文件夹过程中,没有使用系统当前文件夹变量,只是在程序中单独设定了一个变量作为系统当前目录,每次获得的目录路径,如果是相对路径,则自动在前面加上当前目录路径。整个程序的设计流程,围绕着消息循环这一主线,根据消息判断调用不同的功能函数来完成相应的功能,主要使用了一些函数和汇编调用DOS接口和21号中断。

四、详细设计

4.1、主要调用DOS的功能号

2AH 读取日期

2CH 读取时间

30H 读取MS-DOS版本号 39H 创建目录 41H

删除文件

3AH 表示删除目录 56H 重命名文件 3DH 打开文件 47H 读取当前目录 3FH 读文件或目录

4.2、主要函数 void time()通过定义该函数实现调用dos的2C号功能读取系统时间的功能 void day()

通过定义该函数实现调用dos的2A功能读取系统日期的功能 void dos()通过定义该函数调用dos的30H功能读取系统的版本号功能 void DeleteFile(char filename[80])定义该函数用于删除文件或目录如果删除成功显示“success”,删除失败表示找不到该文件 void Createfile(char filename[80])

定义该函数调用dos的39H号功能用于创建一个目录 void file(char filename1[80],char filename2[80])定于该函数调用dos系统的56号功能用于重命名目录名和文件名的 void showlist()

定于该函数调用dos系统的47号功能读取当前的工作目录 void rewords()定于该函数用于调用dos的9号功能实现回显字符串功能 void ReadFromFile(char filename[80])定于该函数用于调用dos的3F功能用于读取文件或目录的内容。clrscr();引用该函数实现清除屏幕内容的功能。

五、完成情况

本程序完成了要求中的13项列目录,包括获取系统时间,获取系统日期,创建目录,删除目录,创建文件并写内容到文件中,打印文本,删除文件,更改目录或文件名,显示版本,清屏操作,获得当前的工 佛山科学技术学院课程设计用纸 作目录等13个要求

六、使用说明

运行程序首先回出现下图的界面,显示的是各项操作的命令,根据相关命令可以执行相关的操作

功能1:显示系统时间 功能2:系统日期:

功能3:显示版本

功能4:删除文件:

佛山科学技术学院课程设计用纸

功能5:创建目录

功能6:删除目录 删除new文件夹:

功能7:重命名目录或文件

修改目录(重命名目录):将上面目录123修改为101

修改文件(重命名文件):将文件名1.txt改为new1.txt 5 佛山科学技术学院课程设计用纸

功能8:显示当前工作目录

功能9:回显字符串

功能10:打印文件内容(读文件)

已知new1.txt文件里面的内容如下,通过该系统读出文件的内容

功能11:清除屏幕所有内容

佛山科学技术学院课程设计用纸

清屏后:

直至输入指令为0(代表exit)时退出系统。

七、设计总结

7.1系统特色

本系统基本实现命令访问接口的设计,能正常解释命令并执行,在命令的解释和执行直接采用DOS系统的中断调用以及功能类型号码的选择和设置,能够符合操作系统命令接口设计的要求。

7.2实践感受

课程设计是理论知识和实际操作的一种结合,对所学的知识进行强化。从确立课题到遇到问题查找资料,直到做出基本的结果,在这个过程中学到了之前所没有接触的知识点。例如在编程过程中要多使用库函数中自带的内容,不必另外再去编写已有的功能,这样不仅能节省时间,也能提高程序的可靠性。要多了解库函数,可以阅读相应的帮助文件来获得有用的信息。遇到问题多与老师同学讨论,可以帮助自己跳出定向思维。

佛山科学技术学院课程设计用纸

参考资料

《c程序设计》(第三版)谭浩强著清华大学出版社

《80x86汇编语言程序设计》沈美明,温冬婵 著清华大学出版社 《c与c++标准类库及函数.chm》

《Windows API for 2000/XP实例精解》王强周明李定国等编著电子工业出版社 《数据结构(c语言版)》严蔚敏,吴伟民等编著清华大学出版社

佛山科学技术学院课程设计用纸

附录

源代码(Torbo C 3.0环境下)

#include #include #include #include #include #define INTER 0x21

void menu(){

printf(“----------n”);

} void time(){

}

void day(){

} void dos(){ union REGS inregs,outregs;//定义中断信息结构体 union REGS inregs,outregs;//定义中断信息结构体 struct SREGS segregs;inregs.h.ah=0x2a;//读取日期

int86x(INTER,&inregs,&outregs,&segregs);

printf(“Now the day is:%d,%d,%dn”,outregs.x.cx,outregs.h.dh,outregs.h.dl);getchar();union REGS inregs,outregs;//定义中断信息结构体 struct SREGS segregs;inregs.h.ah=0x2C;//读取时间

int86x(INTER,&inregs,&outregs,&segregs);printf(“Now the time is:%d:%d:%dn”,outregs.h.ch,outregs.h.cl,outregs.h.dh);getchar();printf(“0.exitn”);printf(“1.Display system timen”);printf(“2.Display system dayn”);printf(“3.Display Mos-dos versionn”);printf(“4.Deletefilen”);printf(“5.Createcontentn”);printf(“6.Deletecontentsn”);printf(“7.Filenamen”);printf(“8.Display currrent listn”);printf(“9.Echo stringn”);printf(“10.ReadingFilen”);printf(“11.Clear screenn”);printf(“----------n”);9 佛山科学技术学院课程设计用纸

}

void DeleteFile(char filename[80]){

}

void Createfile(char filename[80]){

{ }

}

void Deletefile(char filename[80]){

int result;union REGS inregs,outregs;printf(“success!n”);union REGS inregs,outregs;struct SREGS segregs;inregs.h.ah=0x39;

inregs.x.dx=FP_OFF(filename);segregs.ds=FP_SEG(filename);

int86x(INTER,&inregs,&outregs,&segregs);

printf(“nFILE %s is not exist!n”,filename);int result;union REGS inregs,outregs;struct SREGS segregs;

inregs.h.ah=0x41;//DOS 中断号 41 是删除文件 inregs.x.dx=FP_OFF(filename);segregs.ds=FP_SEG(filename);

int86x(INTER,&inregs,&outregs,&segregs);if(result==2||result==5){ } else { } printf(“nThe file:%s has been delete successfully!n”,filename);printf(“nCan't delete the file:%s

The file may not be exist!n”,filename);struct SREGS segregs;

inregs.h.ah=0x30;//DOS 30号功能读取MS-DOS版本号 int86x(INTER,&inregs,&outregs,&segregs);printf(“The DOS

version

of

this

machine is:%d,%d,%d,%d:%dn”,outregs.h.al,outregs.h.ah,outregs.h.bh,outregs.h.ah,outregs.x.cx);getchar();if(02==outregs.x.ax)//02 表示文件未找到

佛山科学技术学院课程设计用纸

}

void file(char filename1[80],char filename2[80]){

}

} void rewords()void showlist(){ char list[80];union REGS reg;struct SREGS segreg;reg.h.ah = 0x47;//47H 读取当前目录 reg.h.dl = 0;reg.x.si = FP_OFF(list);segreg.ds = FP_SEG(list);intdosx(®, ®, &segreg);

printf(“The current working directory is:%sn”, list);union REGS inregs,outregs;struct SREGS segregs;

inregs.h.ah=0x56;//DOS 中断号 56 是重命名文件 inregs.x.dx=FP_OFF(filename1);segregs.ds=FP_SEG(filename1);inregs.x.di=FP_OFF(filename2);segregs.es=FP_SEG(filename2);

int86x(INTER,&inregs,&outregs,&segregs);if(outregs.x.ax==02){

} printf(“success!n”);printf(“nFILE %s is not exist!n”,filename1);struct SREGS segregs;inregs.h.ah=0x3A;//3A 表示删除目录 inregs.x.dx=FP_OFF(filename);segregs.ds=FP_SEG(filename);

int86x(INTER,&inregs,&outregs,&segregs);result=outregs.x.ax;if(result==2||result==5){ } else { } printf(“nThe file:%s has been delete successfully!n”,filename);printf(“nCan't delete the file:%s

The file may not be exist!n”,filename);11 佛山科学技术学院课程设计用纸

{

}

{

union REGS inregs,outregs;struct SREGS segregs;int result;char ReadContents[9*1024];inregs.h.ah=0x3D;//3D 打开文件 inregs.x.dx=FP_OFF(filename);segregs.ds=FP_SEG(filename);inregs.h.al=2;int86x(0x21,&inregs,&outregs,&segregs);result=outregs.x.ax;if(2==result){ } else {

inregs.x.bx=result;inregs.h.ah=0x3F;//读文件或者目录 inregs.x.dx=FP_OFF(ReadContents);segregs.ds=FP_SEG(ReadContents);inregs.x.cx=1024;int86x(0x21,&inregs,&outregs,&segregs);printf(“n Real Number of read characters in file:%s:%dn”,filename,outregs);printf(“nThe contents of file:%s!n”,filename);for(int i=0;i

void ReadFromFile(char filename[80])union REGS reg,reg1;struct SREGS sreg;char word[200];

for(int i=0;i<200;i++)word[i]='$';scanf(“%s”,&word);reg1.x.dx = FP_OFF(word);sreg.ds = FP_SEG(word);reg1.h.ah=0x09;

int86x(INTER,®1,®1,&sreg);printf(“n”);

佛山科学技术学院课程设计用纸

} }

int main(){

char DeleteFileName[80];

char ReadingFileName[80];char file1[80],file2[80];

int a;

menu();do

{ printf(“Please input the number:”);

scanf(“%d”,&a);

switch(a){

case 1: time();

break;

case 2: day();

break;

case 3: dos();

break;

case 4:

printf(“nInput the name of existing file to delete: ”);scanf(“%s”,DeleteFileName);

DeleteFile(DeleteFileName);break;

case 5:

printf(“n Input createcontent: ”);

scanf(“%s”,&DeleteFileName);Createfile(DeleteFileName);break;

case 6:

printf(“n Input deletecontents: ”);scanf(“%s”,&DeleteFileName);Deletefile(DeleteFileName);break;

case 7: printf(“name:”);

scanf(“%s”,&file1);

printf(“new name:”);scanf(“%s”,&file2);file(file1,file2);break;佛山科学技术学院课程设计用纸

case 8: showlist();break;case 9: rewords();break;case 10:

printf(“nInput the name of existing file to ReadingFileName: ”);

scanf(“%s”,ReadingFileName);

ReadFromFile(ReadingFileName);break;case 11: clrscr();

menu();break;

default: break;

} }

while(a!=0);

return 0;}

第二篇:UNIX操作系统命令

UNIX系统操作命令大全

UNIX系统操作命令 第一章 登录和退出

用户在登录前,首先要向系统管理员申请一个用户注册名,不论用户从哪台计

算机登录到ITPNET上都将访问相同的文件系统。

1.1 登录

当屏幕上出现Login提示符时,用户可以输入自己的用户注册名,并按回车键。

若有口令,系统将提示用户输入密码,并按回车键,口令输入正确后,用户登录成

功。这时,屏幕上会显示出一些信息和命令提示符。如:

Login: guest [Enter]

passwd: ****** [Enter]

sun%

注: 用户名要用小写字母输入,UNIX系统区分大小写字母。

[hide]

1.2 退出

当用户准备退出自己的计算机帐号时,可在系统示符下输入logout或exit或按

[Ctrl-D]。当屏幕出现Login时,用户可以安全地离开计算机了。如:

sun% logout [Enter]

Login:

1.3 修改口令 为了防止他人使用自己的帐号,在你首次登录后,请用passwd命令修改只有本

人知道的保密口令,口令通常由此可6到8个字母数字组成。如:

sun% passwd[Enter]

Old Passwd: ******

New Passwd: ******

update 更新磁盘 val SCCS实用程序 vc SCCS实用程序 vi 全屏幕编辑器 volcopy 文件系统的文字拷贝 wait 等待所有字进程结束 while 循环语句 who 显示谁在使用系统 whodo 显示哪些用户在做什么 write 和另一用户直接对话 xargs 建立参数表并执行命令 yacc 语法分析程序生成器;)cl

注:当你退出系统再次登录时,就要使用新的口令。

第二章 目录操作命令

2.1 显示目录

命令:pwd(print working directory)

格式:pwd

功能:显示出用户当前工作目录的全路径名。

例如:% pwd

2.2 建立目录

命令:mkdir(make directory)

格式:mkdir directory_name

功能:建立新目录

例如:% mkdir directory

2.3 改变目录

命令:cd(change directory)

格式:cd directory_name

功能:改变当前工作目录

注释:目录名选项有:

(1)目录名,转到当前目录下的子目录。

(2)..表示转到当前目录的父目录。

(3)/ 表示转到根目录。

(4)没有选项时,转到用户的主目录。

例如:% cd directory

2.4 删除目录

命令:rmdir(remove directory)

格式:rmdir directory_name

功能:删除不存在文件的子目录名。

注释:

(1)删除子目录时,要求被删除的目录中不存在文件或子目录,否则无法删除。

(2)若被删除的目录中有文件或子目录,请参考命令rm-r directory_name。

例如:% rmdir directory

第三章 文件操作命令

3.1 列出文件目录

命令:ls(list)

格式:ls [option] directory_name

功能:列出指定目录中的文件名和子目录名。当无子目录名时,列出当前目录

中的文件名和子目录名。

选项:-a列出所有文件,包括以点开头的隐含文件。

-l按长格式列出文件名,包括文件类型标识,权限,链接数,文件主名,文件组名,字节数,日期。

-r列出包括子目录下所有文件

-g在长格式中给出用户组的标识。

-t安文件生成日期排序。

例如:% ls-la

3.2 显示文件内容

命令:cat(catenae)全屏滚动显示

格式:cat filename

功能:显示出文件的内容。

注释:当文件内容在屏幕上滚动显示时,可按Ctrl+S键屏幕滚暂停,按Ctrl+Q

键继续显示。

例如:% cat filename

3.3 按屏幕显示文件内容

命令:more

格式:more filename

功能:按屏幕一屏一屏显示出文件内容

选项:

注释:在屏幕显示过程中有功能键。空格键 继续下一屏的输出;回车键 看下

一行的输出;q键 跳出more状态;/字符串 查旬字符串所在处;a键 返

回到上一屏。

例如:% more filename

3.4 分页显示文件内容

命令:pg(page)

格式:pg [option] filename

功能:分页显示指定文件的内容。在显示一页文件时,最后一行将显示等待用

户输入指令。可输入的指令有如下选项。

选项:h

显示pg命令中可使用的帮助(help)命令。

q

退出pg命令。

[return] 显示下一页正文。

显示正文的下一行

[Space] 显示下一页

d/[Ctrl-D] 将屏幕滚动半屏。

n

显示pg命令行中说明的下一个文件。

p

显示pg命令行中说明的前一个文件。

%

显示正文当前页的前面一页。

/pattern 在文件中向前搜索指定的字符模式。

?pattern 在文件中向后搜索指定的字符模式。

注释:当pg命令显示到文件的末尾时,显示一个文件结束信息EOF(end of file)。

例如:% pg filename

3.5 读文件

命令:view

格式:view filename

功能:只能读出文件内容。

注释:此命令不能对读出的原文件进行写操作。若对原文件进行了修改,可利

用命令“:w newfilename”将修改后的文件写到新文件中。

例如:% view filename

3.6 显示文件头部

命令:head

格式:head [option] filename

功能:显示文件的头部

选项:缺省 显示文件的头10行。

-i 显示文件的开始 i行。

例如:% head filename

3.7 显示文件尾部

命令:tail

格式:tail [option] filename

功能:显示文件的尾部

选项:缺省 显示文件的末10行。

-i 显示文件最后 i行。

+i 从文件的第i行开始显示。

例如:% tail filename

3.8 显示格式化的文件内容

命令:pr(print)

格式:pr filename

功能:在屏幕上显示格式化的文件内容,即印出每页66行的文本文件,包括5

行页头和5行页尾。页头包括两行空行,一行含有文件的时间、文件名

和页号,另外两行为空行。页尾为5行空行。

例如:% pr filename

3.9 拷贝文件

命令:cp(copy)

格式:cp [option] filename1 filename2

cp [option] filename...directory

cp-r directory1 directon2

功能:把一个文件的全部内容拷贝到另一个文件,也可将一个或多个文件拷贝

到另一个目录中。

选项:-i 按提示进行拷贝文件。

-p 按原文件日期进行拷贝。

-r 对子目录下所有文件进行拷贝。

注释:当filename1拷贝到filename2时,若filename2已经存在,则filename2 的内容将被filename1覆盖。

例如:% cp filename1 filename2

3.10移动文件或文件改名

命令:mv(move)

格式:mv filename1 filename2

mv filename...direction

mv direction1 direction2

功能:改变文件或目录的名子,或把一些文件移到另一目录下。

注释:当filename1更名为filename2时,若filename2已经存在,则filename2 的内容将被filename1覆盖

例如:% mv filename1 filename2

3.11删除文件

命令:rm(remove)

格式:rm filename

rm-r direction

功能:删除指定的文件或一个目录中的文件。

注释:用-r选项时,将删除指定目录的所用文件,包括目录名。

例如:% rm filename

3.12链接文件

命令:ln(link)

格式:ln [option] filename linkname

ln [option] directory pathname

功能:为文件或目录建立一个链。其中,filename和directory是源文件名和

源目录名;linkname和pathname分别表示与源文件或源目录名相链接的

文件或目录。

选项:-s 为文件或目录建立符号链接。

注释:链接的目地在于,对一个文件或目录赋予两个以上的名字,使其可以出

现在不同的目录中,既可以使文件或目录共享,又可以节省磁盘空间。

例如:% ln-s filename linkname

3.13改变文件读取权限

命令:chmod(change mode)

格式:chmod {u|g|o|a}{+|-|=}{r|w|x} filename

chmod [who][op][mode] directory

功能:改变文件的读写和执行权限。有符号法和八进制数字法。

选项:(1)符号法:

u(user)表示用户本人。

g(group)表示同组用户。

o(oher)表示其他用户。

a(all)表示所有用户。

+

用于给予指定用户的许可权限。

用于取消指定用户的许可权限。

=

将所许可的权限赋给文件。

r(read)读许可,表示可以拷贝该文件或目录的内容。

w(write)写许可,表示可以修改该文件或目录的内容。

x(execute)执行许可,表示可以执行该文件或进入目录。

(2)八进制数字法:

此方法用三位八进制数作任选项,每位数字分别表示用户本人、同组用

户、其他用户的权限,其中:(100)表示可读。(010)表示可写。(001)表示可执行。

注释:

例如:% chmod a+rx filename

让所有用户可以读和执行文件filename。

% chmod go-rx filename

取消同组和其他用户的读和执行文件filename的权限。

% chmod 741 filename

让本人可读写执行、同组用户可读、其他用户可执行文件filename。

3.14改变文件所有权

命令:chown(change owner)

格式:chown username filename

chown-R username directory

功能:改变文件或目录的所有权。

选项:-R 将改变目录中所有文件及目录的拥有者。

注释:只有文件的主人和超级用户才能改变文件的所有权。

例如:% chown username filename

3.15寻找文件

命令:find

格式:find pathname [option] expression

功能:在所给的路经名下寻找符合表达式相匹配的文件。

选项:-name 表示文件名

-user 用户名,选取该用户所属的文件

-group 组名,选取该用户组属的文件

-mtime n 选取n天内被修改的文件

-newer fn 选取比文件名为fn更晚修改的文件

注释:

例如:% find.-name '*abc*'-print

3.16搜索文件中匹配符

命令:grep

格式:grep [option] pattern filenames

功能:逐行搜索所指定的文件或标准输入,并显示匹配模式的每一行。

选项:-v找出模式失配的行

-c统计匹配行的数量

-n显示匹配模式的每一行

注释:

例如:% ps-aux | grep R

3.17比较文件不同

命令:diff(difference)

格式:diff filename1 filename2

功能:显示两文件的不同之处。

选项:

注释:

例如:% diff file1 file2

3.18比较文件

命令:cmp(compare)

格式:cmp [-l] [-s] filename1 filename2

功能:显示比较两文件不同处的信息

选项:-l 给出两文件不同的字节数

-s 不显示两文件的不同处,给出比较结果

注释:

例如:% cmp file1 file2

3.19比较文件共同处

命令:comm(common)

格式:comm [-123] filename1 filename2

功能:选择或拒绝比较两文件出现的共同行

选项:-1 不显示第1列

-2 不显示第2列

-3 不显示第3列

注释:输出三列,第一列表示在file1中出现的行,第二列表示在file2中出现 的行,第三列表示在file1和file2中共同出现的行。

例如:% comm file1 file2

3.20排序文件

命令:sort

格式:sort [option] filename

功能:将制定的文件按要求排序

选项:-r 按字母倒排序

-n 按数字的值从小到大排序

-r 按当前排序规则逆序排序

-f 不区分大小写排序

-d 按典型顺序排序

注释:选项缺省时按ascii码顺序排序

例如:% sort-nr file

3.21压缩文件

命令:compress

格式:compress [option] filename 功能:压缩文件。

选项:-f 强制压缩

-v 压缩时显示压缩百分比

注释:

例如:% comproess files

3.22解缩文件

命令:uncompress

zcat

格式:compress [option] filename

zcat filename

功能:展开或显示压缩文件。

选项:-c 不改变文件写到标准输出

注释:zcat命令相当于uncompress-c

例如:% uncomproess files.Z

3.23显示文件类型

命令:file

格式:file filename...功能:按文件内容来推测文件类型,如text,ascii,C,executable,core。

选项:

注释:

例如:% file *

3.24建立档案文件

命令:tar(tape archive)

格式:tar [option] tarfile filename

功能:建立文件的存档或读存档文件。

选项:-c 建立一个新的档案文件

-x 从档案文件中读取文件

-v 显示处理文件的信息

-f 指定档案文件名,缺省时为磁带机即/dev/rmt/0

-t 列出存档文件的信息

注释:

例如:% tar cvf tarfile.% tar xvf tarfile

% tar tvf tarfile

3.25磁带拷贝文件

命令:dd

格式:dd [option=value] 功能:用磁带机转换或拷贝文件。

选项:if=name 指定输入文件名

of=name 指定输出文件名

ibs=n 指定输入文件块大小为n字节(缺省为512字节)

obs=n 指定输出文件块大小为n字节(缺省为512字节)

注释:

例如:% dd if=filename of=/dev/rmt/0

% dd if=/dev/rmt/0 of=filename ibs=1024

3.26修改文件日期

命令:touch

格式:touch filenae

功能:改变文件的日期,不对文件的内容做改动,若文件不存在则建立新文件。

选项:

注释:

例如:% touch file

3.27统计文件字数

命令:wc(word characters)

格式:wc [option] filename

功能:统计文件中的文件行数、字数和字符数。

选项:-l 统计文件的行数

-w 统计文件的字数

-c 统计文件的字符数

注释:若缺省文件名则指标准输入

例如:% wc file

3.28检查拼写

命令:spell(spelling)

格式:spell [option] filename...功能:检查文件中的拼写错误

选项:-b 按英国拼法检查

-v 显示字面上不在拼法字典上的词

-x 显示每一个可能合理的词根

注释:

例如:% spell file

第四章 有关状态信息命令

4.1显示当前注册的用户

命令:w

格式:w [option] [username]

功能:显示当前正在使用系统的用户名、注册时间和当前执行的命令。

选项:-h 不显示起始行

-s 按短格式显示

-l 按长格式显示(缺省设置)

注释:

例如:% w

4.2 显示都谁登录到机器上

命令:who

格式:who

功能:显示当前正在系统中的所有用户名字,使用终端设备号,注册时间。

例如:% who

4.3 显示当前终端上的用户名

命令:whoami

格式:whoami

功能:显示出当前终端上使用的用户。

例如:% whoami

4.4 确定命令位置

命令:whereis

格式:whereis command

功能:确定一个命令的二进制行码、源码及联机手册所在的位置。

选项:

注释:

例如:% whereis ls

4.5 查找非标准命令

命令:which

格式:which command

功能:查找非标准命令,即使用别名或系统中标准命令集之外的命令。

选项:

注释:

例如:% which ls

4.6 显示日期

命令:date

格式:date

功能:显示或设置日期和时间。

选项:

注释:只有超级用户有权设置日期。

例如:% date

4.7 显示日历

命令:cal(calendar)

格式:cal [month] year

功能:显示某年内指定的日历

选项:

注释:

例如:% cal 1998

4.8 计算命令执行时间

命令:time

格式:time [command]

功能:计算程序或命令在执行其间所用的时间。

选项:

注释:计算出的时间为:real是命令在系统驻留的总时间,user是命令消耗CPU 的时间,sys是命令I/O所开销的时间。

例如:% time myprog

4.9 查询帐目

命令:acseek(account seek)

格式:acseek [-d n] [-m usersname]

功能:查询本月的用户帐目。

选项:-d n

-m username

注释:若没有选项,则显示本人当月的帐单。

例如:% acseek

4.10显示用户标识

命令:id 格式:id [option] [user]

功能:显示用户标识及用户所属的所有组。

选项:-a 显示用户名、用户标识及用户所属的所有组

注释:

例如:% id username

4.11显示主机标识

命令:hostid

格式:hostid

功能:显示主机的唯一标识,是被用来限时软件的使用权限,不可改变。

选项:

注释:

例如:% hostid

4.12显示主机名

命令:hostname

格式:hostname

功能:显示或设置主机名。

选项:

注释:只有超级用户才能设置主机名。

例如:% hostname

4.13显示进程

命令:ps 格式:ps [option]

功能:显示系统中进程的信息。包括进程ID、控制进程终端、执行时间和命令。

选项:-a 列出当前系统中所有进程的信息

-l 显示一个长列表

-e 显示当前运行的每一个进程信息

-f 显示一个完整的列表

注释:

例如:% ps-ef

4.14显示磁盘空间

命令:df(disk free)

格式:df [option]

功能:显示磁盘空间的使用情况,包括文件系统安装的目录名、块设备名、总

字节数、已用字节数、剩余字节数占用百分比。

选项:-i 显示已用和未用的字节数

-k 显示磁盘空间的使用信息

注释:

例如:% df-k

4.15显示文件盘空间

命令:du(disk usage)

格式:du [option] [filename]

功能:显示目录或文件所占磁盘空间大小

选项:-a 显示所有文件的大小

-s 显示制定目录所占磁盘大小

注释:

例如:% du

4.16显示盘空间限制

命令:quota

格式:quota-v [username]

功能:显示用户的磁盘空间限制和使用情况。包扩盘空间的限额和已使用数,允许建立的节点数限额和使用节点数。

选项:-v 查看用户在系统中的盘空间

注释:只有超级用户可以显示任何用户的使用情况,用edquota命令可修改。

例如:% quota-v

4.17显示终端选项

命令:stty

格式:stty [option]

功能:显示或设置终端的任选项。

选项:-a 显示所有设置情况

-g 显示当前设置

注释:

例如:% stty-a

4.18显示终端名

命令:tty

格式:tty

功能:显示终端名

选项:

注释:

例如:% tty

4.19回忆命令

命令:history

格式:history

功能:帮助用户回忆执行过的命令。

选项:

注释:

例如:% history

4.20联机帮助手册

命令:man(manual)

格式:man command_name

功能:显示参考手册,提供联机帮助信息。

选项:

注释:-k 按制定关键字查询有关命令

例如:% man tar

4.21建立别名

命令:alias

格式:alias newname name

功能:用户可以将常用的命令用自己习惯的名称来重新命名。

选项:

注释:

例如:% alias dir 'ls-F'

第五章 网络命令

5.1显示网络地址

命令:arp

格式:arp hostname

功能:显示系统当前访问的远程主机名、IP地址和硬件地址。

选项:-a

注释:

例如:% arp-a

5.2 显示用户信息

命令:finger

格式:finger username

功能:显示网上用户使用机器的情况,包括用户何时登录和最后一次注册记录。

选项:

注释:

例如:% finger username

5.3 网上对话

命令:talk

格式:talk username

功能:在网上与另一用户进行对话。

选项:

注释:对话时系统把终端分为上下两部分,上半部显示自己键入信息,下半部

显示对方用户键入的信息。键入delete或Ctrl+C则结束对话。

例如:% talk username

5.4 允许或拒绝接受信息

命令:mesg(message)

格式:mesg [n/y]

功能:允许或拒绝其它用户向自己所用的终端发送信息。

选项:n 拒绝其它用户向自己所用的终端写信息

y 允许其它用户向自己所用的终端写信息(缺省值)

注释:

例如:% mesg n

5.5 给其他用户写信息

命令:write

格式:write username [ttyname]

功能:给其他用户的终端写信息。

选项:

注释:若对方没有拒绝,两用户可进行交谈,键入EOF或Ctrl+C则结束对话。

例如:write username

5.6 测试网路

命令:ping

格式:ping hostname

功能:向网络上的主机发送ICMP ECHO REQUEST信息包,检测网络是否畅通。

选项:

注释:被测试的主机名可用IP地址。当丢包率为(100% packet loss)则说明

当前网络不通。

例如:% ping hostsname

5.7 远程shell命令

命令:rsh(remote shell)

格式:rsh hostsname command

功能:在本地机执行远程主机的shell命令。

选项:

注释:

例如:% rsh hostname who

5.8 远程拷贝文件

命令:rcp(remote copy)

格式:rcp [-r] file newfile

功能:拷贝远程主机上的文件。

选项:-r 拷贝目录

注释:

例如:% rcp hostname:/tmp/file.5.9 远程注册

命令:rlogin(remote login)

格式:rlogin hostname [-l username]

功能:注册到远程主机上。

选项:-l username 注册到另一用户

注释:要有用户口令才能注册。

例如:% rlogin hostname

5.10 远程登录

命令:telnet

格式:telnet hostname

功能:远程登录到网上其它主机。

选项:

注释:支持不同的操作系统。

例如:% telnet bbs.tsinghua.edu.cn

5.11文件传输

命令:ftp(file transfer program)

格式:ftp hostname

功能:网络文件传输及远程操作。

选项:ftp命令:

?/help ftp的联机帮助

open hostname 打开制定的远程机

cd [dirname] 进入远程机的目录

lcd [dirname] 设置本地机的目录

binary 以二进制方式进行传输

dir/ls 显示远程的目录文件

get/mget 从远程机取一个或多个文件

put/mput 向远程机送一个或多个文件

prompt 打开或关闭多个文件传送时的交互提示

close

关闭与远程机的连接

quit

退出ftp

注释:

例如:% ftp hostname

5.12显示到网络主机的路径

命令:traceroute

格式:traceroute hostname

功能:显示本机到达某一网络主机所经的路经和使用的时间。

选项:

注释:

例如:% traceroute hostname

第六章 Mail命令

6.1 发送或接受电子邮件

命令:mail/Mail/mailx

格式:mail username(发送)

mail [option](接受)

功能:向网上用户发送或接受电子邮件。

选项:-r 邮件按先进先出顺序排序。缺省时为后进先出顺序排序

-q 中断mail后不改变信箱内容

-p 显示mail每份邮件,不显示提示信息

-f 从邮件格式文件中读邮件

注释:mail命令:

? 显示mail帮助命令

h 邮件标题列表

p 显示当前邮件

n 显示下一邮件

r [uers] 给发信人或用户回信

s [file] 将邮件保存到文件中,保存标题信息

w [file] 将邮件写到文件中,不保存标题信息

d [n] 删除当前邮件或第n封邮件

q 将未删除的邮件存入mbox文件,并退出mail

x 所有邮件不作修改,退出mail

例如:% mail-s “Subjet...” username < messages

6.2 显示邮件队列

命令:mailq

格式:mailq

功能:查看正在发送或接收邮件的排队情况。选项:

注释:此命令一般在系统或网络不同时使用。

例如:% mailq

6.3 邮件操作命令

命令:pine

格式:pine

功能:对自己邮件操作的程序。

选项:

注释:此操作是在菜单提示下进行。

例如:% pine

第七章 运行程序命令

7.1 按时间执行命令

命令:at/batch

格式:at [option] [time] [data] [file]

功能:在制定的时间执行命令或命令文件。

选项:-r 取消以前用at命令提交的作业

-l 显示用at命令提交的所有作业状态和作业号

注释:

例如:at 0030 Jan 20 myfile

7.2 参数回至标准输出

命令:echo

格式:echo [-n] [arguments]

功能:将参数即字符串至标准输出即显示器

选项:-n 不向标准输出回送换行符

注释:

例如:echo *

7.3 复制至文件

命令:tee

格式:tee [option] filename

功能:至标准输出的同时复制至文件

选项:-a 输出时附加到文件中

-i 不理采中断

注释:

例如:% who | tee file

7.4 给程序优先级

命令:nice

格式:nice [-n] command

功能:以低的优先级运行程序或命令。选项:-n 为优先级0-20从高到低

注释:

例如:nice-5 progame

7.5 终止进程

命令:kill

格式:kill [option] pid

功能:向指定的进程送信号或终止进程。

选项:-9 强行终止进程

-17 将进程挂起

-19 将挂起的进程激活

注释:pid标示进程号,可由ps命令得到。

例如:% kill-9 pid

7.6 进程睡眠

命令:sleep

格式:sleep time

功能:使当前正在执行的进程在规定的时间内处于睡眠。

选项:

注释:time为进程将睡眠的时间,以秒为单位。

例如:% sleep time

7.7 显示作业状态

命令:jobs

格式:jobs [-l]

功能:显示当前作业的状态

选项:-l 长列表显示作业状态,包括所有者、作业号、终端和状态。

注释:作业状态为 +表示最近被停止的作业,-表示先前的作业,exit 1表示

退出的作业,job# done表示已完成的作业。

例如:% jobs

7.8 前台作业

命令:fg

格式:fg job#

功能:将指定作业号的作业转入前台运行。job#表示作业号。

选项:

注释:

例如:% fg job#

7.9 后台作业

命令:bg/&

格式:bg job#

command &

功能:将指定作业号的作业或命令推到后台运行。选项:

注释:

例如:% bg job#

7.10挂起作业

命令:stop

格式:stop job#

功能:将指定作业号的后台作业挂起.选项:

注释:

例如:% stop job#

第八章 程序编译执行命令

8.1 C程序编译

命令:cc

格式:cc [option] filename

功能:编译或链接指定的C文件。

选项:-o 指定输出文件名,缺省时为a.out

-c 只编译,产生.o的目标文件

-g 产生用于符号测试的执行文件

-lm 进行连接cc数学库

-O 进行代码的一般优化

-O2 二级优化

注释:C编译器参考手册可用命令man cc查看。

例如:% cc-o test test.c

8.2 C++程序编译

命令:CC

格式:CC [option] filename

功能:编译或链接指定的C++文件。

选项:同C编译选项

注释:C++编译器参考手册可用命令man CC查看。

例如:% CC-O2 test.cc

8.3 FORTRAN77程序编译

命令:f77

格式:f77 [option] filename

功能:编译或链接指定的Fortran文件

选项:-o 指定输出文件名,缺省时为a.out

-c 只编译,产生.o的目标文件

-g 产生用于符号测试的执行文件

-O0 不进行代码优化

-O1 尽快进行代码优化

-O2 二级优化

-O3 三级优化

注释:FORTRAN77编译器参考手册可用命令man f77查看

例如:% f77-c test.f

8.4 FORTRAN90程序编译

命令:f90

格式:f90 [option] filename

功能:编译或链接指定的Fortran90文件

选项:同FORTRAN77编译选项

注释:FORTRAN90编译器参考手册可用命令man f90查看

例如:% f90-O-o test test.f

8.5 GNU程序编译

命令:gcc(GNU C)

g++/c++(GNU C++)

g77(GNU FORTRAN77)

格式:gcc [option] filename

g++ [option] filename

g77 [option] filename

功能:编译或链接指定的编译文件。

选项:-o 指定输出文件名,缺省时为a.out

-c 只编译,产生.o的目标文件

-O 进行代码的一般优化

-O2 二级优化

注释:GNU编译器参考手册可进入emacs中info菜单下查看。

例如:% gcc-o test test.c

8.6 运行文件

格式:a.out

filename

功能:源程序经编译后产生目标代码文件,放在a.out文件或指定输出文件名。

补充常用配置文件

1./etc/hosts

主机名字解析文件,提供主机名和IP地址的对应。

2./etc/passwd

口令文件,内容为:

登录用户名:加密口令:用户ID:组ID:保留:初始工作目录:shell路径

3. /etc/group

内容为:

组名:加密密码:组ID:所有属于该组的用户。

4. /etc/profile

如果该文件存在,则每个用户登录时将执行该文件。该文件一般用于设置一些通用环境变量,如果用户的home目录中存在.profile文件,则在执行/etc/profile之后,再执行用户的.profile文件。

5. /etc/inittab

内部初始化之后,系统将启动/etc/init这个deamon进程,使/etc/init进程取得引导序列的控制权。而init进程从文件 /etc/inittab(init table,初始化表)取得指示,该文件 的内容控制所有init状态,同时也控制那些已消亡进程的再生。

6. /etc/fstab

系统中可以mount的文件系统的信息。

7. /etc/lvmtab

使用命令:

# strings /etc/lvmtab;查看系统VG和磁盘信息。

8. /etc/rc.config.d/netconf

包含系统名称和网络配置信息,如IP地址、子网掩码和路由信息等。

9. /stand/system

包含系统的驱动程序和子系统信息,内核设备信息和一些系统可调参数信息。

附录 UNIX 常用命令简单说明

UNIX 命令大多数可用联机帮助手册 man 获得帮助,下面是常用命令及简单说明,可供用户快速查找使用。命令 功能简述

cctcom 等于进程记帐文件 accton 启动或中止记帐进程

adb 汇编语言调试工具

admin 创建和管理SCCS文件 ar 档案文件和库文件管理程序 as 汇编器 asa 回车控制 at 在指定时间执行程序 awk 模式搜索和处理语言 banner 制作标题 basename 生成文件基本名(无前。后缀)batch 命令的延迟执行

bc 计算器 bdiff 大型文件比较 bfs 大文件搜索 break 退出循环

cal 打印日历表

calendar 打印日历表 cancel 取消打印任务 case 分支语句 cb C语言整理程序 cd 改变当前目录 cc C语言编译器 cdc SCCS实用程序 cflow 生成C语言流程图 checkeq 数学公式排版命令 chgrp 改变文件组 chmod 改变文件存取模式 chown 改变文件主 chroot 改变根目录 cksum 显示校验和 clri 清除指定的I节点 cmp 文件比较 col 过滤反向换行 comb SCCS实用程序 comm 显示两个排序文件的公共行

command 执行简单命令 continue 进入下一循环 cp 复制文件 cpio 复制文件档案 cpp C语言预处理程序 crash 检查系统内存映象 create 建立临时文件 cref 生成交叉引用表

cron 在指定时间执行一组命令 crontab 为命令cron 准备crontab文件 crypt 加密/解密 csplit 将一个文件分解 ct 远程终端注册

ctags 创建供vi使用的标识符 cu 呼叫另一UNIX系统 cut 断开一文件中所选择的字段 cxref 生成C程序交叉访问表 date 打印和设置时间

dc 桌面计算器 dd 转换和复制文件 delta SCCS实用程序

deroff 去掉排版格式 devnm 标识设备名 df 显示可用磁盘空间 diff 显示两个文件的差异 diff3 显示三个文件的差异 dircmp 目录比较 dis 反汇编程序 du 显示对磁盘的占用情况 dump 对指定文件备份 echo 回显指定参数 ed 行编辑器 edit 文本编辑器 egrep 在文件中查找指定模式 env 设置命令执行环境 eqn 数学公式排版命令 eval 执行指定命令 ex 行编辑器 exec 执行指定命令 exit 进程中止 expand 使表格占满行宽 export 将变量传递给子程序 expr 计算表达式值 factor 因式分解 false 返回FALSE fgrep 在文件中查找指定模式 file 确定文件类型 find 查找符号条件的文件 fmt 安排简单的文本格式 fold 折行 for 循环语句

fsck 文件系统检查和修复 fsdb 文件系统调试程序

fumount 强制性拆协指定资源 function 函数说明 fuser 列出使用文件的进程 fwtmp 产生记帐记录 get SCCS实用程序 getconf 查找配置参数

getopt 获得命令中的选择项

getopts 获得命令中的选择项

getty 设置终端类型、模式、行律等 grep 在文件中查找指定模式 head 打印文件的头若干行

hexdump 按十六进制转储文件 id 显示用户号 if 条件语句 init UNIX 初启进程 install 安装一个文件到文件系统

ipcrm 删除IPC队列 ipcs 显示IPC状态 join 连接两个文件(关系操作〕

kill 中止指定进程 killall 中止所有活动进程 labelit 给文件系统提供标号 ld 目标文件链接编辑器 lex 词法分析程序 line 读一行 link 连接文件 lint C程序检查程序 ln 链接文件 local 建立局部变量 logger 显示注册信息

login 注册

logname 获取注册名 look 在排序文件中查找某行

lorder 查找目标库的次序关系

lp 打印文件

lpr 打印文件

lpstat 显示打印队列状态

ls 目录列表 mail 发送或接收电子邮件

mailx 发送、接收或处理电子邮件

make 执行有选择的编译

makekey 生成加密码 man 显示命令用法

mesg 接收或取消对话方式

mkdir 建立目录 mkfifo 建立FIFO文件

mkfs 建立文件系统 mknod 建立文件系统的I节点 mount 安装文件系统 mv 移动文件 mvdir 移动目录 ncheck 按节点号生成节点名清单

neqn 数学公式排版命令

newgrp 把用户加入到新组 news 打印消息 nice 改变命令执行优先级 nl 给文件加行号 nm 显示目标文件符号表

nohup 忽略挂起或退出执行命令 nroff 文本文件排版 od 按八进制转储文件 pack 压缩文件 passwd 改变口令

paste 文件合并 pax 可移植档案管理程序

pcat 显示压缩格式文件 pg 分屏显示 pr 按打印格式显示文件

pstat 报告系统信息 pwck 口令文件校验程序

pwd 显示当前工作目录

quot 检查文件系统所有权 ratfor 转换成标准FORTRANC程序

read 从标准输入读一行 readonly 标记变量为只读 red 文本编辑器 regcmp 正规表达式编辑 restor 文件系统恢复程序 restore 文件系统恢复程序 return 返回语句 rev 颠倒文件中每行字符次序 rm 删除文件

rmdel SCCS使用程序 rmdir 删除目录 rsh(net)远程SHELL rsh(sec)受限SHELL runacct 运行日常记帐程序 sact SCCS实用程序 sag 打印系统活动图

sar 报告系统活动 sccsdiff SCCS实用程序 sdb 符号调试器 sdiff 并列显示两个文件的差别 sed 流编辑器 sendto 发送邮件

set 设置选项或参数

setmnt 建立文件系统安装表

sh SHELL解释器 shift 命令行参数移位

shl SHELL层(layer)管理程序 shutdown 关机 size 显示目标文件长度 sleep 挂起进程一段时间

sort 文件排序和合并 spell 拼写错误检查程序 spellin 拼写错误检查 spellout 拼写错误检查 spline 按平滑曲线输出数据 split 分解一个文件 strings 在目标文件中寻找可打印字符

strip 删除符号表 stty 设置终端模式 su 改变用户 sum 显示文件校验和及块数 sync 更新磁盘 tabs 设置制表符

tbl 表格排版 tee 在管道上建立多通路 tic 终端数据库编译程序 time 打印执行命令所花时间 tiemx 报告命令所花时间及活动

touch 更新文件时间 tput 恢复终端或查询数据库 tr 转换字符 trap 捕获信号

troff 文本文件排版

true 返回TRUE tsort 拓扑排序 tty 显示终端设备名 umask 设置文件掩码 umount 拆卸文件系统 uname 显示系统名 unget SCCS实用程序 uniq 删除文件中重复行 units 度量单位转换 unlink 删除文件 unpack 将压缩文件还原

until 循环语句 update 更新磁盘 val SCCS实用程序 vc SCCS实用程序 vi 全屏幕编辑器 volcopy 文件系统的文字拷贝 wait 等待所有字进程结束 while 循环语句 who 显示谁在使用系统 whodo 显示哪些用户在做什么 write 和另一用户直接对话 xargs 建立参数表并执行命令 yacc 语法分析程序生成器;

#!/bin/csh

#Scriptname: test.csh goto main usage: echo “(EXAMPLE):test.csh 1(A number in [0-3])” echo “Please input the ARGV!”

main:

if($#argv == 0)then

goto usage

exit();endif

if($argv[1] >= 0 && $argv[1] <= 3)then

switch($argv[1])case 1:

foreach file(1 2 3 4 5 6 7 8 9 10)touch file_$file end

mkdir dir1 dir2 foreach dir_file(file*)switch($dir_file)case “file1”: mv $dir_file

dir1 case “file2”: mv $dir_file

dir1 case “file3”: mv $dir_file

dir1 case “file4”: mv $dir_file

dir1 case “file5”: mv $dir_file

dir1 case “file6”: mv $dir_file

dir2 case “file7”: mv $dir_file

dir2 case “file8”: mv $dir_file

dir2 case “file9”: mv $dir_file

dir2 case “file10”: mv $dir_file

dir2

endsw end

touch 'history.his' foreach cur_dir(dir*)if(-d $cur_dir)then echo directory $cur_dir ls $cur_dir >>'history.his' endif end breaksw

case 2: foreach file(1 2 3 4 5 6 7 8 9 10)touch file_$file end

mkdir dir1 dir2 foreach dir_file(file*)switch($dir_file)case “file1”: mv $dir_file

dir1 case “file2”: mv $dir_file

dir2 case “file3”: mv $dir_file

dir1 case “file4”: mv $dir_file

dir2 case “file5”: mv $dir_file

dir1 case “file6”: mv $dir_file

dir2 case “file7”: mv $dir_file

dir1 case “file8”: mv $dir_file

dir2 case “file9”: mv $dir_file

dir1 case “file10”: mv $dir_file

dir2

endsw end

touch 'history.his' foreach cur_dir(dir*)if(-d $cur_dir)then echo directory $cur_dir ls $cur_dir >>'history.his' endif end breaksw

case 3: foreach file(1 2 3 4 5 6 7 8 9 10)touch file_$file end

`mkdir./dir1/dir2` foreach dir_file(file*)`mv $dir_file./dir1/dir2` end

touch 'history.his' `ls./dir1/dir2 >>history.his` breaksw

case 0: if(!-z `pwd`)then echo “I do not know why you want to do this!” else rm-r * touch 'history.his' echo “You have deleted all the files.” >>'history.his' endif breaksw

default:

echo “You had input the wrong number!” endsw else echo “Input num exceed restriction!!” endif

第三篇:操作系统课程设计

操作系统课程设计

注意事项:

0.请每位同学必须按时提交课程设计报告(包括电子版和纸质版),算入期末成绩

1.在三个题目中选择一个

2.如果选择题目

(一)进程调度算法,要求实现其中2个以上(包括2个)进程调度算法 3.如果选择题目

(二)银行家算法,要求能够判断系统的安全状态

4.如果选择题目

(三)页面调度算法,要求实现其中2个以上(包含2个)进程调度算法 5.报告应包含算法分析、实验截图、核心算法源代码,请各位同学认真对待,独立完成 6.提交要求:电子版(包括实验程序)请发至ropeal@163.com,纸质版请班长收齐,由班长统一在课堂上提交(并提交未交人员名单),截止时间第16周周三(2014.1.31)7.格式要求:

7.1 A4纸10页左右

7.2 封面请注明班级、姓名、学号、所选题目

7.3 电子版发送时,请打包成一个文件,将文件名设置为:学号+姓名+题目名称(如20130000张三进程调度算法课程设计),邮件主题同文件名

一、进程调度算法

1.1 实验目的: a、设计进程控制块PCB表结构,模拟实现进程调度算法:FIFO,静态优先级调度,时间片轮转调度,多级反馈队列调度。(实现其中之二)。* b、建立进程就绪队列。对不同算法编制入链子程序。c、编写一进程调度程序模拟程序。模拟程序只对PCB进行相应的调度模拟操作,不需要实际程序。* 由用户输入进程名和进程长度,然后按照短进程优先的进程处理顺序给出进程的排序。

1.2 实验原理 调度算法是指:根据系统的资源分配策略所规定的资源分配算法。1.2.1 先来先服务和短作业(进程)优先调度算法

1.先来先服务调度算法。先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可用于进程调度。FCFS算法比较有利于长作业(进程),而不利于短作业(进程)。由此可知,本算法适合于CPU繁忙型作业,而不利于I/O繁忙型的作业(进程)。

2.短作业(进程)优先调度算法。短作业(进程)优先调度算法(SJ/PF)是指对短作业或短进程优先调度的算法,该算法既可用于作业调度,也可用于进程调度。但其对长作业不利;不能保证紧迫性作业(进程)被及时处理;作业的长短只是被估算出来的。1.2.2 高优先权优先调度算法

1.优先权调度算法的类型。为了照顾紧迫性作业,使之进入系统后便获得优先处理,引入了最高优先权优先(FPF)调度算法。此算法常被用在批处理系统中,作为作业调度算法,也作为多种操作系统中的进程调度,还可以用于实时系统中。当其用于作业调度,将后备队列中若干个优先权最高的作业装入内存。当其用于进程调度时,把处理机分配给就绪队列中优先权最高的进程,此时,又可以进一步把该算法分成以下两种: 1)非抢占式优先权算法

2)抢占式优先权调度算法(高性能计算机操作系统)

2.优先权类型。对于最高优先权优先调度算法,其核心在于:它是使用静态优先权还是动态优先权,以及如何确定进程的优先权。3.高响应比优先调度算法

为了弥补短作业优先算法的不足,我们引入动态优先权,使作业的优先等级随着等待时间的增加而以速率a提高。该优先权变化规律可描述为:优先权=(等待时间+要求服务时间)/要求服务时间;即 =(响应时间)/要求服务时间 1.2.3 基于时间片的轮转调度算法

1.时间片轮转法。时间片轮转法一般用于进程调度,每次调度,把CPU分配队首进程,并令其执行一个时间片。当执行的时间片用完时,由一个记时器发出一个时钟中断请求,该进程被停止,并被送往就绪队列末尾;依次循环。2.多级反馈队列调度算法 多级反馈队列调度算法多级反馈队列调度算法,不必事先知道各种进程所需要执行的时间,它是目前被公认的一种较好的进程调度算法。其实施过程如下:

1)设置多个就绪队列,并为各个队列赋予不同的优先级。在优先权越高的队列中,为每个进程所规定的执行时间片就越小。

2)当一个新进程进入内存后,首先放入第一队列的末尾,按FCFS原则排队等候调度。如果他能在一个时间片中完成,便可撤离;如果未完成,就转入第二队列的末尾,在同样等待调度„„ 如此下去,当一个长作业(进程)从第一队列依次将到第n队列(最后队列)后,便按第n队列时间片轮转运行。3)仅当第一队列空闲时,调度程序才调度第二队列中的进程运行;仅当第1到第(i-1)队列空时,才会调度第i队列中的进程运行,并执行相应的时间片轮转。4)如果处理机正在处理第i队列中某进程,又有新进程进入优先权较高的队列,则此新队列抢占正在运行的处理机,并把正在运行的进程放在第i队列的队尾。

1.3 实验要求

a、使用模块化设计思想来设计; b、给出算法的流程图或伪码说明。c、学生可按照自身条件,随意选择采用的算法,(例如:采用冒泡法编写程序,实现短进程优先调度的算法)

d、进程调度程序模拟程序只对PCB进行相应的调度模拟操作,不需要实际程序。

1.4 算法简析 a、每个进程可有三个状态,并假设初始状态为就绪状态。b、为了便于处理,程序中的某进程运行时间以时间片为单位计算。各进程的优先数或轮转时间数以及进程需运行的时间片数的初始值均由用户给定。c、在优先数算法中,优先数可以先取值为(50-该进程所需时间),进程每执行一次,优先数减3,CPU时间片数(CPUtime)加1,* 进程还需要的时间片数(needtime)减1。在时间片轮转算法中,采用固定时间片

(即:每执行一次进程,该进程的执行时间片数为已执行了2个单位),这时,CPU时间片(CPUtime)数加2,* 进程还需要的时间片数(needtime)减2,并排列到就绪队列的尾上。

d、对于遇到优先数一致的情况,采用FIFO策略解决。

二、银行家算法

2.1 概述

2.1.1 设计目的1、了解多道程序系统中,多个进程并发执行的资源分配。

2、掌握死锁的产生的原因、产生死锁的必要条件和处理死锁的基本方法。

3、掌握预防死锁的方法,系统安全状态的基本概念。

4、掌握银行家算法,了解资源在进程并发执行中的资源分配策略。

5、理解死锁避免在当前计算机系统不常使用的原因

2.2 关于死锁

2.2.1 死锁概念:

在多道程序系统中,虽可借助于多个进程的并发执行,来改善系统的资源利用率,提高系统的吞吐量,但可能发生一种危险━━死锁。所谓死锁(Deadlock),是指多个进程在运行中因争夺资源而造成的一种僵局(Deadly_Embrace),当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。一组进程中,每个进程都无限等待被该组进程中另一进程所占有的资源,因而永远无法得到的资源,这种现象称为进程死锁,这一组进程就称为死锁进程。

2.2.2 关于死锁的一些结论:

参与死锁的进程最少是两个(两个以上进程才会出现死锁)

参与死锁的进程至少有两个已经占有资源

参与死锁的所有进程都在等待资源

参与死锁的进程是当前系统中所有进程的子集

注:如果死锁发生,会浪费大量系统资源,甚至导致系统崩溃。

2.2.3 资源分类:

永久性资源: 可以被多个进程多次使用(可再用资源),分为:可抢占资源与不可抢占资源

临时性资源:只可使用一次的资源;如信号量,中断信号,同步信号等(可消耗性资源)

“申请--分配--使用--释放”模式

2.2.4 产生死锁的四个必要条件:

1、互斥使用(资源独占)

一个资源每次只能给一个进程使用

2、不可强占(不可剥夺)

资源申请者不能强行的从资源占有者手中夺取资源,资源只能由占有者自愿释放

3、请求和保持(部分分配,占有申请)

一个进程在申请新的资源的同时保持对原有资源的占有(只有这样才是动态申请,动态分配)

4、循环等待

存在一个进程等待队列

{P1 , P2 , „ , Pn},其中P1等待P2占有的资源,P2等待P3占有的资源,„,Pn等待P1占有的资源,形成一个进程等待环路

2.2.5 死锁的解决方案 1 产生死锁的例子

申请不同类型资源产生死锁

P1: „

申请打印机 申请扫描仪 使用

释放打印机 释放扫描仪 „ P2: „

申请扫描仪 申请打印机 使用

释放打印机 释放扫描仪 „

申请同类资源产生死锁(如内存)

设有资源R,R有m个分配单位,由n个进程P1,P2,„,Pn(n > m)共享。假设每个进程对R的申请和释放符合下列原则: * 一次只能申请一个单位 * 满足总申请后才能使用 * 使用完后一次性释放

m=2,n=3 资源分配不当导致死锁产生

2死锁预防: 定义:在系统设计时确定资源分配算法,保证不发生死锁。具体的做法是破坏产生死锁的四个必要条件之一

①破坏“不可剥夺”条件

在允许进程动态申请资源前提下规定,一个进程在申请新的资源不能立即得到满足而变为等待状态之前,必须释放已占有的全部资源,若需要再重新申请 ②破坏“请求和保持”条件

要求每个进程在运行前必须一次性申请它所要求的所有资源,且仅当该进程所要资源均可满足时才给予一次性分配 ③破坏“循环等待”条件 采用资源有序分配法:

把系统中所有资源编号,进程在申请资源时必须严格按资源编号的递增次序进行,否则操作系统不予分配。

2.2.6 安全状态与不安全状态

安全状态: 如果存在一个由系统中所有进程构成的安全序列P1,„Pn,则系统处于安全状态。一个进程序列{P1,„,Pn}是安全的,如果对于每一个进程Pi(1≤i≤n),它以后尚需要的资源量不超过系统当前剩余资源量与所有进程Pj(j < i)当前占有资源量之和,系统处于安全状态(安全状态一定是没有死锁发生的)。

不安全状态:不存在一个安全序列,不安全状态一定导致死锁。

2.3 数据结构设计

1.可利用资源向量矩阵AVAILABLE。这是一个含有m个元素的数组,其中的每一个元素代表一类可利用的资源数目,其初始值是系统中所配置的该类全部可用资源的数目,其数值随该类资源的分配和回收而动态地改变。如果AVAILABLE [j]= K,则表示系统中现有R类资源K个

2.最大需求矩阵MAX。这是一个n*m的矩阵,用以表示每一个进程对m类资源的最大需求。如果MAX [i,j]=K,则表示进程i需要R类资源的数目为K。

3.分配矩阵ALLOCATION。这也是一个n*m的矩阵,它定义了系统中每一类资源当前已分配给每一进程的资源数。如果ALLOCATION [i,j]=K,则表示进程i当前已分得R类资源的数目为K。

4.需求矩阵NEED。这也是一个n*m的矩阵,用以表示每一个进程尚需的各类资源数。如果NEED [i,j]=K,则表示进程i还需要R类资源K个,才能完成其任务。上述矩阵存在下述关系:

NEED [i,j]= MAX[i,j]﹣ ALLOCATION[i,j]

2.4 算法的实现 2.4.1 初始化 由用户输入数据,分别对可利用资源向量矩阵AVAILABLE、最大需求矩阵MAX、分配矩阵ALLOCATION、需求矩阵NEED赋值。2.4.2 银行家算法

在避免死锁的方法中,所施加的限制条件较弱,有可能获得令人满意的系统性能。在该方法中把系统的状态分为安全状态和不安全状态,只要能使系统始终都处于安全状态,便可以避免发生死锁。

银行家算法的基本思想是分配资源之前,判断系统是否是安全的;若是,才分配。它是最具有代表性的避免死锁的算法。

设进程cusneed提出请求REQUEST [i],则银行家算法按如下规则进行判断。(1)如果REQUEST [cusneed] [i]<= NEED[cusneed][i],则转(2);否则,出错。

(2)如果REQUEST [cusneed] [i]<= AVAILABLE[cusneed][i],则转(3);否则,出错。(3)系统试探分配资源,修改相关数据: AVAILABLE[i]-=REQUEST[cusneed][i];ALLOCATION[cusneed][i]+=REQUEST[cusneed][i];NEED[cusneed][i]-=REQUEST[cusneed][i];(4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。

2.4.3 安全性检查算法

(1)设置两个工作向量Work=AVAILABLE;FINISH(2)从进程集合中找到一个满足下述条件的进程,FINISH==false;NEED<=Work;如找到,执行(3);否则,执行(4)(3)设进程获得资源,可顺利执行,直至完成,从而释放资源。

Work+=ALLOCATION;Finish=true;GOTO 2(4)如所有的进程Finish= true,则表示安全;否则系统不安全。

三、页面调度算法 3.1 实验名称

页式虚拟存储管理:页面调度算法 3.2 实验目的

页式虚拟存储器实现的一个难点是设计页面调度(置换)算法,即将新页面调入内存时,如果内存中所有的物理页都已经分配出去,就要按某种策略来废弃某个页面,将其所占据的物理页释放出来,供新页面使用。本实验的目的是通过编程实现几种常见的页面调度(置换)算法,加深读者对页面思想的理解。3.3 实验原理

页面调度算法

目前有许多页面调度算法,本实验主要涉及先进先出调度算法、最近最少调度算法、最近最不常用调度算法。本实验使用页面调度算法时作如下假设,进程在创建时由操作系统为之分配一个固定数目物理页,执行过程中物理页的数目和位置不会改变。也即进程进行页面调度时只能在分到的几个物理页中进行。

下面对各调度算法的思想作一介绍。

<1> 先进先出调度算法

先进先出调度算法根据页面进入内存的时间先后选择淘汰页面,先进入内存的页面先淘汰,后进入内存的后淘汰。本算法实现时需要将页面按进入内存的时间先后组成一个队列,每次调度队首页面予以淘汰。

<2>最近最少调度算法

先进先出调度算法没有考虑页面的使用情况,大多数情况下性能不佳。根据程序执行的局部性特点,程序一旦访问了某些代码和数据,则在一段时间内会经常访问他们,因此最近最少用调度在选择淘汰页面时会考虑页面最近的使用,总是选择在最近一段时间以来最少使用的页面予以淘汰。算法实现时需要为每个页面设置数据结构记录页面自上次访问以来所经历的时间。

<3>最近最不常用调度算法

由于程序设计中经常使用循环结构,根据程序执行的局部性特点,可以设想在一段时间内经常被访问的代码和数据在将来也会经常被访问,显然这样的页面不应该被淘汰。最近最不常用调度算法总是根据一段时间内页面的访问次数来选择淘汰页面,每次淘汰访问次数最少的页面。算法实现时需要为每个页面设置计数器,记录访问次数。计数器由硬件或操作系统自动定时清零。

缺页调度次数和缺页中断率、缺页置换率计算

缺页中断次数是缺页时发出缺页中断的次数。

缺页中断率=缺页中断次数/总的页面引用次数*100%

缺页调度次数是调入新页时需要进行页面调度的次数

缺页置换率=缺页调度次数/总的页面引用次数*100% 3.4 实验内容

(1)设计程序实现以上三种页面调度算法,要求:

①.可以选择页面调度算法类型;

②.可以为进程设置分到物理页的数目,设置进程的页面引用情况,可以从键盘输入页面序列,也可从文件中读取;

③.随时计算当前的页面调度次数的缺页中断率;

④.使用敲键盘或响应WM-TIMER的形式模仿时间的流逝;

⑤.以直观的的形式将程序的执行情况显示在计算机屏幕上;

⑥.存盘及读盘功能,可以随时将数据存入磁盘文件,供以后重复实验时使用。

(2)假定进程分配到3个物理块,对于下面的页面引用序列:(test.txt)

7-0-1-2-0-3-0-4-2-3-0-3-2-1-2-0-1-7-0-1

请分别用先进和先出调度算法,最近最少用调度算法,最近最不常用调度算法计算缺页中断次数,缺页中断率和缺页调度次数、缺页置换率。

再假定进程分配到4、5个物理块,重复本实验。

(3)假定进程分配到3个物理块,对于下面的页面引用序列:(test2.txt)

4-3-2-1-4-3-5-4-3-2-1-5-0-7-3-8-9-0-2-1-4-7-3-9

请分别用先进先出调度算法、最近最少用调度算法,最近最不常用调度算法计算缺页中断次数,缺页中断率和缺页调度次数、缺页置换率。

再假定进程分配到4、5个物理块,重复本实验。

(4)假定进程分配到3个物理块,使用程序的动态页面序列生成算法,生成一个页面序列,将此序列存入磁盘文件。再从磁盘文件读入该序列,用程序分别计算三种算法下的缺页中断次数、缺页中断率和缺页调度次数、缺页置换率。

第四篇:操作系统课程设计

湖北民族学院信息工程学院11级计算机专业操作系统课程设计

(操作系统课程设计)

连续动态分区内存

管理模拟实现

学生姓名: 韩 慧 学生学号: 031140312 班 级: 031140--3 0311401、02、03、04班制

二〇一三年十二月 湖北民族学院信息工程学院11级计算机专业操作系统课程设计

目录

《操作系统》课程设计.......................................................1 引言......................................................................3 课程设计目的和内容......................................................3 需求分析.........................................................................3 概要设计...................................................................3 开发环境........................................................................4 系统分析设计.....................................................................4 有关了解内存管理的相关理论..................................................4 内存管理概念........................................................................4 内存管理的必要性..............................................................4 内存的物理组织.............................................................4 什么是虚拟内存.................................................................5 连续动态分区内存管理方式...................................................5 单一连续分配(单个分区)...................................................5

固定分区存储管理...............................................................5 可变分区存储管理(动态分区)..............................................5 可重定位分区存储管理........................................................5 问题描述和分析....................................................................6 程序流程图........................................................................6 数据结构体分析..................................................................8 主要程序代码分析...............................................................9 分析并实现四种内存分配算法.................................................11 最先适应算.....................................................................11 下次适应分配算法..........................................................13 最优适应算法...............................................................16 最坏适应算法...............................................................18 回收内存算法................................................................20 调试与操作说明.................................................................22

初始界面.......................................................................22 模拟内存分配...............................................................23

已分配分区说明表面............................................................24 空闲区说明表界面.............................................................24 回收内存界面.....................................................................25 重新申请内存界面..........................................................26.总结与体会......................................................................28 湖北民族学院信息工程学院11级计算机专业操作系统课程设计

参考文献.........................................................................28

引言

操作系统是最重要的系统软件,同时也是最活跃的学科之一。我们通过操作系统可以理解计算机系统的资源如何组织,操作系统如何有效地管理这些系统资源,用户如何通过操作系统与计算机系统打交道。

存储器是计算机系统的重要组成部分,近年来,存储器容量虽然一直在不断扩大,但仍不能满足现代软件发展的需要,因此,存储器仍然是一种宝贵而又紧俏的资源。如何对它加以有效的管理,不仅直接影响到存储器的利用率,而且还对系统性能有重大影响。而动态分区分配属于连续分配的一种方式,它至今仍在内存分配方式中占有一席之地。

课程设计目的和内容:

理解内存管理的相关理论,掌握连续动态分区内存管理的理论;通过对实际问题的编程实现,获得实际应用和编程能力。

编写程序实现连续动态分区内存管理方式,该程序管理一块虚拟内存,实现内存分配和回收功能。分析并实现四种内存分配算法,即最先适应算法,下次最先适应算法,最优适应算法,最坏适应算法。内存分配算法和回收算法的实现。

需求分析

动态分区分配是根据进程的实际需要,动态地为之分配内存空间。在实现动态分区分配时,将涉及到分区分配中所用的数据结构、分区分配算法和分区的分配和回收操作这样三个问题。常用的数据结构有动态分区表和动态分区链。在对数据结构有一定掌握程度的情况下设计合理的数据结构来描述存储空间,实现分区存储管理的内存分配功能,应该选择最合适的适应算法(首次适应算法,最佳适应算法,最后适应算法,最坏适应算法),在动态分区存储管理方式中主要实现内存分配和内存回收算法,在这些存储管理中间必然会有碎片的产生,当碎片产生时,进行碎片的拼接等相关的内容

概要设计

本程序采用机构化模块化的设计方法,共分为四大模块。⑴最先适应算法实现

从空闲分区表的第一个表目起查找该表,把最先能够满足要求的空闲区分配给作业,这种方法目的在于减少查找时间。为适应这种算法,空闲分区表(空闲区链)中的空闲分区要按地址由低到高进行排序。该算法优先使用低址部分空闲区,在低址空间造成许多小的空闲区,在高地址空间保留大的空闲区。⑵下次适应分配算法实现 湖北民族学院信息工程学院11级计算机专业操作系统课程设计

该算法是最先适应算法的变种。在分配内存空间时,不再每次从表头(链首)开始查找,而是从上次找到空闲区的下一个空闲开始查找,直到找到第一个能满足要求的的空闲区为止,并从中划出一块与请求大小相等的内存空间分配给作业。该算法能使内存中的空闲区分布得较均匀。⑶最优适应算法实现

它从全部空闲区中找出能满足作业要求的、且大小最小的空闲分区,这种方法能使碎片尽量小。为适应此算法,空闲分区表(空闲区链)中的空闲分区要按从小到大进行排序,自表头开始查找到第一个满足要求的自由分区分配。⑷最坏算法实现

最坏适应分配算法要扫描整个空闲分区或链表,总是挑选一个最大的空闲分区分割给作业使用。该算法要求将所有的空闲分区按其容量从大到小的顺序形成一空闲分区链,查找时只要看第一个分区能否满足作业要求。

开发环境:

win7 下 VC++6.0 系统分析设计:

相关算法原理,算法流程图,涉及的数据结构内容都相应包含在各章节中

有关了解内存管理的相关理论

内存管理概念:

内存管理,是指软件运行时对计算机内存资源的分配和使用的技术。其最主要的目的是如何高效,快速的分配,并且在适当的时候释放和回收内存资源。内存不是预先划分好的,而是在系统运行的过程中建立分区.当作业装入主存时,根据作业所需要的主存容量查看是否有足够的主存空间,若有则按需要分割一个分区给该作业;否则令该作业等待.分区长度不固定分区个数不固定。这种存储管理的方法克服了固定分区严重浪费主存的问题,提高了主存资源的利用率。

内存管理的必要性:

内存管理对于编写出高效率的 Windows 程序是非常重要的,这是因为Windows 是多任务系统,它的内存管理和单任务的 DOS 相比有很大的差异。DOS是单任务操作系统,应用程序分配到内存后,如果它不主动释放,系统是不会对它作任何改变的;但 Windows 却不然,它在同一时刻可能有多个应用程序共享内存,有时为了使某个任务更好地执行,Windows 系统可能会对其它任务分配的内存进行移动,甚至删除。因此,我们在 Windows 应用程序中使用内存时,要遵循Windows 内存管理的一些约定,以尽量提高 Windows 内存的利用率。湖北民族学院信息工程学院11级计算机专业操作系统课程设计

1.3 内存的物理组织:

物理地址:

把内存分成若干个大小相等的存储单元,每个存储单元占 8 位,称作字节(byte)。每个单元给一个编号,这个编号称为物理地址(内存地址、绝对地址、实地址)。

二、物理地址空间: 物理地址的集合称为物理地址空间(主存地址空间),它是一个一维空间。

什么是虚拟内存:

虚拟内存是内存管理技术的一个极其实用的创新。它是一段程序(由操作系统调度),持续监控着所有物理内存中的代码段、数据段,并保证他们在运行中的效率以及可靠性,对于每个用户层(user-level)的进程分配一段虚拟内存空间。当进程建立时,不需要在物理内存件之间搬移数据,数据储存于磁盘内的虚拟内存空间,也不需要为该进程去配置主内存空间,只有当该进程被被调用的时候才会被加载到主内存。

连续动态分区内存管理方式的实现

在早期的操作系统中,主存分配广泛采用连续分配方式。连续分配方式,是指为一个用户程序分配一个连续的内存空间,该连续内存空间指的的是物理内存。下面介绍连续分配的四种方式。

单一连续分配(单个分区)

最简单的存储管理方式,用于多道程序设计技术之前。内存分为系统区和用户区,系统区由操作系统使用。用户区作为一个连续的分区分配给一个作业。分区存储管理是满足多道程序设计的最简单的一种存储管理方法,它允许多 4个用户程序同时存在系统内存中,即共享内存空间。按分区划分方式可分为固定分区和可变分区。

固定分区存储管理

把内存的用户区预先划分成多个分区,每个分区大小可以相同,也可以不同。(分区的划分由计算机的操作员或者由操作系统给出,并给出主存分配表)分区个数固定,分区的大小固定。一个分区中可装入一个作业,作业执行过程中不会改变存放区域。早期的 IBM 的 OS/MFT(具有固定任务数的多道程序系统)采用了这种固定分区的方法。

可变分区存储管理(动态分区)

内存不是预先划分好的,而是在系统运行的过程中建立分区.当作业装入主存时,根据作业所需要的主存容量查看是否有足够的主存空间,若有则按需要分割一个分区给该作业;否则令该作业等待。分区长度不固定分区个数不固定。这种存储管理的方法克服了固定分区严重浪费主存的问题,提高了主存资源的利用率。IBM操作系统OS/MVT采用可变分区存储管理。湖北民族学院信息工程学院11级计算机专业操作系统课程设计

可重定位分区存储管理

解决碎片问题的一种简单方法是采用可重定位分区分配.。其中心思想是,把不同程序,且在内存中地址不连续的想法让他们连续。

例:内存中现有 3 个空闲区,现有一作业到达,要求获得 30k 内存空间,没有分区满足容量要求,若想把作业装入,可将内存中所有作业进行移动,这样把原来分散的空闲区汇集成一个大的空闲区。将内存中的作业进行移动使它们连接在一起把原来分散的多个小分区拼接成一个大的空闲区.这个过程称为”紧凑”或”移动”。需解决的问题:每次”紧凑”后程序或数据装入的物理地址变化采用动态重定位。

问题描述和分析

系统应利用某种分配算法,从空闲分区链表中找到所需大小的分区,如果空闲分区大小大于请求分区大小,则从该分区中按改请求的大小划分出一块内存空间大小划分出一块内存空间分配出去,余下的部分仍留在空闲链表中。然后,将分配区的首址返回给调用者。

当进程运行完毕师范内存时,系统根据回收区的首址,从空闲区中找到相应的插入点,此时可能出现以下四种情况之一:

⑴该空闲区的上下两相邻分区都是空闲区:将三个空闲区合并为一个空闲区。新空闲区的起始地址为上空闲区的起始地址,大小为三个空闲区之和。空闲区合并后,取消可用表或自由链中下空闲区的表目项或链指针,修改上空闲区的对应项。

⑵该空闲区的上相邻区是空闲区:将释放区与上空闲区合并为一个空闲区,其起始地址为上空闲区的起始地址,大小为上空闲区与释放区之和。合并后,修改上空闲区对应的可用表的表目项或自由链指针。

⑶该空闲区的下相邻区是空闲区:将释放区与下空闲区合并,并将释放区的起始地址作为合并区的起始地址。合并区的长度为释放区与下空闲区之和。同理,合并后修改可用表或自由链中相应的表目项或链指针。

⑷两相邻区都不是空闲区:释放区作为一个新空闲可用区插入可用表或自由链。

程序流程图

内存分配流程图,如图

湖北民族学院信息工程学院11级计算机专业操作系统课程设计

从头开始查表检索完否?NY返回分区大小>所需大小N继续检索下一个表项Y分区大小-所需大小<=不可再分割大小N从该分区中划出所需大小的新分区Y将该分区从链中移出将该分区分配给请求者修改有关数据结构返回

内存回收流程图,如图

湖北民族学院信息工程学院11级计算机专业操作系统课程设计

开始判断空闲区上下内存情况上为空下为空上下都为空上下都不为空将上面的空闲区合并,并回收将下面的空闲区合并,并回收将上下的空闲区合并,并回收直接将其回收结束 数据结构体分析

⑴进程属性结构体 typedef struct readyque { char name[10];int size;}readyque,*readyqueue;⑵空闲链表结构体 typedef struct idlyspace { int from;int size;idlyspace * next;}idlyspace,*idly;⑶已分配链表结构体 typedef struct busyspace { int from;readyque r;湖北民族学院信息工程学院11级计算机专业操作系统课程设计

busyspace * next;}busyspace,*busy

主要程序代码分析

⑴主函数//代码请添加适当的注释。int main(){ Is=(idly)malloc(sizeof(idlyspace));Is->from=0;Is->size=256;Is->next=NULL;Is2=Is;Bs=(busy)malloc(sizeof(busyspace));Bs->next=NULL;int t,t1;printf(“n.......................欢迎来到动态分区存储管理系统..................nn”);printf(“...........................请选择要执行的算法:...........................n”);printf(“.........................1.最先适应算法

...............................n”);printf(“.........................2.下次适应算法............................n”);printf(“..........................3.最优适应算法

...............................n”);printf(“.........................4.最坏适应算法................................n”);printf(“........................................................................n”);printf(“请输入您的选择:”);scanf(“%d”,&t);int i;while(i!=5){

printf(“........................................................................n”);

printf(“.........................操作菜单如下:(请选择).......................n”);

printf(“..........................1.输入进程分配空间...........................n”);

printf(“.........................2.进程撤销回收空间...........................n”);

printf(“.........................3.输出所有空闲分区

..........................n”);

printf(“..........................4.输出所有已分配分区..........................n”);

printf(“..........................5.退

出..........................n”);

printf(“........................................................................n”);

scanf(“%d”,&i);

switch(i)

{

case 1:

switch(t)

{

case 1:

t1=FF();湖北民族学院信息工程学院11级计算机专业操作系统课程设计

break;

case 2:

t1=NF();

break;

case 3:

t1=BF();

break;

case 4:

t1=WF();

break;

default:

printf(“选择算法错误n”);

return 1;

}

if(t1)

printf(“分配空间成功n”);

else

printf(“分配空间失败n”);

break;

case 2:

t1=recover();

if(t1)

printf(“回收成功n”);

else

printf(“回收失败n”);

break;

case 3:

Isprint();

break;

case 4:

Bsprint();

break;

} } return 0;}

第三章 :分析并实现四种内存分配算法

最先适应算法

空闲区按地址从小到大的次序排列。

分配:当进程申请大小为 SIZE 的内存时,系统顺序查找空闲区表(链),直到找到容量满足要求(≥SIZE)的空闲区为止。从该空闲区中划出大小为 SIZE的分区分配给进程,余下的部分仍作为一个空闲区,但要修改其首址和大小。湖北民族学院信息工程学院11级计算机专业操作系统课程设计

优点:这种算法是尽可能地利用低地址部分的空闲区,而尽量地保证高地址 6部分的大空闲区,有利于大作业的装入。

缺点:主存低地址和高地址分区利用不均衡。在低地址部分集中了许多非常小的空闲区碎片降低了主存的利用率。最先适应算法 int FF(){ int t=0;readyque D;printf““请输入进程名:””);scanf““%””,D.name);

printf““输入进程申请空间大小:””);scanf““%””,&D.size);

idly l=Is;int mt=256;busy b=Bs;idly min=NULL;while(l)

//寻找空闲表中大小满足申请进程所需大小并且起址最小的空闲结点

{

if(D.size<=l->size)

{

if(l->from

{ mt=l->from;min=l;t=1;

}

}

l=l->next;} if(mt!=256)

{

busy j;

j=(busy)malloc(sizeof(busyspace));

//如果找到则为进程分配空间

湖北民族学院信息工程学院11级计算机专业操作系统课程设计

j->from=min->from;

for(int i=0;i<10;i++)

{

j->r.name[i]=D.name[i];

}

j->r.size=D.size;

while(b->next)

{ if(b->next->fromfrom)

b=b->next;else

break;

}

j->next=b->next;

b->next=j;

min->from=min->from+D.size;

min->size=min->size-D.size;} return t;}

下次适应分配算法

最先适应算法的变种。

总是从空闲区上次扫描结束处顺序查找空闲区表(链),直到找到第一个满足容量要求的空闲区为止,分割一部分给作业,剩余部分仍作为空闲区。下次适应分配算法 int NF(){ int t=0;readyque D;printf““请输入进程名:””);scanf““%””,D.name);

湖北民族学院信息工程学院11级计算机专业操作系统课程设计

printf““输入进程申请空间大小:””);scanf““%””,&D.size);

int mt=256;idly l=Is2;idly min=NULL;busy b=Bs;while(l)//寻找空闲表中大小满足申请进程所需大小并且起址最小的空闲结点

{

if(D.size<=l->size)

{

if(l->from

{ mt=l->from;min=l;t=1;

}

}

l=l->next;} if(mt!=256)

{

busy j;

j=(busy)malloc(sizeof(busyspace));

j->from=min->from;

for(int i=0;i<10;i++)

{

j->r.name[i]=D.name[i];

}

j->r.size=D.size;

while(b->next)

{ if(b->next->fromfrom)

b=b->next;else

break;

//如果找到则为进程分配空间

湖北民族学院信息工程学院11级计算机专业操作系统课程设计

}

//将申请空间进程插入到已分配链表中

j->next=b->next;

b->next=j;

//修改相应空闲节点的起址和大小

min->from=min->from+D.size;

min->size=min->size-D.size;

Is2=min->next;

结点

t=1;

return t;}

l=Is;//l指向空闲表的头

while(l!=Is2)

{

if(D.size<=l->size)

{

if(l->from

{ mt=l->from;min=l;t=1;

}

}

l=l->next;} if(mt!=256){

busy j;

j=(busy)malloc(sizeof(busyspace));

j->from=min->from;

for(int i=0;i<10;i++)

{

//ls2指向修改结点的下一个

//循环查找 湖北民族学院信息工程学院11级计算机专业操作系统课程设计

j->r.name[i]=D.name[i];

}

j->r.size=D.size;

while(b->next)

{ if(b->next->fromfrom)

b=b->next;else

break;

}

j->next=b->next;

b->next=j;

min->from=min->from+D.size;

min->size=min->size-D.size;

Is2=min->next;

t=1;

return t;} return t;}

最优适应算法

空闲区按容量递增的次序排列。

分配:当进程申请存储空间,系统顺序查找空闲区表(链),直到找到第一个满足容量要求的空闲区为止。采用最优适应算法选中的空闲区是满足容量要求的最小空闲区。优点:选中的空闲区是满足容量要求的最小空闲区,而不致于毁掉较大的空闲区。

缺点:空闲区的大小一般与申请分区大小不相等,因此将其一分为二,留下来的空闲区一般情况下是很小的,以致无法使用。随着时间的推移,系统中的小空闲区会越来越多,从而造成存储空间的浪费。最优适应算法 int BF(){ int t=0;湖北民族学院信息工程学院11级计算机专业操作系统课程设计

readyque D;printf““请输入进程名:””);scanf““%””,D.name);

printf““输入进程申请空间大小:””);scanf““%””,&D.size);

idly l=Is;idly min=NULL;int mt=256;busy b=Bs;while(l)//在空闲链中寻找第一个大于所输入的进程大小的空闲块

{

if(D.size<=l->size)

{

if(l->size

{

mt=l->size;min=l;t=1;

}

}

l=l->next;} if(mt!=256)

{

busy j;

j=(busy)malloc(sizeof(busyspace));空间

j->from=min->from;

//申请分配用于存放进程的内存

//找到第一个满足要求的空闲块

//将第一个满足要求的空闲块(min)的首地址赋给j

for(int i=0;i<10;i++)

{

j->r.name[i]=D.name[i];16 湖北民族学院信息工程学院11级计算机专业操作系统课程设计

}

j->r.size=D.size;

while(b->next)

//按从小到大的顺序查找新进程在已分配区中的位置

{ if(b->next->fromfrom)

b=b->next;else

break;

}

j->next=b->next;

b->next=j;

min->from=min->from+D.size;

min->size=min->size-D.size;

} return t;}

最坏适应算法

为了克服最佳适应算法把空闲区切割得太小的缺点,人们提出了一种最坏适应算法,即每次分配时,总是将最大的空闲区切去一部分分配给请求者,剩余的部分仍是一个较大的空闲区。避免了空闲区越分越小的问题。要求空闲区按容量递减的顺序排列。

分配:进程申请存储区时,检查空闲区表(链)的第一个空闲区的大小是否满足要求,若不满足则令进程等待;若满足则从该空闲区中分配一部分存储区给用户,剩下的部分仍作为空闲区。最坏适应算法 int WF(){ int t=0;readyque D;printf““请输入进程名:””);scanf““%””,D.name);

printf““输入进程申请空间大小:””);

//将所输入的进程插入进程链

//改变该空闲块的起始地址 //改变该空闲块的剩余大小 湖北民族学院信息工程学院11级计算机专业操作系统课程设计

scanf““%””,&D.size);

//输入进程申请的空间大小

idly l=Is;//l指向空闲链表ls头

idly min=NULL;int mt=0;busy b=Bs;

//b指向已分配链表Bs头

//找到空闲分区中大小满足进程的请求且尺寸最大的结点

while(l){

if(D.size<=l->size)//判断进程所申请的大小是否小于空闲区的各结点大小

{

if(l->size>mt)

{ mt=l->size;min=l;//min指向空闲区中尺寸最大的结点

t=1;

}

}

l=l->next;} if(mt!=0)点

{

busy j;

j=(busy)malloc(sizeof(busyspace));

j->from=min->from;

for(int i=0;i<10;i++)

{

j->r.name[i]=D.name[i];

}

j->r.size=D.size;

//判断是否找到了空闲区的满足结

//l指向空闲链表下一个结点

湖北民族学院信息工程学院11级计算机专业操作系统课程设计

while(b->next)置

//寻找插入到已分配链表中的位

{ if(b->next->fromfrom)

b=b->next;else

break;

}

//把此进程结点j插入到已分配链表中

j->next=b->next;

b->next=j;

//修改空闲链表的相应结点的参数

min->from=min->from+D.size;

min->size=min->size-D.size;} return t;}

可变分区的回收

当某个进程释放某存储区时,系统首先检查释放区是否与系统中的空闲区相邻若相邻则把释放区合并到相邻的空闲区去,否则把释放区作为一个空闲区插入到空闲表的适当位置。

释放区与空闲区相邻的四种情况。

(1)释放区与前空闲区相邻:把释放区与前空闲区合并到一个空闲区。其首址仍为前空闲区首址,大小为释放区大小与空闲区大小之和。

(2)释放区与后空闲区相邻:则把释放区合并到后空闲区,其首地址为释放区首地址,大小为二者之和。

(3)释放区与前后两空闲区相邻:这三个区合为一个空闲区,首地址为前空闲区首址,大小为这三个空闲区之和,并取消后空闲区表目。

(4)释放区不与任何空闲区相邻:将释放区作为一个空闲区,将其大小和首址插入到空闲区表的适当位置。

湖北民族学院信息工程学院11级计算机专业操作系统课程设计

回收内存算法

int recover(){ readyque D;printf““请输入想要回收的进程名””);

scanf““%””,D.name);

busy b=Bs;idly l=Is;while(b->next)链表中

{

bool yo=1;

for(int i=0;i<10;i++)

{

if(b->next->r.name[i]==D.name[i])yo=yo*1;

else yo=0;

}

//如果在已分配链表中则释放该结点所占空间

if(yo)

{

int t=b->next->from;

int ts=b->next->r.size;

//查找输入的进程名是否在已分配湖北民族学院信息工程学院11级计算机专业操作系统课程设计

while(l)

{ if(l->from>t+ts)不邻接

{ idly tl;tl=(idly)malloc(sizeof(idlyspace));tl->from=t;tl->size=ts;tl->next=l;Is=tl;break;} if(l->from==t+ts)

l->from=t;

l->size=l->size+ts;

busy tb=b->next;

b->next=b->next->next;

free(tb);

return 1;}

if(l->from+l->size

idly tl;

tl=(idly)malloc(sizeof(idlyspace));

tl->from=t;

tl->size=ts;

tl->next=l->next;

l->next=tl;

break;}

else if(l->from+l->size==t)

//所回收进程与空闲结点上邻接 {

//所回收进程与空闲结点上下都不邻接

//所回收进程与空闲结点下邻接 {

//所回收进程与空闲结点上下都 21 湖北民族学院信息工程学院11级计算机专业操作系统课程设计

l->size=l->size+ts;

if(l->from+l->size==l->next->from)接

{

l->size=l->size+l->next->size;

idly tm=l->next;

l->next=l->next->next;

freI);

}

br

l=l->next;

}

//从已分配链表中释放所回收进程

busy tb=b->next;

b->next=b->next->next;

free(tb);

return 1;

}

b=b->next;} printf(“没找到这”进程n”);return 0;}

//所回收进程与空闲结点上下都邻调试与操作说明

初始界面

程序初始界面,有四个块选择,选择要执行的算法,调试以最坏算法为例,如图

湖北民族学院信息工程学院11级计算机专业操作系统课程设计

选择最坏适应算法,如图

模拟内存分配

给进程a分配内存20,如图

湖北民族学院信息工程学院11级计算机专业操作系统课程设计

已分配分区说明表界面

同理,给进程b分配内存30,给进程c分配内存40,给进程d分配50,给进程e分配60,如图

空闲分区说明表界面 湖北民族学院信息工程学院11级计算机专业操作系统课程设计

查看空闲分区,如图

回收内存界面

回收进程b和d所占内存,如图

已分配分区说明表和空闲分区说明表 如图 湖北民族学院信息工程学院11级计算机专业操作系统课程设计

重新申请内存界面

再为新进程i分配内存30,如图

湖北民族学院信息工程学院11级计算机专业操作系统课程设计

根据最坏适应算法结合图所示可知,该算法将会从空闲分区表中选择一块最大的内存空间分配给进程i,从图也可看出该模拟算法实现了最坏适应算法

湖北民族学院信息工程学院11级计算机专业操作系统课程设计

总结与体会

本次做的课题是动态分区分配算法实现,此次课程设计成功实现了内存分配和内存回收,内存分配中包含了四种算法,分别是首次适应算法,循环首次适应算法,最佳适应算法和最坏适应算法。经编码调试,表明该程序模块是有效可行的。

通过这门课程的学习让我充分了解了内存管理的机制实现,从而更深一步的的对计算机

有了很多了解,这对于以后我们的研究和学习计算机系统起到了很重要的作用。

对于本次论文制作,自己的编程能力有所提高,对操作系统内存分配,存储空间的回收都有全新的认识。

在这次操作系统课程设计中,我使用了c++编写系统软件,对os中可变分区存储管理有了深刻的理解,但是过程中遇到了很多困难,一边做一边学,对c++有了比较多的理解。

实验中遇到很多问题,浪费了很多时间,总而言之是自己学习还不够好,不扎实,希望在以后学习中加以改善,学到更多知识。

参考文献

【1】 汤子瀛,哲凤屏,汤小丹.计算机操作系统.西安:西安电子科技大学出版社,2001.。湖北民族学院信息工程学院11级计算机专业操作系统课程设计

【2】 任爱华.操作系统实用教程.北京:清华大学出版社,2001。

第五篇:操作系统课程设计

长春理工大学 软件学院 0813111班 27号

姓名:丁为胜 一. 概述

1、课程设计目的及任务课程设计地点及要求

每个学生一台微机,需要安装windows98或windows2000操作系统,配备VC、VB、java或C编程语言,每个学生上机时间不少于24个小时。

操作系统是计算机专业的核心专业课,“操作系统课程设计”是理解和巩固操作系统基本理论、原理和方法的重要的实践环节。

操作系统课程主要讲述的内容是多道操作系统的原理与技术,与其它计算机原理、编译原理、汇编语言、计算机网络、程序设计等专业课程关系十分密切。本课程设计的目的综合应用学生所学知识,建立系统和完整的计算机系统概念,理解和巩固操作系统基本理论、原理和方法,掌握操作系统基本理论与管理方式。在算法基础上,解决实际的管理功能的问题,提高学生实际应用、编程的能力。

主要任务是实现操作系统和相关系统软件的设计,其中涉及进程创建,同步,进程间的通信,存储管理,文件系统等操作系统概念。

2.课程设计地点及要求

每个学生一台微机,需要安装windows98或windows2000操作系统,配备VC、VB、java或C编程语言,每个学生上机时间不少于24个小时。

3.课程设计的内容

设计二: 设计任务:

掌握进程的管道通讯机制和信号量同步互斥机制。1. 进程的管道通讯

编制一个程序,程序中创建一个子进程。然后父子进程各自独立运行,父进程不断地在标准输入设备上读入小写字母,写入管道。子进程不断地从管道中读取字符,转换为大写字母后输出到标准输出设备上。当读到x时,结束。

2. 信号量实现的同步互斥机制

编制一个程序,程序中创建5个子进程,代表五位哲学家,然后父进程结束。使用信号量机制解决哲学家进餐问题。当哲学家进餐时,屏幕输出:

[进程号] eating!当哲学家思考时,屏幕输出: [进程号] thinging!相关的系统调用和函数:pipe();write();read();semget();sepop();semctl();要求:查找并阅读上述系统调用的相关资料,将上述相关的函数封装为P()、V()操作,使用你封装的P()、V()操作实现5位哲学家的同步和互斥。

二. 设计的基本概念和原理

1.进程的管道通讯

管道(Pipe)实际是用于进程间通信的一段共享内存,创建管道的进程称为管道服务器,连接到一个管道的进程为管道客户机。命名管道(Named Pipes)是在管道服务器和一台或多台管道客户机之间进行单向或双向通信的一种命名的管道。一个命名管道的所有实例共享同一个管道名,但是每一个实例均拥有独立的缓存与句柄,并且为客户——服务通信提供有一个分离的管道。实例的使用保证了多个管道客户能够在同一时间使用同一个命名管道。

2.信号量实现的同步互斥机制

规定奇数号的哲学家先拿起他左边的筷子,然后再去拿他右边的筷子;而偶数号 的哲学家则相反.按此规定,将是1,2号哲学家竞争1号筷子,3,4号哲学家竞争3号筷子.即 五个哲学家都竞争奇数号筷子,获得后,再去竞争偶数号筷子,最后总会有一个哲学家能获 得两支筷子而进餐。而申请不到的哲学家进入阻塞等待队列,根FIFO原则,则先申请的哲 学家会较先可以吃饭,因此不会出现饿死的哲学家。

三. 总体设计

1.实现的方法和主要技术路线

1.无名管道

无名管道用于具有亲缘关系的父子进程,子子进程之间的通讯。它的实现函数有 int pipe(int fd[2]);

//fd[2] 为描述符数组,包含一个读描述符与一个写描述符,在使用管道通信时,关闭某些不需要的读或写描述符,建立起单向的读或写管道,然后用read 和write 像操作文件一样去操作它即可。

如图便是进程1 到进程2 的一个读管道。

分别在父进程和父子进程里向管道写数据,然后在子进程和子子进程里读数据。2.哲学家进餐伪码:

semaphore chopstick[5]={1,1,1,1,1};void philosopher(int i){

while(true){

think();

if(i%2 == 0)//偶数哲学家,先右后左。

{

wait(chopstick[ i + 1 ] mod 5);wait(chopstick[ i]);eat();

signal(chopstick[ i + 1 ] mod 5);signal(chopstick[ i]);}

Else //奇数哲学家,先左后右。

{

wait(chopstick[ i]);

wait(chopstick[ i + 1 ] mod 5);eat();

signal(chopstick[ i]);

signal(chopstick[ i + 1 ] mod 5);} } 四. 详细设计

进程的管道通信代码: import java.io.IOException;import java.io.PipedReader;

public class ReceiverThread1 extends Thread { PipedReader pipedReader;

public ReceiverThread1(SenderThread1 sender)throws IOException

{

pipedReader=new PipedReader(sender.getPipedWriter());

}

public void run()

{ char[] ch=new char[100];StringBuffer sb=null;String str=null;int i=0;try {

while((i=pipedReader.read(ch))!=-1)

{

sb=new StringBuffer();

for(int j=0;j

{

sb.append(ch[j]);

}

str=sb.toString();

System.out.println(“子进程读取的字符为:”+str.toUpperCase());

if(!str.endsWith(“x”))

{

System.out.print(“父进程读入字符为:”);

}else if(str.endsWith(“x”))

{

System.out.println(“结束无法再次输入字符”);

}

} } catch(IOException e){

e.printStackTrace();}finally{

try {

pipedReader.close();

} catch(IOException e){

e.printStackTrace();

} }

}

}

import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PipedWriter;

public class SenderThread1 extends Thread { PipedWriter pipedWriter;

public SenderThread1(){

pipedWriter=new PipedWriter();}

public PipedWriter getPipedWriter(){

return pipedWriter;}

public void run()

{ BufferedReader ir=new BufferedReader(new InputStreamReader(System.in));char[] ch=new char[100];StringBuffer sb=null;String str=null;int i=0;System.out.print(“父进程读入字符为:”);try {

while((i=ir.read(ch))!=-1)

{

sb=new StringBuffer();

for(int j=0;j

{

if(ch[j]>='a' && ch[j]<='z')

{

sb.append(ch[j]);

if(ch[j]=='x')

{

break;

}

}

}

str=sb.toString();

pipedWriter.write(str);

if(str.startsWith(“x”)||str.endsWith(“x”))

{

break;

// this.stop();

}

}

} catch(IOException e){

e.printStackTrace();}finally{

try {

ir.close();

pipedWriter.close();

} catch(IOException e){

e.printStackTrace();

}

}

} }

public class ThreadComm1 { public static void main(String[] args)throws Exception{ SenderThread1 sender=new SenderThread1();ReceiverThread1 receiver=new ReceiverThread1(sender);sender.start();receiver.start();} } 哲学家进餐问题代码: #include “stdafx.h” using namespace std;bool chop[100];//定义筷子 class ph { protected: bool * left,* right;//哲学家的左右手指向的筷子

int eattime;//哲学家的吃饭时间 public: bool check()//用于检查哲学家左右手的筷子是不是被占用

{

if(*left && *right)

return true;

else

return false;} void eat(int ineattime)//哲学家开始进餐

{

eattime=ineattime;

*left=false;

*right=false;} bool finish()//检查哲学家是否完成进餐

{

if(eattime>0)//没完成的话剩余时间减少

{

eattime--;

if(eattime==0)//完成的话归还筷子

{

*left=true;

*right=true;

return true;

}

else

return false;

}

else

return false;} void init(int num,int max)//初始化哲学家,指定他们使用的筷子

{

eattime=0;

left=&chop[num];

if(num

right=&chop[num+1];

else

right=&chop[0];} };void main(){ system(“title 哲学家进餐问题”);int in,i,temp,time,j=1;queue Q;ph P[100];

for(int i=0;i<5;i++){

chop[i]=1;

} for(int i=0;i<5;i++){ P[i].init(i,5);} cout<<“输入哲学家进餐队列:”<>in;if(in==0)

break;else

if(in>5)

{

cout<<“一共只有”<<5<<“个人!”<

}

else

{

Q.push(in-1);

} } cout<<“每个人吃饭时间:”<>time;system(“CLS”);system(“color 0a”);while(!Q.empty()){ temp=Q.front();Q.pop();if(P[temp].check()){

P[temp].eat(time);

cout<

if(temp+2>5)

cout<<1<

else

cout<

Q.push(temp);} for(i=0;i<5;i++)

{

if(P[i].finish())

cout<

}

//Q.push(-1);

for(i=0;i

{

temp=Q.front();

Q.pop();

//if(temp!=-1)

{

cout<

Q.push(temp);

}

//else

{

// Q.pop();

break;

}

} } for(int j=0;j

if(P[i].finish())

{

cout<

} getch();}

下载操作系统命令接口设计课程设计说明书word格式文档
下载操作系统命令接口设计课程设计说明书.doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    操作系统课程设计

    1 引言 操作系统是计算机科学与技术专业的主要专业基础课和主干课。操作系统对计算机系统资源实施管理,是所有其他软件与计算机硬件的唯一接口,所有用户在使用计算机时都要得......

    操作系统课程设计报告

    课程设计报告 题 目: 模拟请求页式管理 课程名称: 计算机操作系统 学 院: 信息工程学院专 业: 计算机科学与技术班 级: 14计本(1) 学生姓名: * * * 学 号: 201403031** 指导教......

    操作系统课程设计报告(★)

    操 作 系 统 课 程 设 计 实 验 报 告 学院:计算机科学与技术学院 班级:计112 学号:1113022032 姓名: 一、 实验名称: 用C++实现驱动调度算法、页面替换算法、银行家算法、处理......

    操作系统课程设计题目

    辽宁科技大学操作系统课程设计指导书 一、课程设计目的和要求 本设计是专业基础课《操作系统》的课程设计。由于操作系统课的学时有限,安排实验的次数不多。为了进一步巩固实......

    操作系统课程设计[合集五篇]

    《操作系统》/《操作系统课程设计》课设指导书 《操作系统》 《操作系统课程设计》 指导 信息技术学院课设书 《操作系统》/《操作系统课程设计》课设指导书 《操作系统》/......

    操作系统课程设计报告

    操作系统课程设计报告 专 业:计算机科学与技术 学 号: 姓 名: 提交日期: 操作系统课程设计报告 【设计目的】 (1)本实验的目的是通过一个简单多用户文件系统的设计,加深理解文件系......

    操作系统课程设计3

    操作系统课程设计3 一. 银行家算法代码 package sheji; import java.awt.Color; import java.awt.Dimension; import java.awt.GridLayout; import java.awt.TextField; im......

    操作系统课程设计教学大纲

    《操作系统课程设计》教学大纲 一、 课程设计基本信息 课程设计环节代码:230027 课程设计环节名称:操作系统课程设计 英文名称:Course Design of Operating System 课程设计周......