HHR的小站
享受代码带来的快乐吧
首页
您正在查看: 面试 分类下的文章

下午收到了腾讯北极光工作室的面试邀请,晚上进行面试。

面试记录

  • 面试老师介绍了自己的团队,然后?问我 玩不玩游戏
    不玩,我更喜欢鼓捣些有趣的小玩意。(然后带跑了节奏)最近在研究GitHub的GitHub Actions
  • 这应该属于一个CI/CP的工具。你觉得它的技术难点主要在哪呢?
    我觉得这个工具其实挺方便的,对于我而言可能阅读文档相对比较难。
  • 你们说一下它的技术原理吗?
    我最近在做一个Spring Boot的项目。在提交的时候,它会先使用gradlew bootjar进行打包,然后使用SFTP协议传输到我的服务器,最后使用SSH协议执行jar包,完成部署。
  • 揣测一下它是怎么实现提交时构建版本的?
    我猜测是一个触发器的机制,在提交版本时进行处理。
  • 如果让你来做,怎么让Git来调用我的编译服务?
    这是GitHub提供的服务。GitHub会启动一个docker容器来进行构建操作。
  • 编译时的环境部署信息怎么输入?
    使用GitHub的secret,将TOKENRSA的私钥上传。在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++的后端开发比较好呢?
  • 我觉得应该从项目入手,做项目来进行学习。
  • 你还有什么想问的吗?
    没有了
  • 辛苦了
    你也辛苦了

    面试总结

    待完善