字节跳动C++云原生一面(52min)
字节跳动C++云原生一面(52min)
一、面试官问
- 你用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,因为当时比赛的时间非常有限,而我是从 开始做的这样一个东西,期间查阅了大量的资料,并且不断地自己调
bug
、调参数,还有进行一些优化
Linux
下的多线程是怎么使用的
答:通过
pthread_create
可以创建线程、通过pthread_exit
可以销毁线程
Linux
的线程和进程有什么区别
答:
①、 一个程序至少有一个进程,一个进程至少有一个线程②、线程的划分尺度小于进程,使得多线程程序的并发性高
③、进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率
④、每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制
⑤、从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这是进程和线程的重要区别。
Linux
的父子进程的概念描述一下
答:
父进程通过fork
函数可以得到一个子进程,子进程的所有资源都继承父进程,但并不是同一个,相当于是资源独立了只不过代码是拷贝了,而是共享的。当父进程到一些阻塞的任务的时候,我们可以让子进程去处理相关信息。
如果父进程先子进程退出或者父进程并未回收子进程,那么子进程就会变成一个僵尸进程
- 我把父进程直接
kill -9
掉了子进程能被回收掉吗
答: 不能,子进程会变成僵尸进程
- 你描述一下
OSI
的七层模型
- 你对
websocket
了解多少
WebSocket
是HTML5
下一种新的协议(其本质上是一个基于TCP
的协议)WebSocket
是一个 持久化 的协议WebSocket
在建立握手的时候是使用Http
协议传输的,但是建立完成后就是使用WebSocket
协议了WebSocket
能够提供低延迟,高性能的客户端与服务端的双向数据通信。WebSocket
提供了一种真正意义上的客户端请求,服务器推送数据的模式,特别适合实时数据交互应用开发- 相比
Http
能够减少源站的压力,并且不需要交换Header
提高了信息交换率
websocket
用的是TCP
还是UDP
WebSocket是基于TCP协议的
TCP
和UDP
的区别是啥
- TCP是基于连接的,而UDP是基于非连接的
TCP
传输数据稳定可靠,适用于对网络通讯质量要求较高的场景(传输数据较大),需要准确无误的传输给对方,比如,传输文件,发送邮件,浏览网页等等,而UDP
传输数据不可靠,适用于少量数据的发送TCP
数据传输的速度比较慢,而UDP
传输速度较快
- 三次握手和四次挥手的过程详细描述一下吧
time_wait
和close_wait
有什么区别
TIME_WAIT 是主动关闭链接时形成的,等待
2MSL
时间,约 分钟。主要是防止最后一个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++
- 你在接受聊天室这些数据请求的时候遇到过哪些问题吗
- 介绍一下双指针算法一般使用哪些场景
DFS
和BFS
解决的场景有什么不同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
,云原生说白了就是一个操作系统
四、结束
- 你之前是怎么投这个方向的,为什么投这个方向,因为我看相关的经验并没有涉及到这些
答:我想多元化发展
- 云原生的话算法能力没有很高的要求,你的算法已经够了,对于云原生的一些组件、镜像容器这些以及运维报错可以去了解一下