Chinaunix

标题: 关于刚才那个删除目录的帖子 [打印本页]

作者: flw2    时间: 2007-09-26 14:42
标题: 关于刚才那个删除目录的帖子
版主怎么关了呢。楼主基础还是有问题,竟然说和mv比较

以下是我的回复


版主已经说的差不多完了
UNIX操作系统的接口向来都是精简,而且确实是没有必要,操作系统来做比不更简单,它还是要一个一个的删除(也许可以有某种文件系统很快就能删除一个目录,但是我没有遇到过,应该是实现这种文件系统代价较大),linux支持不同文件系统,接口要一致,如果吧删除这个接口的改为如果是目录则删除整个目录树,不觉得很别扭吗,
还有,我觉得也很重要的,这个功能没有什么用,你会用rm -rf,但是谁的程序里面会去删除一颗树?多吗?

删除一个文件+rm -rf太完美了
作者: flw2    时间: 2007-09-26 14:45
网络问题,重复一个了
你用的mv的实现就是改名而已,并不涉及太多磁盘操作,就好比删除一个1G的文件并不比1K的文件多多少时间一样,快慢取决于磁盘操作了多少次
作者: oyd_admin    时间: 2007-09-26 14:47
我也不知道为什么版主把帖子关掉了,他们都还不知道我在问什么,还是你理解我
作者: oyd_admin    时间: 2007-09-26 14:54
兼容不同的文件系统,这个理由不错。毕竟,如果所有文件系统都能实现一次删除整棵树的话,那么rm -rf的行为就是吃多了。

但是,我一开始就问的是文件系统的问题,是版主非要扯到操作系统的接口问题上。

另外mv好像不仅仅是改名,mv a/ ../   这个仅仅是改名吗?
作者: 思一克    时间: 2007-09-26 14:57
文件系统的问题本来就是OS接口的问题吗。不是扯到的,而是本质的。
还有一个错误的认识:一个程序放到操作系统中一定比在用户状态快。


原帖由 oyd_admin 于 2007-9-26 14:54 发表
兼容不同的文件系统,这个理由不错。毕竟,如果所有文件系统都能实现一次删除整棵树的话,那么rm -rf的行为就是吃多了。

但是,我一开始就问的是文件系统的问题,是版主非要扯到操作系统的接口问题上。

另 ...

作者: flw2    时间: 2007-09-26 14:59
他们知道你在问什么
你现在明白了mv为什么不花时间吗
如果你认为要支持那个功能,那么别人也许会说不要,如果你坚持要,那你的理由就有点成为“功能越多越好了”,那操作系统就会很难维护。
作者: oyd_admin    时间: 2007-09-26 15:05
还有,我当然知道rm比mv慢,我也知道rm为什么这么慢,我是想知道有没有可能(例如设计一种新的文件系统和算法)使得rm和mv速度在一个级别上。

也许你们体会不到,但是当你删除一棵目录树需要半个小时的时候,你就明白我的意思了。

升级硬件?见鬼去吧,以后只要有解决不了的性能问题,都可以说一句升级硬件吗?
作者: net_robber    时间: 2007-09-26 15:08
原帖由 oyd_admin 于 2007-9-26 15:05 发表
还有,我当然知道rm比mv慢,我也知道rm为什么这么慢,我是想知道有没有可能(例如设计一种新的文件系统和算法)使得rm和mv速度在一个级别上。

...



任务比较艰巨
作者: oyd_admin    时间: 2007-09-26 15:09
难道文件系统的设计,一定要先删除子目录,父目录才能删除吗?

他们都以为我在问为什么递归删除的功能不放在内核中,实际上我在问为什么要递归删除,我不认为这两个是同一种问题。
作者: flw2    时间: 2007-09-26 15:13
原帖由 oyd_admin 于 2007-9-26 15:05 发表
还有,我当然知道rm比mv慢,我也知道rm为什么这么慢,我是想知道有没有可能(例如设计一种新的文件系统和算法)使得rm和mv速度在一个级别上。

也许你们体会不到,但是当你删除一棵目录树需要半个小时的时候,你 ...

当然可能。但是这是需要代价的。
我们所谓的文件系统,都是“通用文件系统”
如果一个80G的硬盘只能存40G文件,你干吗。当然我只是举个例子,实际的代价并不一定是这样的



而且
mv /tmp/file /就是个rename(mv会先检查它们是不是一个文件系统,或者类似的)
作者: wszhl    时间: 2007-09-26 15:13
原帖由 oyd_admin 于 2007-9-26 15:09 发表
他们都以为我在问为什么递归删除的功能不放在内核中,实际上我在问为什么要递归删除,我不认为这两个是同一种问题。

貌似是这样的。
作者: oyd_admin    时间: 2007-09-26 15:26
原帖由 flw2 于 2007-9-26 15:13 发表

当然可能。但是这是需要代价的。
我们所谓的文件系统,都是“通用文件系统”
如果一个80G的硬盘只能存40G文件,你干吗。当然我只是举个例子,实际的代价并不一定是这样的



而且
mv /tmp/file /就是个 ...


