您正在查看: 面试 分类下的文章
2021-03-02 |HHR
下午收到了腾讯北极光工作室的面试邀请,晚上进行面试。
面试记录
- 面试老师介绍了自己的团队,然后?问我 玩不玩游戏?
不玩,我更喜欢鼓捣些有趣的小玩意。(然后带跑了节奏)最近在研究GitHub的GitHub Actions - 这应该属于一个CI/CP的工具。你觉得它的技术难点主要在哪呢?
我觉得这个工具其实挺方便的,对于我而言可能阅读文档相对比较难。 - 你们说一下它的技术原理吗?
我最近在做一个Spring Boot的项目。在提交的时候,它会先使用gradlew bootjar
进行打包,然后使用SFTP
协议传输到我的服务器,最后使用SSH
协议执行jar包,完成部署。 - 揣测一下它是怎么实现提交时构建版本的?
我猜测是一个触发器的机制,在提交版本时进行处理。 - 如果让你来做,怎么让Git来调用我的编译服务?
这是GitHub提供的服务。GitHub会启动一个docker容器来进行构建操作。 - 编译时的环境部署信息怎么输入?
使用GitHub的secret
,将TOKEN
和RSA
的私钥上传。在yml
配置文件中进行调用。 - 考虑极端情况,让我做这样一个系统,在用户量比较大的时候,怎么来分配资源?
在收到请求时,挑选一台空闲的服务器进行运行。 - 我说的是资源管理的问题,假设我只能起100个
docker
容器,但是有一千个人要用,该怎么分配?
做一个FIFO
的队列,先来先服务。 - 那如果我要对资源进行限制,不能让一个人占用过多的资源呢?
给每个人分配时间片,时间片用完了换人。 - 如果时间片当前不在用,不是就浪费了嘛?
大家轮流用,不存在时间片空闲的情况。 - 如果人数是动态变化的呢?
如果有新的请求,就把它放到最空闲的服务器。因为时间随机分布,可以让每台服务器尽量忙碌。 - 在资源不够时该怎么协调资源,该怎么做呢?
那就将I/O密集型和CPU密集型的任务并在一起做,这样可以吗? - 怎么讲这些方法组合起来呢?
那就在收到请求时将他们放到一个FIFO
的队列里,如果有服务器是空闲的,就从队列取出一个服务,为其分配时间片。在时间片用完之后,将其移入队尾。 - 每个任务都要分配相同的时间片吗?
我觉得是的,如果想要做到公平,就要给每个任务分配相同的时间片,大概十分钟那样。 - 你是计算机专业的对嘛?你们学过操作系统吗?
学过 - 操作系统里进程和线程调度的算法有哪些?
FIFO,最短时间,最高响应比,时间片轮转 - 那你想一下这个case,在操作系统里怎么实现是最合理的?
我觉得是一个带优先级的优先队列,让优先级高的进程先进性工作 - 那怎么进行调度呢?
比如一个优先级高的进程进入,就让其抢占原有的进程。 - 那原有的进程呢?
将其挂起?那应该让之前的进程先做完,然后让新的服务执行。 - 我注意到你提到了使用
.NET CORE
完成了一个井字棋游戏,可以介绍一下吗?
这是一个前后端分离的桌面应用,后端用的是ASP .Net Core
- 前端呢?
用的是WinForm
- 这个游戏的规则怎么样?
在一个三乘三的棋盘上,黑白双方轮流下棋,如果一方获得了连续的三颗棋子,就获得胜利。 - 那你有遇到过什么技术难点吗?
开始时我使用了同步的网络请求,这样在请求的时候会导致主线程被挂起,让用户认为游戏卡死了。后来我使用了异步的网络请求,提高了用户体验。 - 会延迟多久
大概两三百毫秒 - 这个服务器在哪?
在上海的阿里云,但是我的数据库不在上海,所以延迟会比较久。 - 为什么ping命令30-40毫秒,为什么操作延迟会到200到300毫秒?
首先是TCP
握手和SSL
握手消耗的时间,然后要连接数据库。 - 那你觉得可以怎么优化呢?
使用连接池加速数据库连接,使用WebSocket
进行网络请求 - 怎么获取对方下棋的结果?
每隔一段时间向服务器请求,进行轮询。现在我应该会用WebSocket
来进行实现。 - 可以实现多少人同时对战
我觉得瓶颈应该在数据库的并发上 - 如果需要改呢?
讲棋局信息存储在内存中。 - 如果服务器
down
了呢?
游戏数据会丢失。那局游戏就没了。 - 连接还在吗?
session
会作废,连接应该也没了 - 为什么会作废呢?
原理不是非常了解。 - 那怎么实现重连呢?
使用token机制,重新验证登录状态。 - 那怎么实现数据的保存呢?
我认为存在前端是不合理的,因为前端是不安全的,所以应该存放在后端。我觉得可以使用类似于radis
的服务。 - 那你有用过redis吗?
了解过,但是没在项目里用过。 - 我对你项目的情况大概了解了。你现在倾向于读研还是工作呢?
倾向于工作,因为非专业课不占优势。 - 你现在学了那些专业课
计算机网络,数据库,组成原理和操作系统 - 那TCP和UDP有什么区别
TCP面向连接,URP面向无连接。TCP提供可靠传输,UDP不能提供可靠传输。TCP的延迟比UDP大。 - 为什么TCP的延迟大?
需要发送ACK报文,UDP不需要。 - TCP发包需要每发一个包,就接受一个ACK吗?
不一定,可以数个包进行一次ACK。 - TCP是怎么实现这样的呢?
是一个滑动窗口的机制。 - 如果报文丢失呢?
接收方就不会发送ACK报文,发送方会进行超时重传。 - 那后面没有丢失的报文呢?
会被丢弃,等待重传。 - 那为什么会被丢到呢?
(不是很清楚呢,有点忘了) - 栈内存和堆内存的区别
new
方法动态生成的对象会被放到堆里,使用类似int a=5
这样生成的变量会被放到栈里。 - 那class可以被放到栈里吗?
如果static
的可能可以?不了解。 - JVM实现了GC的机制,那GC什么时候会失效呢?
循环依赖? - 那怎么检查和解除呢?
类似于操作系统里解除死锁的算法? - 那对象怎么检查呢?
查引用的列表,找有没有他自己? - 那这是深度优先还是广度优先呢?
我觉得是深度优先。我对这块了解不深 - 那你有什么想问的呢?
你们是一个做游戏的部门,那后端应该是基于C++的,而我现在的开发大多基于Java,那应该怎么学习C++的后端开发比较好呢? - 我觉得应该从项目入手,做项目来进行学习。
- 你还有什么想问的吗?
没有了 辛苦了
你也辛苦了面试总结
待完善