字节一面(云原生)

Posted MangataTS

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字节一面(云原生)相关的知识,希望对你有一定的参考价值。

文章目录

一、面试官问

  • 你用docker做什么东西

答:做了一些团队和个人的服务,跑在云服务器上

  • docker在哪个os部署

答: Ubuntu20.04

  • docker 的启动参数看过吗

答:格式:run -p <容器名>|<容器ID>

[root@localhost ~]# runlike -p redis
docker run \\
        --name=redis \\
        --hostname=fd2a88f2a1e7 \\
        --mac-address=02:42:ac:11:00:02 \\
        --env=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin \\
        --env=GOSU_VERSION=1.12 \\
        --env=REDIS_VERSION=6.0.9 \\
        --env=REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-6.0.9.tar.gz \\
        --env=REDIS_DOWNLOAD_SHA=dc2bdcf81c620e9f09cfd12e85d3bc631c897b2db7a55218fd8a65eaa37f86dd \\
        --volume=/mydata/redis/data:/data \\
        --volume=/mydata/redis/conf/redis.conf:/etc/redis/redis.conf \\
        --volume=/data \\
        --workdir=/data \\
        -p 6379:6379 \\
        --restart=always \\
        --runtime=runc \\
        --detach=true \\
        redis \\
        redis-server /etc/redis/redis.conf

常用的启动选项有:

  • -p host_port:docker_port : 端口映射,将容器的端口映射到宿主机的端口
  • -d : 默认是 --detach 将指定的容器放在后台运行,并且返回一个容器的ID
  • -h :默认执行的是--hostname string 是用于指定容器的名字
  • -i :表示以交互模式运行容器
  • -t 表示容器启动后会进入其命令行
  • -v 表示目录映射
  • docker 原理了解过吗

答:Docker 利用 Linux Namespace 进行网络、用户、进程等不同资源的隔离,使用 Linux Cgroups 技术对资源的使用进行限制与监控,通过 AUFS 等存储驱动实现分层结构与增量更新等功能。通过Union-FS进行镜像分层存储,极大的提高了利用空间

  • 介绍一下之前做过的一些项目

答:xxxx

  • 五子棋的话是做的哪些事情

答:做了核心算法处理,通过搜索判断当前棋面的局势,然后推出每一个落点的攻和防的价值,最后取最优的落子

  • 基于QQ的聊天机器人做了什么业务

答:做了一些信息推送、订阅功能、娱乐功能、图片制作、智能聊天、信息查询等业务

  • 介绍一下怎么去获取这些信息然后推送服务的,比如B站的直播信息

答:自己写一个爬虫在通过定时任务不断地爬取直播间的信息,然后如果爬到开播那么就会推送到群聊

  • 聊天机器人只针对一个人吗?

答:可以针对很多人使用

  • 注册、订阅的信息存放在哪里

答:存放在文件

  • 读文件的效率不低吗

答:有考虑过放在数据库里面,但是又想到使用者可能能力优先,对数据库的配置可能会成为其最大的困难,于是我采用的是文件读取,虽然速度比不上数据库,但是也能解决大部分需求,因为并发量不会太大,读取文件 IO 的次数也不会很频繁

  • QQ机器人的后端服务是跑到哪里的

答:云服务器上的

  • 你自己整理了一堆算法和数据结构对吧

是的,目前整理了一些常用的算法和数据结构并且开源在 Github 上了

  • 你觉得比较有挑战性的项目是哪一个

答:五子棋AI,因为当时比赛的时间非常有限,而我是从 0 0 0 开始做的这样一个东西,期间查阅了大量的资料,并且不断地自己调 bug 、调参数,还有进行一些优化

  • Linux下的多线程是怎么使用的

答:通过 pthread_create 可以创建线程、通过 pthread_exit 可以销毁线程

  • Linux 的线程和进程有什么区别

答:
①、 一个程序至少有一个进程,一个进程至少有一个线程

②、线程的划分尺度小于进程,使得多线程程序的并发性高

③、进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率

④、每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制

⑤、从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这是进程和线程的重要区别。

  • Linux 的父子进程的概念描述一下

答:
父进程通过 fork 函数可以得到一个子进程,子进程的所有资源都继承父进程,但并不是同一个,相当于是资源独立了只不过代码是拷贝了,而是共享的。

当父进程到一些阻塞的任务的时候,我们可以让子进程去处理相关信息。

如果父进程先子进程退出或者父进程并未回收子进程,那么子进程就会变成一个僵尸进程

  • 我把父进程直接 kill -9 掉了子进程能被回收掉吗

