Linux面试题及答案,学完时候就可以出师了

1) linux 中主要有哪几种内核锁?Linux 的同步机制从 2.0 到 2.6 以来不断发展完善 。从最初的原子操作,到后来的信号量,从大内核锁到今天的自旋锁 。这些同步机制的发展伴随 Linux 从单处理器到对称多处理器的过渡;
【Linux面试题及答案,学完时候就可以出师了】伴随着从非抢占内核到抢占内核的过度 。Linux 的锁机制越来越有效,也越来越复杂 。Linux 的内核锁主要是自旋锁和信号量 。自旋锁最多只能被一个可执行线程持有,如果一个执行线程试图请求一个已被争用(已经被持有)的自旋锁,那么这个线程就会一直进行慢循环——旋转——等待锁重新可用 。要是说未被争用,请求它的执行线程便能立刻得到它并且继续进行 。自旋锁可以在任何时刻防止多于一个的执行线程同时进入临界区 。
Linux 中的信号量是一种睡眠锁 。如果有一个任务试图获得一个已被持有的信号量时,信号量会将其推入等待队列,然后让其睡眠 。这时处理器获得自由去执行其它代码 。当持有信号量的进程将信号量释放后,在等待队列中的一个任务将被唤醒,从而便可以获得这个信号量 。
信号量的睡眠特性,使得信号量适用于锁会被长时间持有的情况;只能在进程上下文中使用,因为中断上下文中是不能被调度的;另外当代码持有信号量时,不可以再持有自旋锁 。
Linux 内核中的同步机制:原子操作、信号量、读写信号量和自旋锁的 API,另外一些同步机制,包括大内核锁、读写锁、大读者锁、RCU (Read-Copy Update,顾名思义就是读-拷贝修改),和顺序锁 。

Linux面试题及答案,学完时候就可以出师了

文章插图
 
2) Linux 中的用户模式和内核模式是什么含义?MS-DOS 等操作系统在单一的 CPU 模式下运行,但是一些类 Unix 的操作系统则使用了双模式,可以有效地实现时间共享 。在 Linux 机器上,CPU 要么处于受信任的内核模式,要么处于受限制的用户模式 。除了内核本身处于内核模式以外,所有的用户进程都运行在用户模式之中 。
内核模式的代码可以无限制地访问所有处理器指令集以及全部内存和 I/O 空间 。如果用户模式的进程要享有此特权,它必须通过系统调用向设备驱动程序或其他内核模式的代码发出请求 。另外,用户模式的代码允许发生缺页,而内核模式的代码则不允许 。
在 2.4 和更早的内核中,仅仅用户模式的进程可以被上下文切换出局,由其他进程抢占 。除非发生以下两种情况,否则内核模式代码可以一直独占 CPU:
(1) 它自愿放弃 CPU;
(2) 发生中断或异常 。
2.6 内核引入了内核抢占,大多数内核模式的代码也可以被抢占 。
3) 怎样申请大块内核内存?在 Linux 内核环境下,申请大块内存的成功率随着系统运行时间的增加而减少,虽然可以通过vmalloc 系列调用申请物理不连续但虚拟地址连续的内存,但毕竟其使用效率不高且在 32 位系统上 vmalloc 的内存地址空间有限 。所以,一般的建议是在系统启动阶段申请大块内存,但是其成功的概率也只是比较高而已,而不是 100% 。如果程序真的比较在意这个申请的成功与否,只能退用“启动内存”(Boot Memory) 。下面就是申请并导出启动内存的一段示例代码:
void* x_bootmem = NULL;EXPORT_SYMBOL(x_bootmem);unsigned long x_bootmem_size = 0;EXPORT_SYMBOL(x_bootmem_size);static int __init x_bootmem_setup(char *str){x_bootmem_size = memparse(str, &str);x_bootmem = alloc_bootmem(x_bootmem_size);printk(“Reserved %lu bytes from %p for xn”, x_bootmem_size, x_bootmem);return 1;}__setup(“x-bootmem=”, x_bootmem_setup);可见其应用还是比较简单的,不过利弊总是共生的,它不可避免也有其自身的限制:内存申请代码只能连接进内核,不能在模块中使用 。
被申请的内存不会被页分配器和 slab 分配器所使用和统计,也就是说它处于系统的可见内存之外,即使在将来的某个地方你释放了它 。
一般用户只会申请一大块内存,如果需要在其上实现复杂的内存管理则需要自己实现 。在不允许内存分配失败的场合,通过启动内存预留内存空间将是我们唯一的选择 。
4) 用户进程间通信主要哪几种方式?(1)管道(Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同祖先的进程之间进行通信 。
(2)命名管道(named pipe):命名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信 。命名管道在文件系统中有对应的文件名 。命名管道通过命令 mkfifo 或系统调用 mkfifo 来创建 。


推荐阅读