文档库 最新最全的文档下载
当前位置:文档库 › 操作系统课程设计指导书2010

操作系统课程设计指导书2010

操作系统课程设计指导书2010
操作系统课程设计指导书2010

操作系统课程设计指导书

由于操作系统课程的学时和条件有限,在理论学习过程中没有给同学们提供实验的机会。本课程设计的目的,是给同学提供一个集中实验的机会。希望同学们通过该设计加深对所学习课程的基本知识和基本理论的理解。

本设计的内容是基于《操作系统原理》教材的,但还要求同学们必须对以前的《C语言程序设计》和《数据结构》等内容进行认真的复习。课程中学到的UNIX系统调用等是我们使用的主要工具。

系统调用函数说明、参数值及定义

1.fork()

创建一个新进程。

用法:int fork()

其中返回int取值意义如下:

0:创建子进程,从子进程返回的id值

>0:从父进程返回的子进程id值

-1:创建失败

2.lockf(files,function,size)

用作锁定文件的某些段或者整个文件。

头文件:

#include

参数定义:

int lockf(files,function,size);

int files,function;

long size;

其中:files是文件描述符;function是锁定和解锁;1表示锁定;0表示解锁;Size是锁定或解锁的字节数,若用0,表示从文件的当前位置到文件尾。

3.msgget(key,flag)

获得一个消息的描述符

头文件:

#include

#include

#include

参数定义:

int msgget(key,flag)

key_t key

int flag;

语法格式: msgqid=msgget(key,flag);

其中:

msgqid:该系统调用返回的描述符,失败则返回-1;

flag:本身由操作允许权和控制命令值相“或”得到。

如:IPC_CREAT|0400是否该队列应被创建;

IPC_EXCL|0400是否该队列的创建映是互斥的等。

4.msgsnd(id,msgp,size,flag)

发送一消息

头文件;

#include

#include

#include

参数定义:

int msgsnd(id,msgp,size,flag);

int id,size,flag;

struct msgbuf *msgp;

其中:

id:返回消息队列的描述符;

msgp:指向用户存储区的一个构造体指针;

size:指示由msgp指向的数据结构中字符数组的长度,即消息的长度。这个数组的最大值由MSG_MAX系统可调用参数来确定。

flag:规定当核心用尽内部缓冲空间时应执行的动作;若在标志flag中未设置IPC_NOWAIT位,则当该消息队列中的字节数超过一最大值时,或系统范围的消息数超过某一最大值时,调用msgsnd进程睡眠。若是设置IPC_N0WAIT,则在此情况下,msgsnd 立即返回。

5.msgrcv(id,msgp,size,type,flag)

接受一消息

头文件:

#include

#include

#include

参数定义:

int msgrcv(id,msgp,size,type,flag)

int id,size,type,flag;

struct msgbuf *msgq;

struct msgbuf { long mtype schar mtext[];};

语法格式:

count=msgrcv(id,msgp,size,type,flag);

其中:

id:消息描述符;

msgp:用来存放欲接收消息的拥护数据结构的地址;

size:msgp中数据数组的大小;

type:用户要读的消息类型:

type=0:接收该队列的第一个消息;

type>0:接收类型type的第一个消息;

type<0:接收小于或等于type绝对值的最低类型的第一个消息。

flag:规定倘若该队列无消息,核心应当做什么事,如果此时设置了IPC_NOWAIT标志,则立即返回,若在flag中设置了MSG_NOERROR,且所接收的消息大小大于size,核心截断所接受的消息。

count:返回消息正文的字节数。

6.msgctl(id,cmd,buf)

查询一个消息描述符的状态,设置它的状态及删除一个消息描述符。

头文件:

#include

#include

#include

参数定义:

int msgctl(id,cmd,buf)

int id,cmd;

struct msqiq_ds *buf;

其中:函数调用成功时返回0,调用不成功时返回-1。

id:用来识别该消息的描述符;

cmd:规定命令的类型。

IPC_STAT:将与id相关联的消息队列首标读入buf。

IPC_SET:为这个消息序列设置有效的用户和小组标识及操作允许权和字节的数量。

IPC_RMID:删除id的消息队列。

buf:是含有控制参数或查询结果的用户数据结构的地址。

附:msgid_ds结构定义如下:

struct msgid_ds{

struct ipc_perm msg_perm; //许可权结构

short pad1[7]; //由系统使用

ushort onsg_qnum; //队列上消息数

ushort msg_qbytes; //队列上最大字节数

ushort msg_lspid; //最后发送消息的PID

ushort msg_lrpid; //最后接收消息的PID

time_t msg_stime; //最后发送消息的时间

time_t msg_rtime; //最后接收消息的时间

time_t msg_ctime; //最后更改时间

}

struct ipc_perm{

ushort uid; //当前进程用户id

ushort gid; //当前进程组id

ushort cuid; //创建用户id

ushort cgid; //创建进程组id

ushort mode; //存取许可权

{short pad1;long pad2;} //由系统使用

};

7.shmget(key,size,flag)

获得一个共享存储区

头文件:

#include

#include

#include

语法格式:

shmid=shmget(key,size,flag);

参数定义

int shmget(key,size,flag);

key_t key;

int size,flag;

其中:size是存储区的字节数,key和flag与系统调用msgget中的参数含义相同。

附:

如:shmid=shmget(key,size,(IPC_CREAT|0400));

创建一个关键字为key,长度为size的共享存储区。

8.shmat(id,addr,flag)

从逻辑上将一个共享存储区附接到进程的虚拟地址空间。

头文件:

#include

#include

#include

参数定义

char *shmat(id,addr,flag);

int id,flag;

char *addr;

语法格式:virtaddr=shmat(id,addr,flag);

其中:

id:共享存储区的标识符;

addr:用户要使用共享存储区附接的虚地址,若addr是0,系统选择一个适当的地址来

附接该共享区;

flag:规定对此区的读写权限,以及系统是否应对用户规定的地址做舍入操作,如果flag中设置了shm_rnd即表示操作系统在必要时舍去这个地址。如果设置了shm_rdonly,即表示只允许读操作;

viraddr是附接的虚地址。

9.shmdt(addr)

把一个共享存储区从指定进程的虚地址空间断开。

头文件:

#include

#include

#include

参数定义

int shmdt(addr)

char *addr

其中,当调用成功时,返回0值,调用不成功返回-1;addr是系统调用shmat所返回的的地址。

10.shmctl(id,cmd,buf)

对与共享存储区关联的各种参数进行操作,从而对共享存储区进行控制。

头文件:

#include (sys/types.h)

#include (sys/ipc.h)

#include (sys/shm.h)

参数定义:

int shmct1(id,cmd,buf);

int id,cmd;

struct shmid_ds *buf;

其中:调用成功时返回0,否则返回-1。

Id:为被共享存储区的标识符;

