面试复习-计算机基础

发布于 2023-04-18  1104 次阅读


计算机基础


logo

http状态码

HTTP 是超文本传输协议,也就是HyperText Transfer Protocol。

「301 Moved Permanently」表示永久重定向,说明请求的资源已经不存在了,需改用新的 URL 再次访问。
「302 Moved Permanently」表示临时重定向,说明请求的资源还在,但暂时需要用另一个 URL 来访问。

如果客户端使用 POST 方法发起的请求被重定向,且使用 302 状态码重定向,那么重新发起的请求可能会变成 GET 方法,从而可能造成已经提交的数据丢失。而如果使用 307 状态码重定向,客户端会按照原来的方法继续发起请求,因此不会造成数据丢失

img

Http请求头

HTTP(Hypertext Transfer Protocol)请求头结构包含以下几个部分:

  • 请求方法(Request Method):指定客户端请求的动作或者操作类型,如GET、POST、PUT、DELETE等。
  • 请求路径(Request URL):指定请求的资源路径,包括主机名、端口号、路径和查询参数等信息。
  • 协议版本(HTTP Version):指定所使用的HTTP协议版本号,通常是HTTP/1.0或HTTP/1.1。
  • 请求头部(Request Headers):包含一些附加的请求头信息,如Accept、Accept-Encoding、Content-Type、User-Agent等。
  • 实体主体(Request Body):包含请求发送的数据信息,在POST和PUT等请求方法中常用到。

请求头的格式通常为:

<Method> <URL> HTTP/<Version>
<Header Name>: <Header Value>
<Header Name>: <Header Value>
...
<Header Name>: <Header Value>

<Request Body>

例如,一个POST请求头可能如下所示:

