不知道作者怎么想的,scullc的一些算法和scull不一样,除了使用了slab 还有就是scullc_follow 和scull_follow的差别。前者返回一个scullc_dev 后者返回一个scull_qset这两个不是一个层面的东西嘛 ,结果 scullc_dev 充当了两个角色,scullc设备结构和量子集,不过这样用下来也没有问题。因为scullc.h 中的scullc_dev是这样定义的:
struct scullc_dev {
void **data;
struct scullc_dev *next; /* next listitem */
int vmas; /* active mappings */
int quantum; /* the current allocation size */
int qset; /* the current array size */
size_t size; /* 32-bit will suffice */
struct semaphore sem; /* Mutual exclusion */
struct cdev cdev;
};
注意红色,看来作者真是故意的,但我不了解这要搞的目的。我对比了一下scull和scullc 的效率,确实后者好很多!
localhost:~ # time dd if=/media/disk-2/chrono_cross_1.flv of=/dev/scullc
99840+1 records in
99840+1 records out
51118215 bytes (51 MB) copied, 0.106118 s, 482 MB/s
real 0m0.109s
user 0m0.028s
sys 0m0.079s
localhost:~ # time dd if=/media/disk-2/chrono_cross_1.flv of=/dev/scull
99840+1 records in
99840+1 records out
51118215 bytes (51 MB) copied, 0.265509 s, 193 MB/s
real 0m0.269s
user 0m0.022s
sys 0m0.218s
差不多快了3倍 !
但有两点ldd3 中没有说明
1. 其实kmalloc 也是基于slab 伙伴系统来分配内存的,不同的是每次kmalloc的大小不同, 因此是从不同的slab队列中分配。直接使用内核cache的话在分配和回收的时候都是固定大小,这样可以少执行一些代码,所以开销小,速度快。
2. 用于kmalloc可分配(每次调用)的内存大小范围在32~131027(128k)字节,并且由于它用slab分配器来分配内存的,所以,得到的内存大小可能比你申请的要大一些(它向上取2的N次幂整数)。而且如果开启了CONFIG_LARGE_ALLOCS选项,这个值可以更大,可以达到了32M。
Reblogged this on Zander Wong and commented:
姿势