操作系统_独占设备的分配、回收实验

独占设备的分配、回收等主要算法的原理。 
为了提高操作系统的可适应性和可扩展性,现代操作系统中都毫无例外地实现了设备独立性,又叫做设备无关性。设备独立性的含义是:应用程序独立于具体使用的物理设备。  为了实现独占设备的分配,系统设置数据表格的方式也不相同,在实验中只要设计合理即可。这里仅仅是一种方案,采用设备类表和设备表。 
(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红帽写代码的效率,真的慢,心累。。。。













  • 1
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值