6.2避免网络代码中的调度开销 UNX将所有协议代码作为内核进程的一部分执行 当一个包到达时, 网络适配器产生一个硬件中断 。中断处理程序将包放入一个内存队列,然后通过软件中 断调度一个内核进程(一次上下文切换) 内核进程执行协议处理,通过检查传输层端口号得到目 的应用,唤醒应用(一次上下文切换) 每个包的处理至少经历两次上下文切换: 中断上下文到内核进程(协议处理) 内核进程到应用进程
UNIX将所有协议代码作为内核进程的一部分执行 当一个包到达时, ◦ 网络适配器产生一个硬件中断 ◦ 中断处理程序将包放入一个内存队列,然后通过软件中 断调度一个内核进程(一次上下文切换) ◦ 内核进程执行协议处理,通过检查传输层端口号得到目 的应用,唤醒应用(一次上下文切换) 每个包的处理至少经历两次上下文切换: ◦ 中断上下文到内核进程(协议处理) ◦ 内核进程到应用进程
在用户空间实现协议 基本思想: 协议处理与应用在同一个进程中,可以通过 upcall 进行通信 用户级实现的好处 可以绕过内核,直接从中断上下文到应用进程,减 次上下文切换 协议代码可以在用户空间编写和调试 问题: 中断例程如何确定将包交给哪个应用进程?
基本思想: ◦ 协议处理与应用在同一个进程中,可以通过upcall 进行通信 用户级实现的好处: ◦ 可以绕过内核,直接从中断上下文到应用进程,减 少一次上下文切换 ◦ 协议代码可以在用户空间编写和调试 问题: ◦ 中断例程如何确定将包交给哪个应用进程?
中断例程如何确定包的应用进程? 方案一:使用一个解复用进程 解复用进程检查所有的包,确定包的目标进程, 将包交给目标进程。 缺点:增加一次进程切换。 Demux- Process 1 Process 2 process KERNEL (driver)
方案一:使用一个解复用进程 ◦ 解复用进程检查所有的包,确定包的目标进程, 将包交给目标进程。 ◦ 缺点:增加一次进程切换
中断例程如何确定包的应用进程? 方案二: 内核定义一个接口(如 Berkeley packet Filter,BPF) 允许应用声明自己要处理的包类型 中断例程根据一组包过滤器进行解复用(提前解复用) ---Process 1 Process 2---, KERNEL Filter for Filter for s Process 1 Process 2 F1 F3 Arriving Packet FIGURE 6.5 The packet filter approach to demultiplexing
方案二: ◦ 内核定义一个接口(如Berkeley Packet Filter,BPF), 允许应用声明自己要处理的包类型 ◦ 中断例程根据一组包过滤器进行解复用(提前解复用)
协议代码实现为一个共享库 用户级协议实现要求每个应用进程应当实 现协议栈 通常将TCP/P代码实现为一个共享库,链 接到应用中,避免在每个应用中复制 TCP/P代码: TCP/P代码必须是可重入的
用户级协议实现要求每个应用进程应当实 现协议栈 通常将TCP/IP代码实现为一个共享库,链 接到应用中,避免在每个应用中复制 TCP/IP代码: ◦ TCP/IP代码必须是可重入的