(资料图片仅供参考)
Futex系统调用的复杂性体现在其参数上,要理解futex需要充分理解其参数:
从逻辑上看,通过futex实现的互斥锁和内核中的互斥锁mutex是一样的(通过futex实现的读写锁的概念和内核的rwsem也是一样,不再赘述),只不过futex互斥锁是分裂开的:futex word和等待队列是分别在用户空间和内核空间,内核的mutex互斥锁可以讲把待队列头放置在mutex对象上,但是对于futex,我们没有对应的内核锁对象,因此我们就需要一个算法将futex word和其等待队列映射起来。为了管理挂入等待队列的futex阻塞任务,内核建立了一个hansh table如下:
在初始化的时候,内核会构建hashsize个futex hash bucket结构,每个bucket用来管理futex链表(hash key相同)。futex_hash_bucket数据结构定义如下:
在上面的图片中,task 1持有了Lock A和Lock B,阻塞在Lock C上。一个任务只能阻塞在一个锁上,所以红色箭头只能是从任务到锁,不能分叉。由于一个任务可以持有多把锁,所以黑色箭头会有多个锁指向一个任务,即多把锁汇聚于任务。有了这个基本的关系图之后,我们可以形成更加复杂的任务和锁的逻辑图,如下:
关键词: