概要
2020年11月5日,初次尝试面试,我对我自己个人品质方面还挺满意的,但是在回答问题、知识掌握程度等方面还有所欠缺。
经过本次面试后,我将自己的优点和不足,在本文章中讲进行总结,并对以后需要改进的地方进行规划。
对自己满意的地方
- 远程面试的时候,我能感受到我的自信,说话简洁大方。
- 远程面试钱,我对设备进行的充足的调试、在宿舍内划分出了独立的区域,避免了出现尴尬的情况。
自己的不足
-
过于好胜,不轻易说自己不会。实际上并不掌握的东西,我也会蒙着回答。
这并不是个很好的习惯,知之为知之,不知为不知。不清楚的地方可以回答不知道,一方面可以体现出自己实事求是的态度,二方面可以便于用人公司更好地评估自己的水平。
-
被问到自己不会的题以后,会紧张,之后的问题回答的就有些不足。
尽量直视自己不会的问题。多面试几次情况就能好一些。
-
回答问题的总结能力不够。
很多问题自己可以通过脑图、图像等形式解释清楚,但是到了网络面试的时候(以语音为主的情况下),自己的总结概况成文字描述能力不够,导致有时候我自己也不知道自己说道哪里了。(在讲解TCP握手的时候遇到了这个问题。)
-
没有经历过在面试中编写算法代码的经历。
本次面试,被问到了一道非常简单且常规的算法题(求最小公倍数),我虽然知道要怎么做,但是却不能说出自己具体的思路,感觉需要更多的时间去编写代码。
需要改进的地方TODO
- 优化自己对进程、线程、协程描述的语言。
- 继续练习算法,并且练熟算法。
面试总结
从题目来讲,面试的时候无论面试哪一个岗位,网络知识方面是必考的内容,需要重点掌握。其次面试了两家公司的go开发职位,都有问到进程、线程、协程的区别,对于goer来说,应该掌握这三者的区别。
面试问题:
1. 进程、线程、协程的区别
- 进程(process):进程是指计算机中已运行的程序
- 线程(thread):线程是操作系统能够进行运算调度的最小单位。大部分情况下,它被包含在进程之中,是进程中的实际运作单位。
同一进程中的多条线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等。但同一进程中的多个线程有各自的调用栈(call stack),自己的寄存器环境(register context),自己的线程本地存储(thread-local storage)。
一个进程可以有很多线程,每条线程并行执行不同的任务。 - 协程(coroutine):协程是计算机程序的一类组件,推广了协作式多任务的子程序,允许执行被挂起与被恢复。协程更适合于用来实现彼此熟悉的程序组件,如协作式多任务、异常处理、事件循环、迭代器、无限列表和管道。
协程非常类似于线程。但是协程是协作式多任务的,而线程典型是抢占式多任务的。协作式环境下,下一个进程被调度的前提是当前进程主动放弃时间片;抢占式环境下,操作系统完全决定进程调度方案,操作系统可以剥夺耗时长的进程的时间片,提供给其它进程。
协程是语言层级的构造,可看作一种形式的控制流,而线程是系统层级的构造,可看作恰巧没有并行运行的线程。这两个概念谁有优先权是争议性的:线程可看作为协程的一种实现,也可看作实现协程的基底。
2. 网络协议相关问题
OCI是哪七层?
OSI七层网络模型 | 各层的解释 | TCP/IP四层概念模型 | 对应网络协议 |
应用层(Application) | 为应用程序提供服务 | 应用层 | HTTP、TFTP, FTP, NFS, WAIS、SMTP |
表示层(Presentation) | 数据格式转换、数据加密 | Telnet, Rlogin, SNMP, Gopher | |
会话层(Session) | 建立、管理和维护会话 | SMTP, DNS | |
传输层(Transport) | 建立、管理和维护端到端的连接 | 传输层 | TCP, UDP |
网络层(Network) | IP选址及路由选择 | 网络层 | IP, ICMP, ARP, RARP, AKP, UUCP |
数据链路层(Data Link) | 提供介质访问和链路管理 | 数据链路层 | FDDI, Ethernet, Arpanet, PDN, SLIP, PPP |
物理层(Physical) | 物理层 | IEEE 802.1A, IEEE 802.2到IEEE 802.11 | |
TCP、UDP属于哪一层?
见上表
TCP握手
符号 | 功能 |
---|---|
SYN | 请求建立连接符号位 |
FIN | 请求关闭连接符号位 |
ACK | 响应符号位 |
seq | 序号(4字节) |
ack(ACKnum) | 确认号(4字节) |
建立连接时的握手:(三次握手)
为什么不能用两次或四次握手?
断开连接时的挥手:(四次挥手):
ping命令的细节(过程)
在浏览器中访问域名的过程
3. go协程相关问题
题目:运行一个goroutine协程,其内部是for死循环,在该协程之外,如何给定一个信号,使该协程结束?
func main() {
ch := make(chan struct{})
go func() {
for true {
if _, ok := <-ch; ok != false {
runtime.Goexit()
}
}
}
//给一个信号
ch <- struct{}{}
}
手写代码,没试过能不能用。