Cmd:规定操作的类型。规定如下:

IPC_STAT:返回包含在指定的shmid相关数据结构中的状态信息,并且把它放置在用户存储区中的*buf指针所指的数据结构中。执行此命令的进程必须有读取允许权。

IPC_SET:对于指定的shmid,为它设置有效用户和小组标识和操作存取权。

IPC_RMID:删除指定的shmid以及与它相关的共享存储区的数据结构。

SHM_LOCK:在内存中锁定指定的共享存储区,必须是超级用户才可以进行此项操作。

Buf:是一个用户级数据结构地址。

附:

shmid_ds {

struct ipc_perm shm_perm; //许可权结构

int shm_segsz; //段大小

int pad1; //由系统使用

ushort shm_lpid; //最后操作的进程id

ushort chm_cpid; //创建者的进程id

ushort shm_nattch; //当前附接数

ushort pad2; //由系统使用;

time_t shm_atime; //最后附接时间

time_t shm_dtime; //最后断接时间

time_t shm_ctime; //最后修改时间

}

11.signal(sig,function)

允许调用进程控制软中断信号的处理。

头文件:

#include

参数定义

signal(sig,function)

int sig;

void (*function)();

返回值:成功时返回旧的(以前)函数描述,失败时返回SIG_ERR。

说明:信号sig的值在头文件singal.h中有完整定义和描述,可用man 7 signal来获得帮助。

其中:sig的值是:

SIGHUP 挂起

SIGINT 键盘按delete键或break键

SIGQUIT 键盘按quit键

SIGILL 非法指令

SIGIOT I0T指令

SIGEMT EMT指令

SIGFPE 浮点运算溢出

SIGKILL 要求终止进程

SIGBUS 总线错

SIGSEGV 段违例

SIGSYS 系统调用参数错

SIGPIPE 向无读者管道上写

SIGALRM 闹钟

SIGTERM 软件终结

SIGUSR1 第一个用户定义信号

SIGUSR2 第二个用户定义信号

SIGCLD 子进程死

SIGPWR 电源故障

function的解释如下:

SIG_DFL:缺省操作。对除SIGPWR和SIGCLD外所有信号的缺省操作是进程终止。对信号SIGQUIT,SIGILL,SIGTRAP,SIGIOT,SIGEMT,SIGFPE,SIGBUS,SIGSEGV和SIGSYS

它产生一内存映像文件。

SIG_IGN:忽视该信号的出现。

function:在该进程中的一个函数地址,在核心返回用户态时,它以软中断信号的序号作为参数调用该函数,对除了信号SIGILL,SIGTRAP和SIGPWR以外的信号,核心

自动地重新设置软中断信号处理程序的值为SIG_DFL,一个进程不能捕获

SIGKILL信号。

12.kill(pid,sig)

向pid为进程号的进程发送信号sig。

头文件:

#include

#include

参数定义

int kill(pid_t pid,int sig)

pid_t pid:信号的接收进程。(pid_t可用整数代替。)

若pid>0,则pid为接收者的进程号,若pid=0,则接收者为同组的所有进程。若pid=-1则发送到除init进程外的所有进程。若pid<-1,则接收者为-pid进程组中的每个进程。

int sig:发送的信号。

返回值:若成功返回0,否则为-1.当出错时,errno将被设置为合适的错误代码。

open

open可以打开或创建一个文件,并返回一个文件描述符。

调用方法:

#include

#include

#include

int open(const char * pathname, int oflag) ;

int open(const char * pathname, int oflag, mode_t mode ) ;

返回值:成功时为文件描述符,出错则为-1。

open的参数

pathname是要打开或创建的文件的名字。

oflag参数可用来说明此函数的多个选择项。用下列一个或多个常数进行或运算构成oflag 参数(在fcntl.h中):

? O_RDONLY:只读打开。? O_WRONLY:只写打开。

? O_RDWR :读写打开? O_APPEND 追加方式。

? O_CREAT 若不存在则创建它。需同时使用第三个参数mode。

? O_EXCL 如果同时指定了O_CREAT,而文件已经存在,则出错。这可测试一个文件是否存在,如果不存在则创建此文件成为一个原子操作。

? O_TRUNC 如果此文件存在,则将其长度截短为0。

? O_NOCTTY 如果pathname指的是终端设备,则不将此设备分配作为此进程的控制终端。? O_NONBLOCK 如果pathname指的是特殊文件,此选择项为此文件的本次打开操作和后续的I / O操作设置非阻塞方式。

creat

功能:创建一个新文件

用法:

#include

#include

#include

int creat(const char * pathname, mode_t mode) ;

返回:成功为只写打开的文件描述符;出错为-1。

注意:此函数等效于:

open (pathname, O_WRONLY|O_CREAT|O_TRUNC, mode) ;

read

功能:从描述符为filedes的文件读信息。

用法:

#include

ssize_t read(int filedes, void *buff, size_t nbytes) ;

返回:读到的字节数,若已到文件尾为0,若出错为-1。

在UNIX/Linux 可重定义为:

int read(int fd, char *buff, unsigned nbytes) ;

write

功能:向已打开的文件写数据。

用法:

#include

ssize_t write(int filedes, const void * buff, size_t nbytes) ;

返回值:若成功为已写入的字节数;出错为-1。

int write(int fd, char *buff, unsigned nbytes) ;

文件位置指针

文件位置指针:每个打开文件都有一个与其相关联的“当前位移量”。是从文件开始处计算的字节数。通常,读、写操作都从当前文件位置处开始,并使位移量增加所读或写的字节数。按系统默认,当打开一个文件时,除非指定O_APPEND选择项,否则该位移量被设置为0,即指向文件的开始处。

文件位置指针可以通过系统调用lseek来移动。

lseek

功能:显式地定位一个打开文件的位置指针。

用法:

#include

#include

off_t lseek(int filedes, off_t offset, int whence) ;

返回值:若成功为新的文件位移,若出错为-1。

说明:对参数offset 的解释与参数whence的值有关:

whence=SEEK_SET(0),从文件开始。

whence=SEEK_CUR(1),从当前位置, offset可正可负。

whence=SEEK_END(2),从文件末尾, offset可为正或负。

例:求文件的当前位置指针:

off_t currpos; currpos = lseek(fd, 0, SEEK_CUR);

这种方法也可用来确定所涉及的文件是否可以设置位移量。如果文件描述符引用的是一个管道或FIFO,则lseek返回-1,并将errno设置为EPIPE。

fcntl

功能:控制和改变已经打开文件的属性。

用法:

#include

#include

#include

int fcntl(int filedes, int cmd, long arg ) ;

int fcntl(int filedes, int cmd, struct flock *lock ) ;

返回值:若成功则依赖于cmd(见下),若出错为-1

fcntl函数有五种功能

