读书笔记--《LINUX内核设计与实现》(二)

本文探讨了Linux内核中的SLAB管理机制及其与内存分配的关系,并对比了Windows下的内存初始化模式。此外,还讨论了Linux内核如何通过面向对象的方式进行设计,特别是kmem_cache_create函数的应用。最后,介绍了Linux文件系统的组成及关键对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SLAB管理
/*
/*个人感觉是对cache的管理,而它在书上的解释意思是
/*高速对象的管理,难道我接触比较片面??也不知道。
/*需要琢磨。不过它反正都是内存页的分配操作,应该就是
/*cache了。。。
/*
*/
===============================
发现一个问题:linux使用SLAB分配cache可以指定标志,用SLAB_POSION标志可以
              指定用a5a5a5a5填充slab,以前在Windows下写程序,debug版的
              未显式出示化的内存也是a5a5a5a5,难道Windows抄袭Linux,哈哈!!
              但仔细想想,不太可能,linux比Windows后出来,它们应该都是
              抄袭Dos或者Unix吧
遐想二:      网上看帖子讨论能否用C实现面向对象,其实是可以部分实现的。
              内核的VFS的实现就是面向对象的思想。还有
              内核中的kmem_cache_create就带有构造函数和析构函数,和C++对象很像啊,哈哈!
              很多结构体中也带有指向函数的指针,其实这就是一个类,只是C++引入了
              编译时代码保护,即public,private,protocol。
              不过类的继承等需要语言改进和编译器支持
              其实用C++写操作系统是绝对行的,速度应该和C的差不多

胡思乱想了一通,切入正题
kmem_cache_create()  //分配cache对象,标记参见P157,失败返回NULL
    //注意:此函数可能会睡眠,所以不要用在中断里
kmem_cache_destroy  //销毁cache对象,也要睡眠。成功返回0。
    //如果对象正被引用会销毁失败
kmem_cache_alloc  //返回分配的内存地址,应该是物理地址,因为
    //1.kmem
    //2.cache都是分配在物理内存中,所以返回的应该是物理地址
kmem_cache_free   //标记cache为空闲(以后才好destory或者再分配)


在SMP上对公共变量的访问需要禁止抢占,使用如下宏或函数
DEFINE_PER_CPU(type, name) //为每个CPU定义一个类型为type,名字为name的变量
DECLARE_PER_CPU(type, name) //声明一个类型为type,名字为name的变量
get_cpu_var(name);  //返回当前cpu上的指定变量,同时禁止抢占
put_cpu_var(name);  //放回数据并重新激活抢占
/*
/*引入PER_CPU是为了在其他CPU上运行同一个进程的时候加速对这种资源(应该不是同一个对象)的访问
/*个人理解就是和SLAB一样,管你用不用,先预分配了再说,以后在其他CPU上运行同一个进程时不用再
/*分配空间了
*/

也可以获得别的CPU上的数据
per_cpu(name, cpu)++;  //获得CPU号为cpu的CPU上的name变量并加1
    //注意,它不会禁止抢占和加锁,比较危险

动态分配每个CPU数据
alloc_percpu(type)  //分配一个类型为type的CPU数据
free_percpu()   //释放类型为type的CPU数据


文件系统
=================================
VFS主要对象类型
1.超级块对象 (struct super_block)
2.索引节点对象 (struct inode)
3.目录项对象 (struct dentry)
4.文件对象 (struct file)

目录项对象的三种状态:
1.被使用(NULL != d_inode && d_count > 0)
2.未使用(NULL != d_inode && 0 == d_count)
3.负状态(NULL == d_inode)

进程和文件系统相关联的主要三个数据结构是:
1.struct files_struct (打开的文件和文件描述符相关信息)
2.struct fs_struct (文件系统相关信息)
3.struct namespace (2.6的核在nsproxy结构体中)
它们在struct task_struct中有引用

2.6的核中namespace使用的是等待队列(wait_queue),没有用2.4的sem了,提高了效率吧
namespace确实不太常用

大多数的进程都维护各自的files_struct和fs_struct,但clone除外,它们可能指向同一个对象。
而namespace则不一样,一般来说所有程共享此结构体,只有在clone时指定特殊标志才得到新的
命名空间

区分字符设备和块设备的关键是它们是否可以随机访问
扇区是磁盘最小的物理存储单元

2.6的核中块I/O已基本很少使用了,取而代之的是页高速缓存的使用。


页高速缓存
===================================
dirty_background_ratio //释放赃页重获内存

 

 

 

 

 

 

 

 

 

 

 

 

 

 


=====================================
1.LINUX内核设计与实现
2.深入理解LINUX网络内幕
3.iptables                         //资料: http://linux.ccidnet.com/pub/html/tech/iptables/index.htm
4.Linux 的高级路由和流量控制HOWTO
5.Understanding Linux Kernel

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值