Administrator
发布于 2023-11-21 / 11 阅读 / 0 评论 / 0 点赞

游戏后端开发实习生(未来之星)面试

要求
  • 有Erlang编程经验者为佳

  • Linux环境

  • 精通数据结构和算法

  • Socket编程

  • 多线程编程

  • 精通一个数据库

特点

  • 追求高并发和多线程

Erlang语言
  • 高并发、高容错、分布式

  • 进程间通信中完全依赖于消息传递

每个进程都拥有自己独立的邮箱并通过模式匹配的方式来查找要处理的消息,然后分别进行异步处理

可靠的容错机制,由于进程之间相对独立,于是Erlang里可以用一些进程去链接或监视另外一些进程,当这些被监视的进程因为错误而产生异常退出的时候,

缺点
  • 语言的抽象能力不强

  • Erlang是一种弱类型语言

发生错误的时候,这些错误的隐蔽性较强。

  • 学习函数式编程的时候思维难以转变

  • Erlang是属于IO密集型的语言

  • 主要用于游戏服务器系统开发

王者
  • Erlang的并发模型属于Actor Model

  • 对Binary类型计算进行了优化,而浮点计算则非常缓慢。

  • 高并发的基石在于非常廉价的Process

Process不是操作系统中的进程,而是Beam虚拟机内部的一个抽象

一个进程只有 309 字节的foot print,一个Beam节点可以毫无压力的同事运行超过2百万个process。这些Process都是相互独立的,他们不共享任何内存,有独立的堆栈,除非建立连接,一个Process的崩溃完全不会影响到系统的其他进程。

这200万个虚拟机进程,仅仅需要运行在一个操作系统线程内

BEAM把并发模型从操作系统中抽象出来

BEAM进程(Process)
进程通讯(Message Passing)

函数式语法(Functional Programming)

为了容错非常独特的 异常处理代码更新 模式

为什么Erlang有如此高的容错,甚至在线更新系统?

绝大多数语言是不能接受线程异常的。他们的线程异常可能导致系统崩溃,

大部分编程模式的异常处理都是基于 try-catch,也就是 Defensive Programming

Erlang系统很不一样,因为所有进程都是独立的,一个进程的崩溃完全不会影响系统,甚至,系统中的大部分进程都不会意识到。

lang的 异常处理 更加专注于如何让仍然工作的进程修复崩溃的进程,也就是自我恢复,Self-healing。

Erlang生态并没有这个名词, 在Erlang 的世界里叫做 supervisor-tree。

把业务逻辑和异常处理逻辑分离。也正式因为这样的 异常处理和自我修复设计,实现了Erlang系统的高容错性能。

Erlang生态

总结一下 Erlang 实现高并发、高容错、分布式的基石:

  • 函数式语言,Immutability

  • 超轻量线程,Process

  • 自愈模式的异常处理,Supervision tree

  • 在线代码更新,Code Updating

新语言和新框架对他的学习

go routinechannel其实就是轻量级线程和通讯,但却没有Erlang进程那么轻,而且共享内存。Erlang的独特之处在于它的设计目的很单一:高并发。而上面的三个特征是实现可靠的高并发系统必不可少的,Erlang把他们做到了极致,不妥协。

BEAM,高并发的发动机

BEAM属于寄存器机(register machine),而JVM属于堆栈机(stack machine)

寄存器机因为没有堆栈结构直接操作寄存器,一般来讲速度更快,但是开发和维护成本都更大。

不过为了支持Erlang数量庞大的轻量级线程,BEAM选择了寄存器机。

在一般的家用电脑上,BEAM 可以在 1 s 内孵化超过 35万个进程。

BEAM两个非常重要的部分

scheduler(调度器)和 GC (垃圾回收)

Scheduler

负责管理虚拟机中所有的进程,确保他们得到公平的计算资源,不会出现某一个进程独占资源的情况。

例如:一个进程死循环,在其他语言里会不断占用资源影响其他进程。但在BEAM里没事

GC

BEAM的GC是基于每一个进程,而不是挂到整个系统,GC占用的时间非常短暂,系统永远处于工作状态,JVM最经常被职责的就是GC会造成系统间歇性的停止。

并不是JVM不好,而是JVM真的不适合超高并发的场景,一次突如其来的GC会阻塞好多信息,而一次没有捕捉的线程异常甚至会让JVM挂起。

Epoll和select

都是I/O多路复用,

epoll,维护的是一个就绪队列

select,维护的是所由被监视的fd,是一个数组

  • 判断有没有事情就绪,epoll看队列是否为空即可,select要遍历

  • select和poll是轮询,轮询数组每一个事件的处理函数,前面的没处理完,后面的等,管理的fd数量最大为1024

  • epoll而是通过每个fd定义的回调函数来实现的。只有就绪的fd才会执行回调函数;

  • epoll支持电平触发和边沿触发(哪些文件描述符刚刚变为就绪状态,它只说一遍,如果我们没有采取行动,那么它将不会再次告知,这种方式称为边缘触发)

  • select对socket进行扫描时是线性扫描,当socket文件描述符数量变多时,大量的时间是被白白浪费掉的。

链接:https://www.nowcoder.com/questionTerminal/6979d0f1b1df4d8fa038a24bc2dab120
来源:牛客网

但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的 ,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间。

select的3个缺点

  • 每次调用select,都要把所有的fd从内核拷到用户态,重复了

  • 每次调用,都要遍历传递进来的所有fd,没必要

  • select支持的文件描述符数量太小了,默认是1024,改很麻烦

epoll的3个缺点

  • 在一个链接注册时,把所有浮fd考到用户态,epoll保证了每个fd在整个过程中只会拷贝一次。

  • 为每一个fd指定回调函数。当设备就绪时,回调函数会触发,把该fd加入就绪队列。

  • epoll没有这个限制

总结:本质上时回调函数的的胜利,

select和poll是,自己主动不断遍历查看所有设备,而epoll是为fd指定回调函数,设备好了直接加入就绪队列。

笔试

逻辑题

什么归类呀

猜数字啊

猜词语

填招聘表。

技术面

自我介绍

数据结构

贪心和动态规划

比赛过程分工

正式面试

太远,迟到10分钟。提前2h都不够

笔试

逻辑题

动物什么归类呀

猜数字啊

猜词语

填招聘表。

技术面

  1. 自我介绍

  2. 问数据结构

    1. 让我说有哪些,

    2. 我回答大顶堆的原理和实现

  3. 问算法贪心和动态规划

    1. 局部最优解和全局最优解

    2. 一维和二维,确定初状态,找状态转移方程

  4. linux命令

    1. 我ls、pwd、find、cd

    2. touch、mkdir

  5. 比赛分工

    1. 建模手、编程手、写手

    2. svm

    3. 3类模型

    4. 我们的题目

    5. 我解决的过程

  6. 面过几家公司

    1. 3家,1家在等消息

hr面

  1. 技术面怎么样,刚刚面试管怎么样?

  2. 技术面问了什么问题

  3. 对公司的了解

    1. erlang

    2. 高并发、高容错、热更新、进程抽象、函数式

  4. 薪资:3k,大小周、下午茶

  5. 玩什么游戏?

  6. 游戏的开发流程

  7. 与同学合作的经历

    1. 如何解决矛盾

  8. 没了

总结

  1. 准时面试

  2. 组织语言

    1. 建模

    2. 分工

    3. 题目

    4. svm预测

    5. 结果

尽量不要跑题

不要反复说一句话

对于考验性格和合作,当你面对某一情况时,注意你的回答

问你意向的方向


评论