? 复制一个现存的描述符(cmd=F_DUPFD),新文件描述符作为函数值返回。它是尚未打开的各描述符中大于或等于第三个参数值中各值的最小值。新描述符与filedes 共享同一文件表项;

? 获得/设置文件描述符标记(cmd=F_GETFD/F_SETFD);对应于filedes 的文件描述符标志作为函数值返回。

? 获得/设置文件状态标志(cmd=F_GETFL / F_SETFL);新标志值按第三个参数设置。可以更改的几个标志是:O_APPEND,O_NONBLOCK,O_SYNC和O_ASYNC。

? 获得/设置异步I/O有权(cmd=F_GETOWN/F_SETOWN);获取或接收当前接收SIGIO和SIGURG 信号的进程ID或进程组ID。

? 获得/设置记录锁(cmd=F_GETLK, F_SETLK或F_SETLKW)。

ioctl函数

ioctl 函数是I/O操作的杂物箱。不能用本章中其他函数表示的I / O操作通常都能用ioctl 表示。

终端I/O是ioctl 的最大使用方面(第11章将介绍P O S I X . 1已经用新的函数代替ioctl 进行终端I / O操作)。

Ioctl更多的是用于设备控制,比如磁盘的格式化,MODEM设备,磁带的快进、快倒等。文件高级I/O中的二进制I/O及定位

字符I/O只能用于文本文件,而对于二进制文件则会出错。对于二进制文件必须使用二进制I/O。

二进制I/O

系统调用:fread,fwrite

功能:以二进制方式进行I/O。

用法:

#include

size_t fread(void *ptr, size_t size, size_t nobj, FILE *fp);

size_t fwrite(const void *ptr, size_t size, size_t nobj, FILE *fp);

返回:读或写的对象个数。

流定位

有两种方法定位标准I/O流。

(1) ftell和fseek。这两个函数自SYS V7以来就存在了,但是它们都假定文件的位置可以存放在一个长整型中。

(2) fgetpos和fsetpos。这两个函数是新由ANSI C引入的。它们引进了一个新的抽象数据类型fpos_t,它记录文件的位置。在非UNIX系统中,这种数据类型可以定义为记录一个文件的位置所需的长度。

需要移植到非UNIX系统上运行的应用程序应当使用fgetpos和fsetpos。

流定位,可参照系统调用lseek()。

1. 系统调用:ftell:

功能:确定文件位置。

用法:

#include

long ftell(FILE *fp);

返回:若成功则为当前文件位置指示,若出错则为-1L

2. 系统调用:fseek:

用法:int fseek(FILE *fp, long offset, int whence);

返回值:若成功则为0,若出错则为非0(-1)。

3. 系统调用:fgetpos,fsetpos

功能:获得或设置文件位置。

用法:

#include

int fgetpos(FILE *fp, fpos_t *pos);

int fsetpos(FILE *fp, const fpos_t *pos);

返回值:

若成功则为0,若出错则为非0(-1).

注:

Linux操作系统是一个向用户开放源码的免费的类UNIX操作系统。它为在校学生学习操作系统课程提供了一个看得见摸得着的范例。对于学生正确理解,掌握操作系统的基本知识具有重要意义。鉴于此,本操作系统课程涉及的实验均在Linux环境下进行。

这就要求大家:

(1)熟悉Linux的操作和开发环境;

(2)具有C语言知识(Linux操作系统大约90%的源码是用C语言编写)。

Linux系统的内核源代码可以从很多的网站上下载。

如果想安装Linux系统,可以利用Linux安装光盘进行安装,或从校学校的资源上下载RedHat9.2的光盘映象文件。地址为https://www.wendangku.net/doc/c93772580.html,。虚拟机软件,也可从该网站下载。

我们的设计和实验将Windows环境下,基于虚拟机软件VMWare软件进行安装。

具体安装办法,参见虚拟机下的RedHat9.2的安装方法。

设计指导

1.图书管理系统

以UNIX系统文件部分系统调用为基础设计一个简易的图书管理系统。要求实现:图书的录入、查询、借阅、清理、统计等功能、还要实现对每天的借阅情况进行统计并出来统计报表。

图书查询

图书录入

图书借阅

2.信号通信与进程控制

<任务>

(l)进程的创建:编写一段程序,使用系统调用fork()创建两个或多个子进程。当此程序运行时,在系统中有一个父进程和其余为子进程活动。

(2)进程的控制:在程序中使用系统调用lockf()来给每一个进程加锁,实现进程之间的互斥。

(3)进程通信:①软中断通信;②在程序中使用语句signal(SIGINT,SIG_IGN)和signal(SIGQUIT,SIG_IGN),观察执行结果,并分析原因。

(4)软中断的捕获与重定义。首先定义一个服务函数function,然后利用signal(sig,function)系统调用来实现中断的捕获与改道。

(5)使用操作系统保留给用户的信号SIGUSR1和SIGUSR2进行通信。

(6)扩展程序,使之成为信号或事件驱动的应用程序。

<示例1>

编写一段程序,使用系统调用fork()创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符;父进程显示字符"a",子进程分别显示字符"b"和"c"。试观察记录屏幕上的显示结果,并分析原因。

<程序>

include

main()

{

int p1,p2;

while((p1=fork())==-1); //创建子进程p1

if(p1==0) //子进程创建成功

putchar('b');

else {

while((p2=fork())==-1); //创建另一个子进程

if(p2==0) //子进程创建成功

putchar('c');

else putchar('a'); //父进程执行

}

}

<运行结果>

bca(有时会出现bac)

分析:从进程并发执行来看,输出bac,acb等情况都有可能。原因:fork()创建进程所需的时间要多于输出一个字符的时间,因此在主进程创建进程2的同时,进程1就输出了"b",而进程2和主程序的输出次序是有随机性的,所以会出现上述结果。

<示例2>

修改已编写的程序,将每个进程的输出由单个字符改为一句话,再观察程序执行时屏幕上出现的现象,并分析其原因。如果在程序中使用系统调用lockf()来给每个进程加锁,可以实现进程之间的互斥,观察并分析出现的现象。

<程序1>

#include

main()

{

int p1,p2,i;

while((p1=fork())==-1);

if(p1==0) for(i=0; i<500;i++) printf("child %d\n",i);

else {

while((p2=fork())==-1);

if(p2==0)

for(i=0;i<500;i++)

printf("son %d\n",i);

else

for(i=0;i<500;i++)

printf("daughter %d\n",i);

}

}

<运行结果>

child.…

so n…

daughter...

daughter...

或child

...son

...child

...son

…daughter等

分析:由于函数printf()输出的字符串之间不会被中断,因此,字符串内部的字符顺序输出时不变。但是,由于进程并发执行时的调度顺序和父子进程的抢占处理机问题,输出字符串的

