想谈恋爱的鱼

想起记忆深处的一首歌。
想谈恋爱的鱼。
跟大家分享下

[阅读全文] »

LDD读书笔记第八章-分配内存

kmalloc函数的内幕

kmalloc函数在没有阻塞的情况下运行速度很快。
并且不会对申请到的内存区域清空,所以在使用时必须清空。
函数原型

1
2
3
#include <linux /slab.h>
void *kmalloc(size_t size, int flags);
</linux>

第一个参数size 表明要申请的内存区域大小。
flags是分配标志,能以多种方法控制kmalloc的行为。

flags参数

带”__“的标志可与不带的版本一起“或”来使用。
[阅读全文] »

LDD读书笔记第七章-时间、延迟及延缓操作

度量时间差

在linux/param.h中定义HZ值,表示每秒发生时钟中断的频率。
内核时钟计数器:jiffies_64。
内核使用jiffies变量是unsigned log类型。
可能是jiffies_64的值也可能是其底32位。

使用jiffies计数器

头文件:linux/jiffies.h
jiffies变量被声明为volatile防止编译时优化。
[阅读全文] »

LDD读书笔记第六章-高级字符驱动程序操作(一)

ioctl

ioctl是用于控制设备的公共接口,设备除了需要处理读取写入之外还需要一些相关控制信息。这些控制信息就是由ioctl调用来完成
用户空间的ioctl原型为

1
int ioctl(int fd,unsigned long cmd,...);

后面的“…“表示函数的参数个数是可变的(如printf)。
内核空间的ioctl原型

1
2
int (*ioctl)(struct inode *inode,struct file *filp.
		unsigned int cmd,unsigned long arg);

cmd 为指令编号,后面讲述。
arg 为参数。可以是整数也可以是指针,但是内核会以unsigned long形式传送导函数里。
[阅读全文] »

LDD读书笔记第五章-并发和竞态(二)

锁陷阱

不明确的规则:每个线程不能第二次尝试获得该锁。
锁的顺序规则:保证每个线程都以相同的顺序获得锁。
锁的粒度对比:粗粒度锁会导致竞争严重,细粒度锁会导致额外的开销和给维造成副作用

除了锁之外的方法

免锁算法

大量的读取者,只有一个写入者可以使用免锁算法。
免锁算法类似于循环队列(个人理解)。

原子变量

原子变量执行速度非常块。
只要有可能编译器会把对原子变量的操作编译成单条指令。
[阅读全文] »

Page 3 of 5«12345»