POST /api/user/register HTTP/1.1
Host: www.example.com
Content-Type: application/json
Content-Length: 45
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Accept: */*

{"username": "example", "password": "password123"}

其中,请求方法为POST,请求路径为/api/user/register,协议版本为HTTP/1.1,请求头部包含Host、Content-Type、Content-Length、User-Agent、Accept等字段,请求实体主体为JSON格式的用户注册信息。

Http版本

HTTP/1 ~ HTTP/3

下面是各个版本之间的主要特点对比:

版本 发布时间 主要特点
HTTP/0.9 1991 只支持传输纯文本的 HTML 页面
HTTP/1.0 1996 支持多种数据类型;定义了 GET、POST、HEAD 请求方法;引入了状态码和 Header 和 Body 数据结构
HTTP/1.1 1999 引入了持久化连接长连接、分块传输编码、管线化机制、缓存机制(强制缓存和协商缓存)等
HTTP/2 2015 引入了二进制分帧机制、多路复用机制、头部压缩机制、服务器推送机制

无状态 明文传输 1.1

img

RPC 与Http对比

  • 纯裸 TCP 是能收发数据,但它是个无边界的数据流,上层需要定义消息格式用于定义消息边界。于是就有了各种协议,HTTP 和各类 RPC 协议就是在 TCP 之上定义的应用层协议。
  • RPC 本质上不算是协议,而是一种调用方式,而像 gRPC 和 Thrift 这样的具体实现,才是协议,它们是实现了 RPC 调用的协议。目的是希望程序员能像调用本地方法那样去调用远端的服务方法。同时 RPC 有很多种实现方式,不一定非得基于 TCP 协议
  • 从发展历史来说,HTTP 主要用于 B/S 架构,而 RPC 更多用于 C/S 架构。但现在其实已经没分那么清了,B/S 和 C/S 在慢慢融合。很多软件同时支持多端,所以对外一般用 HTTP 协议,而内部集群的微服务之间则采用 RPC 协议进行通讯。
  • RPC 其实比 HTTP 出现的要早,且比目前主流的 HTTP/1.1 性能要更好,所以大部分公司内部都还在使用 RPC。
  • HTTP/2.0HTTP/1.1 的基础上做了优化,性能可能比很多 RPC 协议都要好,但由于是这几年才出来的,所以也不太可能取代掉 RPC。

OSI 七层模型

image-20230408205813514

  • 各层之间是独立的
  • 灵活性好
  • 结构上可分割开
  • 易于实现和维护
  • 能促进标准化工作

TCP 与UDP 8 20

1.是否面向连接:UDP在传送数据之前不需要先建立连接。而TCP提供面向连接的服务,在传
送数据之前必须先建立连接,数据传送结束后要释放连接。
2.是否是可靠传输:远地主机在收到UDP报文后,不需要给出任何确认,并且不保证数据不丢
失,不保证是否顺序到达。TCP提供可靠的传输服务,TCP在传递数据之前,会有三次握手来
建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制。通过TCP连接传输的数
据,无差错、不丢失、不重复、并且按序到达。
3.是否有状态:这个和上面的“是否可靠传输”相对应。TCP传输是有状态的,这个有状态说的是
TCP会去记录自己发送消息的状态比如消息是否发送了、是否被接收了等等。为此,TCP需要
维持复杂的连接状态表。而UDP是无状态服务,简单来说就是不管发出去之后的事情了(这很
渣男!)。
4.传输效率:由于使用TCP进行传输的时候多了连接、确认、重传等机制,所以TCP的传输效
率要比UDP低很多。
5.传输形式:TCP是面向字节流的,UDP是面向报文

6.首部开销:TCP首部开销(20~60字节)比UDP首部开销(8字节)要大。
7.是否提供广播或多播服务:TCP只支持点对点通信,UDP支持一对一、一对多、多对一、多对
多;

122

  1. 可靠传输的原理:停止等待协议、ARQ协议。
  2. TCP连接:TCP连接(套接字1,套接字2)。TCP套接字(IP地址:端口号);

TCP报文段的首部格式(书225页,重在理解)

image-20230212201122516

image-20230212210636412

image-20230212210707648image-20230212210852807image-20230212211025286image-20230212211129145

  1. TCP的运输连接管理:三报文握手建立连接,四报文挥手释放连接。(书247-250,注意发送报文段和确认报文段seq和ack之间的关系)

    ack=seq+1

    msl 最长报文寿命

    image-20230212222302372

如果只有两次握手,存在以下情况:

  1. 主机 A 发送 SYN 报文段,但是该报文段在网络中滞留,无法到达主机 B。主机 A 没有收到主机 B 的 ACK 报文段,就重复发送 SYN 报文段,此时主机 B 收到了两个 SYN 报文段。
  2. 主机 B 回复 ACK 报文段后,主机 A 没有收到确认信息,会继续发送数据,此时主机 B 并不知道主机 A 是否准备好了数据传输

image-20230212222858883

image-20230212222905876

操作系统

进程有哪⼏种状态

image-20230408213323628

进程最⼤的不同在于基本上各进程是独⽴的,进程是资源分配最小单位,线程是调度的最小单位

创建状态 (new) :进程正在被创建,尚未到就绪状态。

就绪状态 (ready) :进程已处于准备运⾏状态,即进程获得了除了处理器之外的⼀切所需资源,⼀旦得到处理器资源(处理器分配的时间⽚)即可运⾏。

运⾏状态 (running) :进程正在处理器上上运⾏(单核 CPU 下任意时刻只有⼀个进程处于运⾏状态)。

阻塞状态 (waiting) :⼜称为等待状态,进程正在等待某⼀事件⽽暂停运⾏如等待某资源为可⽤

或等待 IO 操作完成。即使处理器空闲,该进程也不能运⾏。

结束状态 (terminated) :进程正在从系统中消失。可能是进程正常结束或其他原因中断退出运

⾏。

1680968687046.png

进程间的通信⽅式

1.管道/匿名管道(Pipes):
2.有名管道(Names Pipes):
3.信号(Signal):
4.消息队列(Message Queuing):
5.信号量(Semaphores):
6.共享内存(Shared memory):
7.套接字(Sockets):

线程间的同步的⽅式

  1. 互斥量 (Mutex):采⽤互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。因为互斥对象只有⼀个,所以可以保证公共资源不会被多个线程同时访问。⽐如 Java 中的synchronized 关键词和各种 Lock 都这种机制。

  2. 信号量 (Semaphore) :它允许同⼀时刻多个线程访问同⼀资源,但是需要控制同⼀时刻访问此资源的最⼤线程数量。

  3. 事件 (Event) :Wait/Notify:通过通知操作的⽅式来保持多线程同步,还可以⽅便的实现多线程优先级的⽐᫾操作

内核态

在Java中,通常使用系统调用来进行一些需要操作系统支持的操作,例如文件 I/O 和网络通信等。这些系统调用实际上是由内核态的线程来执行的,而用户态的线程则可以通过调用相关的 Java API 来触发这些系统调用。

import java.io.*;

public class Main {
    public static void main(String[] args) throws Exception {
        FileInputStream fis = new FileInputStream("test.txt"); // 在用户态打开文件
        byte[] buffer = new byte[1024];
        int bytesRead = fis.read(buffer); // 用户态线程触发文件读操作,触发内核态线程执行实际的读操作
        fis.close();
    }
}

在这个示例中,从FileInputStream的构造函数开始到read()方法被调用,所有的操作都是在用户态下执行的。但是,当read()方法被调用时,实际的文件读操作需要依赖内核态线程来完成,因为它需要进行系统调用。所以,read()方法将导致线程从用户态切换到内核态。而在read()方法返回后,又会恢复到用户态。

这个示例中展示了用户态和内核态之间的概念,并通过文件 I/O 操作来说明了它们如何共同工作。

进程的调度算法

image-20230408213617594

死锁

多个进程/线程同时被阻塞,它们中的⼀个或者全部都在等待

四个条件

  1. 循环等待
  2. 请求与保持 一个进程因请求资源而阻塞时,对已获得的资源保持不放。
  3. 互斥 一个资源每次只能被一个进程使用。
  4. 不可剥夺 程已获得的资源,在末使用完之前,不能强行剥夺。

解决死锁的⽅法 预防,避免,检测和解除四种

  1. 预防 是采⽤某种策略,限制并发进程对资源的请求,从⽽使得死锁的必要条件在系统执⾏的任何时间上都不满⾜。

  2. 避免则是系统在分配资源时,根据资源的使⽤情况提前做出预测,从⽽避免死锁的发⽣

  3. 检测是指系统设有专⻔的机构,当死锁发⽣时,该机构能够检测死锁的发⽣,并精确地确定与死锁有关的进程和资源。

  4. 解除 是与检测相配套的⼀种措施,⽤于将进程从死锁状态下解脱出来

常⻅的⼏种内存管理机制

  1. 块式管理 : 远古时代的计算机操作系统的内存管理⽅式。将内存分为⼏个固定⼤⼩的块,每个块中只包含⼀个进程。如果程序运⾏需要内存的话,操作系统就分配给它⼀块,如果程序运⾏只需要很⼩的空间的话,分配的这块内存很⼤⼀部分⼏乎被浪费了。这些在每个块中未被利⽤的空间,我们称之为碎⽚。

  2. ⻚式管理 :把主存分为⼤⼩相等且固定的⼀⻚⼀⻚的形式,⻚⼩,相⽐于块式管理的划分度更⼩,提⾼了内存利⽤率,减少了碎⽚。⻚式管理通过⻚表对应逻辑地址和物理地址。

  3. 段式管理 : ⻚式管理虽然提⾼了内存利⽤率,但是⻚式管理其中的⻚并⽆任何实际意义。 段式管理把主存分为⼀段段的,段是有实际意义的,每个段定义了⼀组逻辑信息,例如,有主程序段MAIN、⼦程序段 X、数据段 D 及栈段 S 等。 段式管理通过段表对应逻辑地址和物理地址。

    ⻚是物理单位,段是逻辑单位。分⻚可以有效提⾼内存利⽤率,分段可以更好满⾜⽤户需求,段⻚式管理机制 。段⻚式管理机制结合了段式管理和⻚式管理的优点。简单来说段⻚式管理机制就是把主存先分成若⼲段,每个段⼜分成若⻚,也就是说 段⻚式管理机制 中段与段之间以及段的内部的都是离散的。

快表(Translation Lookaside Buffer,TLB)是一种硬件缓存,用于加速虚拟地址到物理地址的转换过程。在计算机中,当 CPU 访问内存时,需要先将虚拟地址转换成物理地址,这个过程需要通过页表来实现,页表将虚拟页号转换成物理页号。由于每次访问内存都需要进行这样的转换,如果每次都从主存中读取页表项,将会带来较大的延迟。

快表就是一种缓存页表项的机制,存储最近使用的页表项,以便在下一次访问同一虚拟页时,能够更快地获取到对应的物理页号。快表通常位于 CPU 的芯片中,具有较小的容量,但访问速度非常快,可以极大地提高页面访问的效率。

快表中存储的是虚拟页号和物理页号之间的映射关系,当 CPU 访问内存时,它首先查找快表,如果快表中存在对应的映射关系,则可以直接获取物理页号,否则需要访问主存中的页表来获取对应的物理页号。快表采用了类似于哈希表的机制来实现快速查询,通常配合着高速缓存使用,可以有效降低内存访问时的延迟。

局部性原理

  1. 时间局部性 :如果程序中的某条指令⼀旦执⾏,不久以后该指令可能再次执⾏;如果某数据被

访问过,不久以后该数据可能再次被访问。产⽣时间局部性的典型原因,是由于在程序中存在着

⼤量的循环操作。

  1. 空间局部性 :⼀旦程序访问了某个存储单元,在不久之后,其附近的存储单元也将被访问,即

程序在⼀段时间内所访问的地址,可能集中在⼀定的范围之内,这是因为指令通常是顺序存放、

顺序执⾏的,数据也⼀般是以向量、数组、表等形式簇聚存储的。

加密算法和摘要算法

都是常见的密码学算法,它们在保障信息安全方面发挥着重要作用。

  1. 加密算法

加密算法又称为密码算法,是一种能够将明文转换成密文的算法,用于保护通信过程中的数据安全。加密算法主要包括对称加密算法和非对称加密算法两种类型。

对称加密算法指的是加密和解密使用相同的密钥,其特点是加密速度快、运算效率高,但缺点是密钥容易泄露,从而导致信息被攻击者窃取。

非对称加密算法则采用了公钥和私钥的方式进行加密和解密,其中公钥可以公开发布,任何人可以使用这个公钥对信息进行加密,但只有拥有私钥的人才能够解密,从而保证了信息的安全性。非对称加密算法适合在通信过程中传输少量数据,并且需要保证通信双方的认证和数据的完整性。https

  1. 摘要算法

摘要算法又称为哈希算法,是一种用于生成消息摘要的算法,其主要作用是用来验证接收到的数据是否与原始数据完全一致。摘要算法通常将任意长度的消息转换成固定长度的摘要值,当数据受到篡改时,摘要值也会发生改变,因此可以用来验证数据的完整性。

摘要算法一般是单向函数,即不可逆的,也就是说摘要值无法还原成原始数据。常用的摘要算法有MD5和SHA-1等,MD5和SHA-1算法的输出结果均为一个128位或160位的字符串。由于现代计算机计算能力的提高,MD5和SHA-1算法容易受到暴力破解攻击,因此近年来更常用的摘要算法包括SHA-256和SHA-512等。

总之,加密算法和摘要算法在保障信息安全方面都扮演着重要角色,加密算法可以用于保障通信过程中数据的机密性,摘要算法则用于验证数据的完整性,避免数据被篡改。