顺序和先后随着执行的不同而发生变化。这与打印单字符的结果相同。

<程序2>

#include

main()

{

int p1,p2,i;

while((p1=fork())==-1);

if(p1==0){

lockf(1,1,0) ;

for(i=0; i<500; i++) printf("Child %d\n",i);

lockf(1,0,0);

} else {

while((p2=fork())==-1);

if(p2==0){

lockf(1,1,0);

for(i=0;i<500;i++) printf("son %d\n",i);

lockf(1,0,0);

} else {

lockf(1,1,0);

for(i=0;i<500;i++) printf("daugter %d\n",i);

lockf(1,0,0);

}

}

}

<运行结果>

大致与未上锁的输出结果相同,也是随着执行时间不同,输出结果的顺序有所不同。

分析:因为上述程序执行时,不同进程之间不存在共享临界资源(其中打印机的互斥性已由操作系统保证>问题,所以,加锁与不加锁效果相同。

<示例3>

<任务1>

编制一段程序,使用系统调用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上来的中断信号(即按Del或CTRL+C键),当捕捉到中断信号后,父进程用系统调用kill()向两个子进程发出信号,子进程捕捉到信号后,分别输出下列信息后终止:

child process 1 is killed by parent!

child process 2 is killed by parent!

父进程等待两个子进程终止后,输出以下信息后终止

parent process is killed!

<程序>

#include

#include

#include

void waiting(),stop();

int wait_mark;

main()

{

int p1,p2;

while((p1=fork())==-1); //创建进程p1

if(p1>0){

while((p2=fork())==-1);

if(p2>0){

wait_mark=1;

signal(SIGINT,stop); //接收,Dei'信号,并转Stop保/

waiting();

kill(p1,16); //向p1发中断信号16

kill(p2,17); //向p2发中断信号17

wait(0); //同步

wait(0);

printf("parent process is killed!\n");

exit(0);

} else {

wait_mark=1;

signal(17,stop);

waiting();

lockf(stdout,1,0);

printf("child process 2 is killed by parent!\n");

lockf(stdout,0,0);

exit(0);

}

} else {

wait_mark=1;

signal(16,stop);

waiting();

lockf(stdout,1,0);

printf("child process 1 is killed by parent!\n");

lockf(stdout,0,0);

exit(0);

}

}

void waiting()

{

while(wait_mark!=0);

}

void stop()

{

wait_mark=0;

}

<运行结果>

child process 1 is killed by parent!

child process 2 is killed by parent!

Parent process is killed!

分析

<1>上述程序中,实用函数signal()都放在一段程序的前面部位,而不是在其他接收信号处。这是因为signal()的执行只是为进程指定信号量16或17的作用,以及分配相应的与stop()过程链接的指针。从而,signal()函数必须在程序前面部分执行。

<2>该程序段前面部分用了两个wait(0),为什么?请读者思考。

<3>该程序段中每个进程退出时都用了语句exit(0),为什么?请读者思考。

<任务2>

在上面任务1中,增加语句signal(SIGINT,SIG_IGN)和语句signal(SIGQUIT,SIGIGN),观察执行结果,并分析原因。这里,signal(SIGINT,SIGIGN)和signal(SIGQUIT,SIGIGN)分别为忽略Del,或CTRL+C键信号以及忽略中断信号。

<程序>

#include

#include

#include

int pid1,pid2;

int EndFlag=0;

pid1=0;

pid2=0;

void IntDelete()

{

kill(pid1,16);

kill(pid2,17);

EndFlag=1;

}

void Int1()

{

printf("child process 1 is killed by parent!\n");

exit(0);

}

void Int2()

{

printf("child process 2 is killed by parent\n");

exit(0);

}

main()

{

int exitpid;

signal(SIGINT,SIG_IGN);

signal(SIGQUIT,SIG_IGN);

while((pid1=fork())==-1);

if(pid1==0){

signal(SIGUSR1,Int1);

signal(SIGINT,SIG_IGN);

pause();

exit(0);

} else {

while((pid2=fork())==-1);

if(pid2==0) {

signal(SIGUSR1,Int1);

signal(SIGINT,SIG_IGN);

pause();

exit(0);

} else {

signal(SIGINT,IntDelete);

waitpid(-1,&exitpid,0);

printf("parent process is killed\n");

exit(0);

}

}

}

<运行结果>

请读者将上述程序输入计算机后,执行并观察。

<分析>由于忽略了中断与退出信号,程序会一直保持阻塞状态而无法退出。

3、管道通信

<任务1>

编制一段程序,实现进程的管道通信。使用系统调用pipe()建立一条管道线。两个子进程p1和p2分别向管道各写一句话:

child 1 is sending message!

child 2 is sending message!

而父进程则从管道中读出来自于两个子进程的信息,显示在屏幕上。

<程序>

#include

#include

#include

int pid1,pid2;

main()

{

int fd[2];

char OutPipe[100],InPipe[100];

pipe(fd);

while((pid1=fork())==-1);

if(pid1==0){

lockf(fd[1],1,0);

sprintf(OutPipe,"child1 process is sending message!");

write(fd[1], OutPipe,50);

sleep(5);

lockf(fd[1],0,0);

exit(0);

} else {

while((pid2=fork())==-1);

if(pid2==0){

lockf(fd[1],1,0);

sprintf(OutPipe,"child 1 process is sending message!");

write(fd[1],OutPipe,50);

sleep(5);

lockf(fd[1],0,0);

exit(0);

} else {

wait(0);

read(fd[0],InPipe,50);

printf("%s\n",InPipe);

wait(0);

read(fd[0],InPipe,50);

exit(0);

}

}

}

<运行结果>

child 1is sending message

child 2is sending message

<分析>

请读者自行完成。

<任务2>

命名管道设计。

一、原理

命名管道的通信例子中包括client端和server端。它们源代码文件名称分别为fifo_clt.c和fifo_svr.c,还有一个公共常量的有关文件被打包在文件fifo_hd.h

编译方法是:

cc –o fifo_svr fifo_srv.c

cc –o fifo_clt fifo_client.c

先启动server端程序,方法为:

./fifo_svr

再换一个终端运行client端,方法是:

./fifo_clt

运行时,client只运行一次就将退出,而server端作为服务器仍将继续运行,你再次启动client 来请求服务。

二、FIFO的用法

1、创建

用mkfifo或mknod创建一个命名管道。以mkfifo为例:

#include

#include

int mkfifo(const char *fifo_name, mode_t mode); //成功返回0,否则为-1

2、使用

管道一经创建,就可向普通文件一样使用。可通过系统调用open,close,read,write,unlink 等进行操作。

管道打开过程中,变量O_NONBLOCK将影响打开后对文件的操作。默认情况下该变量不设置,也就是以阻塞方式打开。这样可以保证原子性操作。(因此可以不考虑该参数。)在操作过程中,如果对一个管道进行写操作write,若对方没有以读方式打开将产生SIGPIPE。你可以捕获此信号进行处理。默认情况下是出现写错误。当最后一个写入者关闭了管道,将产生一个文件结束标志EOF。

3、client、server

可以以client/server方式使用FIFO。如果一个服务器有多个客户时,每个客户可通过一个well_known FIFO服务器连接。连接后可以通过well_known FIFO向服务器发送请求,所发信息的长度必须≤PIPE_BUF (4096)。

如果客户服务器模式是并发型的话,则客户机不能再通过well_known FIFO回读信息。此时可采用在已连接的客户与服务器之间建立一个私有通讯管道的办法来进行通信。该私有管道被服务器创建后可以以I/O方式打开,用于客户机和服务器之间进行通讯,以完成指定性工作。

并发型客户机与服务器之间的通讯模式如图所示。

头文件

#define my_fifo "my_fifo"

#define file_name "server."

客户端程序

#include

#include

#include

#include "fifo_hd.h"

main(int argc,char **argv)

{

int fd1,fd2,pid,pid1;

char my_buf[100];

char my_fil[100];

char my1buf[100];

if((fd1=open(my_fifo,1))==-1){

fprintf(stderr,"Open well_known FIFO for readind Error!\n");

exit(-1);

}

fprintf(stderr,"Open %s OK!\n",my_fifo);

pid=getpid();

sprintf(my_buf,"%5.5d%6.6d%7.7d",pid,pid*10,pid*20);

if(write(fd1,my_buf,20)!=0){

strcpy(my_fil,file_name);

strncat(my_fil,my_buf,5);

操作系统课程设计

课程设计报告 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 -

操作系统课程设计文件系统管理)

操作系统课程设计Array文件系统管理 学院计算机学院 专业计算机科学与技术 班级 姓名 学号 2013年1月8日 广东工业大学计算机学院制 文件系统管理 一、实验目的 模拟文件系统的实现的基本功能,了解文件系统的基本结构和文件系统的管理方法看,加深了解文件系统的内部功能的实现。通过高级语言编写和实现一个简单的文件系统,模拟文件管理的工作过程,从而对各种文件操作系统命令的实质内容和执行过程有比较深入的了解。 二、实验内容和要求 编程模拟一个简单的文件系统,实现文件系统的管理和控制功能。在用户程序中通过使用文件系统提供的create,open,read,write,close,delete等文件命令,对文件进行操作。 以下报告主要包括: 1.可行性分析 2.需求分析 3.概要设计

4.详细设计 5.测试 6.总结 三、可行性分析 1、技术可行性 对于图形编程还不了解,但是经过本学期的三次实验的练习,可以设计好命令操作界面。利用大二期间学习的数据结构可以模拟出此课程设计的要求。 2、经济可行性 课程设计作为本课程的练习及进一步加深理解。与经济无关,可以不考虑。(零花费,零收益) 3.法律可行性 自己编写的程序,仅为练习,不作其他用途,与外界没什么联系,可行。 四、需求分析 编写程序实现文件系统,主要有以下几点要求: 1、实现无穷级目录管理及文件管理基本操作 2、实现共享“别名” 3、加快了文件检索 五、概要设计 为了克服单级目录所存在的缺点,可以为每一位用户建立一个单独的用户文件目录UFD(User File Directory)。这些文件目录可以具有相似的结构,它由用户所有文件的文件控制块组成。此外,在系统中再建立一个主文件目录MFD (Master File Directory);在主文件目录中,每个用户目录文件都占有一个目

操作系统课程设计报告书

题目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

操作系统课程设计-模拟文件系统

目录 第1章需求分析 (1) 第2章概要设计 (1) 2.1 系统的主要功能 (1) 2.2系统模块功能结构 (1) 2.3运行环境要求 (2) 2.4数据结构设计 (2) 第3章详细设计 (3) 3.1模块设计 (3) 3.2算法流程图 (3) 第4章系统源代码 (4) 第5章系统测试及调试 (4) 5.1运行结果及分析 (4) 5.2系统测试结论 (5) 第6章总结与体会 (6) 第7章参考文献 (6) 附录 (7)

第1章需求分析 通过模拟文件系统的实现,深入理解操作系统中文件系统的理论知识, 加深对教材中的重要算法的理解。同时通过编程实现这些算法,更好地掌握操作系统的原理及实现方法,提高综合运用各专业课知识的能力;掌握操作系统结构、实现机理和各种典型算法,系统地了解操作系统的设计和实现思路,并了解操作系统的发展动向和趋势。 模拟二级文件管理系统的课程设计目的是通过研究Linux的文件系统结构,模拟设计一个简单的二级文件系统,第一级为主目录文件,第二级为用户文件。 第2章概要设计 2.1 系统的主要功能 1) 系统运行时根据输入的用户数目创建主目录 2) 能够实现下列命令: Login 用户登录 Create 建立文件 Read 读取文件 Write写入文件 Delete 删除文件 Mkdir 建立目录

