当前位置:文档之家› 操作系统利用信号量实现银行叫号排队系统 课程设计实验报告

操作系统利用信号量实现银行叫号排队系统 课程设计实验报告

操作系统利用信号量实现银行叫号排队系统  课程设计实验报告
操作系统利用信号量实现银行叫号排队系统  课程设计实验报告

操作系统课程设计题目:进程通信与进程同步机制实践

所在学院:计算机学院

所在班级:软件1201

学生姓名:

学生学号:

指导教师:薛安荣

2015年1 月

一、题目

某银行提供5个服务窗口(3个对私服务窗口,1个对公服务窗口,1个理财服务窗口)和10个供顾客等待的座位。顾客到达银行时,若有空座位,则到取号机上领取一个号,等待叫号;若没有空座位,则在门外等待或离开。取号机每次仅允许一位顾客使用,有对公、对私和理财三类号,每位顾客只能选取其中一个。当营业员空闲时,通过叫号选取一位顾客,并为其服务。请用P、V操作写出进程的同步算法。

二、目的

1、掌握基本的同步与互斥算法。

2、学习使用Linux 中基本的同步对象,掌握相关API 的使用方法。

3、了解Linux 中多任务的并发执行机制,实现进程的同步与互斥。

三、实验环境

Linux CentOS

编译器GCC

编程语言C语言

四、要求

1、当有顾客取号的时候,不允许其他顾客取号。

2、当服务窗口满的情况下,其他人必须等待。

3、当没有顾客的情况下,服务窗口必须等待。

4、打印:A、初始状态

B、中间变化的状态信息

C、以及最终状态信息。

五、原理及算法

本程序中设计6个信号量,其中signal_A、signal_B和signal_C 分别是对私、对公、理财窗口的同步信号量。若信号量值的等于0,说明当前没有空闲空口,顾客需要等待。另设置一个signal_seat同步信号量,记录当前的座位情况,若该信号量等于0,说明当前没有空座位,顾客需要等待。另有一个signal_customer同步信号量用于记录当前已经取过票的总人数,用于生成票号信息。还有一个mutex 互斥信号量,用于实现各进程在对信号量进行操作时的互斥。

顾客进入银行之后,先看通过一个依据系统时间的随机数来确定自己是需要对私、对公还是理财服务(在本程序中分别对应于A类顾客,B类顾客和C类顾客),这三个类型的顾客的比例为3:1:1.然后顾客根据自己需要的服务类型,查看提供相应类型服务的窗口是否空闲,若窗口有空闲,则系统直接按照signal_customer记录的信息,生成票面信息;若窗口没有空闲,则再去查看signal_seat信号量看看是否有空座位,若有空座位,则根据signal_customer记录的信息,生成票面信息;若没有空座位,则通过一个以系统时间为种子的随机数生成器生成一个随机数,帮助顾客确定是要继续等待还是离开,这两种情况的比例为1:1.若顾客选择离开,则相应的进程退出。

当顾客取到票后,便开始查看对应类型的窗口是否有空闲,如果有空闲,则上前办理业务。顾客办理业务需要的时长通过以系统时间为种子的随机数生成器来确定,时长均在10秒到60秒之间。

在程序执行的过程中,顾客的状态每有变换,都会有相应的输出提示信息,并在输出的行尾输出发生该动作时当前的系统时间,以便于我们分析各个顾客进程的执行情况。

六、说明

本实验在Linux环境下完成,该程序是通过进程实现的。包含一个service可执行文件,一个customer可执行文件和一个deletesem 可执行文件。其中service可执行文件用于在内存中申请一个共享内

存空间,并将这个内存空间与自身进程绑定;customer可执行文件每执行一次,就增加一个进程,即代表有一位顾客来到。通过多次执行customer可执行文件来模拟多位顾客;deletesem可执行文件用于在service进程和customer进城都执行完毕后,删除内存空间中的信号集。

实验中利用GCC编译器,通过编写Makefile文件来快速编译源代码生成以上三个可执行文件。

七、程序中各主要函数说明

1、int createshm( char * pathname, int proj_id, size_t size)

创建共享内存的函数,操作成功则返回共享内存标识符,失败返回-1.

2、int createsem (const char * pathname, int proj_id, int members, int init_val[])

在共享内训中创建信号量的函数,操作成功则返回信号集标识符,失败返回-1.

3、int opensem(const char * pathname, int proj_id)

打开信号集函数,操作成功则返回信号集标识符,失败返回-1. 4、int sem_p(int semid, int index)

P操作函数,操作成功则返回0,失败返回-1.

5、int sem_v(int semid, int index)

V操作函数,操作成功则返回0,失败返回-1.

6、int wait_sem(int semid, int index)

等待信号量为1函数,操作成功返回1.

7、int delete_sem (int semid)

删除信号集函数,操作成功返回0.

8、int get_sem_val (int semid ,int index)

获取指定信号集中指定下标的信号量的值,操作成功返回该信号量的值。

9、int my_random()

自定义随机数生成器,以系统时间为种子,每次执行前延时1秒,以便于生成不同的随机数。

10、void print_time()

打印当前系统时间。

11、int get_ticket(int semid, char identifyLabel, int * ticket, int * flag)

顾客取票函数,取票成功,返回1,失败返回-1,,由于没有空座,顾客选择离开则返回0。

12、void service(int semid, char identifyLabel, int * ticket, int *flag)

顾客办理业务函数。

八、源程序清单

sharemem.h文件

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define SHM_SIZE 1024

#define INDEX_MUTEX 0

#define INDEX_SIGNAL_SEAT 1

#define INDEX_SIGNAL_CUSTOMER 2

#define INDEX_SIGNAL_A 3

#define INDEX_SIGNAL_B 4

#define INDEX_SIGNAL_C 5

/*定义信号量*/

/*同步信号量一共有4个*/

int signal_A=3, signal_B=1, signal_C=1, signal_seat=3, signal_customer=0; /*互斥信号量mutex控制进程对每个同步信号量的操作*/

int mutex=1;

int signal_count=6; //信号量计数器,记录一共有多少信号量

union semun

{

int val;

struct semid_ds * buf;

unsigned short * array;

};

/*创建共享内存函数*/

int createshm( char * pathname, int proj_id, size_t size)

{

key_t shmkey;

int sid;

/*获取键值*/

if ((shmkey=ftok(pathname, proj_id))==-1)

{

perror ("ftok error!\n");

exit(1);

return -1;

}

if ((sid=shmget(shmkey, size, IPC_CREAT | 0666))==-1)

{

perror ("shmget call failed.\n");

exit(1);

return -1;

}

return (sid);

}

/*定义创建信号量的函数*/

int createsem (const char * pathname, int proj_id, int members, int init_val[])

