衡铁刚 1)2011-2013:Alibaba MySQL DBA 2)2014-至今: Alibaba 数据库PD
分类: Mysql/postgreSQL
2012-11-18 12:30:26
从2.6开始内核已经发展成抢占式内核(调度程序可以在任何时刻抢占正在运行的内核代码,重新调度其他的进程执行)
锁的本质区别:当锁已经被其他线程持有,因而不可用时的行为表现.
真并发:出现在对称多处理器,两个进程就可以真正在临界区中同时执行
并发执行的原因:
关键是要给数据而不是给代码加锁,一些概念介绍后来看看linux具体的同步方法
自旋锁最多只能被一个可执行线程持有,一个执行线程试图获取已经被持有的自旋锁,会一直进行忙循环-旋转-等待锁重新可用,等待锁重新可用时自旋,在短期间内进行轻量级加锁,不过也可以让请求线程睡眠直到锁重新可用,但是需要两次上下文切换,但是linux内核实现自旋锁是不可递归的,如果尝试得到一个正在持有的锁,必须自旋,一旦处于自旋忙等待中,就永远没有机会释放锁
特点:加锁时间不长,代码不会睡眠
信号量是一种睡眠锁,如果一个任务试图获得一个不可用的信号量,信号量将其推进一个等待队列,然后让其睡眠,处理器重获自由,从而执行其他代码,当持有的信号量可用后,处于等待队列中的那个任务将被唤醒,获得该信号量,但是信号量比自旋锁有更大的开销,只能在进程上下文中获取信号量锁,占用信号量时不能同时占用自旋锁
任何可以睡眠的强制互斥锁(如计数为1的信号量),长期加锁和持有锁需要睡眠时优先使用互斥体而不是信号量
如果在内核中一个任务需要发出信号通知另一个任务发生了某个特定事件
内核初期的全局自旋锁(BKL大内核锁),2.6中引入了顺序锁,用于读写共享数据,主要依靠序列计数器,禁止抢占、顺序、屏蔽......
头晕了,以后再写吧,哎