深入理解网络技术内幕 阅读笔记(一)

来源:互联网 发布:网络打印相片 编辑:程序博客网 时间:2024/06/05 10:38
第一章 简介

内存缓存:内核分别使用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新机制,下列特定条件下工作的很好:

  • 与只读锁的请求相比,读-写锁的请求很少见。
  • 持有该锁的代码以原子的形式执行,而且不能休眠。
  • 该锁保护的数据结构是通过指针访问的。
        RCU在网络代码中的使用实例就是路由子系统。在缓存中查询比更新更要频繁,因此实现路由缓存查询的函数不会在搜索期间被阻塞。rt_hash_table,ptype_all,ptype_base,inet_protos。
       

0 0
原创粉丝点击