天天看點

作業系統實驗-----檔案系統作業系統實驗-----檔案系統

作業系統實驗-----檔案系統

Y.xj

一,實驗目的

​ 本實驗要求在假設的I/O系統之上開發一個簡單的檔案系統,這樣做既能讓實驗者對檔案系統有整體了解,又避免了涉及過多細節。使用者通過create, open,read等指令與檔案系統互動。檔案系統把磁盤視為順序編号的邏輯塊序列,邏輯塊的編号為L至L-1。I/O系統利用記憶體中的數組模拟磁盤。

二,實驗内容

  • I/O系統:

    ​ 實際實體磁盤的結構是多元的:有柱面、磁頭、扇區等概念。I/O系統的任務是隐藏磁盤的結構細節,把磁盤以邏輯塊的面目呈現給檔案系統。邏輯塊順序編号,編号取值範圍為0至L**−1,其中L表示磁盤的存儲塊總數。實驗中,我們可以利用數組ldisk[C][H][B]建構磁盤模型,其中CHB 分别表示柱面号,磁頭号和扇區号。每個扇區大小為512位元組。I/O系統從檔案系統接收指令,根據指令指定的邏輯塊号把磁盤塊的内容讀入指令指定的記憶體區域,或者把指令指定的記憶體區域内容寫入磁盤塊。檔案系統和I/O系統之間的接口由如下兩個函數定義:

    • read_block(int i, char *p);

    該函數把邏輯塊i的内容讀入到指針p指向的記憶體位置,拷貝的字元個數為存儲塊的長度B。

    • write block(int i, char *p);

    該函數把指針p指向的内容寫入邏輯塊i,拷貝的字元個數為存儲塊的長度B。此外,為了友善測試,我們還需要實作另外兩個函數:一個用來把數組ldisk 存儲到檔案;另一個用來把檔案内容恢複到數組。
  • 檔案系統:

    ​ 檔案系統位于I/O系統之上

    檔案系統需提供如下函數;create, destroy, open, read, write。

    • create(filename): 根據指定的檔案名建立新檔案。

    • destroy(filename): 删除指定檔案。

    • open(filename): 打開檔案。該函數傳回的索引号可用于後續的read, write, lseek,或close操作。

    • close(index): 關閉制定檔案。

    • read(index, mem_area, count): 從指定檔案順序讀入count個位元組memarea指定的記憶體位置。讀操作從檔案的讀寫指針訓示的位置開始。

    • write(index, mem_area, count): 把memarea指定的記憶體位置開始的count個位元組順序寫入指定檔案。寫操作從檔案的讀寫指針訓示的位置開始。

    • lseek(index, pos): 把檔案的讀寫指針移動到pos指定的位置。pos是一個整數,表示從檔案開始位置的偏移量。檔案打開時,讀寫指針自動設定為0。每次讀寫操作之後,它指向最後被通路的位元組的下一個位置。lseek能夠在不進行讀寫操作的情況下改變讀寫指針能位置。

    • directory: 清單顯示所有檔案及其長度。

  • 模拟系統需要的結構體和宏定義
#define B		10			//存儲塊長度
#define L		500			//存儲塊總數
#define K		100			//保留區大小
#define BUSY	1
#define FREE	0
#define OK		1
#define ERROR	0
#define FILE_BLOCK_LENGTH		(B-3)				//檔案配置設定磁盤塊号數組長度
#define FILE_NAME_LENGTH		(B-1)				//最長檔案名長度
#define FILE_SIGN_AREA			((L-1-K)/B+1)		//保留區中檔案辨別符起始塊号(位圖之後)
#define FILE_NUM				FILE_BLOCK_LENGTH	//目錄内最多檔案數目
#define BUFFER_LENGTH			25					//打開檔案表目中的緩沖區長度
#define INPUT_LENGTH			100					//寫檔案時最大輸入長度
#define OUTPUT_LENGTH			100					//讀檔案時最大讀出長度



