TCP/IP详解卷2:实现 第一章 笔记四

来源:互联网 发布:获取键值对java 编辑:程序博客网 时间:2024/05/21 22:22

中断级别与并发

中断是指当出现需要时,CPU暂时停止当前程序的执行转而执行处理新情况的程序和执行过程。
关中断是指在此中断处理完成前,不处理其它中断.

软中断是利用硬件中断的概念,用软件方式进行模拟,实现宏观上的异步执行效果。很多情况下,软中断和"信号"有些类似,同时,软中断又是和硬中断相对应的,"硬中断是外部设备对CPU的中断","软中断通常是硬中断服务程序对内核的中断","信号则是由内核(或其他进程)对某个进程的中断

首先我们先前说了网络代码输入分组用的是异步和中断驱动方式,当一个设备中断他会引发接口层代码执行,然后产生一个软中断引发协议层代码执行。当内核完成这些级别中断后,执行插口代码。
这里有张表表示每一个硬件和软件分配一个优先级,从最低价(不阻塞中断)到最高级(阻塞所有中断)。


这张图会很明显解释这些中断之间的关系:
1)当插口层以级别sp10执行时,一个以太网设备驱动程序中断发生(splimp),这个中断抢占了插口层代码执行,这就是异步执行接口输入例程。
2)当以太网设备驱动程序在运行时,它把一个接受的分组放置到Ip输出队列中并调度一个splnet软中断,软中断不会立即生效,因为内核有一个更高优先级上执行。
3)当以太网设备执行完成后,splnet执行。这就是异步执行IP输入例程。
4)一个中断设备中断发生,它立即被处理,抢占协议层因为他的优先级spltty高于splnet。
5)slip设备驱动程序把接收的分组放到IP输入队列中并为协议层调度另一个软中断。
6)当SLIP驱动程序结束后,被抢占的协议层继续以级别splnet执行,处理完从以太网设备驱动程序收到的分组后,处理从SLIP收到的分组,直到没有要处理的输入分组时,他会把控制权返回给抢占的进程。
7)插口层从它被中断的地方继续执行。
前面说到了spl函数其中有splimp和splnet这俩个调用总是与splx成对出现,他们的使用说白了就是保护数据的完整性。看下面的代码
struct mbuf *m;
int s;
s = splimp();//设置为最高优先级别
if(IF_QFULL(&ifp->if_snd)){
IF_DROP(&ifp->if_snd);队列满了,就丢掉包
splx(s);恢复调用前的优先级
error;
}
IF_ENQUEE(&ifp->if_snd,m);
if((ifp->if_flags &IFF_OACTIVE) == 0)
(*IFP->if_start)(ifp);
splx(s);
当以太网输出例程把一个要输出的分组放到一个接口队列,并测试当前接口是否忙,若接口不忙则启动接口。
设备发送队列在协议层和接口层共享的数据结构。
假如我们以以太网驱动程序执行时,SLIP驱动程序会发生什么?
SLIP的优先级低于以太网,且高于splnet,因此SLIP驱动程序被中断并且会被阻塞。
好了第一章结束了,我想第一章虽然说的很笼统,但是网络流程,我们心里都有了一点想法了,接下来就是学习第二章mbuf了,其实数据结构的学习比较简单,只要能理解他的好处和不足,我们就能轻车熟路。先把基础知识弄明白了,以后再跳着看,我想说章数太多了只能跳着看了,不过我会从插口层到协议层到接口层会细看的。好了今天到这里吧,安喽~。
1 0
原创粉丝点击