如下要求:

当某一线程欲删除一个文件时,如果另外一些线程正在访问该文件。那么这些线程仍然可以对该文件进行操作。直到所有这些线程关闭了这个文件。该文件才被删除。也就是说,只要有一个线程还打开着这个文件,该文件的物理空间就没有真正地被删除。(假设是单级目录,即只有根目录)

结构:

////////////////////////////////////

位图模块

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多线程删除,请教高手:多线程访问时如何实现删除一个文件?相关推荐

  1. mysql中用于删除数据的是什么意思_在删除关系表中数据时,要先删除主表数据再删除从表数据。_学小易找答案...

    [单选题]在MySQL中,所有存储过程的信息存放在下列哪个数据库中 [填空题]拉伸试验能测定的塑性指标有: 和 . [单选题]下面查看视图的基本信息的语句中,正确的是 [单选题]下面关于视图建立的说法 ...

  2. 如何配置log4j每天产生日志,并且当天日志大于10M时自动生成另一个文件

    http://bbs.csdn.net/topics/390635339?page=1 如何配置log4j每天产生日志,并且当天日志大于10M时自动生成另一个文件 假设 11-11日 生成comlib ...

  3. hdfs dfs -put_通过HDFS中的`hdfs dfs -put`命令行上传文件时,如何设置一个文件的复制因子?...

    hdfs dfs -put When uploading a file by the hdfs dfs -put command line in HDFS, how to set a replicat ...

  4. PPT内嵌视频(指发布时只需要ppt一个文件即可)

    做实验时用手机拍了视频,想把视频嵌入到PPT中.只是单纯的嵌入很容易,但是我想将PPT推送给其他人时,不需要再传视频文件.搜了一下做法,可以通过flash视频格式实现.电脑为thinkpad笔记本,w ...

  5. 怎样把计算机里的图片快速删除,如何批量删除重复图片 电脑中相同图片批量删除的方法...

    因为工作需要,在电脑上存了大量的图片,有些是从网站上批量下载的,这里面难免会有许多重复的,如果数量少的话,一张张地看,再一张张的删除重复图片那还行得通.可是当你一个文件夹里就有几千上万张的图片时,再用 ...

  6. Oracle字符串转BooIean,利用Java的多线程技术实现数据库的访问.pdf

    利用Java的多线程技术实现数据库的访问.pdf 第 卷第 期 计算机应用 22 12 Voi .22 , No . 12 年 月 2002 12 Computer Appiications Dec ...

  7. 多线程对共享资源的访问

    一.什么是多线程? 线程是程序中一个单一的顺序控制流程.在单个程序中同时运行多个线程完成不同的工作,称为多线程. 所有的线程虽然在微观上是串行执行的,但是在宏观上你完全可以认为它们在并行执行 二.那什 ...

  8. linux编写一个简单的端口扫描程序,小弟我在linux下写了个简单的多线程端口扫描程序,运行时出现有关问题,请问一下(2)...

    当前位置:我的异常网» Linux/Unix » 小弟我在linux下写了个简单的多线程端口扫描程序, 小弟我在linux下写了个简单的多线程端口扫描程序,运行时出现有关问题,请问一下(2) www. ...

  9. 拒绝你访问计算机 无法删除,电脑删除文件或文件夹时出错无法删除访问如何解决?...

    我们在使用电脑的时候,发现不需要这个文件了或者整个文件夹不要了,想将它删除掉:但在删除的过程中,发现删除不了,提示:删除文件或文件夹出错" 或"文件夹访问被拒绝".怎么办 ...

最新文章

  1. Python中正则匹配与中文的问题
  2. 吴恩达Deeplearning.ai国庆节上新:生成对抗网络(GAN)专项课程
  3. 逻辑模型三要素-数据操作
  4. HDU 4282 A very hard mathematic problem 二分题目
  5. 推荐一个有趣的Chrome扩展程序-查看任意网站的开发技术栈
  6. Log4Net配置使用简记
  7. layui 如何去dom_javascript 怎么去引用layui里面的方法
  8. linux win7 默认启动,请教:我的grub.cfg里面的内容如下,请教怎样改代码才能让WIN7设为默认启动...
  9. [上海]招募.net网站测试员(实习/见习)
  10. activiti高亮显示图片_电气自动化控制中,工业显示器应用如何“硬核”拓展细分领域?...
  11. golang websocket 聊天室demo
  12. 数据结构笔记(二十七)-- 图的深度优先遍历
  13. nginx+tomcat+msm实现seesion共享
  14. dnfdpl服务器维护了,2019DNF心悦DPL赛事活动地址 强化器和时空石没了
  15. HashMap 的底层结构和原理
  16. Unity 截屏时,安卓和编辑器下,Rect的坑
  17. 业界 | 摩根大通报告12个亮点总结:金融领域的机器学习工具有哪些?
  18. 【codeforces 417D】Cunning Gena
  19. vue简易微前端项目搭建(一):项目背景及简介
  20. 【英语六级】【仔细阅读】(1)

热门文章

  1. 众所周知的局域网聊天软件
  2. 即时通讯飞鸽传书民意soft需求
  3. 把exe里面的资源通通取出来
  4. python通过ssh配置交换机_配置(通过SSH)Cisco交换机的Python脚本
  5. 导师没有教你的“潜规则”
  6. 一个R包玩转单细胞免疫组库分析,还能与Seurat无缝对接
  7. 重磅综述:三万字长文读懂单细胞RNA测序分析的最佳实践教程 (原理、代码和评述)
  8. Mac效率软件|HazeOver轻松虚化背景,专注当前任务窗口
  9. linux启动大叶机制,DPDK-Suricata应用部署
  10. 1.5编程基础之循环控制_45金币