-
简述一下 Linux 中的零拷贝
零拷贝(Zero-Copy)就是一种避免 CPU 将数据从一块存储拷贝到另外一块存储的技术,是指将数据直接从磁盘文件复制到网卡设备中,而不需要经由应用程序之手。
Linux中零拷贝
● Linux中零拷贝实现Linux 中零拷贝技术实现方式通常有 2 中:
● mmap() + write()
● sendfile()
● 零拷贝的实现原理
● mmap() + write():mmap() 系统调用函数会直接把内核缓冲区里的数据映射到用户空间,这样,操作系统内核与用户空间就不需要再进行任何的数据拷贝操作。具体过程:
○ 应用进程调用了 mmap() 后,DMA 会把磁盘的数据拷贝到内核的缓冲区里,接着应用进程跟操作系统内核共享这个缓冲区
○ 应用进程再调用 write(),操作系统直接将内核缓冲区的数据拷贝到 socket 缓冲区中,这一切都发生在内核态,由 CPU 来搬运数据
○ 最后,把内核的 socket 缓冲区里的数据,拷贝到网卡的缓冲区里,这个过程是由 DMA 搬运的
● sendfile():在 Linux 内核版本 2.1 中,提供了一个专门发送文件的系统调用 sendfile()。具体过程:
○ 发起 sendfile() 系统调用,操作系统由用户态空间切换到内核态空间
○ 通过 DMA 引擎将数据从磁盘拷贝到内核态空间的输入的 socket 缓冲区中
○ 将数据从内核空间拷贝到与之关联的 socket 缓冲区
○ 将 socket 缓冲区的数据拷贝到协议引擎中
○ sendfile() 系统调用结束,操作系统由用户态空间切换到内核态空间 -
创建线程有哪几种方式
创建线程
1,继承Thread
2,实现Runnable
3,实现Callable -
说一说你对双亲委派模型的理解
双亲委派模型要求除了顶层的启动类加载器外,其余的类加载器都应当有自己的父类加载器。
类加载器
如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成。
每一个层次的类加载器都是如此。因此,所有的加载请求最终都应该传送到顶层的启动类加载器中。
只有当父加载器反馈自己无法完成这个加载请求时(搜索范围中没有找到所需的类),子加载器才会尝试自己去加载。
很多人对“双亲”一词很困惑。这是翻译的锅,,,“双亲”只是“parents”的直译,实际上并不表示汉语中的父母双亲,而是一代一代很多parent,即parents。 -
Redis有哪些数据类型
String:字符串类型, Hash:哈希,类似HashMap, List:列表, Set:无序集合, ZSet:有序集合 -
三个数的最大乘积
import java.util.*;
public class Solution {
/**
* 最大乘积
* @param A int整型一维数组
* @return long长整型
*/
public long solve (int[] A) {
// write code here
Arrays.sort(A);
return Math.max((long)A[0]*A[1]*A[A.length-1],(long)A[A.length-3]*A[A.length-2]*A[A.length-1]);
}
}