进程和线程

什么是进程

进程是程序的一次执行过程,是一个动态概念,是程序在执行过程中分配和管理资源的基本单位,每一个进程都有一个自己的地址空间,至少有 5 种基本状态:初始态,执行态,等待状态,就绪状态,终止状态。

什么是线程

线程是CPU调度和分派的基本单位,它可与同属一个进程的其他的线程共享进程所拥有的全部资源。

进程和线程之间的联系

线程是进程的一部分,一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。

进程和线程之间的区别

理解它们的差别,我从资源使用的角度出发。(所谓的资源就是计算机里的中央处理器,内存,文件,网络等等)

根本区别:进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位。

在开销方面:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。

所处环境:在操作系统中能同时运行多个进程(程序);而在同一个进程(程序)中有多个线程同时执行(通过CPU调度,在每个时间片中只有一个线程执行)

内存分配方面:系统在运行的时候会为每个进程分配不同的内存空间;而对线程而言,除了CPU外,系统不会为线程分配内存(线程所使用的资源来自其所属进程的资源),线程组之间只能共享资源。

包含关系:没有线程的进程可以看做是单线程的,如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。

为什么进程切换慢,线程切换快?

虚拟内存是操作系统为每个进程提供的一种抽象,每个进程都有属于自己的、私有的、地址连续的虚拟内存,最终进程的数据及代码必然要放到物理内存上,那么必须有某种机制能记住虚拟地址空间中的某个数据被放到了哪个物理内存地址上,这就是所谓的地址空间映射,也就是虚拟内存地址与物理内存地址的映射关系。

那么操作系统是如何记住这种映射关系的呢,答案就是页表,页表中记录了虚拟内存地址到物理内存地址的映射关系。有了页表就可以将虚拟地址转换为物理内存地址了,这种机制就是虚拟内存。

每个进程都有自己的虚拟地址空间,进程内的所有线程共享进程的虚拟地址空间。进程切换与线程切换的一个最主要区别就在于进程切换涉及到虚拟地址空间的切换而线程切换则不会。因为每个进程都有自己的虚拟地址空间,而线程是共享所在进程的虚拟地址空间的,因此同一个进程中的线程进行线程切换时不涉及虚拟地址空间的转换。

为什么虚拟地址空间切换会比较耗时呢?

进程都有自己的虚拟地址空间,把虚拟地址转换为物理地址需要查找页表,页表查找是一个很慢的过程,因此通常使用 cache 来缓存常用的地址映射,这样可以加速页表查找,这个 cache 就是快表 (TLB, Translation Lookaside Buffer),我们不需要关心这个名字只需要知道 TLB 本质上就是一个 cache ,是用来加速页表查找的。由于每个进程都有自己的虚拟地址空间,那么显然每个进程都有自己的页表,那么当进程切换后页表也要进行切换,页表切换后 TLB 就失效了,cache 失效导致命中率降低,那么虚拟地址转换为物理地址就会变慢,表现出来的就是程序运行会变慢,而线程切换则不会导致 TLB 失效,因为线程线程无需切换地址空间,因此我们通常说线程切换要比较进程切换块,原因就在这里。

为什么有了进程,还要有线程?

进程可以使多个程序并发执行,以提高资源的利用率和系统的吞吐量,但是其带来了一些缺点

  1. 进程在同一时间只能干一件事情;
  2. 进程在执行的过程中如果阻塞,整个进程就会被挂起,即使进程中有些工作不依赖与等待的资源,仍然不会执行。

基于以上的缺点,操作系统引入了比进程粒度更小的线程,作为并发执行的基本单位,从而减少程序在并发执行时所付出的时间和空间开销,提高并发性能。

HTTP 与 HTTPS

HTTP 与 HTTPS 有哪些区别

HTTP + 加密 + 认证 + 完整性保护 = HTTPS

  1. HTTPS 协议需要到 CA ( Certificate Authority ,证书颁发机构)申请证书,一般免费证书较少,因而需要一定费用。
  2. HTTP 是超文本传输协议,信息是明文传输,HTTPS 则是具有安全性的 SSL 加密传输协议。
  3. HTTP 和 HTTPS 使用的是完全不同的连接方式,用的端口也不一样,前者是 80 ,后者是 443 。
  4. HTTP 的连接很简单,是无状态的;HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,比 HTTP 协议安全。(无状态的意思是其数据包的发送、传输和接收都是相互独立的。无连接的意思是指通信双方都不长久的维持对方的任何信息。)

