20240307

近几天导师那边项目和开题比较忙,学的很零散,断更了几天...

NAPI机制

网卡专门负责接收和发送网络包,当其接收到一个网络包后,会通过 DMA 技术,将网络包写入到指定的内存地址即Ring Buffer ,这个是一个环形缓冲区,接着通过触发中断的方式告诉操作系统这个网络包已经到达,但这样CPU会频繁处理中断,导致其他任务无法推进,因此需要引入一种机制进行缓解。

Linux 内核在2.6版本中引入了 NAPI 机制,它是混合中断和轮询的方式来接收网络包,它的核心概念就是不采用中断的方式读取数据,而是首先采用中断唤醒数据接收的服务程序,然后poll的方法来轮询数据。当有网络包到达时,会通过DMA技术将网络包写入到指定的内存地址,接着网卡向 CPU 发起硬件中断,当 CPU 收到硬件中断请求后,根据中断表,调用已经注册的中断处理函数。

硬件中断包含的流程:

1、需要先暂时屏蔽中断,表示已经知道内存中有数据了,告诉网卡下次再收到数据包直接写内存就可以了,不要再通知 CPU 了,这样可以提高效率,避免 CPU 不停的被中断。

2、发起软中断,完成后恢复刚才屏蔽的中断。

3、内核中的ksoftirqd线程专门负责软中断的处理,当ksoftirqd内核线程收到软中断后,就会来轮询处理数据,线程会从Ring Buffer中获取一个数据帧,从而可以作为一个网络包交给网络协议栈进行逐层处理。

4、网络包从网络接口层逐层向上,依次去掉帧头、TCP 头或 UDP 头,此时已到达传输层,再根据四元组(源 IP、源端口、目的 IP、目的端口)作为标识,得到对应的 Socket,并把数据放到 Socket 的接收缓冲区,应用层程序调用 Socket 接口,将内核的 Socket 接收缓冲区的数据拷贝到应用层的缓冲区,然后唤醒用户进程,网络包的接收过程结束。

类加载顺序

1、父类静态代码块(包括静态初始化块,静态属性,但不包括静态方法)

2、子类静态代码块(包括静态初始化块,静态属性,但不包括静态方法)

3、父类非静态代码块(包括非静态初始化块,非静态属性 )

4、父类构造函数

5、子类非静态代码块 (包括非静态初始化块,非静态属性 )

6、子类构造函数

子类覆盖父类方法

即方法重写实现多态,若A类继承了B类,且执行B b = new A(),其为多态的一种表现形式,声明是B,实现是A类,理解为b编译时表现为B类特性,运行时表现为A类特性。

若B中有构造方法,该构造方法执行c函数,且A中也包含c函数,则执行B b = new A()时调用B类的构造方法(此时由于B中的构造方法被初始化),执行的是A类中的c函数。

全部评论

相关推荐

点赞 1 评论
分享
牛客网
牛客企业服务