发信人: tcpip (俺的昵称改了), 信区: cnunix
标  题: [转载]  好书共赏-《Unix Internels》(三)
发信站: 哈工大紫丁香 (Sun Sep 26 15:23:22 1999), 转信

寄信人: NTMD.bbs@bbs.net.tsinghua.edu.cn 
发信站: 华南理工大学 BBS木棉站
日  期: Wed Aug  5 21:00:25 1998

发信人: BlueOcean (Blue), 信区: Unix
标  题: [转载]  好书共赏-《Unix Internels》(三)
发信站: BBS 水木清华站 (Mon Apr 27 13:20:24 1998) WWW-POST


Chapter 8 File System Interface and Framework

本节前半段讨论(复习)跟filesystem有关的系统呼叫. 後半段讨论mordern
Unix的VFS (vnode)架构, 亦即, kernel处理file system的方法. 下一个chapter
主要讨论file system在disk上的layout.

s5fs是unix早期(System V r4以前)档案系统,特色是简单但功能尚可,最大
的缺点是有14个字的档名限制. 4.2BSD设计了Fast File System, FFS,
提供了较优的performance和功能. FFS受到广大的欢迎, 最後被SVR4
所采用. FFS又称为UFS (UNIX File System)

早期的Unix kernel不能同时支援两种以上的档案系统. 各家
都有解决之道. AT&T用file system switch, DEC用gnode/gfs, Sun
所提出的vnode/vfs最广为接受, 最後赢得胜利,成为SVR4的
一部份.

inode 是Unix特有的观念. Unix kernel利用inode来作为他对档案的介面.
一个inode代表一个档案, 记录了kernel存取该档案所需要用到的资料,
以及该档案的属性等等.名叫inode的原因是因为本资料结构的大部份
内容皆由on-disk的inode而来.Unix file system 在disk上的image不用档名
而用整数(i-number)来表示每一个档案. 目录只是一个较为特别的档案,
记录i-number和档名的对照而已.有了i-number,kernel才找得到inode,
也就是记录档案存放位置与属性的地方.一般称在disk上的inode为on-disk
inode,被kernel读进记忆体,使用中的inode为in-core inode.

vnode/vfs的概念是把原来in-core inode物件化成为 virtual class.
vnode提供一个抽象化的介面. kernel要对档案的所有操作接
透过vnode所定义的虚拟函式来达成. 一个vnode 初始化後,就
会有个指标指向file system dependant part.所以不管底下的档案
系统格式为何, kernel皆能呼叫到正确的函数. VFS的架构使得
Unix可以支援多重档案系统, kernel经由vnode提供档案系统的
发展者一个标准的介面. 七月号的InfoMac介绍狂想曲的
一篇文章说VFS可以有档案压缩,解压缩,线上防毒的功能, 
真的是颇为奇怪..

比较特别的是Unix的实作和定义有点不太一样.
定义说:

    struct vnode {

        public_data1,2,3,....

        caddr_t v_data;

    } vnode;

    vnode.v_data = (caddr_t *)&ffs_data;

而实作作成这样,把interface和file system dependant data放在一起:

    struct ffs_node {

        public_data1,2,3,... /*和struct vnode顺序一样*/

        caddr_t v_data;

        private_data1,2,3.... /* ffs private data */

    } vnode;

    vnode.v_data = (caddr_t *)&vnode;

Understand?不懂就去看书吧!书上是用图示法的,见图知意.

