?? hdmemory.h
字號:
/****************************************************************************
*****************************************************************************
文件名稱: HDMEMORY.H
模塊名稱: 內存和硬盤管理模塊
模塊作用: 內存和硬盤的申請,釋放的管理
編寫者一: 賴惠芳(AP0006306)
編寫者二:
編寫日期:
完成日期:
程序行數: 250
*****************************************************************************
*****************************************************************************/
/****************************************************************************
模塊名稱: 內存和硬盤管理模塊
函 數 名: M_GET_MEMORY_FREE_TABLE
功 能: 得到當前內存的可用(空閑)頁數
入口參數: 無
出口參數: 返回可用的內存頁數
調用關系: 被作業調度進程(P2)調用
編 者: 賴惠芳(AP0006306)
編寫日期: 2003-10-12
完成日期: 2003-10-12
*****************************************************************************/
M_GET_MEMORY_FREE_TABLE()
{
int i=0,j;
/* 內存按頁式管理,總共有30頁 */
for(j=0;j<30;j++)
{
/* 如果內存的當前頁為空閑狀態,則空閑頁面數計數器加 1 */
if(MEMORY_TABLE[j] == 'F')
i++;
}
/* 返回可用的內存頁數*/
return(i);
}
/****************************************************************************
模塊名稱: 內存和硬盤管理模塊
函 數 名: M_MALLOC_MEMORY_TABLE
功 能: 向內存申請i頁空閑的空間
入口參數: int i 要申請的內存頁數
出口參數: 無
調用關系: 被作業調度進程(P2)調用
編 者: 賴惠芳(AP0006306)
編寫日期: 2003-10-12
完成日期: 2003-10-12
*****************************************************************************/
M_MALLOC_MEMORY_TABLE(int i)
{
int j,k=0;
/* 在30頁內存中循環檢查,哪些頁面是空閑狀態的 */
for(j=0;j<30;j++)
{
/* 如果該頁面空閑,則將該內存頁分配給要申請的作業 */
if(MEMORY_TABLE[j] == 'F')
{
/* 分配給作業后應置該內存頁已被占用 */
M_CHARGE_MEMORY_TABLE_STATUS(j,'T');
/* 將分配到的內存頁面頁號寫入作業的頁表中 */
J_INPUT_JOB_HEAD->j_next->j_job_table[k] = j;
/* 已分配的頁數加1 */
k++;
/* 如果已分配i頁,則跳出循環*/
if(k == i)
break;
}
}
/* -1 表示作業頁表中該項已經是最后一項,該項后面的所有項無效 */
for(;k<10;k++)
J_INPUT_JOB_HEAD->j_next->j_job_table[k] = -1;
}
/****************************************************************************
模塊名稱: 內存和硬盤管理模塊
函 數 名: M_CLEAR_MEMORY_JOB_HAD_TAKEN
功 能: 將當前運行完成的作業所占用的內存頁全部釋放
入口參數: 無(默認當前正在運行的作業)
出口參數: 無
調用關系: 當作業執行H指令或作業發生錯誤時調用
編 者: 賴惠芳(AP0006306)
編寫日期: 2003-10-12
完成日期: 2003-10-12
*****************************************************************************/
M_CLEAR_MEMORY_JOB_HAD_TAKEN()
{
int i;
/* 從作業的頁表中找出該作業所占用的內存頁*/
for(i=0;i<10;i++)
{
/* 如果該作業頁表不是-1,則表示應該釋放該頁面*/
if(RUNNING_QUEUE->p_next->p_job_table[i] != -1)
{
/* 將作業頁表中所指的內存頁號相應置為空閑狀態*/
M_CHARGE_MEMORY_TABLE_STATUS(RUNNING_QUEUE->p_next->p_job_table[i],'F');
/* 在圖形方式顯示清除內存頁面這一過程*/
M_G_DISPLAY_OR_CLEAN_DATA_TAKEN_USERBUF(RUNNING_QUEUE->p_next->p_job_table[i],0);
}
}
}
/****************************************************************************
模塊名稱: 內存和硬盤管理模塊
函 數 名: M_CLEAR_HARDDISK_JOB_HAD_TAKEN
功 能: 作業被P2調用后全部已裝入用戶存儲區后釋放占用的輸入井
入口參數: (JCB *P) 指向要釋放輸入井空間的作業的指針
出口參數: 無
調用關系: 當作業全部裝入用戶存儲或被P2調用過程中出錯,則調用該函數
編 者: 賴惠芳(AP0006306)
編寫日期: 2003-10-12
完成日期: 2003-10-12
*****************************************************************************/
M_CLEAR_HARDDISK_JOB_HAD_TAKEN(JCB *p)
{
int i;
/* 在作業的占用硬盤頁表中查找*/
for(i=0;i<10;i++)
{
/* 如果該頁表數值有效,則釋放對應的輸入井空間*/
if(p->j_hd_table[i] != -1)
{
/* 將輸入井置為空*/
HARDDISK_TRACK[p->j_hd_table[i]] = 'F';
/* 圖形方式下顯示這一過程 */
M_G_DISPLAY_OR_CLEAN_INPUT_BUF(p->j_hd_table[i],0);
}
else
break;
}
}
/****************************************************************************
模塊名稱: 內存和硬盤管理模塊
函 數 名: M_MALLOC_SPACE_FOR_JOB_FROM_HARDDISK
功 能: 向輸入井申請空間,只申請一道(硬盤按道管理)
入口參數: (JCB *tempjcb) 指向要申請輸入井空間的作業的指針
出口參數: 無
調用關系: 被P2調用
編 者: 賴惠芳(AP0006306)
編寫日期: 2003-10-12
完成日期: 2003-10-12
*****************************************************************************/
M_MALLOC_SPACE_FOR_JOB_FROM_HARDDISK(JCB *tempjcb)
{
int i,j,pre=HARDDISK_TRACK_INDEX;
int *table;
table = tempjcb->j_hd_table;
for(i=0;i<10;i++)
{
if(table[i] == -1)
break;
else
pre = table[i];
}
if(i >= 10)
return(FALSE);
else
{
for(j=0;j<100;j++)
{
pre++;
pre %= 100;
if(HARDDISK_TRACK[pre] == 'F')
{
HARDDISK_TRACK[pre] = 'T';
table[i] = pre;
HARDDISK_TRACK_INDEX = pre;
/* [0]是圖形方式下顯示需要的附加變量*/
LINE_FROM_SYSTEM_MEMORY_TO_INPUT_BUF_INDEX[0] = pre;
tempjcb->j_index = i;
if(i+1 < 10)
table[i+1] = -1;
break;
}
}
if(j<100)
return(TRUE);
}
}
/****************************************************************************
模塊名稱: 內存和硬盤管理模塊
函 數 名: M_CHECK_WHETHER_HAVE_SPACE_IN_HARDDISK
功 能: 檢查硬盤是否存在空閑空間(硬盤按道管理)
入口參數: 無
出口參數: 如果有空間返回真,否則返回假
調用關系: 被P1調用
編 者: 賴惠芳(AP0006306)
編寫日期: 2003-10-12
完成日期: 2003-10-12
*****************************************************************************/
M_CHECK_WHETHER_HAVE_SPACE_IN_HARDDISK()
{
/* 如果磁盤還存在空間,則返回真 */
int i;
for(i=0;i<100;i++)
{
/* 只要存在一道硬盤空閑空間,就返回真*/
if(HARDDISK_TRACK[i] == 'F')
return(TRUE);
}
return(FALSE);
}
/****************************************************************************
模塊名稱: 內存和硬盤管理模塊
函 數 名: M_CHANGE_POSITION_OF_LENGTH_TO_POSITION_OF_HARDDISK
功 能: 將作業中某一字節(地址以邏輯方式)轉換成硬盤的絕對地址
入口參數: (JCB *j)要轉換地址的作業
出口參數: 無(以全局變量HDWPOINTERR返回)
調用關系: 被P1,P2調用
編 者: 賴惠芳(AP0006306)
編寫日期: 2003-10-12
完成日期: 2003-10-12
*****************************************************************************/
M_CHANGE_POSITION_OF_LENGTH_TO_POSITION_OF_HARDDISK(JCB *j)
{
int page,offset,block;
/* 先轉換成該作業硬盤頁表的數組下標*/
page = (j->j_loaded_length -1) / 10;
/* 再轉換成硬盤的道號*/
block = j->j_hd_table[page];
/* 再得到道內的偏移量*/
offset = (j->j_loaded_length - 1) % 10;
/* 將道號X道的長度+偏移量,則是絕對地址*/
HDWPOINTER = block * 10 + offset;
}
/****************************************************************************
模塊名稱: 內存和硬盤管理模塊
函 數 名: M_GET_JOB_CURRENT_HARDDISK_INDEX_AND_MEMORY_INDEX
功 能: 將一個作業的當前位置轉換成內存和硬盤的絕對地址
入口參數: int offset 該作業的邏輯地址(當前位置+偏移量)
int *hdi 該作業對應的硬盤道號
int *mmi 該作業對應的內存頁號
出口參數: 用指針方式返回兩個值,硬盤道號和內存頁號
調用關系: 被P2調用
編 者: 賴惠芳(AP0006306)
編寫日期: 2003-10-12
完成日期: 2003-10-12
*****************************************************************************/
M_GET_JOB_CURRENT_HARDDISK_INDEX_AND_MEMORY_INDEX(int offset,int *hdi,int *mmi)
{
int l;
l = J_INPUT_JOB_HEAD->j_next->j_loaded_length;
l += offset;
if(l<0)
return(FALSE);
*hdi = J_INPUT_JOB_HEAD->j_next->j_hd_table[l/10];
*mmi = J_INPUT_JOB_HEAD->j_next->j_job_table[l/10];
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -