首页 > 其他分享 >字节2面真题,你能答对几道?

字节2面真题,你能答对几道?

时间:2023-11-24 10:33:52浏览次数:43  
标签:持久 字节 COW 答对 Redis 面真题 复制 数组 进程

字节跳动的面试难度,放眼整个互联网都是“遥遥领先”!不能说有多难,就是看了都不会的哪种!当然,这句话是开玩笑的。

咱们先来看下字节二面的所有问题:
image.png
前半部分的问题比较简单,相信大部人都能搞定(如果你搞不定,可以偷偷去看磊哥的武林秘籍:https://www.javacn.site)。本文咱们就挑两个比较典型的问题来回答。

1.RDB 持久化会阻塞主线程吗?

注意这个问题有坑,这个问题千万别上来就说:“不会阻塞主线程”,这样回答只能拿到 50 分,压根都没过及格线,为什么呢?

因为 RDB 持久化是有可能会阻塞主线程的,因为 RDB 持久化有以下两种命令:

  • save:同步持久化 Redis。
  • bgsave:background save,后台保存的意思,也就是后台持久化 Redis。

默认情况下,如果不是手动执行“bgsave”命令,则会使用“save”命令来持久化 Redis,此时是会阻塞 Redis 主线程的。所以,这是一个不难,但很容易答错的问题。

2.说一下 Copy On Write 技术?

在市面上很少有面试官问 Java 程序员 COW(Copy On Write,写时复制)技术的,当然能回答上来的人也不多,那咱们就来看看什么是 COW?

Copy On Write(写时复制)是一种延迟复制的技术,用于在多个线程(或进程)之间共享资源时减少内存复制成本的。它的基本思想是,在创建拷贝或修改资源之前,不会真正的进行复制操作(懒汉模式),而是共享同一份资源的只读副本,直到某个线程(或进程)试图修改资源时,才会对资源进行复制操作。 这种延迟复制的策略可以减少资源复制的开销,一定程度提高了性能和效率。

那它的使用场景有哪些呢?咱们继续来看。

2.1 Redis 中的 Copy On Write

单线程的 Redis 想要解决一边响应主线程的任务,一边持久化数据,依靠的就是 COW 技术,具体来说就是依赖系统的 fork 函数的 COW 实现的。

具体来说,COW 技术的使用过程是这样的:

  1. 在执行 RDB 持久化时,Redis 进程会 fork 一个子进程来执行持久化,该过程是阻塞的。
  2. 当 fork 过程完成后,父进程会继续接收客户端的命令。
  3. 此时子进程与 Redis 主进程共享内存中的数据,但是子进程并不会修改内存中的数据,而是不断的遍历读取并写入数据到磁盘,也就是持久化数据的过程。
  4. 然而 Redis 主进程则不一样,它需要响应客户端的命令,如果收到写入数据的操作请求,主进程就会使用 COW 机制将数据先复制再修改。
  5. 而此时,子进程使用的数据页并不会发生任何改变,依然是 fork 时的数据,继续进行持久化。

这就是 COW 技术在 Redis 中的使用。

2.2 Java 中的 Copy On Write

Java 中使用 COW 技术实在并发容器中,这种技术的实现容器有两个:CopyOnWriteArrayList 和 CopyOnWriteArraySet。

这两个集合是这样使用 COW 技术的,当有数据写入操作时,会先复制一个新数组进行操作,等写完之后,再将原数组的地址赋值成新数组,以 CopyOnWriteArrayList 的 add 实现为了,它的实现源码如下:

public boolean add(E e) {
    final ReentrantLock lock = this.lock;
    lock.lock();
    try {
        // 获取老数组
        Object[] elements = getArray();
        int len = elements.length;
        
        // 复制出新数组
        Object[] newElements = Arrays.copyOf(elements, len + 1);
        
        // 添加元素到新数组中
        newElements[len] = e;
        
        // 把原数组引用指向新数组
        setArray(newElements);
        return true;
    } finally {
        lock.unlock();
    }
}

从上述代码可以看出,在添加的时候也会使用锁,如果不使用锁的话,在多线程写入时,可能会出现多个副本。

而加锁之后,会先复制一个新数组,进行写入操作,之后再将原数组指向新数组,整个添加操作执行完了。

当然,这两个容器只适合多读少写的场景,因为每次写入操作都要加锁和复制新数组进行操作,这些操作的性能开销都是很大的。

小结

都说字节的面试难,其实就难在底层知识问的多,以及有算法问题,所以想进大厂,这两项能力都要提升,勿在浮沙筑高台。愿好~

参考 & 鸣谢

www.cnblogs.com/chenssy/p/15142814.html

本文已收录到我的面试小站 www.javacn.site,其中包含的内容有:Redis、JVM、并发、并发、MySQL、Spring、Spring MVC、Spring Boot、Spring Cloud、MyBatis、设计模式、消息队列等模块。

标签:持久,字节,COW,答对,Redis,面真题,复制,数组,进程
From: https://www.cnblogs.com/vipstone/p/17853183.html

相关文章

  • bytenode nodejs 字节码编译工具
    bytenode是一个nodejs字节码编译工具,可以用来实现nodejs代码的一些加密简单使用安装目前推荐安装为cli全局模式,我使用npmscript不成功 sudonpminstall-gbytenode简单代码app.js定义一个模块 module.exports={name:"dalong",age:333}编译bytenode--compileapp.j......
  • js如何计算字符串的字节数
    如果计算字符长度只需要使用length,letstr="hello世界";console.log(str.length)//7如何计算所占用的字节数呢?functiongetByteLength(str){letlength=0;for(leti=0;i<str.length;i++){letcharCode=s......
  • eBPF 概述:第 2 部分:机器和字节码
    1.前言我们在第1篇文章中介绍了eBPF虚拟机,包括其有意的设计限制以及如何从用户空间进程中进行交互。如果你还没有读过这篇文章,建议你在继续之前读一下,因为没有适当的介绍,直接开始接触机器和字节码的细节是比较困难的。如果有疑问,请看第1部分开头的流程图。本系列的第2......
  • 位、字节、字
    位、字节、字是计算机数据存储的单位。位是最小的存储单位,每一个位存储一个1位的二进制码,一个字节由8位组成。而字通常为16、32或64个位组成。 二进制码 二进制码,在数学和数字电路中,二进制(binary)数是指用二进制记数系统,即以2为基数的记数系统表示的数字。这一系统中,数通常用......
  • 【Python】【OpenCV】【NumPy】图像和原始字节的转换
    学习完基础的图像算法,开始接触OpenCV学习:灰度图中,一个像素点上的灰度级需要一个字节(byte,2^8,8bit)进行存储,此时的灰度图是二维的。而当我们需要转换为彩色图时,即三维,便会产生颜色通道(Channel),这个时候,一个像素点上的灰度级便会需要三个字节来进行存储。可以借助笛卡尔坐标系来帮助......
  • Windows rustup update 速度慢,使用字节跳动Rust镜像加速
    不设置镜像加速rustup更新升级会非常慢RsProxy字节跳动的Rust镜像 Windows想要使用这个镜像需要按照官方提示去设置两个系统变量分别为 RUSTUP_DIST_SERVER RUSTUP_UPDATE_ROOT 之后来到当前用户文件夹下修改cargo的配置文件(没有就创建一个)C:\Users\你PC名\.c......
  • 字节跳动小程序开发:探索创新的数字化世界
    在数字化时代,字节跳动小程序开发成为企业数字化转型的关键一环。通过这一平台,企业能够借助先进的技术和丰富的功能,实现创新、引领市场潮流。本文将通过一些简单的技术代码示例,带你深入了解字节跳动小程序开发的魅力。1.小程序入口文件app.js//app.jsApp({onLaunch:function......
  • 汇编-SIZEOF返回数组字节总数
     SIZEOF操作符的返回值等于LENGTHOF与TYPE的返回值的乘积.386.modelflat,stdcall.stack4096ExitProcessPROTO,dwExitCode:DWORD.dataintArrayWORD32DUP(0).codemainPROCmoveax,SIZEOFintArray;EAX = 00000040h=64INV......
  • JavaWeb--响应字符&字节数据
    Response响应字符数据 //text/html解码html,charset解码汉字response.setContentType("text/html;charset=utf-8");//1、获取字符输入流PrintWriterwriter=response.getWriter();writer.write("你好");writer.write("<h1>124</h1>");响应字节数据添加一个i......
  • 最高加速9倍!字节跳动开源8比特混合精度Transformer引擎
    前言 近年来,Transformer已经成为了NLP和CV等领域的主流模型,但庞大的模型参数限制了它的高效训练和推理。于是字节跳动在2019年12月和2021年6月分别推出了高效推理和训练引擎LightSeq,大大加速了Transformer系列模型的训练和推理,也打通了Transformer从训练到推理......