struct filesign {							//檔案描述符
	int file_length;						//檔案長度
	int filesign_flag;						//占用辨別位
	int file_block;							//檔案配置設定磁盤塊号數組實際長度
	int file_block_ary[FILE_BLOCK_LENGTH];	//檔案配置設定磁盤塊号數組
};

struct contents {							//目錄項
	char filename[FILE_NAME_LENGTH];		//檔案名
	int	 filesignnum;						//檔案描述符序号
};

struct openfilelist {						//打開檔案表表目
	char buffer[BUFFER_LENGTH];				//讀寫緩沖區
	int pointer[2];							//讀寫指針(檔案内容的位置)
	int filesignnum;						//檔案描述符
	int flag;								//占用符
};

char ldisk[L][B];						//用字元數組模拟磁盤

openfilelist open_list[FILE_NUM];		//打開檔案表
           
  • 核心函數的編寫
void read_block(int, char*);
/**************************讀磁盤塊
該函數把邏輯塊的内容讀入到指針指向的記憶體位置
拷貝的字元個數為存儲塊的長度。
***************************/

void write_block(int, char*);
/**************************寫磁盤塊
該函數把指針p指向的内容寫入邏輯塊i
拷貝的字元個數為a存儲塊的長度。
***************************/

void Init();
/**************************初始化磁盤
将磁盤全部置空
然後建立0号檔案描述符為根目錄的檔案描述符
初始化位圖區
***************************/

int create(char*);
/**************************根據檔案名建立檔案。
.找空閑檔案描述符
.在檔案目錄裡為新建立的檔案配置設定一個目錄項,(可能需要為目錄檔案配置設定新的磁盤塊)
.在配置設定到的目錄項裡記錄檔案名以及描述符編号
.傳回狀态資訊
***************************/

int destroy(char*);
/**************************删除指定檔案
.在目錄裡搜尋該檔案的描述符編号
.删除該檔案對應的目錄項并更新位圖
.釋放檔案描述符
.傳回狀态資訊
***************************/

int open(char*);
/***************************打開檔案t
該函數返|回的索引号可用于後續的read, write, lseek, 或close 操作
.搜尋目錄找到檔案對應的描述符序号
.在打開檔案表中配置設定一個表目
.在配置設定到的表目中把讀寫指針置為并記錄描述符編号
.讀入檔案t的第一塊到ì讀寫緩沖區中
.傳回配置設定到的表à目在打開檔案表中的索引号
***************************/

int close(int);
/***************************關閉檔案t
.把緩沖區的内容寫入磁盤
.釋放該檔案再打開檔案表中對應的表目
.傳回狀态資訊
***************************/

void Init_block(char, int);
/**************************初始化一個字元數組塊
處理的字元數組塊長度為a
内容為'\0'
***************************/

int read(int, int, int);
int write(int, int, int);
int write_buffer(int, int);
int lseek(int, int);
           

三,實驗結果

  • 首先進入程式運作界面,彈出系統使用說明書
作業系統實驗-----檔案系統作業系統實驗-----檔案系統
  • 顯示檔案目錄的内容
作業系統實驗-----檔案系統作業系統實驗-----檔案系統
  • 建立一個新的檔案
作業系統實驗-----檔案系統作業系統實驗-----檔案系統
  • 删除一個檔案
作業系統實驗-----檔案系統作業系統實驗-----檔案系統
  • 檢視檔案索引号
作業系統實驗-----檔案系統作業系統實驗-----檔案系統
  • 讀操作
作業系統實驗-----檔案系統作業系統實驗-----檔案系統
  • 寫操作
作業系統實驗-----檔案系統作業系統實驗-----檔案系統
  • 關閉操作
作業系統實驗-----檔案系統作業系統實驗-----檔案系統
  • 實時檢視磁盤存儲狀況
作業系統實驗-----檔案系統作業系統實驗-----檔案系統
作業系統實驗-----檔案系統作業系統實驗-----檔案系統

GITHUB位址:

這裡

繼續閱讀