讨论:Nachos 2013: File system
在nachos.filesys.INode.java第34行有这样一句:/** the reserve size (in byte) in the first sector */ private static final int FIRST_SEC_RESERVE = 16; 在文件的开头留出16-byte的空间是存什么的?如果要存什么信息不是可以放到INode里吗?为什么要在文件第一个sector保留?这样对文件数据的访问会变麻烦(每次seek(pos),但真正操作的是pos+16等等)。可以不需要这16-byte的保留空间吗?
A1: 你可以看slides里的内容。
我们需要支持的最长文件名是256-byte吧?
A1: 文件名没有最长长度限制。
p5中SWAP和disk分开吗?是不是SWAP和disk文件分开,SWAP用StubFileSystem,disk用自己写的filesys?
A1: Phase 5里,swap不需要分开吧,在这个phase里swap一般都放到自己的disk(nachos-disk.dat)里
我对inode的理解还是有问题,到底是一个文件一个inode,还是一个文件很多个inode,它们组成一个链表,放在每一个sector开头
A1: INode我的理解是,首先存放file_size, file_type, use_count, link_count, sec_addr, addr_ext。 其中sec_addr用于存放当前file用到的sector address,如果sec_addr用满,则用adde_ext指向新开的sector(次级INode),在次级INode中记录更多的sector address,拓展file size。
A2: 这里的次级INode有些误导,其实就是一个sector可能不够存储file的内容sector号,这个时候你就用addr_ext去指向新的sector,在这个新的sector继续存储,邹恒明老师的书上P225有介绍
那sec_addr中存的是一些sector号?难道sec_addr是不能扩张的么?如果sec_addr可以无限增加(也就是可以不停申请新的sector),adde_ext是不是就没用了。。
A1: sec_addr和addr_ext虽然都是一些sector号,但sec_addr指向的sector都是file内容,而addr_ext中指向的sector是次级INode,处理是不一样的吧?sec_addr的增长受INode设计空间大小的限制,但是由于addr_ext可以创建出INode树,故空间可以成长。当然如果你要把两者统一,那么你得区分你链表指向的每一个sector,到底是文件的内容呢,还是次级INode。
一个文件有很多个inode,他们组成一个链表? 可是很奇怪的是,为什么文件的信息要存放在文件的各个sector里面,一份文件,不是只要存放一份信息就可以了吗?为什么要重复那么多次?
A1: 一个文件只有一个inode,inode里面记录file size, file type, use count, link count,共16个字节,inode之后的sector都是数据sector,用链表串起来
A2: 补充一下:一个文件的INode只有一个,但是他可能占不止一个Sector,比如一个超级大的文件,他文件内容用的Sector数量非常多,要把所有的地址都记录下来,就需要很大的存储空间,可能一个Sector存不下,这时候就要用多个Sector,但是他们都是一个INode中的信息.
inode里的 /** the first address */ private int addr; 存的是什么?该inode自身的sector编号?
A1: 里面存放的是INode在磁盘上的sector编号,当你从磁盘上读入一个INode的时候,你需要记录一下它在磁盘上的位置,方便你将其save回磁盘的时候知道放在哪儿
一份文件可以被不同线程同时打开吗?可以同时读吗?可以同时写吗?可以一个读一个写吗?
A1: Machine.synchDisk()会帮你控制同步的问题,看一下它的实现。
文件读写的部分,我看了那个的实现,同一时刻,只有一个thread可以读写。可是可以一个文件既被thread A打开,又被thread B打开吗?然后他们可能交替着做一些读写的操作?
A1: 可以的
read(pos,...), write(pos,....) 中的pos允许超过fileSize吗?
A1: 应该是不允许的,在read函数里,你需要判断pos是否超过fileSize,如果超过了,read函数返回-1
A2: write时pos超出,则需要在INode申请新的sector
助教,求Preview Testcase和运行参数额,Thanks
A1: 几点说明: 1. 测试数据在preview-testcase目录下,如果想批量测试,将你的nachos工程文件夹***改名为nachos(也可以修改tester.py最后的mystu)放入nachos-project文件夹,然后运行tester.py。测试log在test.log,测试结果在result.txt。 2. phase 5的数据原则上和前年差不多。 3. Symlink里有环,有些争议~
Phase 5的灵活性比前几个Phase都要大,所以数据上,大家如果有疑问多提
基本上Phase 5的最终测试数据会遵循下面的原则(by HanLi): 1. 不会删除正在使用中的目录 2. 删除正在使用中的文件 B删除A正在使用中的文件F,此时只有A可以accessF,但A进程结束后要负责删掉F 3. 文件名长度<=32,不会出这种数据卡人 4. 只需删除空目录 5. 不允许直接创造/a/b/c之类的文件,必须先创建/a,然后/a/b
简言之,最终测试数据都是普通数据,不会使用奇葩数据
cwd是每个进程一个的,还是整个filesys共用一个。
A1: 共用一个
nachos文件夹和普通文件可以重名吗?
A1: 全都按 unix 文件系统的情况处理
是否允许用户读写nachos文件夹
A1: 应该不会出现这种测试数据。如果出现了,提醒助教一下
A2: 最后使用的都是基本数据
在syscall.h里,stat这个系统调用中有个参数是FileStatType,这个类型在内存中是怎么存的?其中的FileNameMaxLen是什么意思?不应该是unlimited length of file 么
A1: FileStatType 开个byte[4 * 5 + FileNameMaxLen],依次存size, sectors, type, inode, links, filename 就可以了。FileNameMaxLen 就是字面意思,即文件名最长为256,不要求实现无限长的文件名。
A2: 理论上!
我想问评测是否不允许生成多余文件?
A1: 生成的多余文件是什么?有必要吗?
FileStat在内存中的格式确定是这样吗?我获取FileStat的时候值是对的,但是那个C程序从内存中读出来就错了,求解
A1: 按fileStat中定义顺序来,filename first
如果是filename先的话,那其他int是直接接在后面吗?filename最后是不是要多加个0?
A1: filename自己开FILE_NAME_MAX_LEN,没有填满后面的int不直接接,还是从FILE_NAME_MAX_LEN处开始放
filesys_link.c这个测试数据,里面用了creat函数,按照syscall.h里面所说,实际相当于open,但是在unlink之前,这个文件都没有被close,所以,依照unlink要求,在这个程序里面是不会生效的(因为需要所有process关闭这个文件),除非进程结束。但是在最后,assertTrueWMsg(getFreeDiskSize() == size, "size mismatch")。显然这个文件对应的空间没有被释放掉,所以两个硬盘用的sector数量也应该和初始不同。求解释啊
A1: 这里确实有问题,我们会修改这个测试数据,保证在assertTrueWMsg(getFreeDiskSize() == size, "size mismatch”)之前会把文件都close掉的
助教,filesys_symlink.c这里,assertTrueWMsg(fileStat.type == LinkFileType, "type mismatch"); LinkFileType是什么值?我按照INode里默认的
A1: LinkFileType是FileStat里的,默认值是2: INode.TYPE_FILE与INode.TYPE_FILE_DEL对应FileStat.NORMAL_FILE_TYPE; INode.TYPE_FOLDER与INode.TYPE_FOLDER_DEL对应FileStat.DIR_FILE_TYPE; INode.TYPE_SYMLINK对应FileStat.LINK_FILE_TYPE;
filesys_symlink.c应该也是有问题的吧,和filesys_link.c一样,creat完没有关闭,导致文件无法删除,进程结束前Disk空间没有被释放掉
A1: 对的,最后这两个数据会改,同时symlink不会有环