Cd 切换目录 Logout 退出登录 2.2系统模块功能结构 2.3运行环境要求 操作系统windows xp ,开发工具vc++6.0 2.4数据结构设计 用户结构:账号与密码结构 typedef struct users { char name[8]; char pwd[10]; }users;

操作系统课程设计报告

操作系统课程设计报告

东莞理工学院 操作系统课程设计报告 学院:计算机学院 专业班级: 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<

操作系统课程设计完整版内含代码

操作系统课程设计LRU页面调度算法 学号: 姓名: 学院: 专业: 班级: 指导老师: 日期:

目录 一、实验题目 (1) 二、课程设计的目的 (1) 三、设计内容 (1) 四、设计要求 (1) 五、设计思想 (1) 六、主要数据结构及其说明 (2) 七、硬件支持 (3) 八、源程序文件 (3) 九、程序运行结果 (7) 十、实验体会 (8)

一实验题目 LRU页面调度算法 二课程设计的目的 操作系统课程设计是计算机专业重要的教学环节,它为学生提供了一个既动手又动脑,将课本上的理论知识和实际有机的结合一起,独立分析和解决实际问题的机会。 1.进一步巩固和复习操作系统的基础知识。 2. 培养学生结构化程序、模块化程序设计的方法和能力。 3.提高学生调试程序的技巧和软件设计的能力。 4.提高学生分析问题、解决问题以及综合利用C语言进行程序设计的能力。 三设计内容 程序应模拟实现LRU算法思想,对n个页面实现模拟调度。 四设计要求 1.不同的功能使用不同的函数实现(模块化),对每个函数的功能和调用接口要注释清楚。对程序其它部分也进行必要的注释。 2.对系统进行功能模块分析、画出总流程图和各模块流程图。 3.用户界面要求使用方便、简洁明了、美观大方、格式统一。所有功能可以反复使用,最好使用菜单。 4.通过命令行相应选项能直接进入某个相应菜单选项的功能模块。 5.所有程序需调试通过。 五设计思想 最近最久未使用(LRU)页调度算法是选择最近最久未使用的页面予以淘汰。 算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间,当所要访问的页面在内存块中时,就不淘汰页面,否则,淘汰页面中时间最长的,即淘汰最近最久未使用的页面。

