- 论坛徽章:
- 1
|
1.linux内核有哪几大模块?
这个比较固定了。内存管理,进程管理,文件系统,网络,驱动,锁?。
内存管理又可分为:
a. 内核自身(内核态)的管理,可以认为是为管理内存而做的工作,有点类似meta data的意思,如分段,分页,slab/slub/slob,buddy,tlb之类。
b. 进程的虚拟内存管理,主要是进程地址空间的管理,如进程内存区域的分配,映射,缺页的处理。
c. 在一个就是各种cache,如内核的一些基本常用的结构都会有个pool,还有就是页缓存和块缓存加速磁盘访问,但是感觉这2个和前面的还不一样,放到一起不知道合适不。。
进程管理可分为:进程/线程的创建/撤销/复制/通信/调度。
文件系统可分为:
a. 虚拟文件系统(vfs)主要是提供一个抽象层,屏蔽不同文件系统差异,提供统一的视图(open,close, read, write..)
b. 具体的文件系统, 如ext2/3/4,fat16/32,btrfs。。。
c. 还有一个就是类似proc这个pseudo 文件系统,sysfs也有点类似,但是感觉放到driver那里合适一点
网络应该主要是各种的协议栈,传输层(tcp/udp), 网络层(ip),route,设备接口(link),sock和各种的网络设备(eth,tun,geneve,ifb。。。)
驱动感觉东西更多,char/block 设备,bus, driver,sysfs,以及其他各种设备的driver。
锁虽然单独做为一个有点勉强,但是还是很重要的,主要各种的同步(spinlock,memory barrier,rcu,semaphore, rw lock..)和delay(softirq, tasklet, wrok queue)的机制吧
2. cache 在 Linux 内核中有哪些应用?(一两个例子即可)
这个在上面提了一下,如页缓存和块缓存,其目的当然是通过把一部分磁盘的数据放到内存里加速对磁盘的访问,减小内存和磁盘访问速度的差距,后台会有内核线程去sync data到磁盘。页缓存page cache应该是为了优化file IO,块缓存buffer cache是为了优化block IO,以前好像是2套不同的实现,但是现在好像同一了。
3. cache coherency 和 memoryconsistency 有什么区别?
cache coherency主要是因为多核cpu一般都有自己的cache,但是memory确实共享的,所以当同一份数据(memory上的)在cache上有多个copy时需要确保 他们不能乱掉,有些协议如mesi就是控制这个的。
memory consistency 主要是因为程序并发,如多cpu或多线程访问同一数据,做不同的操作,如果没有控制,那么最后的数据就不可预测,出现了inconsistency。还有就是因为compiler 的优化,或cpu 执行时的乱序也可能导致inconsistency,Linux kernel里头的spinlock,semaphore,barrier,mfence之类的就是实现这个目的。
个人理解,cache coherency 更多的硬件去实现的,memory consistency跟我们关系更密切一点,内核的各种锁,屏障。。(说句题外话,你们是怎么研究锁的,感觉看了实现代码也就那样,不知道哪里该加哪里不该加,没有机会去实现总是感觉玄而又玄。。)
4. 如何理解Linux一切皆是文件?
个人理解就是在linux,不但文件可以是文件,其他的所有东西也可以用文件来表示。
比如一个设备/dev/sda就是代表系统里的一个disk,/dev/cdrom就是光驱,对这个文件的操作就是对设备的操作。
比如我想查看当前系统cpu的一些信息,那我就可以去操作(读)/proc/cpuinfo。
在比如我想产生随机数,那我就可以去读/dev/random。
总之,这样的好处就是统一了操作接口,打开一个文件生成fd,然后对fd进行读写或其他的操作。
但是我觉得有一点不好的(或不统一的)是网络设备有点特殊,为什么网卡在/dev/下没有设备?网络发送或接受数据要通过一个特殊的socket描述符去做,虽然也是一个fd,但是感觉就不统一了。其他个人理解,为什么不能把stream socket 当成一个char 设备,datagram socket当成一个block设备?(可能理解的不对)
|
|