不同加密方式

  • 共享密钥加密(对称密钥加密):加密和解密用同一个密钥。
  • 公开密钥加密:使用一对非对称密钥(私钥、公钥),发送方使用对方的公钥加密,对方收到加密信息,用自己的私钥进行解密。

HTTPS 加密机制

HTTPS 采用混合加密机制,在交换密钥环节使用公开密钥加密方式(非对称密钥加密),之后的建立通信交换报文阶段使用共享密钥加密方式(对称密钥加密)。

HTTPS 通信步骤

 HTTPS 通信步骤图解
步骤 1: 客户端通过发送 Client Hello 报文开始 SSL 通信。报文中包含客户端支持的 SSL 的指定版本、加密组件(Cipher Suite)列表(所使用的加密算法及密钥长度等)。

步骤 2: 服务器可进行 SSL 通信时,会以 Server Hello 报文作为应答。和客户端一样,在报文中包含 SSL 版本以及加密组件。服务器的加密组件内容是从接收到的客户端加密组件内筛选出来的。

步骤 3: 之后服务器发送 Certificate 报文。报文中包含公开密钥证书。

步骤 4: 最后服务器发送 Server Hello Done 报文通知客户端,最初阶段的 SSL 握手协商部分结束。

步骤 5: SSL 第一次握手结束之后,客户端以 Client Key Exchange 报文作为回应。报文中包含通信加密中使用的一种被称为 Pre-mastersecret 的随机密码串。该报文已用步骤 3 中的公开密钥进行加密。

步骤 6: 接着客户端继续发送 Change Cipher Spec 报文。该报文会提示服务器,在此报文之后的通信会采用 Pre-master secret 密钥加密。

步骤 7: 客户端发送 Finished 报文。该报文包含连接至今全部报文的整体校验值。这次握手协商是否能够成功,要以服务器是否能够正确解密该报文作为判定标准。

步骤 8: 服务器同样发送 Change Cipher Spec 报文。

步骤 9: 服务器同样发送 Finished 报文。

步骤 10: 服务器和客户端的 Finished 报文交换完毕之后,SSL 连接就算建立完成。当然通信会受到 SSL 的保护。从此处开始进行应用层协议的通信,即发送 HTTP 请求。

步骤 11: 应用层协议通信,即发送 HTTP 响应。

步骤 12: 最后由客户端断开连接。断开连接时,发送 close_notify 报文。上图做了一些省略,这步之后再发送 TCP FIN 报文来关闭与 TCP的通信。

认证过程

① 服务器把自己的公开密钥登录至数字证书认证机构。

② 数字证书认证机构用自己的私有密钥对服务器的公开密钥做数字签名,并颁发数字证书。

③ 客户端拿到服务器的公钥证书后,使用数字证书认证机构的公开密钥,向数字证书认证机构进行验证,以确认服务器公开密钥的真实性。

④ 客户端使用服务器的公开密钥对报文加密后发送。

⑤ 服务器用私有密钥对报文进行解密。

常见的 HTTP 状态码的含义

1xx 的状态码

对于1xx的状态码,信息,服务器收到请求,需要请求者继续执行操作。

  • 100为继续,表示确认,成功返回具体参数信息;
  • 101为切换协议,服务器根据客户端的请求切换协议。

2xx 的状态码

对于2xx的状态码,成功,操作被成功接收并处理。

  • 200 表示正常返回信息;
  • 201表示请求成功并且服务器创建了新的资源;
  • 202表示服务器已接受请求,但尚未处理。

3xx 的状态码

对于3xx,重定向,需要进一步的操作以完成请求。

  • 301表示请求的网页已永久移动到新位置;
  • 302表示临时性重定向;
  • 303表示临时性重定向,且总是使用 GET 请求新的 URI;
  • 304表示自从上次请求后,请求的网页未修改过。

4xx 的状态码

对于4xx,客户端错误,请求包含语法错误或无法完成请求。

  • 400,服务器无法理解请求的格式,客户端不应当尝试再次使用相同的内容发起请求;
  • 401,请求未授权;
  • 403,禁止访问;
  • 404,找不到如何与 URI 相匹配的资源。

5xx 的状态码

对于5xx,服务器错误,服务器在处理请求的过程中发生了错误。

  • 500,最常见的服务器端错误,服务器端在执行请求时发生了错误;
  • 503,服务器端暂时无法处理请求,可能是过载或维护。

更多详情参考:HTTP状态码

© 2022 物极必反 All Rights Reserved.
Theme by hiero