一面
首先聊项目,主要让我讲了讲我 xv6-rust
的项目,然后讲到我用 Buddy System Allocator
替换了 xv6-riscv
的内存分配算法的时候,他问了我关于 Buddy System
算法相关的内容,我说伙伴内存分配算法使用多个链表和位图维护,然后举了个例子,说如果想去分配 512 bytes 的内存但是512 bytes 的链表为空,则去 1024 bytes 去找,如果 1024 bytes 的链表也为空,则向 2048 bytes 去找,找到了的话就把其分成两个 1024 bytes 的内存块,其中一块加入 1024 bytes 的链表中,另一块分为两块 512 bytes 的,一块供程序使用,另一块加入链表中,并更新位图。当回收时更新位图,并判断是否存在连续内存可以合并。
之后面试官问我伙伴内存系统解决了什么问题,我说可以有效减少内存碎片,然后他问伙伴内存分配算法真的可以完全解决吗,我说应该不可以,然后他说为啥不可以,我想了会没说上来,然后他说比如 513 bytes 这种,我说这种可以 2 的幂次对齐进行分配(但当时我记错了,我应该说 slab
的),之后又问我知道什么算法可以解决内存碎片,当时没想起来,其实应该是 slab
的2333。
之后我又开始讲了锁的设计,说我使用 Rust 实现的相比于 xv6-riscv
可以完全实现 RAII
,然后他问我为什么可以实现 RAII
,我说使用了 Drop
trait,之后问我关于 spinlock
和 sleeplock
的区别,我说 spinlock
需要自旋,一直占用 CPU 的时间,所以一般是多进程/线程 访问内存的中的数据时,占用时间不长使用的,而 sleeplock
则是一般做 IO 这种需要较长时间的,这段时间需要把 CPU 调度出去运行其他线程,等到 IO 结束后唤醒并调度回来这个线程。
之后我又介绍了一下我的进程调度和文件系统的设计,然后他问我 buffer 和 cache 的区别(比较奇怪),我说 buffer 一般是软件来做的,用在内存里,cache 一般是体系结构里的东西,一般从磁盘取出来的东西要放在 cache 里做缓存,当发现脏数据的时候需要写回磁盘中,但感觉没答到点上。
之后又说了说我 rCore-fat
的项目,然后问了问我 fat32
文件系统的结构,然后问了我如何计算 fat32
能够存储文件的最大容量。之后又问了问我知不知道其它文件系统,我说了 ext2
和 ext4
,并表示细节并不清楚。
之后开始问关于 Rust 内容了,首先问我 trait
和 dyn trait
的区别是啥,我说一个是动态派发一个是静态派发。然后问我它们在编译时和运行时有啥区别,我说静态派发一般是固定类型大小的,而动态派发在运行时是有一个 vtable
维护的,编译时不需要知道大小是多少,再往深了问就不知道了(
之后开始问了我 Rust 的智能指针(Box
,Vec
, RC
, Arc
, RefCell
, Cell
, UnsafeCell
)
最后问了我三次握手和四次挥手的问题,之前做计网 proj 仔细看过 RFC 793,答得很好。
然后就是一道简单的二分搜索算法题。
一面结束。
二面
5分钟后开始二面。
同样是开始介绍我的项目,问的问题和一面也差不多,略过不说了。
然后开始问我关于 Rust 的内容,问了 Deref
, Drop
, Copy
, Any
几个 trait, Any
没答上来,没用过(,
然后问我 Send
, Sync
的问题,都答上来了。
之后问我 trait
和 trait object
的问题,和一面说的差不多。
之后问我如果想在函数调用前和调用后都打印消息应该怎么做,我说过程宏,他说应该怎么写,我说我不会过程宏(雾)。
之后问我 Box<dyn(Fn() + Send + 'static)>
的表达式的意思,我说是做并发用的,‘static 是静态生命周期,因为在多线程的时候很可能主线程结束了,多线程仍然在跑,没有 'static 的话生命周期会随着主线程 drop, Send
是用来标记可以把其所有权传递到线程中,Fn()
表示用 &self 当做参数,dyn
是因为在编译期不知道大小,需要动态派发,Box
是用来包裹 dyn
生成的胖指针的。
之后问了我关于 分页和分段的问题,我说分段是 Intel 8086 为了扩大寻址空间干的事,因为当时只有16位寻址空间,但是地址总线有20位,于是搞了个段表,每次从段表里取基址左移然后再加上实际的地址。分页是操作系统为了管理内存,并且让多个程序有一种独占地址空间的错觉,更便于进行管理,后面说了一对细节巴拉巴拉…
然后是一道链表的算法题,面试官让我用熟悉的语言写,可能是考虑到 Rust 写比较困难,但我还是用 Rust 写的,最后写出来了,虽然复杂度不咋地。