linux write的行为
从write()调用返回时,内核已经将缓冲区所提供的数据到内核的缓冲区,但是无法保证数据已经写出到其预定的目的地。的确,写入调用返回的速度实在太快了,可能没有时间完成该项目的工作。处理器和硬盘之间的性能差异使得此类令人头痛的行为显而易见。
事实上,如果用户空间应用程序发出write()系统调用,Linux内核会先进行若干检查,接着将数据复制进缓冲区。稍后,内核会在后台收集所有“脏”(有数据写入)缓冲区(内容跟相应磁盘块不同的所有缓冲区),将它们安排成最佳顺序,接着写进磁盘。这让写入调用的执行快如闪电,几乎立即返回,这也让内核可以将写入操作延后到较空闲的时段再进行,并且是多笔写入操作会整批一起进行。
延后进行的写入操作并不会改变POSIX的语义。举例来说,数据刚写入缓冲区而尚未写回磁盘,此时如果发出读取请求,此请求可从缓冲区得到满足,而且不会因此而读取到地盘上的旧数据。此行为会实际提高性能,因为读取请求可从内存中的缓冲区得到满足,而不必从磁盘。当读取和写入请求如预期般交替出现时,结果也和预期一样,也就是说,数据被写回磁盘之前系统不会崩溃!即使应用程序相信写入请求已经成功完成了,但事实上数据尚未写回磁盘。
延后写入的另一个问题是无法安排写入顺序,尽管应用程序可能会安排写入请求的顺序,好让他们能够按照特定的顺序写回磁盘,内核会以它认为合适的方式重新安排写入请求的顺序,主要是基于新能的考虑。除非系统崩溃,否则这通常不是一个问题,因为所有缓冲区最后都会写回磁盘,所以一切都很好。即使如此,绝大多数的应用程序实际上并不关心写入请求的顺序。
延迟写入必须探讨的最后一个问题是汇报I/O错误。写回磁盘期间可能会发生任何无法向发出写入请求的进程汇报的I/O错误,例如磁盘驱动器故障。的确,缓冲区与这些进程毫无关系。假如有多个进程“弄脏”(将数据写入)单一缓冲区,而这些进程可能在数据写入缓冲区之后并且在数据写回磁盘之前先借宿了。
内核会试图尽量降低延后写入的风险,为了确保数据可以被及时写出,内核未缓冲区设立了一个时间上限,而且会在时间超过上限之前写出所有“脏”缓冲区。用户可通过/proc/sys/vm/dirty_expire_centiseconds来设定此值,此值以厘秒(百分之一秒)为单位。
相关文档:
总览
用iptables -ADC 来指定链的规
则
,-A添加 -D删除 -C 修改
iptables - [RI] chain rule num rule-specification[option]
用iptables - RI 通过规则的顺序指定
iptables -D chain rule num[option]
删除指定规则
iptables -[LFZ] [chain][option]
用iptables -LFZ 链名 [选项]
iptables -[NX] chain
用 -NX ......
驱动编程核心理论之并发控制
并发,竟态的理解:也就是Linux的东西在时间和空间被同时使用导致的问题
Linux系统提供的解决方案:
中继屏蔽
原子操作
自旋锁
信号量
1,中断屏蔽
首先这个依赖 ......
以 i2c-mpc.c 驱动模块为例
fsl_i2c_init -> of_register_platform_driver -> of_register_driver -> driver_register -> bus_add_driver -> driver_attach
-> bus_for_each_dev -> __driver_attach -> driver_probe_device -> really_probe -> drv->probe(dev); ......
Author-------Dansen-----xzd2734@163.com
wait_queue_head_t wait_q;
首先看看
wait_queue_head_t这个等待队列的结构
在wait.h中定义了这个结构
typedef struct
__wait_queue_head wait_queue_head_t;
struct __wait_queue_head {
wq_lock_t
lock;
struct list_head task_list;
};
# define wq_ ......