Please enable Javascript to view the contents

一些常见的计算机面试题

 ·  ☕ 4 分钟

计算机基础

堆和栈

什么时候用堆?什么时候用栈?栈有什么作用?Golang 的变量在栈还是堆?堆、栈有没有上限?有的话和什么有关?

数据结构

Slice 空间是怎样分配的?双倍扩容,原来数据复制过去。

Golang 的 map 是什么结构 Golang 的 map 是什么结构,遍历是否有序, 什么是 Hash 表? Hash 表的查询效率? 解决碰撞有什么方法?

线程

线程是否越多越好吗? 线程切换消耗大不大?

协程是否越多越好吗?要区分线程调度(内核上下文切换)与协调调度时(进程内上下文切换)机制。

网络

TCP 协议

TCP 建立过程是怎样的,最要的工作是什么?协商序列号。

TCP 关闭过程,为什么要四次挥手?因为TCP是全双工的。

Client -> Server, Client 主动关闭链接, TIME_WAIT 发生在那端?服务器有很多 TimeWait 一般是什么情况 主动关闭端。有很多 Timewait 证明是服务主动关闭连接,存在有很多短链接。

Client 和 Server 已建立了 TCP 连接, Client 正在调用 Read 阻塞,Server 进程崩溃后,Client 会怎样? 进程崩溃,操作系统会关闭文件描述符,Sever 进入主动关闭流程。

通过 TCP 传输文件,为什么还需要对收到的文件做正确性校验?

HTTP 协议

简述 http 协议格式,文本协议能不能传输二进制?http 可传输图片的方法(content-length)。

http 与 https 关系是什么?简述 https 协议作用,描述出 https 握手过程的加分 。

什么是 http 中 的 keepalive,怎样做到 keepalive ? http1.1 才支持 keepalive,一个 tcp 连接顺序发送请求(遵守一问一答顺序),http2.0 多路复用。

数据库

索引知识

数据库索引使用了什么数据结构?为什么要使用这个数据结构?

一个表的字符串字段 A 已经建立了索引,使用查询条 A == ‘abc’ 是否能用上索引?使用查询条A != ‘abc’ 是否能用上索引?为什么?因为 A!=‘abc’ 在 B+ 树查找过程无法比较大小,无法进一步定位孩子树

有个表 a 有主键 id, 说明一下 select * from a order by id desc limit 10, 1select*from a order by id desc limit 100000, 1 的效率差别? offset 为多少,就要遍历多少

一个表有一个联合索引(A,B),如果查询用 A=1 能用上索引吗,B=2 呢,为什么?

limit 的局限

用什么办法遍历一个有主键 id 的 3 亿数据表

算法

算法能力考察

有一个 100 万个不相等的乱序的整数, 用最快方法将其分成相等的两部分,要求前一部分每个数都比后一部分每个数小?使用快速排序的思路

在内存中有 100 组有序数组, 每组 10 万个元素,用最快方法将他们合并成一个有序的数组。使用堆

基本知识

如何判断一个链表有闭环

Golang

多线程编程

如果多个线程并发读写一个 map,会产生什么结果?为什么会产生这种结果?有什么办法保证并发安全?

Golang 中对一个 int64 进行高并发更新(增减),有什么办法保证并发安全? 并发编程的理解,可以有 3 种方式:(1)锁(2)atomic包(3)channel - 多生产者单消费者

协程,线程,进程

描述 goroutine 调度、切换机制。

Channel

Golang chan特性 chan 为什么不用锁,底层是怎么实现的?

什么时候会阻塞,怎么判断会阻塞? 1)chan底层是用了锁+双向队列实现。2)投递前可cap、len函数判断是否相等,但要锁住。第2个方法是用select default,实际编程中select必需加 default处理逻辑。

Redis

基本数据结构

string、list、set、zset、hash,每种数据结构的使用场景,实现原理

Redis Redis 用法如何用 Redis 实现一个分布式锁 最初级的回答是SETNX。更好的回答是考虑到原子性,用 Lua 脚本

原理

Redis对设置了TTL的key,是如何实现key的过期的? 能回答出 2 种过期方式:主动和被动(惰性)。如果能回答出主动方式的随机抽样流程,加分。

Redis的key淘汰策略有哪些? 各有什么特点?常用的有volatile-lru、volatile-ttl。LRU 算法的流程是什么

redis 有没有 stop the world 问题?什么时候会出现?为什么?回答:redis 是单进程、单线程服务,单个任务处理时间过长,就严重影响并发性能。如持久化时、处理返回大 values 值数据时、从一个很长的 list 中删除一个元素时等场景。

系统设计

短网址服务

  1. 输入一个长网址,编码返回一个短网址(重点是编码方法的考虑,比如用什么方式表示短网址,能表示的量有多大)

  2. 如何通过短网址找到长网址?

  3. HTTP重定向是选301还是302? (1)编码方式:用ID生成器生成一个64bit整数,然后把这个整数编码成英文数字的字符串(注意考虑要多长的字符串?),如果回答md5之类的hash方法的,会有冲突问题。

  4. 通过kv存储,key是短网址,value是长网址,redis mysql都可以

  5. 301(永久重定向)和302(临时重定向)的区别主要在于搜索引擎的行为。如果想要统计用户请求信息,用302.

高并发 ID 生成服务

  1. 全局唯一

  2. ID体积尽可能小

  3. ID按照时间有序


微信公众号
作者
微信公众号