内存缓存:内核分别使用kmalloc和kfree函数分配和释放一个内存块。当分配和回收经常发生时,相关的内核组建初始化函数通常会分配一块特殊的内存缓存,以作分配之用。当一个内存块被释放时,实际上是返回到当初被分配的同一个缓冲区中。内核维护的其专属内存缓存的一些网络数据结构的例子包括,
套接字缓冲区描述符:用于分配sk_buff缓冲区描述符。sk_buff结构可能是网络子系统中分配和回收注册次数最高的。
邻居映射协议:每一个邻居映射协议都使用一个缓存区,以分配存储L3层到L2层地址映射的数据结构(struct neighbour)。
路由表:路由代码使用两个缓存,用于定义路径的三个数据结构(struct fib_node, struct fib_alias, struct rtable<v4>)。
kmem_cache_create
kmem_cache_destroy
创建和销毁一个缓存。
kmem_cache_alloc
kmem_cache_free
为缓存分配及回收一个缓冲。
互斥:每种互斥机制都是特定环境下的最佳选择。
回旋锁(spin lock):这是一种在某一个时刻只能由一个执行的线程所持有的锁。若试图获得由另一个执行线程所持有的锁,则要进入循环等待,直到该锁被释放为止。由于进入循环将造成浪费,回旋锁只用于多处理器系统中,并且通常只用在开发人员预期该锁只会被短期持有的时候。此外,由于会引起其他执行线程的浪费,执行线程在持有回旋锁时不能休眠。
读-写回转锁:当给定锁的使用可以明确分为只读和读-写时,应该先使用读-写回转锁。同一时刻该锁的持有者只能有一个可以写入,同时,当该锁被一个写入者持有时,读者都不能取得该锁。由于读取者的优先级高于写入者,因此当读取者的数目远远超过写入者的数目时,这种类型的锁能很好的工作。例如fib_hash_lock,dev_base_lock,proto_list_lock。
RCU:Linux新机制,下列特定条件下工作的很好:
- 与只读锁的请求相比,读-写锁的请求很少见。
- 持有该锁的代码以原子的形式执行,而且不能休眠。
- 该锁保护的数据结构是通过指针访问的。