安全编程:防止缓冲区溢出
常见缓冲区溢出函数(http://zhuanlan.51cto.com/art/201701/527478.htm)
Linux内核面试问题汇总
Linux的内核锁主要是自旋锁和信号量。
自旋锁最多只能被一个可执行线程持有,如果一个执行线程试图请求一个已被争用(已经被持有)的自旋锁,那么这个线程就会一直进行忙循环——旋转——等待锁重新可用。要是锁未被争用,请求它的执行线程便能立刻得到它并且继续进行。自旋锁可以在任何时刻防止多于一个的执行线程同时进入临界区。
自旋锁是专门为防止多处理器的并发而引入的一种锁,它在内核中大量的应用于中断处理等部分(对于单处理器来说,防止中断处理中的并发可以简单的采用关闭中断的方式,不需要自旋锁)。事实上,自旋锁的初衷就是:在短期内进行轻量级的锁定。一个被争用的自旋锁使得请求它的线程在等待锁重新变得可用的期间进行自旋(特别浪费处理器的时间),所以自旋锁不应该被持有时间过长。如果需要长时间锁定的话,做好使用信号量。
自旋锁的基本形式如下:
spin_lock(&mr_lock)
//临界区
spin_unlock(&mr_lock)
Linux中的信号量是一种睡眠锁。如果有一个任务试图获得一个已被持有的信号量时,信号量会将其推入等待队列,然后让其睡眠。这时处理器获得自由去执行其它代码。当持有信号量的进程将信号量释放后,在等待队列中的一个任务将被唤醒,从而便可以获得这个信号量。
信号量的睡眠特性,使得信号量适用于锁会被长时间持有的情况;只能在进程上下文中使用,因为中断上下文中是不能被调度的;另外当代码持有信号量时,不可以再持有自旋锁。
Linux 内核中的同步机制:原子操作、信号量、读写信号量和自旋锁的API,另外一些同步机制,包括大内核锁、读写锁、大读者锁、RCU (Read-Copy Update,顾名思义就是读-拷贝修改),和顺序锁。
网友评论