操作系统课程设计报告

上海电力学院 计算机操作系统原理 课程设计报告 题目名称:编写程序模拟虚拟存储器管理 姓名:杜志豪.学号: 班级: 2012053班 . 同组姓名:孙嘉轶 课程设计时间:—— 评语: 成绩: 目录 一、设计内容及要求 (4) 1. 1 设计题目 (4) 1.2 使用算法分析: (4)

1. FIFO算法(先进先出淘汰算法) (4) 1. LRU算法(最久未使用淘汰算法) (5) 1. OPT算法(最佳淘汰算法) (5) 分工情况 (5) 二、详细设计 (6) 原理概述 (6) 主要数据结构(主要代码) (6) 算法流程图 (9) 主流程图 (9) Optimal算法流程图 (10) FIFO算法流程图 (10) LRU算法流程图 (11) .1源程序文件名 (11) . 2执行文件名 (11) 三、实验结果与分析 (11) Optimal页面置换算法结果与分析 (11) FIFO页面置换算法结果与分析 (16) LRU页面置换算法结果与分析 (20) 四、设计创新点 (24) 五、设计与总结 (27)

六、代码附录 (27) 课程设计题目 一、设计内容及要求 编写程序模拟虚拟存储器管理。假设以M页的进程分配了N

块内存(N

【精选】操作系统课程设计(文件系统管理)文件

评定等级 操作系统课程设计 文件系统管理 学院计算机学院 专业计算机科学与技术 班级 姓名 学号 2013年1月8日 广东工业大学计算机学院制

文件系统管理 一、实验目的 模拟文件系统的实现的基本功能,了解文件系统的基本结构和文件系统的管理方法看, 加深了解文件系统的内部功能的实现。通过高级语言编写和实现一个简单的文件系统,模拟文件管理的工作过程,从而对各种文件操作系统命令的实质内容和执行过程有比较深入的了 解。 二、实验内容和要求 编程模拟一个简单的文件系统,实现文件系统的管理和控制功能。在用户程序中通过使用文件系统提供的create,open,read,write,close,delete 等文件命令,对文件进行操作。以下报告主要包括: 1.可行性分析 2.需求分析 3.概要设计 4.详细设计 5.测试 6.总结 三、可行性分析 1、技术可行性 对于图形编程还不了解,但是经过本学期的三次实验的练习,可以设计好命令操作界面。利用大二期间学习的数据结构可以模拟出此课程设计的要求。 2、经济可行性 课程设计作为本课程的练习及进一步加深理解。与经济无关,可以不考虑。(零花费,零收益) 3.法律可行性 自己编写的程序,仅为练习,不作其他用途,与外界没什么联系,可行。 四、需求分析 编写程序实现文件系统,主要有以下几点要求: 1、实现无穷级目录管理及文件管理基本操作 2、实现共享“别名” 3、加快了文件检索 五、概要设计 为了克服单级目录所存在的缺点,可以为每一位用户建立一个单独的用户文件目录 UFD (User File Directory )。这些文件目录可以具有相似的结构,它由用户所有文件的文件 控制块组成。此外,在系统中再建立一个主文件目录MFD (Master File Directory );在主文件目录中,每个用户目录文件都占有一个目录项,其目录项中包括用户名和指向该用户目 录的指针。

操作系统课程设计报告

课程设计说明书 设计题目:操作系统课程设计 班级:信息学管理与信息系统2011级 学号: 2 姓名:克乾

山东科技大学2013年12 月11 日

课程设计任务书 学院信息科学与工程专业信息学管理与信息系统班级2011-2 克乾 一、课程设计题目:操作系统课程设计 二、课程设计主要参考资料 (1)Abraham Silberschatz & Peter Baer Galvin & Greg Gagne. Operating System Concepts(第七版影印版). 高等教育. 2007.3. (2)c++面向对象程序设计电子工业 (3)计算机操作系统(第三版)电子科技大学 三、课程设计应解决的主要问题: (1)CPU调度算法的模拟实现 (2)死锁相关算法的实现 (3)磁盘调度算法的实现 四、课程设计相关附件(如:图纸、软件等): (1)程序源代码 (2) 五、任务发出日期:2013-10-1 课程设计完成日期:2014-1-1

指导教师签字:

指导教师对课程设计的评语成绩: 指导教师签字: 年月日

设计1 CPU调度算法的模拟实现一、设计目的 利用C++编写CPU调度算法,实现先来先服务调度算法FCFS、优先级调度算法PS、短作业优先调度算法SJF、时间片轮转调度算法RR的运行过程和实现的结果,针对模拟进程,利用编写的CPU调度算法对需要运行的进程进行调度。进行算法评价,计算平均周转时间和平均等待时间。 二、设计要求 针对模拟进程,利用CPU调度算法进行调度,最后要进行算法评价,计算平均周转时间和平均等待时间,并且输出调度结果和输出算法评价指标。 调度所需的进程参数由输入产生(手工输入或者随机数产生)。 三、设计说明 时间片轮转算法需要输入相应的时间片,所以独立编写一个程序,系统主体结构如下:

操作系统课程设计报告

; 一、概述 课程设计目的、意义: 课程设计目的使学生熟悉文件管理系统的设计方法;加深对所学各种文件操作的了解及其操作方法的特点。通过模拟文件系统的实现,深入理解操作系统中文件系统的理论知识, 加深对教材中的重要算法的理解。同时通过编程实现这些算法,更好地掌握操作系统的原理及实现方法,提高综合运用各专业课知识的能力。 主要任务: 模拟文件系统设计是设计和实现一个简单的文件系统。内容包括: 1.建立文件存储介质的管理机制 2.建立目录(采用一级目录结构) 3.文件系统功能(显示目录、创建、删除、打开、关闭、读、写) ~ 4.文件操作接口(显示目录、创建、删除、打开、关闭、读、写) 二、系统设计 课程设计的系统设计: 本系统模拟一个文件管理系统,要完成对文件的基本操作,文件的基本操作有文件、文件夹的打开、新建、删除和读取写入文件,创建更改目录,列出目录内容等信息。系统建立了文件目录树,存储文件系统中的所有文

件。对于用户名下的文件,用文件目录树的分枝来存贮。采用命令行操作界面很直观,也方便用户进行操作,用户只要按照操作界面所显示的命令来操作就行了。 整体设计框架: 系统初始化界面是由创建用户存储空间,管理文件,退出系统三个模块组成。用户创建由创建用户存储空间,进入目录,删除用户存储空间,显示所有用户存储空间,等模块组成。然后各个模块再由一些小模块组成。其中创建文件,打开关闭文件,读写文件等文件操作模块包括在进入目录模块里面。 三、系统实现 课程设计主要内容的实现程序代码: 《 #include <> #include <> #include <> typedef struct file{ char name[10]; struct file *next; }File; typedef struct content{ ! char name[10]; File *file;

操作系统课程设计报告

东莞理工学院 操作系统课程设计报告学院:计算机学院 专业班级: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<

操作系统课程设计

湖南科技大学计算机科学与工程学院 操作系统课程设计报告 ******** *** 目录 实验一 Windows 进程管理 实验二 Linux 进程管理 实验三 互斥与同步 实验四 银行家算法的模拟与实现 实验五 内存管理 指导老师: *** 完成时间: **** ** **

实验六磁盘调度 实验七进程间通信 实验一 Windows进程管理 一、实验目的 1 )学会使用VC编写基本的Win3 2 Consol Application (控制台应用程序)。 2)2)通过创建进程、观察正在运行的进程和终止进程的程序设计和调试操作,进一步熟 悉操作系统的进程概念,理解Windows进程的"一生”。 3)3)通过阅读和分析实验程序,学习创建进程、观察进程、终止进程以及父子进程同步 的基本程序设计方法。 二、实验内容和步骤 (1)编写基本的 Win32 Consol Application 步骤1:登录进入 Windows系统,启动VC++ 6.0。 步骤2:在“ FILE”菜单中单击“ NEW”子菜单,在“ projects ”选项卡中选择 “Win32 ConsolApplication ”,然后在“ Project name 处输入工程名,在“Location ”处输入工程目录。创建一个新的控制台应用程序工程。 步骤3:在“ FILE”菜单中单击“ NEW”子菜单,在“ Files ”选项卡中选择“ C++ Source File ” ,然后在“ File ”处输入C/C++源程序的文件名。 步骤4:将清单1-1所示的程序清单复制到新创建的C/C++源程序中。编译成可执行文件。 步骤5 :在“开始”菜单中单击“程序” -“附件”-“命令提示符”命令,进入Windows“命令提示符”窗口,然后进入工程目录中的 debug子目录,执行编译好的可执行程序,列出运行结果(如果运行不成功,则可能的原因是什么?) 如果运行不成功可能是路径有问题或者没有通过编译。