vnode/vfs有个地方和原本的unix不一样,会导致race condition.我想这是
许多security hole的泉源.就是file name lookup不一样.以前只有一个
filesystem的时候(看Bach的书) Unix是传一个路径给namei(),就可以找到
inode. vnode的方法要把一个路径切碎,一段一段找.这也使performance
降低不少. (unix filesystem瓶颈之一在file name lookup,每次lookup都会
碰到路径上每一个目录的inode....4.4BSD和OSF/1都有提出解决的对策.
(自己看书,太琐碎了)

有了vnode/vfs, 则可以鼓励出更多的创意, 更多的档案系统可以被提出来.
比较有趣的有NFS, specfs, fifofs, /proc fs.这里顺便提一下後三者.本书是在
稍後的章节才提到.

specfs在干什麽的呢?以前s5fs的时代,有些特别的inode不表示实体的档案,
而是用来表示周边装置.现在假设我们的ffs上有个/dev/tty1的档案. 利用
刚刚提到的vnode/vfs的方式, kernel会去呼叫到ffs的函式,而这些函式并不能
知道怎样驱动tty driver.解决的方式是设计一个specfs.只要kernel发现
inode是个device file的话,就不去呼叫vnode的open,而是呼叫specvp(),把
该vnode传给他.specvp就会把适当的virtual function和指标填到vnode去,
而得到所希望的操作.这就是specfs存在的目的. Chapter 16有更详细的资料.
并讨论到不同device file major/minor device number都一样,也就是指到
相同device的问题解法.

fifofs和specfs一样.用来把ffs的某个vnode换成有fifo作用的named pipe.

/proc file system则是把process在记忆体中的状态,转换为file system的方式
方便存取.这样子debugger得以更方便的控制process,提供更多的功能,
也可以debugger执行到一半的process. (前面提到在旧的Unix下,这是不可行的)


Chapter 9 File System Implementations

本章主要讨论on disk  file system layout, 和一些其他的file system.
前面没有提到vnode在kernel如何组织,所以这章也补齐.

首先是s5fs.其实这还是自己看比较快,看图说故事就对了.

比较特别的是file system如何处理free block. s5fs用free block
list来管理free block.这个list会很占空间吗?不会的,因为此
list在free block上,也就是借用没有用的的空间.free block list
的大小和所剩的空间成正比.如果没有空间了,也不需要
free block list了; free block list原先占用的空间就
会释出来当作free block用.

其实前面没说清楚. free block list分成两部份.在super block
内有一小节,剩下的才放在free data block上. super block的
free list用完了就会从free data block上的list调借. 所以
free block list占用data block的空间会在data block用完前释出.


Berkeley Fast File System

s5fs有许多限制, performance是一个问题.比如说ls -l dir,就会在inode和dir
的档案间来回奔跑. (inode才有file attribute.) s5fs把inode table放在disk
空间的最前面, 其他的地方放data block.导致浪费掉许多seek time.

s5fs fragmentation的问题也没有处理得很好.用free block list的方法只能
在档案系统刚建立的时候拥有良好的连续配置,用久了fragmentation就严重了.

block size也有问题.  block size大会增加效率,但是浪费空间,反之减少效率,
但是空间利用率较高.

s5fs单一的super block也很危险, super block 毁了整个filesystem就完了.

s5fs还有一个缺点是14个字的档名限制.

FFS的出现就是解决这些问题的. How? s5fs把disk看成是一个磁带般处理,
没有考虑实体结构, FFS设计的时候就面对现实,把实体结构考虑进去,也就是
考虑了disk的head, track, cylinder等性质. hard disk由好几片platter
(硬碟片)组成.cylinder就是不同platter下相同track所组成的圆柱体.

FFS把一个disk划成好几个cylinder group. 一个cylinder group
由相邻的cylinder组成.简单的说,FFS就是把一个disk划成几个小
disk (cylinder group),每个cylinder group (disk)上面放个s5fs
就是了. 这样子作可以让某个cylinder group内的资料限制在几个
cylinder的□围内,减少seek time.

针对fragmentation的问题则是使用bitmap来解决. FFS使用超大
的data block以降低fragmentation带来的影响.

但是对於小的档案(和大档案的尾巴,不满一个block的部份),则是把data block
切成几个小块,存放好几个小档来节省浪费掉的空间.存放在fragmented
block的资料一定要是一个档案的最尾端,而且在此block内的资料必须
连续存放,不可以说A档的tail住在一block的第1/4, 3/4块, B档比较小,
住在同一 block的第2/4块.这种情形要把A档的block移到另一个新的block
上,让A的最後一个block连续存放.

为了避免因为一个档案慢慢的成长导致不必要的搬移, FFS限制只有direct
block可以用fragmentation.也就是档案超过一定大小就不用fragmentation block
了.

除了架构上的改变, allocation policy也很重要. FFS这样配置硬碟空间:

   * 同一个目录的档案(inode)都放在同一个cylinder group上. (localizing
     policy)
   * 每个新的目录都和其parent位於不同的cylinder group上. (distributing
     policy)
   * 档案的data block放在和其inode相同的cylinder group上(localizing policy)
   * 档案超过48kb,以及以後每增加1MB,就要换跑道,喔是cylinder
     group.免得某个档案灌爆一个cylinder.
   * 配置data block时考虑disk的interleave factor.(不懂?那你一定没有
     用过MS-DOS的floppy加速程式:) 没关系, 本书有图解)

