进程与线程 进程,是操作系统进行资源分配的基本单位。 每个进程都有独立的资源,包括独立的内存空间、文件描述符、PCB块、堆、方法区等。 线程是CPU 调度的基本单位 可以理解成进程内部的一个执行单元。 一个进程可以包含多个线程,这些线程共享进程的资源,但有各自的栈、寄存器和程序计数器。 在切换的时候,进程切换需要切换页表 TLB 高速缓存,会比较慢,线程切换只需要切换栈和寄存器,会比较快。 进程之间因为隔离强,通信相对复杂,要借助 IPC。 线程之间因为共享内存,通信更方便,但也正因为共享资源,所以容易出现线程安全问题,比如竞态条件、可见性问题、数据不一致。

1 min

浏览器输入url后发生了什么 1.DNS解析 包括了 浏览器缓存、操作系统缓存、本地 DNS 服务器 到 根域名服务器的递归查询 2.TCP链接 http请求 知道地址和端口后,使用三次握手建立TCP链接,然后发送http请求。 3.服务器接收请求后,返回处理浏览器渲染 4.客户端保持TCP链接或者四次挥手关闭TCP链接 http的格式 请求行(Request Line) GET /api/user HTTP/1.1 请求头(Headers)accept:html,txt Accept-Language:zh-CN Content-Type ,Content-Length keepalive:true host:www.xxx.com User-Agent:Android auth:xxxx, 请求体(Body,可选:POST/PUT 才常见) 具体而言, http状态码 2xx:成功 3xx:重定向 301 永久重定向 302 临时重定向 4xx:客户端错误 404 资源未找到 403 禁止访问 400 客户端请求参数错误 5xx:服务器错误 500 服务器内部错误 502 网关错误 http的状态演进 针对的上一个版本的痛点,这个版本的改进,带了的收益 思考 HTTP/1.0::短连接。每个请求都要经历“三次握手”建立 TCP 连接,请求完立即断开。主要是少量的文本和少量图片。 HTTP/1.1::长连接。同一个 TCP 连接可以传输多个 HTTP 请求。引入了 Keep-Alive(长连接),允许在同一个 TCP 连接上发送多个请求。痛点:“队头阻塞(Head-of-line blocking)”:请求还是按照顺序一个一个来,如果前面的请求没处理完,后面的请求就得等着。 1.1是目前用的最广泛的http版本,解决了连接频繁建立的问题,但本质上还是单行道,可以提高“带宽利用率”。 HTTP/2::多路复用。在同一个 TCP 连接上并行传输多个 HTTP 请求和响应。引入了二进制分帧、头部压缩等特性。解决了队头阻塞的问题。“TCP 层的队头阻塞”。即便 HTTP 层不排队了,如果底层 TCP 丢了一个包,整个连接都会因为丢包重传而卡住。 ...

1 min