操作系统课程设计二级文件系统

操作系统课程设计报告 专业:计算机信息处理 学号:09103408 姓名:纪旻材 提交日期:2011-12-28

【设计目的】 1. 课程设计目的是通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能和内部实现。 2. 结合数据结构、程序设计、计算机原理等课程的知识,设计一个二级文件系统,进一步理解操作系统。 3. 通过对实际问题的分析、设计、编程实现,提高学生实际应用、编程的能力 【设计内容】 1、delete 删除文件 2、open 打开文件 3、close 关闭文件 4、write 写文件 【实验环境】 Windows7系统

Visual studio 2010 【相关知识综述】 本文件系统采用两级目录,其中第一级对应于用户账号,第二级对应于用户帐号下的文件。另外,为了简便文件系统未考虑文件共享,文件系统安全以及管道文件与设备文件等特殊内容。 首先应确定文件系统的数据结构:主目录、子目录及活动文件等。主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。用户创建的文件,可以编号存储于磁盘上。如:file0,file1,file2…并以编号作为物理地址,在目录中进行登记。 【设计思路】 1 主要数据结构 #define MAXNAME 25 /*the largest length of mfdname,ufdname,filename*/ #define MAXCHILD 50 /*the largest child每个用户名下最多有50个文件*/ #define MAX (MAXCHILD*MAXCHILD) /*the size of fpaddrno*/ typedef struct/*the structure of OSFILE定义主文件*/

操作系统课程设计报告

东莞理工学院 操作系统课程设计报告 学院:计算机学院 专业班级: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<

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

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

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

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

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

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

操作系统课程设计(文件系统)

操作系统课程设计 班级: 姓名: 学号: 使用语言:C++ 指导老师: 学院:

一、系统要求 1、实验目的 通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现。 2、实验内容 为linux系统设计一个简单的二级文件系统。要求做到以下几点: (1)可以实现下列几条命令(至少4条); login 用户登陆 dir 列文件目录 create 创建文件 delete 删除文件 open 打开文件 close 关闭文件 read 读文件 write 写文件 (2)列目录时要列出文件名、物理地址、保护码和文件长度; (3)源文件可以进行读写保护。 二、系统分析 1、设计思想 本文件为二级文件系统,即要实现对文件的增删改查,同时又具备登陆系统、注册用户的功能,各个用户之间的文件系统互不干扰。 本文件系统采用两级目录,其中第一级对应于用户账号,第二级对应于用户帐号下的文件。另外,为了简便文件系统未考虑文件共享,文件系统安全以及管道文件与设备文件等特殊内容。 系统采用结构体来存储用户、文件目录、文件数据内容: 0 48*5 48*5+44*50 48*5+44*50+264*200 每个分区都是由结构体组成,每个个去的结构体的个数由格式化系统是决定。整个系统的编码构成主要分为:

Allstruct.h 定义了每个分区的结构体; Mysys.h 声明了对系统操作的各种方法; Myuserfile.h 声明了对文件操作的各种方法; Mymain.cpp 整个系统的主函数,操作入口; Mysys.cpp 包含了mysys.h,实现了操作系统的各种方法;Myuserfile.cpp 包含了myuserfile.h,实现了操作文件的各种方法; 2、主要数据结构 Allstruct.h文件的内容: struct s_user //用户区结构体 { long isuse; //是否使用 char name[20]; //用户名 char psd[20]; //密码 long address; //目录地址 }; struct s_list //目录结构体 { long isuse; //是否使用 char name[20]; //文件名字 long myaddress; //本条目录地址 long pointaddress; //指向的文件的地址 long isfile; //是否锁定 long pointsize; //目标文件的大小 long nextaddress; //下条目录的地址 }; struct s_file //文件结构体 { long isuse; //是否使用 char content[256]; //文件内容 long next; //下个文件块地址 };

操作系统课程设计报告

