深入理解Linux网络技术内幕 第1章 简介

内存缓存

内核使用kmalloc和kfree分配和释放内存块。对于常用的数据结构比如struct skb_buff等内核通常分配一块内存缓冲区用于常用数据结构的申请和释放。
处理内存缓存相关的函数

  • kmem_cache_create
  • kmem_cache_destroy
  • kmem_cache_alloc
  • kmem_cache_free

引用计数

为了避免访问已经释放的数据结构,同时让垃圾回收机制更加容易和有效率,很多数据结构会设置引用计数(reference count)。对于数据结构的存储和释放,内核组件会分别递增和递减引用计数。一般内核组件提供两个函数用于维护引用计数。xxx_get、xxx_put或者xxx_hold、xxx_release等。

垃圾回收

内核垃圾回收方式主要有两种:

  • 异步
    定时器定义调用函数,扫描数据结构然后把那些适合删除的数据结构释放掉。

  • 同步方式
    内存不足时立即出发垃圾收集动作,不用等定时器超时出发异步操作。

函数指针和虚拟函数表(VFT)

借助函数指针可以使C语言实现面向对象语言的某些优点。在定义数据结构的时候将函数指针作为结构的成员。
函数指针的优点是可以根据不同逻辑规则为对象设置不同的操作函数。
执行函数指针时需要检查其值是否为NULL,避免发生段错误。
函数指针缺点是增加阅读代码的困难程度,需要搞清楚函数指针的初始化位置。

goto语句

Linux内核中使用goto语句作为异常处理的常用方式。

likely和unlikely宏

这个两个宏利用gcc编译器的特性,使产生的汇编代码更优。主要影响CPU的流水线判断,降低cpu的branch_miss。

互斥

自旋锁

一个时刻只有一个执行线程持有的锁,该锁只用于多处理器系统中,且该锁只会在短期持有的时候使用。

读写锁

和自旋锁很像,但是同一时刻允许多个持有读锁。写锁还是排他的。

RCU

读取(拷贝)更新(read-copy-update RCU)是Linux提供的最新机制,在下列特定条件下工作很好:

  • 读-写锁相比读锁的数量少很多
  • 持有该锁的代码不休眠
  • 持有该锁的数据结构以指针形式访问

RCU锁在SMP系统上对处理器缓存比较友好,具体的可以参考我的另外一篇文章《》

展开阅读全文
©️2019 CSDN 皮肤主题: 游动-白 设计师: 上身试试
应支付0元
点击重新获取
扫码支付

支付成功即可阅读