oracle多线程删除,请教高手:多线程访问时如何实现删除一个文件?
如下要求:
當某一線程欲刪除一個文件時,如果另外一些線程正在訪問該文件。那么這些線程仍然可以對該文件進行操作。直到所有這些線程關閉了這個文件。該文件才被刪除。也就是說,只要有一個線程還打開著這個文件,該文件的物理空間就沒有真正地被刪除。(假設是單級目錄,即只有根目錄)
結構:
////////////////////////////////////
位圖模塊
class?BitMap?{
public:
BitMap(int?nitems);?????//初始化方法,給出位圖的大小,將所有位標明未用
~BitMap();?????//析構方法
void?Mark(int?which);???//標志第which位被占用
void?Clear(int?which);??//清除第which位
bool?Test(int?which);???//測試第which位是否被占用,若是,返TRUE
int?Find();????????????//找到第一個未被占用的位,標志其被占用;
//若沒有找到,返回-1
int?NumClear();?????//返回多少位沒有被占用
void?Print();?????//打印出整個位圖(調試用)
void?FetchFrom(OpenFile?*file);?//從一個文件中讀出位圖
void?WriteBack(OpenFile?*file);?//將位圖內容寫入文件
private:
...//內部實現屬性
};
////////////////////////////////////
文件頭的定義
class?FileHeader?{
public:
bool?Allocate(BitMap?*bitMap,?int?fileSize);
//通過文件大小初始化文件頭
//根據文件大小申請磁盤空間
void?Deallocate(BitMap?*bitMap);??//將一個文件占用的數據空間釋放
//(沒有釋放文件頭占用的空間)
void?FetchFrom(int?sectorNumber);?//從磁盤扇區中取出文件頭
void?WriteBack(int?sectorNumber);?//將文件頭寫入磁盤扇區
int?ByteToSector(int?offset);?????//文件邏輯地址向物理地址的轉換
int?FileLength();??????//返回文件長度
void?Print();??????//打印文件頭信息(調試用)
private:
int?numBytes;???//文件長度(字節數)
int?numSectors;???//文件占用的扇區數
int?dataSectors[NumDirect];???//文件索引表
};
///////////////////////////////////
文件系統模塊:
class?FileSystem?{
public:
FileSystem(bool?format);??????//生成方法
bool?Create(char?*name,?int?initialSize);?//生成一個文件
OpenFile*?Open(char?*name);??????//打開一個文件
bool?Remove(char?*name);???????//刪除一個文件
void?List();//列出文件系統中所有的文件
//(實際上就是根目錄中所有的文件)
void?Print();//列出文件系統中所有的文件和它們的內容
private:
OpenFile*?freeMapFile;//位圖文件打開文件結構
OpenFile*?directoryFile;//根目錄打開文件結構
};
////////////////////////////////////
Remove方法
語法:bool?Remove?(char?*name)
參數:name:需要刪除的文件名
功能:在當前的文件系統中刪除一個已有的文件
實現:在根目錄下搜尋該文件名
1.如果沒有搜索到,返回FALSE
2.如果搜索到,打開該文件并返回打開文件控制塊
2.1.將該文件從目錄中刪除
2.2.釋放FileHeader所占用的空間
2.3.釋放文件數據塊占用的空間
2.4.將對位圖和目錄的修改寫回磁盤
返回:如果刪除成功,返回TRUE;否則返回FALSE
bool?FileSystem::Remove(char?*name)
{
Directory?*directory;
BitMap?*freeMap;
FileHeader?*fileHdr;
int?sector;
directory?=?new?Directory(NumDirEntries);
directory->FetchFrom(directoryFile);
sector?=?directory->Find(name);
if?(sector?==?-1)?{
delete?directory;
return?FALSE;?//?file?not?found
}
fileHdr?=?new?FileHeader;
fileHdr->FetchFrom(sector);
freeMap?=?new?BitMap(NumSectors);
freeMap->FetchFrom(freeMapFile);
fileHdr->Deallocate(freeMap);??//?remove?data?blocks
freeMap->Clear(sector);//?remove?header?block
directory->Remove(name);
freeMap->WriteBack(freeMapFile);//?flush?to?disk
directory->WriteBack(directoryFile);????????//?flush?to?disk
delete?fileHdr;
delete?directory;
delete?freeMap;
return?TRUE;
}
如何修改remove方法和相應的文件結構,實現上面的要求?
|
由操作系統釋放,OS知道哪些進程打開了哪些文件。
創建一個臨時文件的典型做法就是用創建方式打開一個文件,然后馬上unlink,
但你可以繼續使用這個文件句柄讀/寫,當你close后磁盤空間才被釋放。
|
unix就是這樣做的。當你刪除一個文件時,它的目錄項被馬上刪除。但是只要還有進程打開了該文件,文件所占用的磁盤塊就沒有釋放,直到最后一個進程關閉該文件,文件所占磁盤空間才釋放。
建議:多看點Unix系統的書,少看點C++的書。
|
up
|
那你首先要實現對文件的打開記數。
|
用互斥和計數器,可以參照微軟的com技術中的關于addRef和release方法
|
那你是要在核心態實現還是用戶態?
如果在核心態,根據文件系統的數據結構是可以實現的。
如果在用戶態,嘿嘿,我看夠戧。
我不了解你的什么nachos。只是隨便說說,說錯了別見怪。
總結
以上是生活随笔為你收集整理的oracle多线程删除,请教高手:多线程访问时如何实现删除一个文件?的全部內容,希望文章能夠幫你解決所遇到的問題。