s5fs的super block被分成两部份. FFS4每个cylinder group都有记录
自己的空间使用状况. 而整个disk的super block只记录整体性的资料,
如cylinder的大小位置, block的大小位置等等资料.每个cylinder group
都有一个super block的备份. FFS把这些备份分散开来, 使得没有单一的
磁头,磁轨,磁柱或碟片存放这些备份. (没有把所有的鸡蛋放在同一篮子
上的意思.)

即使目前的SCSI硬碟并不区分head, cylinder, sector,制造商提供的资料只是
让他乘起来和硬碟的大小相同而已, 但是实验显示FFS的方式还是可以得到
良好的效能.

FFS还有很多chache的改进可以提高他的效能,不过要自己看书:)

Temporary File System

temporary file system对於需要暂时使用档案的场合可以增进效率.
以前的方式是把一块ram划下来作ram disk.这样子浪费记忆体. BSD用memory file
system (mfs)的方式, 让一个io server用他的address space当作空间来提供
temporary file system的暂存空间,不过最大的缺点是context switch使
performance不好. Sun的方式最好, tmpfs整合了vnode/vfs介面和VM介面,
让整个virtual memory来提供tmpfs的空间. 整个存取的方法和一般的filesystem
没有两样,是最理想的方法. 另外一个方法是设定file system write back的时间,
以企图延後所有档案系统的资料写入disk来达到temp file system的目的. (期望
他没被写入前就杀掉了).

Unix用到暂时档的地方很多(如cc).所以temporary file system的发展
是很有价值的.

Chapter 9结束的时候提到了Buffer Cache.这个东西在Bach的书里是重点,但是
目前的Unix已经不用Buffer Cache,改采整合file system和virtual memory的方式,
更为有效的运用记忆体.


Chapter 10 Distributed File Systems

本章介绍..NFS/RFS/AFS/DFS.
NFS其实算蛮简单的,他只是把kernel往disk写回的动作(& reading),换成
network packet送出去而已.对kernel的介面则是藏在vnode/vfs下.

NFS performance bottleneck在於NFS要求每次的write()不能够cache,一定要
马上写回,而档案属性必须一个一个档询问,使得ls -l产生大量的traffic.
当然现在已有方法改进.

NFS version 3於1995年公布,更正了NFS v2的大部份的问题. (security
的问题是在RPC上面. RPC本来就有提供security的机制,只是少有实作而
已...) 由於NFS v3出现蛮晚的,有支援的Unix可能算很赶的上流行了:)

本章提到两个dedicated NFS server. 我比较有兴趣的是Auspex NS5000.
另外一个是IBM的, focus在容错. Auspex NS5000有好几个CPU, 每个CPU
都作单一个事,分成两组,一组处理网路上的需求,另一组处理硬碟档案系
统的IO.另外有一个CPU跑修改过的SunOS,admin用,其他的CPU都跑一个叫
做functional multiprocessing kenel (FMK)的系统,彼此间用message 
passing交谈. FMK的好处是他只提供作NFS server所必要的function, 
而不提供Unix的语意/环境,使得系统省下不少负担.

RFS没什麽好提的...

AFS, Andrew File System是CMU发展的系统, 後来成立Transarc
Corporation.继续发展. 後来AFS演变成OSF DCE的Distributed File
System.本书AFS/DFS都有详细的介绍.他们太复杂了,看书比较清楚.
结论是AFS比较不好, DFS作了很多改善, 功能也比较多. DFS比较特
别的是对分散式档案系统cache的改进. DFS server会给他的client
一个(read/write/status/lock..)token, 允许他(read/write/status
/lock..)等等的动作而不需要与server synchronize,也不用
update cache.也就是说该client拥有该资料的使用权(token,权杖之意).
client拥有token直到kernel撤回这样权力为止.kernel随时可撤回
这些token,表示有人要更改data,需要synchronize了.

token的想法非常的高明,因为传统的方法所有的时间都要synchronize.但是
token的想法则是考虑到大部份的时间内皆不会产生race condition,所以
不需要每个动作都synchronize.

不过文中也指出, DFS非常的复杂, 不好实作就是了.

--
                                  
    Buck barks in the darkness    
                                  
※ 修改:.trueip 于 Sep 26 15:27:08 修改本文.[FROM: dns.mtlab.hit.ed]
--
※ 转寄:.华南网木棉站 bbs.gznet.edu.cn.[FROM: dns.mtlab.hit.ed]

--
☆ 来源:.哈工大紫丁香 bbs.hit.edu.cn.[FROM: trueip.bbs@melon.gzn]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:6.947毫秒