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