{

key_t msgkey;

int index,sid;

union semun semopts;

if ((msgkey=ftok(pathname, proj_id))==-1)

{

perror ("ftok error!\n");

exit(1);

return -1;

}

if((sid=semget(msgkey, members, IPC_CREAT | 0666))==-1)

{

perror ("semget call failed.\n");

exit(1);

return -1;

}

/*对信号量进行初始化操作*/

for(index=0;index

{

semopts.val=init_val[index]; //根据init_val数组中的值对各个信号量进行初始化

semctl (sid,index,SETVAL,semopts);

}

return (sid);

}

/*打开信号量函数*/

int opensem(const char * pathname, int proj_id)

{

key_t msgkey;

int sid;

if ((msgkey=ftok(pathname,proj_id))==-1)

{

perror ("ftok error!\n");

exit(1);

return -1;

}

if((sid=semget(msgkey, 0 ,IPC_CREAT | 0666))==-1)

{

perror ("semget call failed.\n");

exit(1);

return -1;

}

return (sid);

}

/*P操作函数*/

int sem_p(int semid, int index)

{

struct sembuf buf={0,-1,IPC_NOWAIT};

if(index<0)

{

perror("index of array cannot equals a minus value!");

exit(1);

return (-1);

}

buf.sem_num=index;

if(semop (semid , & buf,1)==-1)

{

perror ("a wrong operation to semaphore occurred!");

exit(1);

return -1;

}

return 0;

}

/*V操作函数*/

int sem_v(int semid, int index)

{

struct sembuf buf={0,+1,IPC_NOWAIT};

if(index<0)

{

perror("index of array cannot equals a minus value!");

exit(1);

return (-1);

}

buf.sem_num=index;

if(semop (semid , & buf,1)==-1)

{

perror ("a wrong operation to semaphore occurred!");

exit(1);

return (-1);

}

return 0;

}

/*等待信号量为1函数*/

int wait_sem(int semid, int index)

{

while(semctl(semid, index, GETVAL, 0)==0)

{

usleep(10000);

}

return 1;

}

/*删除信号集函数*/

int delete_sem (int semid)

{

return (semctl(semid, 0 , IPC_RMID));

}

/*获取指信号量的值*/

int get_sem_val (int semid ,int index)

{

return semctl(semid, index, GETVAL, 0);

}

/*我的随机数生成器*/

int my_random()

{

usleep(1000000); //延时函数,延时1秒,以便于生成不同的随机数

srand((unsigned)time(NULL)); //初始化随机数生成器

return (rand()); //调用随机数生成器生成并返回随机数

}

/*获取当前系统时间并靠右输出*/

void print_time()

{

time_t now; //实例化time_t结构

struct tm *timenow; //实例化tm结构指针

time(&now); //time函数读取现在的时间(国际标准时间非北京时间),然后传值给now

timenow=localtime(&now); //localtime函数把从time取得的时间now换算成你电脑中的时间(就是你设置的地区)

printf("Time:%s\n",asctime(timenow)); //asctime函数把时间转换成字符,通过printf()函数靠右输出

}

/*顾客取票函数,取票成功,返回1,失败返回-1,,由于没有空座,顾客选择离开则返回0*/ int get_ticket(int semid, char identifyLabel, int * ticket, int * flag)

{

int wait_num=0;

switch(identifyLabel)

{

case 'A':

if(get_sem_val(semid, INDEX_SIGNAL_SEAT) == 0)

{

if( (wait_num=my_random()%10)<5)

return 0; //返回0表示顾客选择离开

printf("目前没有空座位,但该顾客选择了等待。\n\n");

}

if(get_sem_val(semid, INDEX_SIGNAL_A) > 0) //检查,如果有空窗口,则直接取票,不用判断座位

{

*flag=0; //将标志为设为0,标示没有顾客在等待,不用排队

goto goto_A; //跳转到直接取票

}

if( wait_sem(semid, INDEX_SIGNAL_SEAT) ) //如果没有空座,则等待空座

sem_p(semid, INDEX_SIGNAL_SEAT);

goto_A: if( wait_sem(semid, INDEX_MUTEX) ) //等待操作信号量释放

sem_p(semid, INDEX_MUTEX); //锁定操作信号量

*ticket=get_sem_val(semid, INDEX_SIGNAL_CUSTOMER) + 1; //分配票号(票号是根据当天的总顾客数排的)

wait_num = (signal_seat - get_sem_val(semid,INDEX_SIGNAL_SEAT) ) -1;

//获取当前等待的人数

printf("号码:A%03d,",*ticket);

if(wait_num==0 || *flag==0)

{

printf("当前没有顾客正在等待。\t"); //wait_num大于等于0或者flag 大于0,表示当前无人等待

print_time();

}

else

{

printf("有%d位顾客正在等待。\t",wait_num);

print_time();

}

printf("顾客A%03d正在等待办理业务。\t",*ticket);

print_time();

if( sem_v(semid, INDEX_SIGNAL_CUSTOMER) !=0) //记录目前办理过业务和等待办理业务的顾客总数

{

printf("对不起,V操作失败!");

exit(1);

return -1;

}

sem_v(semid, INDEX_MUTEX); //释放控制进程访问资源的信号量

break;

case 'B':

if(get_sem_val(semid, INDEX_SIGNAL_SEAT) == 0)

{

if( (wait_num=my_random()%10)<5)

return 0; //返回0表示顾客选择离开

printf("目前没有空座位,但该顾客选择了等待。\n\n");

}

if(get_sem_val(semid, INDEX_SIGNAL_B) > 0) //检查,如果有空窗口,则直接取票,不用判断座位

{

*flag=0; //将标志为设为0,标示没有顾客在等待,不用排队

goto goto_B; //跳转到直接取票

}

if( wait_sem(semid, INDEX_SIGNAL_SEAT) ) //如果没有空座,则等待空座

sem_p(semid, INDEX_SIGNAL_SEAT);

goto_B: if( wait_sem(semid, INDEX_MUTEX) ) //等待操作信号量释放

sem_p(semid, INDEX_MUTEX); //锁定操作信号量

*ticket=get_sem_val(semid, INDEX_SIGNAL_CUSTOMER) + 1; //分配票号(票号是根据当天的总顾客数排的)

wait_num = (signal_seat - get_sem_val(semid,INDEX_SIGNAL_SEAT) ) -1;

//获取当前等待的人数

printf("号码:B%03d,",*ticket);

if(wait_num==0 || *flag==0)

{

printf("当前没有顾客正在等待。\t"); //wait_num大于等于0或者flag 大于0,表示当前无人等待

print_time();

}

else

{

printf("有%d位顾客正在等待。\t",wait_num);

print_time();

}

printf("顾客B%03d正在等待办理业务。\t",*ticket);

print_time();

if( sem_v(semid, INDEX_SIGNAL_CUSTOMER) !=0) //记录目前办理过业务和等待办理业务的顾客总数

{

printf("对不起,V操作失败!");

exit(1);

return -1;

}

sem_v(semid, INDEX_MUTEX); //释放控制进程访问资源的信号量

break;

case 'C':

if(get_sem_val(semid, INDEX_SIGNAL_SEAT) == 0)

{

if( (wait_num=my_random()%10)<5)

return 0; //返回0表示顾客选择离开

printf("目前没有空座位,但该顾客选择了等待。\n\n");

}

if(get_sem_val(semid, INDEX_SIGNAL_C) > 0) //检查,如果有空窗口,则直接取票,不用判断座位

{

*flag=0; //将标志为设为0,标示没有顾客在等待,不用排队

goto goto_C; //跳转到直接取票

}

if( wait_sem(semid, INDEX_SIGNAL_SEAT) ) //如果没有空座,则等待空座

sem_p(semid, INDEX_SIGNAL_SEAT);

goto_C: if( wait_sem(semid, INDEX_MUTEX) ) //等待操作信号量释放

sem_p(semid, INDEX_MUTEX); //锁定操作信号量

*ticket=get_sem_val(semid, INDEX_SIGNAL_CUSTOMER) + 1; //分配票号(票号是根据当天的总顾客数排的)

wait_num = (signal_seat - get_sem_val(semid,INDEX_SIGNAL_SEAT) ) -1;

//获取当前等待的人数

printf("号码:C%03d,",*ticket);

if(wait_num==0 || *flag==0)

{

printf("当前没有顾客正在等待。\t"); //wait_num大于等于0或者flag 大于0,表示当前无人等待

print_time();

}

else

{

printf("有%d位顾客正在等待。\t",wait_num);

print_time();

}

printf("顾客C%03d正在等待办理业务。\t",*ticket);

print_time();

if( sem_v(semid, INDEX_SIGNAL_CUSTOMER) !=0) //记录目前办理过业务和等待办理业务的顾客总数

{

printf("对不起,V操作失败!");

exit(1);

return -1;

}

sem_v(semid, INDEX_MUTEX); //释放控制进程访问资源的信号量

break;

}

return 1;

}

/*顾客接受服务函数*/

void service(int semid, char identifyLabel, int * ticket, int *flag)

{

int need_time=0; //用于记录该顾客需要的服务时间

switch(identifyLabel)

{

case 'A':

if(wait_sem(semid, INDEX_SIGNAL_A)) //等待有空闲窗口

sem_p(semid, INDEX_SIGNAL_A); //走向窗口,即将接受服务if( wait_sem(semid, INDEX_MUTEX) ) //等待操作信号量释放

sem_p(semid, INDEX_MUTEX); //锁定操作信号量

printf("顾客A%03d开始在对私窗口办理业务。\t",*ticket);

print_time();

if(*flag==1) //如果该顾客在进入银行取票后等待了窗口,那么顾客开始办理业务时即走向了窗口,需要释放座位

sem_v(semid, INDEX_SIGNAL_SEAT);

sem_v(semid, INDEX_MUTEX); //释放控制进程访问资源的信号量

/*接受服务(服务时长为1分钟以内并且大于10秒的任意时间)*/

need_time=my_random()%50 + 10;

printf("该顾客需要的服务时长为:%d秒。\t", need_time);

print_time();

sleep(need_time); //将该顾客进程挂起need_time秒,模拟该顾客正在接受服务

if( wait_sem(semid, INDEX_MUTEX) ) //等待操作信号量释放

sem_p(semid, INDEX_MUTEX); //锁定操作信号量

printf("顾客A%03d业务办理完毕。\t",*ticket);

print_time();

sem_v(semid, INDEX_SIGNAL_A); //业务办理完成,离开窗口

sem_v(semid, INDEX_MUTEX); //释放控制进程访问资源的信号量

break;

case 'B':

if(wait_sem(semid, INDEX_SIGNAL_B)) //等待有空闲窗口

sem_p(semid, INDEX_SIGNAL_B); //走向窗口,即将接受服务if( wait_sem(semid, INDEX_MUTEX) ) //等待操作信号量释放

sem_p(semid, INDEX_MUTEX); //锁定操作信号量

printf("顾客B%03d开始在对公窗口办理业务。\t",*ticket);

print_time();

if(*flag==1) //如果该顾客在进入银行取票后等待了窗口,那么顾客开始办理业务时即走向了窗口,需要释放座位

sem_v(semid, INDEX_SIGNAL_SEAT);

sem_v(semid, INDEX_MUTEX); //释放控制进程访问资源的信号量

/*接受服务(服务时长为1分钟以内并且大于10秒的任意时间)*/

need_time=my_random()%50 + 10;

printf("该顾客需要的服务时长为:%d秒。\t", need_time);

print_time();

sleep(need_time); //将该顾客进程挂起need_time秒,模拟该顾客正在接受服务

if( wait_sem(semid, INDEX_MUTEX) ) //等待操作信号量释放

sem_p(semid, INDEX_MUTEX); //锁定操作信号量

printf("顾客B%03d业务办理完毕。\t",*ticket);

print_time();

sem_v(semid, INDEX_SIGNAL_B); //业务办理完成,离开窗口

sem_v(semid, INDEX_MUTEX); //释放控制进程访问资源的信号量

break;

case 'C':

if(wait_sem(semid, INDEX_SIGNAL_C)) //等待有空闲窗口

sem_p(semid, INDEX_SIGNAL_C); //走向窗口,即将接受服务if( wait_sem(semid, INDEX_MUTEX) ) //等待操作信号量释放

sem_p(semid, INDEX_MUTEX); //锁定操作信号量

printf("顾客C%03d开始在理财窗口办理业务。\t",*ticket);

print_time();

if(*flag==1) //如果该顾客在进入银行取票后等待了窗口,那么顾客开始办理业务时即走向了窗口,需要释放座位

sem_v(semid, INDEX_SIGNAL_SEAT);

sem_v(semid, INDEX_MUTEX); //释放控制进程访问资源的信号量

/*接受服务(服务时长为1分钟以内并且大于10秒的任意时间)*/

need_time=my_random()%50 + 10;

printf("该顾客需要的服务时长为:%d秒。\t", need_time);

print_time();

sleep(need_time); //将该顾客进程挂起need_time秒,模拟该顾客正在接受服务

if( wait_sem(semid, INDEX_MUTEX) ) //等待操作信号量释放

sem_p(semid, INDEX_MUTEX); //锁定操作信号量

printf("顾客C%03d业务办理完毕。\t",*ticket);

print_time();

sem_v(semid, INDEX_SIGNAL_C); //业务办理完成,离开窗口

sem_v(semid, INDEX_MUTEX); //释放控制进程访问资源的信号量

break;

}

}

service.c文件

#include

#include"sharemem.h"

int main()

{

int init_val[]={mutex, signal_seat, signal_customer, signal_A, signal_B, signal_C};

//信号集初始化值数组

int semid, shmid; //信号集标识符semid和共享内存区标识符shmid

char *shmaddr; //共享内存附加点

int beforenumber=0, afternumber=0, temp=0;

/*申请创建共享内存空间,创建信号集(创建的同时已经对信号集进行了初始化)*/ if((shmid = createshm (".", 'm', SHM_SIZE))==-1)

{

exit(1);

}

/*将共享内存区附加到进程的地址空间*/

if((shmaddr = shmat (shmid, (char *)0, 0)) == (char *)-1)

{

exit(1);

}

/*在共享内存空间中创建信号集*/

if((semid = createsem (".", 's', signal_count, init_val)) == -1)

{

exit(1);

}

/*循环输出客流情况*/

while(1)

{

afternumber= signal_seat - get_sem_val(semid, INDEX_SIGNAL_SEAT);

//取得当前在座的人数

temp=afternumber-beforenumber; //计算前一次查看时与这次查看时的人数差

if(temp>0)

{

printf("新增顾客%d位。\t",temp);

print_time();

}

else if(temp<0)

{

temp=abs(temp);

printf("有%d位顾客办完业务并离开。\t",temp);

print_time();

}

beforenumber = afternumber;

usleep(100); //每隔一定时间进行一次查询输出

}

return 0;

}

customer.c文件

#include"sharemem.h"

int main()

{

int semid, shmid; //信号集标识符semid和共享内存区标识符shmid

char *shmaddr; //共享内存附加点

char identifyLabel; //标志该进程(顾客)是需要那种服务(对私:A;对公:B;理财:D)

int ticket, flag=1; //顾客的票号和用于标示该顾客需不需要排队的变量,flag值为1表示需要排队等待,值为0表示不需要排队

/*根据随机数,按照6:2:2的比例确定顾客需要的服务类型*/

int randomNumber=((my_random())%10); //产生随机数

if(randomNumber>=0 && randomNumber<=5)

identifyLabel='A';

else if(randomNumber>=6 && randomNumber<=7)

identifyLabel='B';

else

identifyLabel='C';

printf("新增一位%c类顾客。\t",identifyLabel); //输出新增顾客的提示

print_time();

/*打开共享内存中的信号集*/

if((semid = opensem (".", 's')) == -1)

{

printf("对不起,打开共享内存中的信号集失败!");

exit(1);

}

/*顾客取票*/

if( get_ticket(semid, identifyLabel, &ticket, &flag) == 0)

{

printf("由于没有空座位,该顾客选择了离开。\t"); //输出新增顾客离开的提示

print_time();

return 1;

}

/*顾客办理业务*/

service(semid, identifyLabel, &ticket, &flag);

return 0;

}

deletesem.c文件

#include"sharemem.h"

/*该文件用于删除信号集*/

int main()

{

int semid; //信号集标识符semid

if((semid = opensem (".", 's')) == -1) //打开共享内存中的信号集

{

printf("对不起,打开共享内存中的信号集失败!");

exit(1);

}

delete_sem (semid);

}

Makefille文件

CC=gcc

program=$(ser) $(cus) $(del)

ser=s

cus=c

del=d

source_ser=service.c

source_cus=customer.c

source_del=deletesem.c

操作系统课程设计

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

排队叫号系统设计说明

单片机系统 课程设计 成绩评定表 设计课题:排队叫号系统设计 学院名称:电气工程学院 专业班级:自动F1207 学生:康 学号: 2 指导教师:周刚 设计地点: 31-517 设计时间:2014-12-29~2015-01-09

单片机系统 课程设计 课程设计名称:排队叫号系统设计 专业班级:自动F1207 学生姓名:康 学号: 2 指导教师:周刚 课程设计地点:31-517 课程设计时间:2014-12-29~2015-01-09 单片机系统课程设计任务书

1、该系统是一款自动的排队叫号系统,以排队抽号顺序为核心,排队者利用客户端抽号,工作人员利用叫号端叫号; 2、通过显示器及时显示当前所叫号数,语音提示,提醒排队者接受服务; 3、客户及时了解排队信息,可以通过显示器显示队列中排在其前面的顾客数,通过合理的程序结构来执行排队抽号; 排队叫号系统主要由系统主从机、键盘电路、显示电路、语音电路等部分构成。 目录

1绪论 (6) 1.1课题背景 (6) 1.2课题研究的目的和意义 (6) 1.3课题研究现状 (7) 1.4设计目的及功能 (7) 2系统需求分析与整体设计 (7) 2.1确定的方案 (7) 2.2系统原理图 (8) 2.3整体设计方案 (8) 3系统硬件设计 (10) 3.1主电路硬件设计 (11) 3.2时钟电路 (12) 3.3键盘电路 (13) 3.4LED显示电路 (14) 3.5LCD显示电路 (15) 3.6语音提示电路 (17) 4系统软件设计 (20) 4.1主控软件设计 (20) 4.2LED显示程序设计 (21) 4.3LCD显示程序设计 (22) 4.4声音系统程序设计 (23) 5系统仿真实验 (23) 6总结 (25) 7参考文献 (26) 附录1实物图 (26) 附录2系统原理图 (27) 附录3C51源程序 (28) 1 绪论 1.1课题背景

操作系统课程设计实验报告

河北大学工商学院 课程设计 题目:操作系统课程设计 学部信息学部 学科门类电气信息 专业计算机 学号2011482370 姓名耿雪涛 指导教师朱亮 2013 年6月19日

主要内容 一、设计目的 通过模拟操作系统的实现,加深对操作系统工作原理理解,进一步了解操作系统的实现方法,并可练习合作完成系统的团队精神和提高程序设计能力。 二、设计思想 实现一个模拟操作系统,使用VB、VC、CB等windows环境下的程序设计语言,以借助这些语言环境来模拟硬件的一些并行工作。模拟采用多道程序设计方法的单用户操作系统,该操作系统包括进程管理、存储管理、设备管理、文件管理和用户接口四部分。 设计模板如下图: 注:本人主要涉及设备管理模块

三、设计要求 设备管理主要包括设备的分配和回收。 ⑴模拟系统中有A、B、C三种独占型设备,A设备1个,B设备2个,C设备2个。 ⑵采用死锁的预防方法来处理申请独占设备可能造成的死锁。 ⑶屏幕显示 注:屏幕显示要求包括:每个设备是否被使用,哪个进程在使用该设备,哪些进程在等待使用该设备。 设备管理模块详细设计 一、设备管理的任务 I/O设备是按照用户的请求,控制设备的各种操作,用于完成I/O 设备与内存之间的数据交换(包括设备的分配与回收,设备的驱动管理等),最终完成用户的I/O请求,并且I/O设备为用户提供了使用外部设备的接口,可以满足用户的需求。 二、设备管理函数的详细描述 1、检查设备是否可用(主要代码) public bool JudgeDevice(DeviceType type) { bool str = false; switch (type) { case DeviceType.a: {

《操作系统原理》课程设计--银行家算法程序设计

信息与计算科学 操作系统原理 课程设计报告 题目:银行家算法程序设计 班级: 姓名: 专业:

银行家算法程序设计 目录 1.绪论 (2) 2.需求分析 (2) 2.1功能需求 (2) 2.2数据需求 (2) 3. 总体设计 (2) 3.1功能模块设 (2) 3.2系统设计方案 (3) 3.3开发工具 (4) 4. 详细设计 (4) 4.1银行家算法中的数据结构 (4) 4.2银行家算法 (5) 4.3安全性算法 (6) 5. 调试与测试 (8) 6. 结论 (8) 结束语 (8) 参考文献 (9) 附录1-用户手册 (10) 附录2-源程序清单 (11)

1.绪论 20世纪末,随着计算机科学的发展,C语言的应用越来越广泛,很多程序都需要使用C语言来编写。C语言使用方便快捷,它已经成为计算机编程中不可缺少的一部分,而且它也被用于各个方面。例如:政府部门,银行,学校等等。 银行家算法是判断系统是否安全,并且允许其它进程来申请这里的资源,任何一个进程来申请资源时,必须先登记该进程对资源的申请要求然后由系统检查当前资源的状况,并用银行家算法和安全性算法来检查是否允许分配资源给进程。通过课程设计,加深我们对利用银行家算法避免死锁的理解。在设计中主要的难点是用语言编写银行家算法和安全性算法,使系统资源分配能安全进行,避免系统死锁。 2.需求分析 2.1 功能需求 1.添加进程的可用资源,最大资源,已分配资源; 2.判断系统是否安全; 3.申请资源; 4.申请资源后如何分配; 5.进行安全检查。 2.2 数据需求 主要数据包括:可用资源,最大资源,已分配资源,申请资源数。 3. 总体设计 3.1 功能模块设

银行叫号系统设计..

摘要 排队叫号管理系统是针对银行、工商、税务、通讯、政府机构等部门的大厅工作流程设计的,是利用电脑的科学管理客户排队的系统,很好地解决了客户在服务机构办理业务时所遇到的各种排队、拥挤和混乱现象,为客户办理业务带来莫大的方便和愉悦。该题研究的目的是研制一款无人排队的排队叫号机,它主要由主控制器、键盘、显示电路、蜂鸣器电路等部分构成。系统利用单片机进行控制,通过串行通信方式传输处理数据;通过按键取号,在LCD1602上显示排队的号码以及当前正在等待的人数;通过按键叫号,在LCD1602上显示叫到的号码,由扬声器发出声音提示客户。同时免除了令客户不舒服的站立式排队,这种现代化的高科技产品彻底解决了银行普遍存在的站立等候,服务无序的问题,深化并完善了服务的质量。本系统采用单片机进行控制,利用LCD1602显示,蜂鸣器鸣叫提示的人机交互界面,模拟排队管理系统,科学地处理各种排队情况。操作简便,控制灵活,显示清晰,制作成本低,性价比较高。 关键词STC89C52 LCD1602 蜂鸣器

目录 1 系统方案论证 (1) 1.1 设计要求 (1) 1.2 单片机芯片的选择方案和论证 (1) 1.3 显示模块选择方案和论证 (1) 1.4 系统方案设计 (2) 2 系统硬件设计 (3) 2.1 系统总电路 (3) 2.2 单片机处理部分设计 (3) 2.3 显示电路部分 (4) 2.4 时钟振荡电路 (5) 2.5 复位电路 (6) 2.6 叫号电路 (6) 2.7 按键电路 (7) 3 系统软件设计 (8) 4系统测试 (9) 5 小结 (10) 参考文献 (11) 附录 (12) 源程序: (12)

操作系统课程设计实验报告(以Linux为例)

《操作系统课程设计》 实验报告 学号: 姓名: 苏州大学计算机科学与技术学院 2014年9月

操作系统课程设计实验报告 目录 目录 (1) 一、实验环境 (2) 二、实验报告总体要求 (2) 实验一编译L INUX内核 (3) 实验二观察L INUX行为 (7) 实验三进程间通信 (14)

操作系统课程设计实验报告 一、实验环境 Linux平台 ◆硬件平台:普通PC机硬件环境。 ◆操作系统:Linux环境,例如,红旗Linux或Red Hat Linux;启动 管理器使用GRUB。 ◆编译环境:伴随着操作系统的默认gcc环境。 ◆工作源码环境:一个调试的内核源码,版本不低于2.4.20。 二、实验报告总体要求 在2013年11月25日前提交实验报告。实验报告至少要求包含以下内容: 1.引言:概述本次实验所讨论的问题,工作步骤,结果,以及发现的意 义。 2.问题提出:叙述本篇报告要解决什么问题。注意不可以抄写实验要求 中的表述,要用自己的话重新组织我们这里所提出的问题。 3.解决方案:叙述如何解决自己上面提出的问题,可以用小标题 3.1, 3.2<等分开。这是实验报告的关键部分,请尽量展开来写。注意, 这部分是最终课程设计的基本分的部分。这部分不完成,本课程设计不会及格。 4.实验结果:按照自己的解决方案,有哪些结果。结果有异常吗?能解 释一下这些结果吗?同别人的结果比较过吗?注意,这部分是实验报告出彩的地方。本课程设计要得高分,应该在这部分下功夫。 5.结束语:小结并叙述本次课程设计的经验、教训、体会、难点、收获、 为解决的问题、新的疑惑等。 6.附录:加了注释的程序清单,注释行数目至少同源程序行数目比1: 2,即10行源程序,至少要给出5行注释。

计算机操作系统原理课程设计

上海电力学院 课程设计报告 课程名称:操作系统原理 题目名称:采用可变分区存储管理,模拟主存空间的分配和回收 姓名: xxx 学号: xxx 班级: 2013054 同组姓名: xxx 课程设计时间: 2015.7.6~2015.7.10 评语: 成绩:

课程设计题目 一、设计内容及要求 可变分区存储管理模拟 设计内容:编写程序模拟实现可变分区存储管理。 具体要求: 编写程序模拟实现可变分区存储管理,实现存储管理的基本功能,包括内存的分配、内存的回收、地址变换等。 输入:1、输入新进程名称及使用内存的大小(可创建多个进程); 2、撤销某个指定的进程; 3、某个进程的逻辑地址; 输出:显示每次创建进程或者撤销进程后内存使用的状况,包括每一个进程占据的内存的位置和大小; 计算并输出给定逻辑地址对应的物理地址。 必须分别使用以下分配算法完成模拟: 1、首次适应算法; 2、最佳适应算法; 3、最差适应算法; 小组分工: 程序设计讨论: 程序主体设计: 程序调试及修改: 实验报告设计: 总结: (要求注明小组分工情况) 二、详细设计 1)原理概述 对于可变分区存储管理的内存分配与回收,主要为设计以下几个部分: 1、设计动态输入空闲分区表的程序 2、设计内存分配的程序 3、设计内存回收的程序 首次适应算法: FF算法要求空闲分区表或空闲分区链以地址递增的次序链接。在分配内时,从链首开始查找,直至找到一个大小能满足要求分区为止;然后再按照作业大小,从该分区中划一块内存空间分配给请求者,余下的空闲分区仍留在空闲链中。如从链首直至链尾都不能找到一个能满足要求的分区,则此次分配失败,返回 最佳适应算法: BF算法是指每次为作业分配内存,总是把满足要求、又是最小的空闲分区分配给作业,避免“大材小用”。为了加速寻找,该算法要求所有的空闲分区按其容量以从小到大的顺序形成一空闲分区链。这样,第一次找到能满足要求的空闲区,

操作系统课程设计报告

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

操作系统课程设计

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

《操作系统原理》课程设计任务书 一、课程设计题目(任选一个题目) 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周进行,时间安排如下:

银行排队叫号系统的设计毕业论文

银行排队叫号系统的设计 毕业论文 目录 摘要.............................................................. I ABSTRACT .......................................................... II 1 绪论.. (1) 1.1 课题来源 (1) 1.2 国外发展状况 (1) 1.3 有线系统与无线系统 (3) 1.4 发展前景 (4) 1.5 系统的设计目的 (4) 2 系统的需求分析 (5) 2.1 系统功能需求 (5) 2.2 非功能性需求 (5) 3 系统总体设计 (7) 3.1 方案论证 (7) 3.1.1 方案要求 (7) 3.1.2 方案确立 (7) 3.2 方案原理 (8)

3.3 异步通信 (9) 3.4 系统的体系结构 (10) 3.5 系统的软件结构 (10) 3.6 系统的基本功能和工作原理 (11) 3.6.1 排队系统的基本功能 (11) 3.6.2 工作原理 (11) 3.7 排队系统工作流程 (12) 3.7.1 数据处理流程 (12) 3.7.2 客户工作流程 (13) 3.7.3 工作人员工作流程 (13) 3.7.4 系统工作流程 (13) 3.8 主要应用器件及技术原理 (14) 3.8.1 微处理器介绍 (14) 3.8.2 液晶LCD1602的介绍 (16) 3.8.3 硬件概要设计 (22) 3.8.4 软件概要设计 (23) 4 系统硬件设计 (25) 4.1 主要电路设计 (25) 4.1.1 主机部分电路 (25) 4.1.2 从机部分电路 (26) 4.2 功能部分电路设计 (26) 4.2.1 单片机最小系统电路 (26)

操作系统课程设计论文

学年论文(课程设计)题目:操作系统课程设计 学院数学与计算机学院 学科门类工学 专业网络工程 学号 姓名 指导教师王煜 年月日

河北大学学年论文(课程设计)任务书 (指导教师用表) 指导教师签字: 系主任签字: 主管教学院长签字: 装 订 线

河北大学学年论文(课程设计)成绩评定表学院:数学与计算机学院 装 订 线

摘要 此系统实现了存储管理、设备管理和进程管理。 存储管理部分主要实现主存空间的分配和回收。存储管理采用可移动的可变分区存储管理方式。采用数组来模拟主存,大小为512个字节。 设备管理主要包括设备的分配和回收。模拟系统中有A、B、C三种独占型设备,A设备3个,B设备2个,C设备1个。设备分配时采用采用先来先服务策略。设备回收时唤醒等待设备的进程。 进程管理主要包括进程调度,进程的创建和撤销、进程的阻塞和唤醒,中断作用的实现。其中硬件中的中央处理器用不断循环的函数CPU( )模拟,重要寄存器(如:程序状态寄存器PSW、指令寄存器IR)用全局变量模拟,中断的发现是在函数CPU中加检测PSW 的方式来模拟,时钟的模拟通过timer控件实现。进程控制块的模拟通过数组,本系统最多容纳10个。进程调度时采用时间片轮转调度算法,时间片为5。 关键词:存储管理设备管理进程管理时间片

ABSTRACT The system has storage management, equipment management and process management. The storage management has achieved the allocation and recovery of the main memory space. Variable storage management is used as storage management .We simulate the main memory by array, whose size is 512 bytes. The device management, including the distribution and recovery of devicet. We simulate three devices ,A,B,C. the numbers of them are 3,2,1. The distribution of device used to adopt first-come first-service strategy. It awakes the blocking process when the device is recycled. The process management, including scheduling ,creating revocation ,blocking and waking up the process, the realization of the interruption.We simulate the central processing unit by the cycling function named CPU(),simulate the important register by global variable, simulate the recovering of interruption by checking PSW in the function of CPU(),simulate the clock by the timer control. The simulation of the process control block by array, whose number is up to 10. When the scheduling of the process happens, we use the algorithm of time piece rotation scheduling, and the time piece is 5. Key words: storage device process time

毕业论文-银行排队叫号系统的设计

毕业论文-银行排队叫号系统的设计

本科毕业设计(论文) 题目银行排队叫号系统的设计 学生姓名陈福秀 专业班级 09 电子科学与技术1班 学号 200931002 院(系)电气工程学院 指导教师(职称) 王继红(讲师) 完成时间 2013 年05月18日 郑州科技学院电气工程学院

二○一三年五月

郑州科技学院毕业设计(论文)任务书 题目银行排队叫号系统的设计 专业 09电科学号 200931002 姓名陈福秀 一、主要内容 收集,整理与课题有关技术与产品资料,确定系统方案,设计电路原理图,绘制电路板,编写应用程序,进行焊接调试并撰写毕业论文。 二、基本要求 1. 检索与课题有关的资料,提出自己的设计方案,方案应具有可行性、经 济性;写出开题报告。 2. 编写论文初稿。 3. 在的初稿基础上撰写毕业论文。 4. 毕业论文的撰写,要求认真工整、条理清晰、正确标准。 三、主要参考资料 1. 张毅坤编.单片微型计算机原理及其应用[M] 西安:西安电子科技大学出版社1998 2. 金篆芷.王明时现代传感器技术[M].北京:电子工业出版社1995 3. 吕俊芳. 传感器接口与检测仪器电路[M].北京:北京航空航天出版社1994 完成期限: 指导教师签名: 专业负责人签名: 2013年5月18日

中文摘要 摘要 本文设计了一套排队叫号系统。该系统是以排队抽号顺序为核心,客户利用客户端抽号,工作人员利用叫号端叫号;通过显示器及时显示当前所叫号数,客户及时了解排队信息,通过合理的程序结构来执行排队抽号。以提高排队等待效率,解决排队秩序混乱,前拥后挤等现象,实现排队自动化,规范化。通过该系统的使用,客户不必为排队浪费大量精力,便于管理排队秩序,同时适应信息时代管理数字化的要求,提高服务水平与质量。 排队叫号系统是针对银行、工商、税务、通讯、政府机构等部门的大厅工作流程设计的,是利用电脑的科学管理客户排队的系统,能够很好地解决客户在服务机构办理业务时所遇到的各种排队、拥挤和混乱现象,为客户办理业务带来莫大的方便和愉悦。本课题研究的是一款无人排队的排队叫号系统,它主要由系统主从机、键盘、显示电路、蜂鸣器电路等部分构成。系统利用AT89C51 单片机进行控制,通过串行通信方式传输处理数据;通过按键取号,在LCD1602 上显示排队的号码以及当前正在等待的人数;通过按键叫号,在LCD1602 上显示叫到的号码,由蜂鸣器发出声音提示客户。这种现代化的高科技产品彻底解决了银行、工商、税务、通讯、政府机构等部门的服务大厅普遍存在的站立等候、服务无序的问题,同时免除了令客户不舒服的站立式排队,深化完善了服务的质量。本系统采用AT89C51 单片机进行控制,利用LCD1602 显示,蜂鸣器鸣叫提示的人机交互界面,模拟排队管理系统,科学的处理各种排队情况,具有操作简便、控制灵活、显示清晰、制作成本低、性价比较高等特点。 关键词:AT89C51单片机LCD1602排队叫号系统开发

期末 操作系统实验课程设计

操作系统实验课程设计(二)(参照实验五) 学院:计算机科学与工程专业:信息管理工作与信息系统学号:2008142118 姓名:丁建东 一、实验题目:设计一个Shell解释器 二、实验目的:本设计的主要目的在于学会如何在Unix系 统下创建进程和管理进程。 三、实验内容: 实现一个简单的shell(命令行解释器),类似于bash, csh等。 要求实现的shell支持以下内部命令: 1.cd <目录> 更改当前的工作目录到另一个<目录>。如果<目录>未指定,输出当前工作目录。如果<目录>不存在,要求有适当的错误信息提示。改命令应能够改变PWD的环境变量。 2.echo <内容> 显示echo后的内容且换行。 3.help 简短概要地输出你的shell的使用方法和基本功能。 4.jobs

输出shell当前的一系列子进程,要求提供子进程的命名和PID号。 5.quit, exit, bye 退出shell。 所有的内部命令应当优于在$PATH中同名的程序。 任何非内部命令必须请求shell创建一个新进程,且该子进程执行指定的程序。这个新进程必须继承shell的环境变量和指定的命令行参数。 要求实现的shell支持以下内部命令: Batch Processing 如果shell启动带有一个文件名作为参数,打开该文件并执行文件里所有命令。待所有进程全部结束退出shell。 四、实验思路: 1.所用到的系统函数 (1)打开目录 void cd() API调用:int chdir(dir);getcwd(dir,dir_max); 实现:改变当前目录,并判断目录是否存在。 (2)回应 void echo() 实现: 用户输入字符串,以回车结束输入。

操作系统原理课程设计实践报告

操作系统原理课程设计 实践报告 题目: 仿真多进程并发环境中死锁的预防、避免、检测与解除 姓名: 学院: 信息科技学院 专业: 计算机科学技术系 班级: 学号: 指导教师: 职称: 20010年4月8日 仿真多进程并发环境中死锁的预防、避免、检测与解除 摘要:在多道程序系统中,多个程序并发执行时可能造成死锁。所谓死锁是指多

个进程在运行过程中因争夺资源而造成的一种僵局。当进程处于这种僵局状态时若无外力作用,它们都将无法再向前推进,造成资源的浪费。该程序将模拟多进程并发时死锁现象的产生、避免、检测与解除。死锁避免用最著名的银行家算法,用银行家安全性算法类似的死锁检测算法来检测进程状况,又用资源剥夺法来实现死锁的解除。该程序实现操作简易,表示清晰并且形象描述多进程并发环境中死锁的预防、避免、检测与解除。 关键字:死锁;避免死锁;安全状态;银行家算法 引言:在操作系统、数据库系统以及网络通信中,由于进程并发和资源共享,当系统中资源分配顺序或者进程推进顺序不当就会造成系统死锁[1]。处于死锁状态的系统中,进程之间互相等待资源而永远不能继续向前推进,严重地影响了系统的可靠性。因而有时需要合理的对资源进行分配必要的时候加以限制保证系统安全、高效、稳定的运行。 1理论分析 1.1 死锁的概念 如果一个进程集合中的每个进程都在等待只能由此集合中的其他进程才能引发的事件,而无限期陷入僵持的局面称为死锁[2]。 1.2 产生死锁的条件: 1、互斥使用(资源独占):一个资源每次只能给一个进程使用。 2、不可强占(不可剥夺):资源申请者不能强行的从资源占有者手中夺取资 源,资源只能由占有者自愿释放。 3、请求和保持(部分分配,占有申请):一个进程在申请新的资源的同时保 持对原有资源的占有(只有这样才是动态申请,动态分配)。 4、循环等待:存在一个进程等待队列{P1,P2,…,Pn},其中P1等待P2占 有的资源,P2等待P3占有的资源,…,Pn等待P1占有的资源,形成一个进程等待环路[3]。 1.3死锁的预防 在系统设计时确定资源分配算法,保证不发生死锁。具体的做法是破坏产生死锁的四个必要条件之一。 ①破坏“不可剥夺”条件 在允许进程动态申请资源前提下规定,一个进程在申请新的资源不能立即得到满足而变为等待状态之前,必须释放已占有的全部资源,若需要再重新申请。 ②破坏“请求和保持”条件 要求每个进程在运行前必须一次性申请它所要求的所有资源,且仅当该进程所要资源均可满足时才给予一次性分配。 ③破坏“循环等待”条件 采用资源有序分配法:把系统中所有资源编号,进程在申请资源时必须严格按资源编号的递增次序进行,否则操作系统不予分配。

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

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

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

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

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

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

操作系统课程设计实验报告proj2

操作系统课程设计报告 班级: 团队成员:

目录 ................................................................................................................ 错误!未定义书签。 一、实验要求:建立线程系统................................................................... 错误!未定义书签。 1.1Task 2.1实现文件系统调用 (3) 1.1.1题目要求 (3) 1.1.2题目分析与实现方案 (3) 1.1.3关键点与难点 (4) 1.1.4实现代码 (4) 1.2 Task 2.2 完成对多道程序的支持 (5) 1.2.1题目要求 (5) 1.2.2题目分析与实现方案 (5) 1.2.3关键点与难点 (6) 1.2.4实现代码 (7) 1.3 Task 2.3 实现系统调用 (7) 1.3.1题目要求 (7) 1.3.2题目分析与实现方案 (8) 1.3.3关键点与难点 (9) 1.3.4实现代码 (9) 1.4 Task 2.4 实现彩票调度 (10) 1.4.1题目要求 (10) 1.4.2题目分析与实现方案 (10) 1.4.3关键点与难点 (11) 1.4.4实现代码 (11) 二、测试结果............................................................................................ 2错误!未定义书签。

操作系统课程设计1要点

操作系统原理 课程设计报告题目:采用二级目录实现文件管理 所在学院: 班级: 学号: 姓名: 指导教师: 2013年1月15日

目录 一、课程设计目的 (1) 二、课题内容 (1) 三、总体路线 (1) 四、概要设计 (2) 1.数据结构 (2) 2.所使用函数及其功能 (3) 五、详细设计 (4) 1.主函数流程图 (4) 2.创建文件函数流程图 (5) 3.删除文件函数流程图 (7) 4.分解命令函数流程图 (10) 六、测试、修改及运行结果 (10) 七、结束语 (13) 八、参考文献 (14)

一、课程设计目的 文件系统是现代OS用来存储和管理信息机构,具有按名存取的功能,不仅能方便用户对信息的使用,也有效提高了信息的安全性。本课题模拟文件系统的目录结构,并在此基础上实现文件的各种操作方法。 通过本课题,深入理解文件文件目录的作用和功能,掌握文件打开结构,熟悉与文件有关的系统调用,从而更好地掌握文件系统概念。 二、课题内容 1.文件目录采用二级目录结构,第一级为主文件目录master_file_directory;第二级为用户文件目录user_file_directory。 图1 master_file_directory 结构 图2 user_file_directory 结构 2.为加速文件存取,为每个用户建立一张用户打开表fileTable,用以记录该 3.为该系统提供6条操作命令:创建、打开、读、写、关闭、删除等。 4.在该模拟系统中,应先建立主文件目录、用户目录和用户打开文件表,然后接受合法用户,给出一个菜单,按用户选择执行相关操作。 三、总体路线 1.在内存中开辟一个虚拟磁盘空间作为文件存储器,在其上实现一个简单的单用户文件系统。在退出这个简单的文件系统时,应将该虚拟文件系统保存到磁盘上,以便下次可以再将它恢复到内存的虚拟磁盘空间中。 2.文件存储空间的分配采用显式链接分配。为了实现创建和删除文件必

操作系统nachos课程设计实验报告

一题目 project1:实现nachos操作系统的project1中的join()方法,condition2 类,Alarm类,Communicator类,PriorityScheduler类和Boat类 project2:实现nachos操作系统的project2中的creat open read write close unlink 文件系统调用,修改UserProcess.readVirtualMemory和UserProcess.writeVirtualMemory使操作系统能够运行多用户程序,实现exec join exit系统调用,实现LotteryScheduler类 二实验目的 熟悉nachos操作系统,深入理解操作系统内核 了解用户程序的加载过程以及多用户进程的内存分配机制 三实验要求 完成nachos,提交设计文档和你的代码 四实验说明,程序代码及测试结果 Project1: 1 join() 要求实现join()方法,注意,其他线程没必要调用join函数,但是如果它被调用的话,也只能被调用一次。join()方法第二次调用的结果是不被定义的,即使第二次调用的线程和第一次调用的线程是不同的。无论有没有被join,一个进程都能够正常结束 (a)设计思想 当线程B执行A.join()时,将B放入A的等待队列,直到A完成时,唤醒在等待队列中的所有线程,因此需要实现join()方法和修改finish方法(b)源代码 public void join(){ Lib.debug(dbgThread, "Joining to thread:" + toString()); Lib.assertTrue(this!=currentThread); Lib.assertTrue(join_counter == 0); join_counter++; boolean status=Machine.interrupt().disable(); if (this.status != statusFinished) { waitQueue.waitForAccess(KThread.currentThread()); currentThread.sleep();

计算机操作系统课程设计

计算机操作系统课程设计 班级:计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; //目录地址 };

操作系统课程设计题目

操作系统课程设计 一、课程设计题目 实现一个模拟操作系统。 二、课程设计的目的 通过模拟操作系统原理的实现,加深对操作系统工作原理理解,进一步了解操作系统的实现方法,并可练习合作完成系统的团队精神和提高程序设计能力。 三、小组人数 建议3~4人一组共同完成模拟系统的实现。 四、编程语言 建议使用VC、VB、C#、Java等Windows环境下的程序设计语言,以借助这些语言环境来模拟硬件的一些并行工作。 五、课程设计内容 模拟采用多道程序设计方法的单用户操作系统,该操作系统包括进程管理、存储管理、设备管理、文件管理和用户接口四部分。 六、课程设计具体要求和内容 1.文件管理和用户接口 文件管理和用户接口部分实现的主要是单用户的磁盘文件管理部分,包括文件的逻辑结构、物理结构、目录、磁盘分配回收、文件的保护和用户接口的实现。 ⑴文件的逻辑结构 文件的逻辑结构采用流式结构; 文件的内容均采用文本文件; 系统中有两种文件,一种是存放任意字符的文件,一种是可执行文件。可执行文件的内容就是模拟系统内进程的程序体。 文件中要有一种特定命令的“可执行”文件,该文件中的命令有: x=?; 给x赋值一位数 x++; x加1 x--; x减1 !??;第一个?为A,B,C中某个设备,第二个?为一位数,表示使用设备的时间(由于没有实际设备,所以无法知道设备何时工作完成,所以假定一个数,这个数随着系统时间增加而递减,减到0时,认为是设备工作完成); end. 表示文件结束,同时将结果写入文件out,其中包括文件路径名和x的值。 ⑵磁盘模拟 用一个文件disk1模拟磁盘c,用一个文件disk2模拟磁盘d。两个磁盘一样大小,磁盘的每个盘块64字节,模拟磁盘共有128块。第0、1块存放文件分配表,第2块存放根目录,其余存放子目录和文件。 ⑶目录结构 目录结构采用树型目录结构。 ①目录项内容(8个字节): 目录名、文件名:3个字节; 扩展名:2个字节(可执行文件扩展名为ex,目录没有扩展名); 目录、文件属性:1字节(1位标识是文件还是目录,1位标识只读还是非只读,1位是隐藏属性,标识显示还是不显示); 起始盘块号:1个字节; 文件长度:1字节(目录没有长度)。

相关主题
文本预览
相关文档 最新文档