华为内部面试题库---(16)
1.内核对磁盘数据的高速缓存有:(多选)
A.目录项高速缓存
B.页高速缓存
C.索引节点高速缓存
D.超级块高速缓存
参考答案:ABC
分析:磁盘高速缓存有三种:目录项高速缓存,页高速缓存与索引节点高速缓存,内核会把磁盘上的超级块以读出,以VFS超级块的方式存储在内存中,不存在超级块高速缓存。
参考:深入理解Linux内核,第15章,P595.
2.页高速缓存可以缓存以下内容:(多选)
A.普通文件数据
B.含有目录的页
C.直接从快设备读取的页
D.用户进程数据的页
参考答案:ABCD
分析:页高速缓存中的页可以是以下内容,还包括属于特殊文件系统的页,如共享内存的进程间通信的shm,参考深入理解Linux内核第十五章,P596.
3.以下说法错误的有:(单选)
A.所有的文件读写操作都依赖于页高速缓存
B.一个页高速缓存中包含的数据在磁盘块上可以不连续
C.页高速缓存可以改善系统性能
D.使用O_DIRECT标志打开文件时,则磁盘数据不会被缓存
参考答案:A
分析:在O_DIRECT标志被置位时进程打开文件时,应用程序使用自己的磁盘高速缓存算法。参考深入理解Linux内核第十五章,P596~P597.
4.以下说法正确的有:(多选)
A.每个address_space对象都对应一颗搜索树
B.radix tree的根都可以通过address_space对象获取
C.基树的深度越深,其对应的最大索引值越大,可以索引的文件也越大
参考答案:ABC
分析:参考深入理解Linux内核第十五章,P600~P602.
5.对页高速缓存可以采用的操作有:(多选)
A.查找页
B.增加页
C.删除页
D.更新页
参考答案:ABCD
分析:参考深入理解Linux内核第十五章,P602~P607.
6.关于磁盘页高速缓存address_space及inode说法正确的有:(多选)
A.如果页高速缓存中的页的所有者是一个文件,则inode中包含有address_space对象;
B.如果页高速缓存中的页的所有者是一个文件,则inode的i_mapping字段总是指向其i_data字段;
C.如果页高速缓存中的页的所有者是一个文件,则address_space对象的host总是指向其所有者的VFS inode;
D.如果页高速缓存页中数据存放着块设备的原始数据,即使这些数据位于不同的块设备文件,从块设备读取数据的所有的页也具有相同的address_space对象;
参考答案:ABCD
分析:参考深入理解Linux内核第十五章,P597~P600.
7.address_space_operations是对address_space的操作方法的集合,包括以下方法:(多选)
A.针对页的读写操作的readpage与writepage方法;
B.与I/O操作相关的set_page_dirty及sync_page方法;
C.准备释放页的releasepage方法;
D.迁移页数据的migratepage方法;
参考答案:ABCD
分析:参考深入理解Linux内核第十五章,P597~P600,Linux内核源代码.
8.以下说法错误的是:(单选)
A.在块设备上,VFS及各种文件系统以块为逻辑单位组织磁盘数据;
B.页高速缓存用来存放访问磁盘文件内容时生产的磁盘数据页,缓冲区高速缓存把通过VFS访问的块的内容保留着内存中;
C.缓冲区页页保存在页高速缓存中;
D.页高速缓存内的页中的数据在磁盘上的地址都是相邻的;
参考答案:D
分析:页高速缓存页中的数据在磁盘上的地址可以是不连续的。参考深入理解Linux内核第十五章,P607~P609.
9.以下说法错误的是:(单选)
A.通过缓冲区首部可以快速确定页中的一个块在磁盘中的地址;
B.缓冲区首部的b_data字段存放的是块缓冲区的线性地址;
C.每个文件系统可以定义自己的私有缓冲区首部标志;
D.如果缓冲区首部的b_state&BH_Lock为真,则通常是表明缓冲区正在进行磁盘传输;
参考答案:B
分析:首先要判断页是否在高端内存,如果页是在高端内存,则b_data字段存放的是块缓冲区相对于页的起始位置的偏移量,否则存放的是缓冲区的线性地址。
参考深入理解Linux内核第十五章,P607~P618.
10.以下说法正确的是:(多选)
A.当访问一个单独的磁盘块时,内核通常分配的缓冲区超过所读取的磁盘内容需要的缓冲区大小;
B.通常缓冲区首部都有自己的slab分配器高速缓存;
C.如果一个页作为缓冲区使用,那么与它的块缓冲区相关的所有缓冲区首部都被收集在一个单向循环链表中,该链表的头部是缓冲区页描述符的private字段;
D.当空闲内存变得很少时,内核将检测块缓冲区,引用计数为0的块缓冲区将被回收;
参考答案:ABCD
分析:参考深入理解Linux内核第十五章,P607~P617.
11.关于缓存的说法错误的是:(单选)
A.因为通常物理内存的容量比块设备要小,所以不能将块设备上的所有数据都缓存,被缓存的数据一定是经过内核挑选的。
B.用于缓存的物理内存不能分配给普通进程直接使用,造成一定的可用物理内存减小。
C.如果系统崩溃,使用缓存一定会造成不可恢复的数据丢失。
D.块缓存是为了加速对物理块设备的访问,而slab缓存则是为了对现有资源进行更简单、更高效的访问。
参考答案:C
分析:如果系统崩溃,对于未写入块设备的缓存中的数据会造成不可恢复的数据丢失。如果只是读缓存则不会造成数据丢失。参考深入Linux内核架构第16章,P760~P761。
12.关于缓存的说法正确的有:(多选)
A.页缓存针对以页为单位的所有操作,针对于特定的体系结构,所有文件系统的缓存页的页面大小固定。
B.块缓存是以块设备的块为单位进行操作的,必须考虑不同文件系统之间块设备大小的差异性。
C.如果用于加速页缓存查处速度的基数树中的某个叶子节点是脏的,则从该叶子节点一直到根节点的链路中的所有节点都会被设置为脏。
D.内核在将页缓存回写到块设备期间,并不是将整个缓存页回写,而是以更细粒度的“缓冲区”为单位的。
参考答案:ABCD
分析:参考深入Linux内核架构 P760~P765。
13.关于缓存数据同步条件的说法正确的有:(多选)
A.页高速缓存变得太满,但是还需要更多的页,或者脏页的数量已经太多。
B.自从变为脏页已经过去很长时间。
C.进程请求对块设备或者特定文件系统任何待定的变化都进行刷新,如通过sync系列调用。
D.块设备空闲很长一段时间。
参考答案:ABC
分析:Linux内核对页高速缓存的刷新主要基于以下三个原则:1.缓存页资源紧张,2.定时刷新,3.进程主动发起对块设备的变更请求。
参考深入Linux内核架构第17章P793~P794,深入理解Linux内核第15章P618~P619。
14.下面关于pdflush内核线程的说法错误的有:(单选)
A.Linux 2.6内核使用pdflush内核线程实现页高速缓存的脏页搜索及数据刷新。
B.当大数据量的缓存数据需要被同步到磁盘时,创建更多数目的pdflush内核线程一定能显著改善同步性能。
C.内核中必须至少有两个pdflush线程。
D.如果最近一次pdflush线程变为空闲的时间超过了1s,则应该删除一个pdflush进程。
参考答案:B
分析:参考深入理解Linux内核第15章,P619~P620,深入Linux内核架构第17章P795~P798。
15.关于高速缓存的说法正确的有:(多选)
A.超级块的同步必须要在磁盘数据同步之前完成,因为不正确的超级块数据将导致文件系统各处的一致性错误,并且有可能导致部分数据损失。
B.在一次同步过程中并非所有的脏页都需要回写。
C.基于wakeup_pdflush函数的强制回写可以是由内核触发的,sync系统调用也会触发强制回写。
D.系统调用fdatasync仅回写数据内容,忽略元数据。
参考答案:ABCD
分析:A.超级块在普通数据之前进行同步。B.一次同步回写的脏页数目限制于MAX_WRITEBACK_PAGES
参考深入Linux内核架构第17章,Linux内核代码2.6.37。