- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
Erlang面试题及参考答案
一、基础语法与数据类型(共3题)
题目:Erlang中原子(atom)和字符串(string)的核心区别是什么?实际开发中要注意哪些原子相关的风险?
答案:原子是不可变的常量标识符(如ok、error),存储在原子表中且全局唯一;字符串本质是整数列表(如abc等价于[97,98,99]),支持动态创建和修改。风险点:原子表容量有限(默认约100万个),若通过list_to_atom/1把用户输入等动态数据转原子,可能导致原子表溢出崩溃,因此严禁将不可控数据转为原子,优先用二进制(binary)存储动态文本。
题目:解释Erlang中的「尾递归」,并写一个尾递归函数计算1到N的累加和。
sum(N)whenis_integer(N),N0-sum(N,0).
sum(0,Acc)-Acc;
sum(Num,Acc)-sum(Num-1,Acc+Num).
注:Acc是累加器,用于存储中间结果,避免递归返回后再计算。
答案:尾递归是指函数最后一步仅调用自身,且无后续计算操作,Erlang虚拟机(BEAM)会优化尾递归,不会产生栈溢出。实现如下:
题目:Erlang二进制(binary)相比列表(list)的优势是什么?什么时候优先使用二进制?
答案:优势:1.存储高效,二进制按字节存储,列表每个元素需额外存储指针(约8字节),大量文本/二进制数据场景下,二进制内存占用远低于列表;2.支持模式匹配和位操作,适合解析协议、处理文件等场景。优先使用场景:存储大文本、网络数据传输、协议解析、文件I/O等,列表更适合少量数据的临时处理或函数式编程中的列表操作(如map/2、filter/2)。
二、并发与进程(共4题)
题目:Erlang进程和操作系统进程的区别是什么?Erlang如何实现百万级并发?
答案:区别:1.轻量级:Erlang进程是用户态进程(BEAM调度),内存占用仅几KB(初始栈约1KB),操作系统进程是内核态,占用MB级内存;2.调度方式:Erlang采用抢占式调度(默认时间片1ms),由BEAM自主调度,无需内核参与;3.通信:Erlang进程通过消息传递(!操作符)通信,无共享内存,操作系统进程需通过IPC(管道、信号量等)通信。百万级并发实现:基于轻量级进程、高效调度器(BEAM每个CPU核心对应一个调度器)、无锁设计,进程切换成本极低(约几十纳秒)。
题目:解释Erlang消息传递的特性,以及!、receive、timeout的作用。
receive
{msg,Data}-io:format(收到数据:~p~n,[Data]);
stop-io:format(停止进程~n)
after5000-
io:format(5秒内未收到消息~n)
end.
答案:消息传递特性:异步、无阻塞、按发送顺序排队(FIFO)、进程间无共享状态。核心操作:1.Pid!Msg:向目标进程发送消息,发送方立即返回,不等待接收方处理;2.receive:接收进程邮箱中的消息,按模式匹配提取,若无匹配消息则阻塞;3.timeout:receive中可选参数,指定阻塞超时时间,超时后执行after子句。示例:
题目:什么是Erlang进程字典(processdictionary)?为什么不推荐使用?
答案:进程字典是每个Erlang进程内置的键值存储(类似哈希表),通过put/2、get/1、erase/1操作,无需显式传递即可在进程内共享数据。不推荐原因:1.破坏函数纯性:函数结果依赖进程字典状态,而非仅依赖输入参数,导致函数不可预测、难以测试;2.影响并发和分布式:进程字典无法在分布式节点间共享,且会增加进程内存占用;3.调试困难:状态隐藏在字典中,难以追踪数据流向。实际开发中优先用参数传递或ETS表替代。
题目:如何实现两个Erlang进程的双向通信?写一个简单示例。
%进程A:接收进程B消息并回复
process_a(B_Pid)-
receive
{from_b,Msg}-
io:format(进程A收到B的消息:~p~n,[Msg]),
B_Pid!{from_a,收到你的消息啦},
process_a(B_Pid);
stop-io:format(进程A停止~n)
end.
%进程B:发送消息给A并接收回复
process_b(A_Pid)-
A_Pid!{from_b,你好,进程A},
您可能关注的文档
最近下载
- 苏S13-2022 预制混凝土排水检查井工程图集规范 .docx VIP
- 一种钛合金离子渗氧的方法.pdf VIP
- 冀人版(2024)小学科学一年级下册《认识自然物和人造物》说课课件.pptx VIP
- 2025人教版英语八年级上册全册教学设计教案.pdf
- 刮研方法与 技巧.ppt VIP
- 摄影笔记完整版.docx VIP
- 工课:即将失传的轴瓦刮研-王震.pdf VIP
- T_CEA 0052.2-2025《电梯电缆及线束试验方法 第2部分:电气性能》.docx VIP
- T_CEA 0052.1-2025《电梯电缆及线束试验方法 第1部分:机械物理性能》.docx VIP
- 陕西省专业技术人员继续教育2025公需课《党的二十届三中全会精神解读与高质量发展》20学时题库及答案.docx VIP
原创力文档


文档评论(0)