独占设备的分配、回收等主要算法的原理。
为了提高操作系统的可适应性和可扩展性,现代操作系统中都毫无例外地实现了设备独立性,又叫做设备无关性。设备独立性的含义是:应用程序独立于具体使用的物理设备。 为了实现独占设备的分配,系统设置数据表格的方式也不相同,在实验中只要设计合理即可。这里仅仅是一种方案,采用设备类表和设备表。
(1) 数据结构
操作系统设置“设备分配表”,用来记录计算机系统所配置的独占设备类型、台数以及分配情况。设备分配表可由“设备类表”和“设备表”两部分组成,如下图:
(2) 设备分配
头文件
回收函数
显示函数
Makefile我就不向上面粘贴了,昨天写了一下午,必须吐槽Linux红帽写代码的效率,真的慢,心累。。。。
为了提高操作系统的可适应性和可扩展性,现代操作系统中都毫无例外地实现了设备独立性,又叫做设备无关性。设备独立性的含义是:应用程序独立于具体使用的物理设备。 为了实现独占设备的分配,系统设置数据表格的方式也不相同,在实验中只要设计合理即可。这里仅仅是一种方案,采用设备类表和设备表。
(1) 数据结构
操作系统设置“设备分配表”,用来记录计算机系统所配置的独占设备类型、台数以及分配情况。设备分配表可由“设备类表”和“设备表”两部分组成,如下图:
(2) 设备分配
当进程申请某类设备时,系统先查“设备类表”如果该类设备的现存台数可以满足申请要求,则从该类设备的“设备表”始址开始依次查该类设备在设备表中的登记项,找出“未分配”的设备分配给进程。分配后要修改设备类表中的现存台数,把分配给进程的设备标志改为“已分配”且填上占用设备的进程名。把设备的绝对号与相对号的对应关系通知用户,以便用户在分配到的设备上装上存储介质。
(3) 设备回收
当进程执行结束撤离时应归还所占设备,系统根据进程名查设备表,找出进程占用设备的登记栏,把标志修改为“未分配”,清除进程名。同时把回收的设备台数加到设备类表中的现存台数中。
下面是程序;本人在LINUX下用C语言写的:因为是在虚拟机下写的,所以注释在windows下会变成乱码,但代码不影响
主函数
/*****************************************
Function:
Description:
Calls:
Called by:
Input:
Output:
Return:
*****************************************/
#include"/root/process4/include/head.h"
/*
void save(Link head)
{
FILE *fp;
Link p = head->next;
int i;
if((fp = fopen("/root/Address_book/address.txt","wt")) == NULL)
{
printf("cannot open file\n");
return;
}
while(p != NULL)
{
fprintf(fp,"%d %s %s %s\n",p->ID,p->name,p->num,p->ad);
p = p->next;
}
fclose(fp);
}
void read(Link head)
{
FILE *fp;
Link p = head;
Link newnode;
int i = 1;
p->next = NULL;
if((fp = fopen("/root/Address_book/address.txt","rt")) == NULL)
{
printf("cantnot open file\n");
return;
}
while(i > 0)
{
newnode = (Link)malloc(sizeof(Stu));
i = fscanf(fp,"%d %s %s %s\n",&newnode->ID,newnode->name,newnode->num,newnode->ad);
if(i == EOF)
{
free(newnode);
newnode = NULL;
break;
}
newnode->next = p->next;
p->next = newnode;
p = p->next;
}
p = NULL;
fclose(fp);
return;
}
*/
void init_Link(Link *head)
{
*head = (Link)malloc(sizeof(Eqt));
(*head)->next = NULL;
}
void print()
{
printf("*****************************************\n");
printf("* 1.鍒嗛厤 2.鍥炴敹 3.鏄剧ず 4.閫€鍑? *\n");
printf("*****************************************\n");
printf(" 璇疯緭鍏ヤ綘鐨勯€夋嫨(1~4)\n");
}
void choose(Link *thead)
{
int i;
Link head = *thead;
create(head);
while(1)
{
print();
scanf("%d",&i);
while(i < 1||i > 4)
{
printf("error number,please input again\n");
scanf("%d",&i);
}
switch(i)
{
case 1:allocate(head);
// choose(&head);
//input(head);
break;
case 2:delete1(head);
break;
case 3:display(head);
break;
case 4:exit(1);
break;
default:break;
}
}
}
int main()
{
Link head;
init_Link(&head);
// read(head);
create(head);
system("clear");
choose(&head);
return 0;
}
头文件
/**************************************************
Functon: head.h
Description:
Calls:
Called By:
Input:
Output:
Return:
*************************************************/
#ifndef HEAD_H_
#define HEAD_H_
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#define INSERT 0 /*瀹忓畾涔夋彃鍏ョ殑鍔ㄤ綔涓?*/
#define DISPLAY 1 /*瀹忓畾涔夋煡鐪嬬殑鍔ㄤ綔涓?*/
#define DELETE 2 /*瀹忓畾涔夊垹闄ょ殑鍔ㄤ綔涓?*/
#define SEARCH 3 /*瀹忓畾涔夋煡鎵剧殑鍔ㄤ綔涓?*/
#define NUM_MAX 20 /*瀹忓畾涔夐€氳褰曚腑瀛樻斁鏈€澶氫汉鏁?/
#define NAME_SIZE 20 /*瀹忓畾涔夊鍚嶆渶澶ч暱搴?/
#define PHONE_SIZE 11 /*瀹忓畾涔夋墜鏈哄彿鐮佹渶澶ч暱搴?/
#define EMAIL_SIZE 100 /*瀹忓畾涔夐偖绠辨渶澶ч暱搴?/
#define ADDRESS_SIZE 200 /*瀹忓畾涔変綇鍧€鏈€澶ч暱搴?/
struct equipment
{
int number;//缁濆鍙? int lnumber;//鐩稿鍙? int state;//鐘舵€? int remain;//鏄惁瀹屽ソ
char jobname[NUM_MAX];//鍗犵敤浣滀笟鍚?};
struct equiptype
{
char type[NUM_MAX];//璁惧绫诲悕
int count;//璁惧鍙版暟
int remain;//绌洪棽鍙版暟
struct equipment equipment[NUM_MAX];
struct equiptype * next;
};
typedef struct equiptype Eqt;
typedef Eqt* Link;
extern void create(Link head);
extern void display(Link head);
extern void delete1(Link head);
#endif /* HEAD_H_ */
创建链表
/*****************************************
Function:
Description:
Calls:
Called by:
Input:
Output:
Return:
*****************************************/
#include"/root/process4/include/head.h"
void create(Link head)
{
Link p = head;
Link q = p->next;
Link newnode;
Link newnode2;
Link newnode3;
newnode = (Link)malloc(sizeof(Eqt));
strcpy(newnode->type,"print");
newnode->count = 2;
newnode->remain = 1;
newnode->equipment[0].number = 1001;
newnode->equipment[1].number = 1002;
newnode->equipment[0].lnumber = 1;
newnode->equipment[1].lnumber = 2;
newnode->equipment[0].state = 1;
newnode->equipment[1].state = 0;
newnode->equipment[0].remain = 1;
newnode->equipment[1].remain = 1;
strcpy(newnode->equipment[0].jobname,"Job4");
strcpy(newnode->equipment[1].jobname,"null");
p->next = newnode;
newnode->next = NULL;
newnode2 = (Link)malloc(sizeof(Eqt));
strcpy(newnode2->type,"input");
newnode2->count = 3;
newnode2->remain = 2;
newnode2->equipment[0].number = 1003;
newnode2->equipment[1].number = 1004;
newnode2->equipment[2].number = 1005;
newnode2->equipment[0].lnumber = 1;
newnode2->equipment[1].lnumber = 2;
newnode2->equipment[2].lnumber = 3;
newnode2->equipment[0].state = 0;
newnode2->equipment[1].state = 0;
newnode2->equipment[2].state = 0;
newnode2->equipment[0].remain = 1;
newnode2->equipment[1].remain = 1;
newnode2->equipment[2].remain = 0;
strcpy(newnode2->equipment[0].jobname,"null");
strcpy(newnode2->equipment[1].jobname,"null");
strcpy(newnode2->equipment[2].jobname,"null");
newnode->next = newnode2;
newnode2->next = NULL;
newnode3 = (Link)malloc(sizeof(Eqt));
strcpy(newnode3->type,"drawing");
newnode3->count = 2;
newnode3->remain = 2;
newnode3->equipment[0].number = 1006;
newnode3->equipment[1].number = 1007;
newnode3->equipment[0].lnumber = 1;
newnode3->equipment[1].lnumber = 2;
newnode3->equipment[0].state = 1;
newnode3->equipment[1].state = 0;
newnode3->equipment[0].remain = 1;
newnode3->equipment[1].remain = 1;
strcpy(newnode3->equipment[0].jobname,"Job7");
strcpy(newnode3->equipment[1].jobname,"null");
newnode2->next = newnode3;
newnode3->next = NULL;
}
分配函数
/*****************************************
Function:
Description:
Calls:
Called by:
Input:
Output:
Return:
*****************************************/
#include"/root/process4/include/head.h"
void allocate(Link head)
{
Link p = head->next;
int i;
int j = 0;
char name[NUM_MAX];
char job_name[NUM_MAX];
system("clear");
printf("璇疯緭鍏ヨ鍒嗛厤鐨勮澶囩被鍚峔n");
scanf("%s",name);
while(p != NULL)
{
if((0 == strcmp(p->type,name)))
{
if(p->remain == 0)
{
printf("璁惧鏃犵┖闂瞈n");
break;
}
else
{
printf("璇疯緭鍏ヨ澶囨墍瑕佸崰鐢ㄧ殑浣滀笟杩涚▼\n");
scanf("%s",job_name);
for(i = 0; i < p->count; ++i)
{
if((p->equipment[i].remain == 1)&&(p->equipment[i].state == 0))
{
p->equipment[i].state = 1;
p->remain = p->remain-1;
strcpy(p->equipment[i].jobname,job_name);
j++;
printf("杈撳叆鎴愬姛\n");
break;
}
}
}
}
p = p->next;
}
if(j == 0)
{
printf("鏃犳墍杈撳叆鐨勮澶囩被鍚峔n");
}
// choose(&head);
}
回收函数
/*****************************************
Function:
Description:
Calls:
Called by:
Input:
Output:
Return:
*****************************************/
#include"/root/process4/include/head.h"
void delete1(Link head)
{
Link p = head->next;
int i;
int j = 0;
char name[NUM_MAX];
system("clear");
printf("璇疯緭鍏ヨ鍥炴敹鐨勮澶囩被鍚峔n");
scanf("%s",name);
while(p != NULL)
{
if((0 == strcmp(p->type,name)))
{
for(i = 0; i < p->count; ++i)
{
if((p->equipment[i].remain == 1))
{
p->equipment[i].state = 0;
p->remain = p->remain+1;
strcpy(p->equipment[i].jobname,"null");
}
}
j++;
break;
}
}
p = p->next;
if(j == 0)
{
printf("鏃犳墍杈撳叆鐨勮澶囩被鍚峔n");
}
}
显示函数
/*****************************************
Function:
Description:
Calls:
Called by:
Input:
Output:
Return:
*****************************************/
#include"/root/process4/include/head.h"
void display(Link head)
{
Link p = head->next;
Link q = head->next;
int i;
system("clear");
printf("*****************************************\n");
printf("* 璁惧绫昏〃 *\n");
printf("*****************************************\n");
printf("璁惧绫诲悕 璁惧鎬诲彴鏁? 绌洪棽鍙版暟\n");
while(p != NULL)
{
printf("%s\t\t%d\t\t%d\n",p->type,p->count,p->remain);
p = p->next;
}
printf("********************************************************************\n");
printf("* 璁惧鍒嗛厤琛? *\n");
printf("********************************************************************\n");
printf("璁惧鐩稿鍙? 璁惧缁濆鍙? 璁惧鏄惁瀹屽ソ 璁惧鏄惁鍒嗛厤 鍗犵敤浣滀笟杩涚▼\n");
while(q != NULL)
{
for(i = 0; i < q->count; ++i)
{
printf("%d\t\t%d\t\t%d\t\t%d\t\t%s\n",q->equipment[i].lnumber,q->equipment[i].number,
q->equipment[i].remain,q->equipment[i].state,q->equipment[i].jobname);
}
q = q->next;
}
}
Makefile我就不向上面粘贴了,昨天写了一下午,必须吐槽Linux红帽写代码的效率,真的慢,心累。。。。