一个buf.一个read_buf
来源:互联网 发布:针式打印机用什么软件 编辑:程序博客网 时间:2024/04/28 20:14
数据最终会通过tty-> receive_buf()将数据放入read_buf.
在这段代码中,有几个很有意思的处理。在进入工作队列的时候,首先会置TTY_FLUSHING标志.如果有进程在读read_buf的时候,如果此标志被置位,就会设置TTY_FLUSHPENDING标志,并进行睡眠。在数据处理完成之后,判断是否有TTY_FLUSHPENDING标志。如果有,则将读进程唤醒.并清除TTY_FLUSHPENDING和TTY_FLUSHING
想一想。为什么会这么处理呢?为什么这里需要两个缓存区,一个buf.一个read_buf。为什么要这样麻烦呢?
首先,对于缓存区的数目问题:我们在后面会看到。对接收数据还有一系列的预处理过程,这些过程是比较费时的。不宜在中断中进行费时的操作。所以需要选用软中断机制。这就需要将数据先放置一个buf.再由软中断进行预处理之后,再将它放入到read_buf.这就是两个缓存区的原因.
另外:在存数据到read_buf的时候。会有进程从read_buf中读数据。这样就会造成一个竞争。注意到在软中断情况下是不可睡眠的。我们只能选用自旋锁一类的机制。而这种机制是禁止中断和抢占的。这又违背了软中断机制的初衷。怎么办呢?这就是这样标志的作用了。在设计中,我们必须首先得要保证软中断处理机制的快速完成。所以一进入软中断,就置了一个标志。如果有进程来读数据了,也就是说竞争条件发生了,先将读进程置睡眠。不管怎样,先让软中断处理完之后再说。软中断的工作over这后,再唤醒读进程。
我们之前讲的一系统加锁机制是在两者同样平等的情况。而原子置位与判断置位一般是为了保证一方的工作先完成
原文见:http://bbs.csdn.net/topics/300067769
- 一个buf.一个read_buf
- 有没有函数删除一个buf的某个位置到某个位置buf={1,2,3,4} 我要删除从1-2的位置。得到的是buf={1,4}
- 一个
- 一个
- 练习4-7 编写一个函数ungets(s),将整个字符串压回到输入中。ungets函数需要使用buf和bufp吗?它能否仅使用ungetch函数
- Stream buf
- var buf
- ring buf
- mciSendString("play movie",buf,sizeof(buf),NULL)
- sizeof 之 buf[ ]
- ::new(buf) class();
- Tomcat BUF实用工具集
- buf 经典使用
- read(STDIN_FILENO,buf,BUFFSIZE)
- buf[2]="test"
- DMA-BUF API使用指南
- DMA-BUF API使用指南
- 一个算法一个遗憾
- Android Service学习之AIDL, Parcelable和远程服务
- Java与RESTful
- Hibernate操作Clob类型完整版!
- java “static”关键字深入浅出解释
- PHP配置
- 一个buf.一个read_buf
- MySQL之备份
- 《转载》移植 android, touch screen 不能正常工作的问题
- css引用的两种方式,link和@import的区别
- 代码大全2(读书笔记10)
- Apache Mina 2.x 超详实例
- OnMeasureItem和OnDrawItem的区别和联系
- java文件操作工具类
- 26 个 jQuery使用技巧