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多线程删除,请教高手:多线程访问时如何实现删除一个文件?相关推荐
- mysql中用于删除数据的是什么意思_在删除关系表中数据时,要先删除主表数据再删除从表数据。_学小易找答案...
[单选题]在MySQL中,所有存储过程的信息存放在下列哪个数据库中 [填空题]拉伸试验能测定的塑性指标有: 和 . [单选题]下面查看视图的基本信息的语句中,正确的是 [单选题]下面关于视图建立的说法 ...
- 如何配置log4j每天产生日志,并且当天日志大于10M时自动生成另一个文件
http://bbs.csdn.net/topics/390635339?page=1 如何配置log4j每天产生日志,并且当天日志大于10M时自动生成另一个文件 假设 11-11日 生成comlib ...
- 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 ...
- PPT内嵌视频(指发布时只需要ppt一个文件即可)
做实验时用手机拍了视频,想把视频嵌入到PPT中.只是单纯的嵌入很容易,但是我想将PPT推送给其他人时,不需要再传视频文件.搜了一下做法,可以通过flash视频格式实现.电脑为thinkpad笔记本,w ...
- 怎样把计算机里的图片快速删除,如何批量删除重复图片 电脑中相同图片批量删除的方法...
因为工作需要,在电脑上存了大量的图片,有些是从网站上批量下载的,这里面难免会有许多重复的,如果数量少的话,一张张地看,再一张张的删除重复图片那还行得通.可是当你一个文件夹里就有几千上万张的图片时,再用 ...
- Oracle字符串转BooIean,利用Java的多线程技术实现数据库的访问.pdf
利用Java的多线程技术实现数据库的访问.pdf 第 卷第 期 计算机应用 22 12 Voi .22 , No . 12 年 月 2002 12 Computer Appiications Dec ...
- 多线程对共享资源的访问
一.什么是多线程? 线程是程序中一个单一的顺序控制流程.在单个程序中同时运行多个线程完成不同的工作,称为多线程. 所有的线程虽然在微观上是串行执行的,但是在宏观上你完全可以认为它们在并行执行 二.那什 ...
- linux编写一个简单的端口扫描程序,小弟我在linux下写了个简单的多线程端口扫描程序,运行时出现有关问题,请问一下(2)...
当前位置:我的异常网» Linux/Unix » 小弟我在linux下写了个简单的多线程端口扫描程序, 小弟我在linux下写了个简单的多线程端口扫描程序,运行时出现有关问题,请问一下(2) www. ...
- 拒绝你访问计算机 无法删除,电脑删除文件或文件夹时出错无法删除访问如何解决?...
我们在使用电脑的时候,发现不需要这个文件了或者整个文件夹不要了,想将它删除掉:但在删除的过程中,发现删除不了,提示:删除文件或文件夹出错" 或"文件夹访问被拒绝".怎么办 ...
最新文章
- Python中正则匹配与中文的问题
- 吴恩达Deeplearning.ai国庆节上新:生成对抗网络(GAN)专项课程
- 逻辑模型三要素-数据操作
- HDU 4282 A very hard mathematic problem 二分题目
- 推荐一个有趣的Chrome扩展程序-查看任意网站的开发技术栈
- Log4Net配置使用简记
- layui 如何去dom_javascript 怎么去引用layui里面的方法
- linux win7 默认启动,请教:我的grub.cfg里面的内容如下,请教怎样改代码才能让WIN7设为默认启动...
- [上海]招募.net网站测试员(实习/见习)
- activiti高亮显示图片_电气自动化控制中,工业显示器应用如何“硬核”拓展细分领域?...
- golang websocket 聊天室demo
- 数据结构笔记(二十七)-- 图的深度优先遍历
- nginx+tomcat+msm实现seesion共享
- dnfdpl服务器维护了,2019DNF心悦DPL赛事活动地址 强化器和时空石没了
- HashMap 的底层结构和原理
- Unity 截屏时,安卓和编辑器下,Rect的坑
- 业界 | 摩根大通报告12个亮点总结:金融领域的机器学习工具有哪些?
- 【codeforces 417D】Cunning Gena
- vue简易微前端项目搭建(一):项目背景及简介
- 【英语六级】【仔细阅读】(1)
热门文章
- 众所周知的局域网聊天软件
- 即时通讯飞鸽传书民意soft需求
- 把exe里面的资源通通取出来
- python通过ssh配置交换机_配置(通过SSH)Cisco交换机的Python脚本
- 导师没有教你的“潜规则”
- 一个R包玩转单细胞免疫组库分析,还能与Seurat无缝对接
- 重磅综述:三万字长文读懂单细胞RNA测序分析的最佳实践教程 (原理、代码和评述)
- Mac效率软件|HazeOver轻松虚化背景,专注当前任务窗口
- linux启动大叶机制,DPDK-Suricata应用部署
- 1.5编程基础之循环控制_45金币