答: 不能,子进程会变成僵尸进程

  • 你描述一下 OSI 的七层模型

  • 你对 websocket 了解多少
  • WebSockethtml5下一种新的协议(其本质上是一个基于TCP的协议)
  • WebSocket 是一个 持久化 的协议
  • WebSocket 在建立握手的时候是使用 Http 协议传输的,但是建立完成后就是使用WebSocket 协议了
  • WebSocket能够提供低延迟,高性能的客户端与服务端的双向数据通信。
  • WebSocket提供了一种真正意义上的客户端请求,服务器推送数据的模式,特别适合实时数据交互应用开发
  • 相比 Http能够减少源站的压力,并且不需要交换 Header 提高了信息交换率
  • websocket 用的是 TCP 还是UDP

WebSocket是基于TCP协议的

  • TCPUDP 的区别是啥
  • TCP是基于连接的,而UDP是基于非连接的
  • TCP传输数据稳定可靠,适用于对网络通讯质量要求较高的场景(传输数据较大),需要准确无误的传输给对方,比如,传输文件,发送邮件,浏览网页等等,而 UDP 传输数据不可靠,适用于少量数据的发送
  • TCP 数据传输的速度比较慢,而UDP 传输速度较快
  • 三次握手和四次挥手的过程详细描述一下吧

  • time_waitclose_wait 有什么区别

  • TIME_WAIT 是主动关闭链接时形成的,等待2MSL时间,约 4 4 4 分钟。主要是防止最后一个ACK丢失。 由于TIME_WAIT 的时间会非常长,因此server端应尽量减少主动关闭连接

  • CLOSE_WAIT是被动关闭连接是形成的。根据TCP状态机,服务器端收到客户端发送的FIN,则按照TCP实现发送ACK,因此进入CLOSE_WAIT状态。但如果服务器端不执行close(),就不能由CLOSE_WAIT迁移到LAST_ACK,则系统中会存在很多CLOSE_WAIT状态的连接。此时,可能是系统忙于处理读、写操作,而未将已收到FIN的连接,进行close。此时,recv/read 已收到FIN的连接socket,会返回0。

  • 你之前做的那个聊天室后是线程处理还是直接处理,用的是 python 还是 C++
  • 你在接受聊天室这些数据请求的时候遇到过哪些问题吗
  • 介绍一下双指针算法一般使用哪些场景
  • DFSBFS 解决的场景有什么不同
  • C/C++ 里面 有什么区别
  • 申请方式不同,栈是由系统自动分配,而堆是由程序员申请
  • 系统响应不同
  • 空间大小不同,栈是一块连续的区域,大小一般是1~2M;堆是不连续的区域,空间很大,上限取决于有效的虚拟内存
  • 碎片问题,栈是后进先出的队列,内存是连续的,而堆则在多次的new和delete后会产生很多碎片
  • 分配方式不同,栈是动态分配,堆是静态分配
  • 分配效率不同,栈的效率比较高,而堆的效率比较低
  • C++ 中的引用和指针有什么区别
  • 指针是一个变量,存储的是地址,而引用是变量的别名
  • 指针可以为空,而引用在定义的时候必须初始化
  • 指针可以有多级,而引用只有一级
  • 指针可以更改指向的对象,而引用不行
  • C/C++ 程序的编译和python 有什么区别
  • C/C++编译过程:预编译=>编译=>汇编=>链接
  • python编译过程:python解释器将源码=>字节码然后直接在解释器中运行

二、编程题

看题 3min 然后给面试官先说思路,就是一个裸的 拓扑排序

然后write 大约 10min

十四、五行已经pop 掉元素了,为什么要加 vis 标识

整体看着没有啥问题,我这边就面试这些

三、反问

  • 我想了解一下贵部门方向是什么样子呢?怎么去学习云原生方面知识?

答:基于 k8s 做一些组件化的开发、一些应用啊,微服务的引擎这些东西,你可以先去了解一下 k8s 是一个基于 docker 之上的一个编排系统,这是一个基础

  • 有什么相关的项目或者练手的去提升自己呢?

答: 你可以用 k8s 的部署命令去玩一下,然后了解一下 k8s 的架构,以及容器怎么启动的,这一整套的技术栈,多在虚拟机部署使用

  • 云原生对数据库这方面重视吗(准备了很久,但是一句都没提)

答:数据库就是一个可以容器化的一些中间件,比如说像一些 mysql 啊,还有一些其他的 rdies ,云原生说白了就是一个操作系统

四、结束

  • 你之前是怎么投这个方向的,为什么投这个方向,因为我看相关的经验并没有涉及到这些

答:我想多元化发展

  • 云原生的话算法能力没有很高的要求,你的算法已经够了,对于云原生的一些组件、镜像容器这些以及运维报错可以去了解一下

以上是关于字节一面(云原生)的主要内容,如果未能解决你的问题,请参考以下文章

2022字节跳动数据仓库工程师日常实习面经-----一面

不止一面的百变 ACE

云原生很美好,找准抓手才能进入快行道

成都精灵云C++ 一面(20min)

成都精灵云C++ 一面(20min)

字节收购 强化云原生