《TCP/IP详解卷2:实现》笔记--中断级别与并发
2014-04-28 21:28
676 查看
网络代码处理输入分组用的是异步和中断驱动的方式。首先,一个设备中断引发接口层代码执行,然后它产生一个软中断
引发协议层代码执行。当内核完成这些级别的中断后,执行插口代码。
在这里给每个硬件和软件中断分配一个优先级。如下图:
对于不同优先级,一个要关心的问题就是如何处理那些在不同级别的进程共享的数据结构。例如,当IP输入例程正在从它的
输入队列中取出一个接收的分组时,一个设备中断发生,抢占了协议层,并且那个设备驱动程序可能添加一个分组到IP输入
队列。这些共享的数据结构,如果不协调对他们的访问,可能会破坏数据的完整性。
Net/3代码经常调用函数splimp和splnet,这两个调用总是与splx成对出现,splx使处理器返回到原来的优先级。例如下面
这段代码,被协议层IP输入函数执行,去检查是否有其他分组在它的输入队列中等待处理。
存放在变量s中,然后执行宏IF_DEQUEUE把IP输入队列头部的第二个分组删去,并把指向此mbuf链表的指针放到变量m中。
最后,通过调用带有参数s的splx,CPU的优先级恢复到调用splimp前的级别。由于在调用splimp和splx之间所有的网络设备
驱动程序的中断被禁止,在这两个调用间的代码应尽可能的少。如果中断被禁用过长的时间,其他设备会被忽略,数据会被
丢失。
引发协议层代码执行。当内核完成这些级别的中断后,执行插口代码。
在这里给每个硬件和软件中断分配一个优先级。如下图:
对于不同优先级,一个要关心的问题就是如何处理那些在不同级别的进程共享的数据结构。例如,当IP输入例程正在从它的
输入队列中取出一个接收的分组时,一个设备中断发生,抢占了协议层,并且那个设备驱动程序可能添加一个分组到IP输入
队列。这些共享的数据结构,如果不协调对他们的访问,可能会破坏数据的完整性。
Net/3代码经常调用函数splimp和splnet,这两个调用总是与splx成对出现,splx使处理器返回到原来的优先级。例如下面
这段代码,被协议层IP输入函数执行,去检查是否有其他分组在它的输入队列中等待处理。
struct mbuf *m; int s; s = splimp (); IF_DEQUEUE (&ipintrq, m); splx(s); if (m == 0) return;调用splimp把CPU的优先级升高到网络设备驱动程序级,防止任何设备驱动程序中断发生,原来的优先级作为函数的返回值
存放在变量s中,然后执行宏IF_DEQUEUE把IP输入队列头部的第二个分组删去,并把指向此mbuf链表的指针放到变量m中。
最后,通过调用带有参数s的splx,CPU的优先级恢复到调用splimp前的级别。由于在调用splimp和splx之间所有的网络设备
驱动程序的中断被禁止,在这两个调用间的代码应尽可能的少。如果中断被禁用过长的时间,其他设备会被忽略,数据会被
丢失。
相关文章推荐
- 网上资料笔记总结!!数据库事务并发问题,锁机制和对应的4种隔离级别
- Java并发编程实践笔记之—阻塞和中断方法(Blocking and Interruptible Methods)
- (43)21.4.3 中断---Java编程思想之并发笔记
- (47)21.4.3 中断2---Java编程思想之并发笔记
- [原创]java WEB学习笔记93:Hibernate学习之路---Hibernate 缓存介绍,缓存级别,使用二级缓存的情况,二级缓存的架构集合缓存,二级缓存的并发策略,实现步骤,集合缓存,查询缓存,时间戳缓存
- (48)21.4.4 检查中断---Java编程思想之并发笔记
- JAVA 并发的基础笔记
- JAVA并发编程笔记二
- 微信公号“架构师之路”学习笔记(二)-高可用高并发负载均衡的架构设计(冗余+自动故障转移、水平扩展等)
- 高并发服务器架构笔记(3)——muduo_base 源码分析
- 【Java并发】并发笔记(一)
- 并发编程学习笔记之Lock与synchronized
- 【张孝祥并发课程笔记】13:java5的同步工具简介
- 【Java并发】并发容器笔记
- Linux中断异步通知笔记
- ARM 学习笔记(二) S3C2440 中断配置
- linux内核设计与实现笔记之中断和中断处理
- (学习笔记)51单片机的中断功能及其相关的寄存器
- 个人学习笔记---软中断(下半部)和软件中断(系统调用)的区别
- Ice笔记--C++线程与并发(二)