UNIX的成组连接
UNIX的外存
0 | 1 | 2-K | K-N-1 |
---|---|---|---|
引导块 | 超级块,管理inode区和文件区的空闲块,inoode进行成组的方法管理,文件区用成组连接的方式 | inode区存储所有文件的inode | 文件存储区域保存文件快和存储它的空闲块 |
成组连接的管理方法
超级块中有三个关键结构管理成组连接
int s_nfree;//记录s_free的值,即保存物理块的个数
int s_free[100];//可以保存一百个物理块的块号
char s_flock;//一个锁,对s_free和s_nfree进行互斥操作的一个锁
一百个块的块号放到这些块的第一个里面
s_nfree=66
s_free[0]
s_free[1]
......
s_free[65]
一百个快中有一个连接块,存储下一组连接块的块号,采用栈管理,也就是先入s_free[0]里,存储了连接块,存储了下一组的块号。
每回收一个物理块,把回收的块号放到s_free中,然后s_nfree加一,占用物理块也可以类推
空闲块管理
申请时
s_nfree>1,取s_free[–s_nfree]
s_nfree=1把s_free[0]所指连接块读入内存,分配s_free[0],这个时候s_free[0]连接的那组变成了内存里的一组,s_free[0]指向的块则被取走变成了占用块,这说明s_free[0]所指向的块其实也算空闲块。
释放时
s_nfree<100,s_free[s_nfree]=释放块号,s_nfree++;
s_nfree=100,把s_nfree和s_free拷贝到释放块中,将该块号记录到s_free[0],写回外存,s_nfree=1
空闲inode管理
目录项,相当于FCB次部,形式为文件名.文件号,Inode相当于FCB主部,每个inode有一个i_number,多个文件名可以对应同一个(连接共享),这使得文件在不同的路径,却可以访问相同的文件。
s_inode最多可以记载100个空闲inode
申请时
s_ninode>0,取s_inode[–s_ninode];
s_ninode=0,由磁盘inode区顺取100个空闲I节点(i_nlink=0),将其编号填入s_inode表中,修改s_ninode,然后分配
释放时
s_ninode<100,s_inode[s_ninode++]=i_number(释放的)
s_ninode=100,丢弃
例题
某系统磁盘块大小为1KB,文件的物理组织为索引结构,每个索引项占2字节,磁盘空闲区管理采用成组链接的结构(假设每组最多5个磁盘块)。当前磁盘空闲区的成组链接结构(简称group_link)内容如下
在下述情况下,假设进程P对流式文件f执行如下操作:
fd=creat("f",fcb_args);
<处理数据并送到buf中>;
write(fd,3048,buf);
问题
(1)该文件系统一个文件的最大容量是多少个磁盘块?
根据最初给定的group_link内容,磁盘中有几个空闲磁盘块?
(2)给出文件f的索引块(标明索引块的块号)内容。
(3)写出P的用户打开文件表中,文件f的表项内容。
(4)写出P对文件f执行上述操作后的group_link的内容。
(1)答:1024/2=512个磁盘块
从图中可看s_nfree为4,所以s_free[4]其实已经被占用了,只有0、1、2、3这四个空闲块,所以4+5+2=11
还有11个空闲块,第三组因为第0处没有指向块,所以不能计算在内。
(2)这里取走s_free[3],s_nfree-1,所以索引块的块号是23、
3048/1024取天花是3所以需要使用三个块
有索引块如下
逻辑块号 | 索引块#23 |
---|---|
0 | 70 |
1 | 40 |
2 | 79 |
3 | ^ |
(3)P的用户打开文件表中,文件f的表项如下:
文件描述符(隐含) | 打开方式 | 读写指针 | 系统文件打开表指针 |
---|---|---|---|
fd | write | 3048 | … |
复习
用户打开文件表的结构
文件描述符 | 打开方式 | 读写指针 | 系统打开文件表入口 |
---|---|---|---|
系统打开文件表
FCB主部 | 文件号 | 共享计数 | 修改标志 |
---|---|---|---|
(4)取走了四个快,系统调用s_free[0]所指的一组进入内存