原来是这样子呀,也许这个问题在冯诺依曼体系下都是无法完美解决的了。
我刚又想到了内存的分配释放其实也存在类似的问题,当进程内分配了无数小块内存后,要在进程内释放,也很花时间。不过强行结束进程好像就很快的样子,而且内存也回收了。不知道文件系统能不能借鉴一下这个
作者: 思一克    时间: 2007-09-26 15:35
本质就是这样的。

文件系统比一个有千万个货架的仓库,每个架子上还有盒子,里面还有小盒子。
现在要将1,8, x, y, z, x1, a1, .......N号码的盒子中的东西誊空(或做标记)。还要保留其他的不动。本来就是一个大的工作量吗。

如果你可以仓库中其他都不要了,连盒子也不要了,那爆破掉速度就快了。
作者: net_robber    时间: 2007-09-26 15:44
原帖由 oyd_admin 于 2007-9-26 14:54 发表
兼容不同的文件系统,这个理由不错。毕竟,如果所有文件系统都能实现一次删除整棵树的话,那么rm -rf的行为就是吃多了。

但是,我一开始就问的是文件系统的问题,是版主非要扯到操作系统的接口问题上。

另 ...

修改了数的节点的位置,仅此而已
作者: oyd_admin    时间: 2007-09-26 16:24
不知道谁有文件系统的起源方面的资料,就是那种阐述文件系统为什么会成为现在这样的文章。

我刚才试图设计一种能快速rm -R的文件系统,但是发现无论怎么实现,它都无法快速的mv了。
mv操作应该是比rm更频繁的,看来文件系统设计成现在这个样子是不无道理的。
作者: 塑料袋    时间: 2007-09-26 16:43
原帖由 oyd_admin 于 2007-9-26 15:09 发表
难道文件系统的设计,一定要先删除子目录,父目录才能删除吗?

他们都以为我在问为什么递归删除的功能不放在内核中,实际上我在问为什么要递归删除,我不认为这两个是同一种问题。



不递归删除,还能怎样删除啊?除非你的文件逻辑结构不是树
作者: scutan    时间: 2007-09-26 16:48
原帖由 oyd_admin 于 2007-9-26 16:24 发表
不知道谁有文件系统的起源方面的资料,就是那种阐述文件系统为什么会成为现在这样的文章。

我刚才试图设计一种能快速rm -R的文件系统,但是发现无论怎么实现,它都无法快速的mv了。
mv操作应该是比rm更频繁 ...


<Linux 内核源代码情景分析> 上册第五章讲的文件系统.
<UNIX操作系统设计> 上面也有.
作者: cugb_cat    时间: 2007-09-26 19:20
原帖由 思一克 于 2007-9-26 15:35 发表
本质就是这样的。

文件系统比一个有千万个货架的仓库,每个架子上还有盒子,里面还有小盒子。
现在要将1,8, x, y, z, x1, a1, .......N号码的盒子中的东西誊空(或做标记)。还要保留其他的不动。本来就是 ...

对头,很久以前,在偶还理解不了什么是文件系统的时候,我就用这个比喻来给自己解释什么是文件系统。

rm操作是要遍历目录树中的节点,mv只是操作顶部目录的节点,如果想rm的速度快起来,那只能重新设计文件系统了,能够让rm时只操作那一个节点结构就行了
作者: silasoni    时间: 2007-09-26 22:21
原帖由 塑料袋 于 2007-9-26 16:43 发表
不递归删除,还能怎样删除啊?除非你的文件逻辑结构不是树

这个解释好
作者: tom_xx_hu@yahoo    时间: 2007-09-27 01:58
原帖由 oyd_admin 于 2007-9-26 15:09 发表
难道文件系统的设计,一定要先删除子目录,父目录才能删除吗?

他们都以为我在问为什么递归删除的功能不放在内核中,实际上我在问为什么要递归删除,我不认为这两个是同一种问题。

我觉得你可能没有理解目录文件本身只是一个文件,目录文件的内容是指向目录内含文件的索引。
作者: tom_xx_hu@yahoo    时间: 2007-09-27 02:04
原帖由 flw2 于 2007-9-26 14:42 发表
版主怎么关了呢。楼主基础还是有问题,竟然说和mv比较

以下是我的回复


版主已经说的差不多完了
UNIX操作系统的接口向来都是精简,而且确实是没有必要,操作系统来做比不更简单,它还是要一个一个的删除 ...

我也不理解版主为什么关掉那一帖。操作记录里没有些原因。也许,这就是版主自主?
作者: oyd_admin    时间: 2007-09-27 10:53
我有一个奇想,既保持对通用文件系统的兼容,又能在O(1)时间复杂度删除一棵目录树,不知道行不行的通:
我们知道mount是可以把一个设备挂到一个文件系统中,umount操作就是O(1)的复杂度。
如果我们能随时把一个普通文件虚拟成一个存储设备的话,这个设备再mount到文件系统中,那么不管随后建立了多少级子目录,全删除都是O(1)的复杂度了。
理论上来说,实现把普通文件虚拟成设备应该不难,直接写在内核中或者做成驱动程序。
在虚拟设备上的读写效率问题,我觉得只要剩余磁盘空间还充足的话,就不会差真实设备太多。
作者: 思一克    时间: 2007-09-27 11:01
umount没有删除东西。

