[计算机基础]面试基础

线程和进程的区别

  • 进程是系统进行资源分配和调度的基本单位,线程是CPU调度和分配的基本单位。
  • 线程依赖于进程而存在,一个进程至少有一个线程。
  • 进程拥有自己的独立地址空间,线程共享所属进程的地址空间。
  • 进程是拥有系统资源的一个独立单位,而线程自己基本上不拥有系统资源,和其他线程共享本进程的相关资源。
  • 进程切换时,涉及到整个当前CPU环境的保存设置以及被调度运行的CPU环境设置,而线程切换只需要保存和设置少量寄存器的内容,并不涉及存储器管理方面的操作,进程切换的开销远大于线程。

死锁

定义

指两个或两个以上的进程在执行的过程中,因争夺资源而陷入的一种互相等待的状态,若无外力作用,他们将无法推荐。此时系统处于死锁,这些永远在相互等待的进程被称为死锁进程。

原因

  • 系统资源不足
  • 进程的推进顺序不当(P1拥有A申请B,P2拥有B申请A)

产生死锁的必要条件

  • 互斥条件:线程对所分配到的资源进行排他式使用,即一段时间内某个资源只由一个进程占用。
  • 请求和保持条件:线程至少拥有了一个资源,但又提出了新的资源请求,但此资源已被其他进程占有,此时请求进程阻塞,但又对自己所持有的资源保持不放。
  • 不剥夺条件:线程已获得的资源,在未使用完之前,不能被剥夺。只能在使用完后由自己释放。
  • 环路等待:发生死锁时,必然存在一个进程的环形链。

    处理死锁的基本方法

  • 检测死锁:了解死锁发生的情况和位置,可以通过死锁检测工具来检测死锁。
  • 解除死锁:一旦检测到死锁,可以通过以下方法解除死锁:
    • 终止其中一个或多个死锁进程。
    • 撤销死锁进程占用的资源
    • 抢占死锁进程占用的资源。
  • 避免死锁:
    • 避免线程同时请求多个资源。当线程需要多个资源时,一次只请求一个。
    • 避免持有资源的时间过长。当线程池持有一个资源的时间的时间过长时,其他线程可能会等待很长时间,从而导致死锁。
    • 避免循环等待。
    • 明确资源获取顺序。
    • 使用超时机制。如果线程请求资源一段时间未果,则应释放当前占有的资源,并重新请求。

Get与Post

  • Get的语义是从服务器获取指定的资源。
    • 用于从服务器请求数据的HTTP方法。
    • 在浏览器地址输入连接时,会向服务器发送一个GET请求。
    • 请求参数会包含在URL中。
    • 比如打开我的文章,浏览器就会发送 GET 请求给服务器,服务器就会返回文章的所有文字及资源。
  • POST的语义时根据请求负荷对制定的资源做出处理。
    • 用于向服务器提交数据的HTTP方法。
    • 填写表单并提交数据时,会向服务器发送一个POST请求。
    • POST请求可以用于向服务器提交敏感数据,例如用户名和密码,并且可以改变服务器状态。

GET请求适用于提交数据,而POST请求适用于提交数据。

DNS请求过程

假设请求https://chat.openai.com/域名:

  • 1.本地DNS服务器查询:
    • 首先向本地DNS服务器发起请求,询问该域名对应的IP地址。
    • 如果缓存了直接返回,负责向根域名服务器请求。
    • 询问https://chat.openai.com/
  • 2.根域名服务器查询
    • 根域名服务器里面存储的都是各个顶级域名服务器的位置。如.com.cn服务器的位置
    • 会返回顶级域名服务器的IP地址给本地DNS服务器。
  • 3.顶级域名服务器查询
    • 本地服务器向顶级域名服务器发起请求。
    • 顶级域名服务器返回一个IP地址,该IP地址指向与该URL相关的权威DNS服务器。
    • 询问.com
  • 4.权威DNS查询
    • 本地服务器向权威DNS服务器发起请求。
    • 如果权威DNS服务器由该域名的IP地址记录,则返回。否则,返回一个没有该域名的响应。
    • 询问openai.com
  • 5.返回IP地址
    • 得到该域名的IP地址后,给计算机并放入缓存,以便下快速响应下一次请求。

HTTP

超文本传输协议

  • 协议:
    • HTTP是一个用在计算机世界里的协议。它使用计算机能够理解的语言确定了一种计算机之间交流通信的规范,以及相关的各种控制和错误处理方式。
  • 传输:
    • HTTP是一个在计算机世界里专门用来在两点之间传输数据的约定和规范。
  • 超文本:
    • HTTP是一个在计算机世界里专门在[两点]之间[传输]文字、图片、音频、视频等[超文本]数据的[约定和规范]。

HTTP常见的状态码

  • 1xx:提示成功,表示目前是协议处理的中间状态,需要后续的操作。
  • 2xx:提示成功,豹纹已收到并被正确处理。
  • 3xx:重定向
  • 4xx:客户端错误。
  • 5XX:服务器错误

TCP三次握手

第一次握手丢失

  • 客户端重传SYN,达到一定次数后关闭连接。

第二次握手丢失

  • 因为第二次握手报文里是包含对客户端的第一次握手的 ACK 确认报文,所以,如果客户端迟迟没有收到第二次握手,那么客户端就觉得可能自己的 SYN 报文(第一次握手)丢失了,于是客户端就会触发超时重传机制,重传 SYN 报文。
  • 同时因为第二次握手丢失了,服务端就收不到第三次握手,于是服务端这边会触发超时重传机制,重传 SYN-ACK 报文。会忽略客户端重传的SYN报文。

第三次握手丢失

  • ACK 报文是不会有重传的,当 ACK 丢失了,就由对方重传对应的报文。

SYN攻击

  • 假设攻击者短时间伪造不同 IP 地址的 SYN 报文。
  • 服务端每接收到一个 SYN 报文,就进入SYN_RCVD 状态。
  • 但服务端发送出去的 ACK + SYN 报文,无法得到未知 IP 主机的 ACK 应答。
  • 久而久之就会占满服务端的半连接队列,使得服务端不能为正常用户服务。
  • SYN 攻击方式最直接的表现就会把 TCP 半连接队列打满。
  • 这样当 TCP 半连接队列满了,后续再在收到 SYN 报文就会丢弃,导致客户端无法和服务端建立连接。

避免 SYN 攻击方式,可以有以下四种方法:

  • 调大 netdev_max_backlog;
  • 增大 TCP 半连接队列;
  • 开启 tcp_syncookies;
  • 减少 SYN+ACK 重传次数