資源簡介
操作系統中的實驗,用C語言實現循環首次適應算法的功能
代碼片段和文件信息
#include?
#include?
#define?MAX_SIZE?128?//系統分配給用戶的最大內存
typedef?struct?MCB{//內存控制塊
int?add;???????//分區起始地址
int?sta;???????//分區狀態,0為可用
int?size;??????//分區大小
int?jno;???????//分區裝入作業號作業號從1開始
struct?MCB*?next;?//鏈連指針8
}MCB;
MCB?*free_table*ft;??//可用分區的頭指針,尾指針
MCB?*used_table*ut;??//已分配分區的頭指針,尾指針
MCB?*next_ft=NULL;????//??********************?added?下一個可用分區的頭指針
/*?函數聲明?*/
void?initFree_table();
void?initUsed_table();
void?add_ut(MCB?*pfint?sizeint?jno);
int?Is_Jno_Exists(int?jno);?//??********************??added???判斷改作業是否存在
void?allot(int?jnoint?size);
void?reclaim(int?jno);
void?displayUt(MCB?*pMCB);
void?displayFt(MCB?*pMCB);
/*?函數定義?*/
void?initFree_table()//初始化可用區鏈表初始大小為整個用戶分區
{
if(!(free_table=(MCB*)malloc(sizeof(struct?MCB))))
exit(1);
free_table->add?=?0;
free_table->size?=?MAX_SIZE;
free_table->sta?=?0;
free_table->jno?=?0;
free_table->next?=?NULL;
ft=free_table;
}
void?initUsed_table()//初始化已分配分區鏈表
{
if(!(used_table=(MCB*)malloc(sizeof(struct?MCB))))
exit(1);
used_table->add?=?0;
used_table->size?=?0;
used_table->sta?=?1;
used_table->jno?=?0;
used_table->next?=?NULL;
ut=used_table;
}
void?add_ut(MCB?*pfint?sizeint?jno)
{
//修改已分配鏈表
if(used_table->next?==?NULL?&&?used_table->size?==?0)
{//已用分區表的第一塊
used_table->add?=?pf->add;
used_table->size?=?size;
used_table->jno?=?jno;
}else{//將新增分區加到已分配鏈表末尾
//pt為臨時MCB
MCB?*pt;
if(!(pt=(MCB*)malloc(sizeof(struct?MCB))))
exit(1);
pt->size?=?size;
pt->add?=?pf->add;
pt->jno?=?jno;
pt->sta?=?1;
pt->next?=?NULL;
ut->next?=?pt;
ut?=?ut->next;
}
}
int?Is_Jno_Exists(int?jno)//??********************??added?
{
int?Is_Exists?=?0;
MCB?*tmp_usedtable=used_table;
while(NULL?!=?tmp_usedtable)
{
if?(jno?==?tmp_usedtable->jno)
{
Is_Exists?=1;
break;
}
tmp_usedtable?=?tmp_usedtable->next;
}
return?Is_Exists;
}
void?allot(int?jnoint?size)//首次適應法為作業分配存儲空間
{
????????MCB?*pf?=?NULL;
???? MCB?*p?=?NULL;?
MCB?*q?=?free_table;///
if((jno?<=?0?)||(1?==?Is_Jno_Exists(jno)))??/*?jno小于0或jno有重復?*/
{
printf(“輸入作業號有誤請重新輸入!\n“);
return;
}
if(size?>?MAX_SIZE)
{
printf(“作業太大,無法分配!\n“);
return;
}
if(size?<=?0)
{
printf(“作業大小不合法!\n“);
}
/*********************??startadded??*/
if?(NULL?==?next_ft)??//?下一個空閑列表節點為空,表明已到末尾,則回到空閑列表開頭開始掃描?
{
????pf?=?free_table;
????p?=?pf;
}
else
{
????pf?=?next_ft;
????p?=?pf;?
}
while?(q->next?!=next_ft)?//new
????????????????????{
??????????????????????next_ft?=?q->next?;
????????????????????}
????????????
//查空白分區鏈表
while(pf?!=?NULL?&&?pf->size? {
p?=?pf;
pf?=?pf->next;
}
????????????????/*********************??endadded??*/???
if(?(pf?==?NULL)?&&?(?NULL?!=?ne
- 上一篇:控制臺嵌入MFC
- 下一篇:c++primerplus第六版源碼
評論
共有 條評論