操作系统/计网
进程和线程?线程的轻量级的体现在哪里? 一个进程可以有多个线程,线程是 CPU 调度的最小单位,进程是资源分配的最小单位。轻量级体现在线程共享进程的资源(如内存空间),创建和切换开销比进程小。
线程 crash 进程会不会 crash? 在 Java 语言中,线程 crash 通常不会导致整个进程 crash,但进程内不同线程之间的内存是共享的,一个线程的 crash 可能导致其他线程访问到不正确的数据,进而引发其他线程异常。
死锁了解吗?说一下死锁产生的四个必要条件?有什么算法能避免死锁吗? 四个必要条件:互斥(一个资源一次只能分配给一个线程使用)、不可剥夺(一个线程不能强行占有其他线程已经占有的)、请求和保持(一个线程在等待其他进程释放资源的同时,继续占有已经拥有的资源)、循环等待条件(A 等 B 等 C 等 A)。银行家算法可用于避免死锁。
操作系统中 cpu 调度算法有哪些?你觉得其中最好的一种是? 分为抢占式和非抢占式。具体包括:先进先执行 FCFS、最短优先 SJF、优先级调度算法(隔一段时间被迫交出 CPU)等。没有绝对最好的算法,需根据场景选择。
操作系统 IO 模型
- 同步阻塞:从开始阻塞到结束。
- 同步非阻塞:开始到资源就绪轮询,资源拷贝阻塞。
- IO 多路复用:poll&epoll 机制,Handler 处理。
- 异步非阻塞:回调式。
- 异步阻塞:Kotlin 协程 suspend 底层原理利用了 Continuation 实现了 CPS 转换,回调地狱应算作异步阻塞。
进程通信方式 管道(只能在有亲缘关系进程间单向流动)、有名管道(允许无亲缘关系进程间单向流动)、消息队列、共享内存、信号量(控制多个进程对共享资源的访问,常用于文件锁)、套接字(可用于网络)、信号(通知进程某个事件已经发生)。
解释性语言 vs 编译型语言 Java 编译成 class,在不同平台使用不同虚拟机解释执行。C 语言编译成二进制文件,不同平台可执行的二进制文件不同。
架构?MVVM/MVP 区别 MVC:View 触发事件传递给 Controller 通知 Model 数据变化刷新 View。MVP:Model 和 View 彻底解耦,Presenter 持有两者的接口进行操作。MVVM:Model 和 View 彻底解耦,ViewModel 实现数据双向绑定,比如 Google 的 Databinding,这时我们其实还需要写 BindAdapter。
https 与 http 的区别,数字签名? HTTPS 多了一层 TLS/SSL。数字签名将服务器发来的密文用签发机构的公钥解密,然后和服务器的信息的 hash 值进行对比。
DNS 解析怎么做的?DNS 劫持如何避免? DNS 解析就是根据指定的域名,记录类型 (A, AAAA, CNAME, MX, NS),记录值找到指定的服务器或跳转到其他域名。避免 DNS 劫持可以在 OkHttpClient 中自定义自己的 DNS。
http 状态码 100/102 continue, 206 分段内容,301 永久/302 临时重定向/304 NotModified, 401 未授权/403 Forbidden 服务器拒绝请求/404 NotFound, 500 服务器内部错误/502 网关错误/503 服务暂时不可用。
http2 多路复用 基于二进制分帧层,HTTP 消息被分解为独立的帧并行发送出去,最后在另一端根据流 ID 重新组合。
http 几个版本的不同 1.1:多条连接承载多个请求;2.0:单条连接多路复用;3.0:基于 QUIC 实现快速可靠的 UDP 连接。
get 与 post 请求的区别?get 与 post 携带数据的区别 GET 往往使用 FormUrlEncoded 这种方式将请求参数编码在 URL 中,POST 往往会在 body 中包含数据。且 GET 请求一般带有缓存,POST 没有。GET 发送一次,POST 会先发送一次 header,服务端响应 100 continue,然后再发送真实数据,响应 200。
浏览器输入 url 发生了什么 构建请求 -> DNS 解析 -> 发起 TCP 连接 -> 发送 HTTP 请求 -> 服务端响应 HTTP 请求 -> 客户端处理请求。
TCP 原理,如何实现可靠传输,除了三次握手和四次挥手还有哪些机制? ACK(服务端返回收到的最后一次正确的 seq+1)、流量控制、拥塞控制。
为什么要三次握手/四次挥手
- 三次握手:SYN->SYN+ACK->ACK。如果变成两次握手,如果第一次 SYN 包发送出去但是暂未成功建立连接,而在客户端重试之后原来失效的连接又被成功发到了服务器使得服务器又使用原来的 SYN 包建立起了连接,不符合预期。


