大家好,我(被迫)来更新第一章了。虽然也是做了题目,但是知识已经光滑地从我脑子上面滑过,我记不清发生了什么了。这里先给大家放一下本书的源码社区链接吧,就是本书跟练实战的实验平台。
runninglinuxkernel_5.0: 奔跑吧linux内核第二版(卷1,卷2,入门篇) 实验平台 (gitee.com)
然后在gitee的介绍主页会引导你去关注公众号,回复Linux2之后就会给你一个度盘链接,可以下载免费的资料。有虚拟机镜像,免费视频,所有的插图,还有一些勘误的部分。虚拟机镜像是给我们windows系统的朋友使用的,mac book的朋友使用GPL V2免费授权的virtualbox软件。然后就可以挂载到虚拟机上面了,虚拟机这玩意你懂的,就是内存不够的时候比较折腾人,一顿操作下来我的盘又开始告急了。
然后就是读书的部分,大概摘抄一下几个概念的总结吧。自旋锁和排队自旋锁,还有信号量。
自旋锁在同一时刻只能被一个内核代码路径持有。如果另外一个内核代码路径试图获取一个已经被持有的自旋锁,那么该内核代码路径需要一直忙等待,直到自旋锁持有者释放该锁。如果该锁没有被其他内核代码路径持有(或者称为锁争用),那么可以立即获得该锁。自旋锁的特性如下。
忙等待的锁机制。操作系统中锁的机制分为两类,一类是忙等待,另一类是睡眠等待。自旋锁属于前者,当无法获取自旋锁时会不断尝试,直到获取锁为止。 同一时刻只能有一个内核代码路径可以获得该锁。 要求自旋锁持有者尽快完成临界区的执行任务。如果临界区中的执行时间过长,在锁外面忙等待的CPU比较浪费,特别是自旋锁临界区里不能睡眠。 自旋锁可以在中断上下文中使用。
排队自旋锁,继承了MCS算法到自旋锁中,有效解决CPU高速缓存行颠簸问题。没有增加spinlock数据结构的大小,把val分成多个域。
当至于两个CPU试图获取自旋锁时候,使用pending域解决问题。第二个CPU只需要设置pending域然后自旋等待锁释放。当有第三个或者更多CPU来争抢时候需要使用额外MCS节点。第三个CPU会自旋等待锁被释放,即pending域和loscked域被清零,而四个以后的CPU在MCS节点中自旋,等待locked域被置为1,等到前继结点把locked控制器过继给自己才有机会自旋等待自旋锁的释放。
信号量有一个有趣的特点,它可以同时允许任意数量的锁持有者。信号量初始化函数为sema_init(struct semaphore *sem, int count),其中count的值可以大于或等于1。当count大于1时,表示允许在同一时刻至多有count个锁持有者,这种信号量叫作计数信号量(counting semaphore);当count等于1时,同一时刻仅允许一个CPU持有锁,这种信号量叫作互斥信号量或者二进制信号量(binary semaphore)。在Linux内核中,大多使用count值为1的信号量。相比自旋锁,信号量是一个允许睡眠的锁。信号量适用于一些情况复杂、加锁时间比较长的应用场景,如内核与用户空间复杂的交互行为等。