操作系统课程设计实验报告 实验名称:进程控制 姓名/学号: 一、实验目的 学习、理解和掌握Linux与windows的进行控制系统调用的功能,熟悉主要的几个系统调用命令的格式和如何利用系统调用命令进行编程。通过学习,理解如何创建一个进程、改变进程执行的程序、进程和线程终止以及父子进程的同步等,从而提高对进程和线程控制系统调用的编程能力。 二、实验内容 设计并实现Unix的“time”命令。“mytime”命令通过命令行参数接受要运行的程序,创建一个独立的进程来运行该程序,并记录程序运行的时间。 三、实验环境 CPU: Inter ×2 2.10GHz RAM: 3.00GB Windows 7 旗舰版 Linux Ubuntu 10.04 编译: VS2010 四、程序设计与实现 4.1进程控制系统的调用 4.1.1 windows进程控制调用程序中使用的数据结构及主要符号说明 SYSTEMTIME starttime,endtime; //进程开始时间和结束时间 PROCESS_INFORMATION pi //该结构返回有关新进程及 //其主线程的信息 STARTUPINFO si //该结构用于指定新进程的主窗口特性4.1.2 linux进程控制调用程序中使用的数据结构及主要符号说明 struct timeval starttime,endtime //进程开始时间和结束时间 pid_t pid //进程标志符

4.2 程序流程图 图1 windows进程控制调用图2 linux进程控制调用程序运行流程图程序运行流程图 五、实验结果和分析 5.1 windows实验结果和分析

操作系统课程设计

计算机科学技术学院 操作系统原理课程设计报告 题目:进程管理系统 专业: 班级: 姓名: 学号: 指导老师: 年月日

《操作系统原理》课程设计任务书 一、课程设计题目(任选一个题目) 1.模拟进程管理 2.模拟处理机调度 3.模拟存储器管理 4.模拟文件系统 5.模拟磁盘调度 二、设计目的和要求 1.设计目的 《操作系统原理》课程设计是网络工程专业实践性环节之一,是学习完《操作系统原理》课程后进行的一次较全面的综合练习。其目的在于加深对操作系统的理论、方法和基础知识的理解,掌握操作系统结构、实现机理和各种典型算法,系统地了解操作系统的设计和实现思路,培养学生的系统设计能力,并了解操作系统的发展动向和趋势。 2.基本要求: (1)选择课程设计题目中的一个课题,独立完成。 (2)良好的沟通和合作能力 (3)充分运用前序课所学的软件工程、程序设计、数据结构等相关知识 (4)充分运用调试和排错技术 (5)简单测试驱动模块和桩模块的编写 (6)查阅相关资料,自学具体课题中涉及到的新知识。 (7)课题完成后必须按要求提交课程设计报告,格式规范,内容详实。 三、设计内容及步骤 1.根据设计题目的要求,充分地分析和理解问题,明确问题要求做什么。

2.根据实现的功能,划分出合理的模块,明确模块间的关系。 3.编程实现所设计的模块。 4.程序调试与测试。采用自底向上,分模块进行,即先调试低层函数。能够熟练掌握调试工具的各种功能,设计测试数据确定疑点,通过修改程序来证实它或绕过它。调试正确后,认真整理源程序及其注释,形成格式和风格良好的源程序清单和结果; 5.结果分析。程序运行结果包括正确的输入及其输出结果和含有错误的输入及其输出结果。 6.编写课程设计报告; 设计报告要求:A4纸,详细设计部分主要叙述本人的工作内容 设计报告的格式: (1)封面(题目、指导教师、专业、班级、姓名、学号) (2)设计任务书 (3)目录 (4)需求分析 (5)概要设计 (6)详细设计(含主要代码) (7)调试分析、测试结果 (8)用户使用说明 (9)附录或参考资料 四、进度安排 设计在学期的第15、16周进行,时间安排如下:

操作系统课程设计模拟文件系统

操作系统课程设计模拟文 件系统 Newly compiled on November 23, 2020

目录第1章需求分析 (1) 第2章概要设计 (1) 系统的主要功能 (1) 系统模块功能结构 (1) 运行环境要求 (2) 数据结构设计 (2) 第3章详细设计 (3) 模块设计 (3) 算法流程图 (3) 第4章系统源代码 (4) 第5章系统测试及调试 (4) 运行结果及分析 (4) 系统测试结论 (5) 第6章总结与体会 (6) 第7章参考文献 (6) 附录 (7) 第1章需求分析 通过模拟文件系统的实现,深入理解操作系统中文件系统的理论知识, 加深对教材中的重要算法的理解。同时通过编程实现这些算法,更好地掌握操作系统的原理及实现方法,提高综合运用各专业课知识的能力;掌握操作系统结构、实现机理和各种典型算法,系统地了解操作系统的设计和实现思路,并了解操作系统的发展动向和趋势。

模拟二级文件管理系统的课程设计目的是通过研究Linux的文件系统结构,模拟设计一个简单的二级文件系统,第一级为主目录文件,第二级为用户文件。 第2章概要设计 系统的主要功能 1) 系统运行时根据输入的用户数目创建主目录 2) 能够实现下列命令: Login 用户登录 Create 建立文件 Read 读取文件 Write 写入文件 Delete 删除文件 Mkdir 建立目录 Cd 切换目录 Logout 退出登录 系统模块功能结构 运行环境要求 操作系统windows xp ,开发工具vc++ 数据结构设计 用户结构:账号与密码结构 typedef struct users { char name[8]; char pwd[10]; }users;

计算机操作系统课程设计

计算机操作系统课程设计 班级:计091-1 姓名: 学号: 使用语言:C++ 指导老师: 学院:

一、系统要求 1、实验目的 通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现。 2、实验内容 为linux系统设计一个简单的二级文件系统。要求做到以下几点: (1)可以实现下列几条命令(至少4条); login 用户登陆 dir 列文件目录 create 创建文件 delete 删除文件 open 打开文件 close 关闭文件 read 读文件 write 写文件 (2)列目录时要列出文件名、物理地址、保护码和文件长度; (3)源文件可以进行读写保护。

二、系统分析 1、设计思想 本文件为二级文件系统,即要实现对文件的增删改查,同时又具备登陆系统、注册用户的功能,各个用户之间的文件系统互不干扰。 本文件系统采用两级目录,其中第一级对应于用户账号,第二级对应于用户帐号下的文件。另外,为了简便文件系统未考虑文件共享,文件系统安全以及管道文件与设备文件等特殊内容。 系统采用结构体来存储用户、文件目录、文件数据内容: 0 48*5 48*5+44*50 48*5+44*50+264*200 每个分区都是由结构体组成,每个个去的结构体的个数由格式化系统是决定。

整个系统的编码构成主要分为: Allstruct.h 定义了每个分区的结构体; Mysys.h 声明了对系统操作的各种方法;Myuserfile.h 声明了对文件操作的各种方法; Mymain.cpp 整个系统的主函数,操作入口; Mysys.cpp 包含了mysys.h,实现了操作系统的各种方法;Myuserfile.cpp 包含了myuserfile.h,实现了操作文件的各种方法; 2、主要数据结构 Allstruct.h文件的内容: struct s_user //用户区结构体 { long isuse; //是否使用 char name[20]; //用户名 char psd[20]; //密码 long address; //目录地址 };

相关文档