momo zone

调核人的blog

关于scullc 中的一些问题

不知道作者怎么想的,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。

1 responses to “关于scullc 中的一些问题

  1. zanderwong 2014年05月5日 8:23 下午

    Reblogged this on Zander Wong and commented:
    姿势

留下评论