类似的,如果rmdir DIR 仅仅把DIR驱除,也是一瞬间的。但子目录和文件的驱除就要开机时候fsck (CHKDISK)了。
作者: oyd_admin    时间: 2007-09-27 11:19
umount没有删除东西,可是umount之后,我再把当初虚拟成设备的那个文件干掉,这就删除了呀。
作者: 塑料袋    时间: 2007-09-27 11:33
原帖由 oyd_admin 于 2007-9-27 10:53 发表
我有一个奇想,既保持对通用文件系统的兼容,又能在O(1)时间复杂度删除一棵目录树,不知道行不行的通:
我们知道mount是可以把一个设备挂到一个文件系统中,umount操作就是O(1)的复杂度。
如果我们能随时把一个普通文件虚拟成一个存储设备的话,这个设备再mount到文件系统中,那么不管随后建立了多少级子目录,全删除都是O(1)的复杂度了。
理论上来说,实现把普通文件虚拟成设备应该不难,直接写在内核中或者做成驱动程序。
在虚拟设备上的读写效率问题,我觉得只要剩余磁盘空间还充足的话,就不会差真实设备太多。



奇想完全不具有可行性。

"随时把一个普通文件虚拟成一个存储设备,这个设备再mount到文件系统中"。这个不用你自己实现,kernel早实现了,见loopback
作者: flw2    时间: 2007-09-27 12:57
原帖由 oyd_admin 于 2007-9-27 10:53 发表
我有一个奇想,既保持对通用文件系统的兼容,又能在O(1)时间复杂度删除一棵目录树,不知道行不行的通:
我们知道mount是可以把一个设备挂到一个文件系统中,umount操作就是O(1)的复杂度。
如果我们能随时把一 ...

那得有多少个文件系统?如果你的那个文件里面有10文件,我要删除其中一个包含8个文件的目录,能容易做到吗?
作者: oyd_admin    时间: 2007-09-27 13:29
原帖由 塑料袋 于 2007-9-27 11:33 发表

"随时把一个普通文件虚拟成一个存储设备,这个设备再mount到文件系统中"。这个不用你自己实现,kernel早实现了,见loopback

loopback我搜了一下,好像是路由相关东西,没太明白,能不能再提示一下?
作者: oyd_admin    时间: 2007-09-27 13:56
原帖由 flw2 于 2007-9-27 12:57 发表

那得有多少个文件系统?如果你的那个文件里面有10文件,我要删除其中一个包含8个文件的目录,能容易做到吗?


创建目录a的时候,可以指定一个flag,表示为此目录创建一个新的文件系统。
随后,目录a可以任意mv和rm,a中的普通子目录b也可以在a中任意mv,但是移出a的代价则很高。删除b的代价和普通目录一样,但这样的好处是,a可以整体快速删除。
如果要快速删除b的话,可以把b像a那样创建。但是创建b的时候,是使用a中的文件呢,还是使用a外面的文件?使用a中的文件,效率差一点,不过逻辑上没有问题。
作者: apsong    时间: 2007-09-27 14:25
原帖由 oyd_admin 于 2007-9-27 10:53 发表
我有一个奇想,既保持对通用文件系统的兼容,又能在O(1)时间复杂度删除一棵目录树,不知道行不行的通:
我们知道mount是可以把一个设备挂到一个文件系统中,umount操作就是O(1)的复杂度。
如果我们能随时把一 ...

O(1)在线性地址空间里貌似是不可能实现的。
作者: oyd_admin    时间: 2007-09-27 15:03
原帖由 apsong 于 2007-9-27 14:25 发表

O(1)在线性地址空间里貌似是不可能实现的。


我说O(1)当然是针对子目录个数来算的呀
作者: 塑料袋    时间: 2007-09-27 15:31
sys_mount时,指定参数为MS_BIND,则执行loopback操作。

就是你说的“把目录文件虚拟为一个存储设备”,然后把以这个目录文件为根的文件树,mount到任何一个挂载点上。

但是这完全达不到你说的效果。
作者: jaryer    时间: 2007-09-27 16:22
楼主重写内核吧。。
作者: xfly_t    时间: 2007-09-27 20:48
因为linux删除东西是不可还原的,不然不是与windows一样了吗? 慢是必然的
作者: Lotus_hu    时间: 2007-09-27 21:22
原帖由 oyd_admin 于 2007-9-27 10:53 发表
我有一个奇想,既保持对通用文件系统的兼容,又能在O(1)时间复杂度删除一棵目录树,不知道行不行的通:
我们知道mount是可以把一个设备挂到一个文件系统中,umount操作就是O(1)的复杂度。
如果我们能随时把一 ...

多挂机个硬盘??
作者: tudouniurou    时间: 2007-09-28 15:53
提示: 作者被禁止或删除 内容自动屏蔽




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2