牛客网AI面试第五轮

  1. 简述一下 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() 系统调用结束,操作系统由用户态空间切换到内核态空间

  2. 创建线程有哪几种方式
    创建线程
    1,继承Thread
    2,实现Runnable
    3,实现Callable

  3. 说一说你对双亲委派模型的理解
    双亲委派模型要求除了顶层的启动类加载器外,其余的类加载器都应当有自己的父类加载器。
    类加载器
    如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成。
    每一个层次的类加载器都是如此。因此,所有的加载请求最终都应该传送到顶层的启动类加载器中。
    只有当父加载器反馈自己无法完成这个加载请求时(搜索范围中没有找到所需的类),子加载器才会尝试自己去加载。
    很多人对“双亲”一词很困惑。这是翻译的锅,,,“双亲”只是“parents”的直译,实际上并不表示汉语中的父母双亲,而是一代一代很多parent,即parents。

  4. Redis有哪些数据类型
    String:字符串类型, Hash:哈希,类似HashMap, List:列表, Set:无序集合, ZSet:有序集合

  5. 三个数的最大乘积

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]);
    }
}

猜你喜欢

转载自blog.csdn.net/AzirBoDa/article/details/126213478