计算机基础知识脑图

计算机基础知识脑图

操作系统

资料

  • 《现代操作系统》
  • 《深入理解计算机系统》
  • 《UNIX 环境高级编程》
  • 《Unix/Linux 编程实践教程》
  • 《鸟哥的 Linux 私房菜》
  • 《The Linux Command Line》

基础

概述
并发和并行

并发:

  • 同一段时间交替发生。

并行:

  • 在同一时刻内发生了。

单核CPU只能并发,而多核CPU可以并行

举例:

1.在操作系统中,某一时间段,几个程序在同一个CPU上运行,但在任意一个时间点上,只有一个程序在CPU上运行。
2.边吃饭边看电视,并行,
边吃饭边喝水,并发

阻塞与非阻塞

  • 阻塞是指调用线程或者进程被操作系统挂起。
  • 非阻塞是指调用线程或者进程不会被操作系统挂起。

同步与异步

  • 同步是阻塞模式,异步是非阻塞模式。
  • 同步就是指一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那么这个进程将会一直等待下去,直到收到返回信息才继续执行下去;
  • 异步是指进程不需要一直等下去,而是继续执行下面的操作,不管其他进程的状态。当有消息返回式系统会通知进程进行处理,这样可以提高执行的效率。
操作系统完成了什么工作?是干什么的?
定义:

1.本质是运行在计算机上的软件程序,用于管理软硬件资源
2.屏蔽硬件层的复杂性,解脱程序员,所有跟硬件打交道的工作,封装为一个个系统调用,即一个方法,将系统调用再翻译为机器语言让硬件工作
3.内核是其核心,下面工作都由其来负责

工作:
  • 设备管理(开关机)
  • 文件管理(读、写、创及删等)
  • 进程管理(控制、通信)
  • 内存管理(完成内存的分配、回收)
  • 磁盘管理(Linux没有盘符这个概念,只有一个根目录/ /Windows下是盘符)
什么是系统调用?用户态内核态是什么?
进程级别分类

根据进程访问资源的特点,我们可以把进程在系统上的运行分为两个级别:

  • 用户态(user mode) :
    用户态运行的进程可以直接读取用户程序的数据。
  • 系统态(kernel mode):
    可以简单的理解系统态运行的进程或程序几乎可以访问计算机的任何资源,不受限制。
系统调用

1.我们运行的程序基本都是在用户态,
2.如果我们调用操作系统提供的系统态级别的子功能就需要系统调用了!
3.在我们运行的用户程序中,凡是与系统态级别的资源有关的操作(如文件管理、进程控制、内存管理等),都必须通过系统调用方式向操作系统提出服务请求,并由操作系统代为完成

如何从用户态切换到内核态呢?

1.系统调用(主动)
2.异常(被动)
3.外围设备的中断(被动)

Linux下的系统调用都有哪些?
  • 进程控制

    • fork()
      创建一个新进程

      • exit()
        中止进程

      • wait()
        等待子进程终止

  • 进程通信

    • pipe()
      同|:一个命令的输出 可以通过管道 做为 另一个的输入
  • 文件操作

    • open()
    • read()
    • write()
  • 安全操作

    • chmod()
      修改 用户/组 对 文件/目录 的权限

    • chown()
      修改文件拥有者

进程管理
  • 设备管理(开关机)
  • 文件管理(文件系统)
  • 进程管理(控制、通信)
  • 内存管理
  • 磁盘管理
进程、线程、协程区别?

从四个方面答:

  • 资源分配:
    进程操作系统资源分配的基本单位。
    一个进程可以拥有多个线程,线自身没有资源但可以访问其隶属进程的资源。
  • 执行调度:
    线程CPU调度的基本单位。
    线程在同一个进程内切换无需引起进程切换。从一个进程中的线程切换到另一个,会引起切换。
  • 系统开销:
    创建进程的资源开销要比创建线程的资源开销要大。
    创建或撤销进程,系统都要分配回收资源,进程切换的时候,涉及当前执行进程 CPU 环境的保存及新调度进程 CPU 环境设置。
    线程切换只需保存和设置少量寄存器的内容。
  • 通信难易程度:
    同一进程内的线程很容易进行通信,但是进程通信就需要借助一些其他的手段。

协程

  • 是用户态的轻量级线程,是线程内部的基本单位,
  • 是进程和线程的升级版,进程和线程都面临着内核态和用户态的切换问题而耗费许多切换时间,而协程就是用户自己控制切换的时机,不再需要陷入系统的内核态.
    Python里最常见的yield就是协程的思想!
    参考zz笔记
PCB 和 TCB 是什么?有什么作用?

PCB:进程控制块

包含内容:

  1. 进程的描述信息,比如进程的名称,标识符,
  2. 处理机的状态信息,当程序中断时保留此时的信息,以便 CPU 返回时能从断点执行
  3. 进程调度信息,比如阻塞原因,状态,优先级等等
  4. 进程控制和资源占用,同步通信机制,链接指针(指向队列中下一个进程的 PCB 地址)

PCB 作用?

  • PCB是进程实体的一部分,是操作系统中最重要的数据结构
  • 由于它的存在,使得多道程序环境下,不能独立运行的程序成为一个能独立运行的基本单位,使得程序可以并发执行
  • 系统通过 PCB 来感知进程的存在。(换句话说,PCB是进程存在的唯一标识)
  • PCB 应该常驻内存

TCB:线程控制块

进程和线程创建和销毁时会发生什么事?
进程:

进程允许创建和控制另一个进程,前者称为父进程,后者称为子进程,子进程又可以创建孙进程,如此下去进而形成一个进程的家族树,这样子进程就可以从父进程那里继承所有的资源,当子进程撤销时,便将从父进程处获得的所有资源归还,此外,撤销父进程,则必须撤销所有的子进程。(撤销的过程实际上就是对这棵家族树进行后序遍历的过程)

  • 创建:申请资源,创建 PCB
  1. 申请空白的PCB
  2. 初始化进程描述信息
  3. 为进程分配资源以及地址空间
  4. 将其插入就绪队列中
  • 销毁:回收资源,销毁 PCB
  1. 查找需要撤销的进程的 PCB
  2. 如果进程处于运行状态,终止进程并进行调度
  3. 终止子孙进程 - 归还资源
  4. 将它从所在的队列中移除
线程:

创建:
销毁:

进程五种状态
  • 先说有什么
    创建状态、就绪状态、运行状态、阻塞状态、结束状态

  • 再说哪两个能互相转化,什么情况下互相转化。
    只有就绪状态和运行状态能互相转化,当进程为就绪态时,等待 CPU 分配时间片,得到时间片后就进入 运行状态

  • 再说阻塞状态是什么情况下会到?
    阻塞状态是进程在运行状态时,需要等待某个资源比如打印机资源,而进入一个挂起的状态,等资源拿到后会回到就绪状态,等待 CPU 时间片。
    其和就绪状态相比还差一些资源

进程调度算法

不同环境的调度算法目标不同,因此需要针对不同环境来讨论调度算法。
具体见SZZ笔记

  • 批处理系统,类似打印机
    没有太多的用户操作,在该系统中,调度算法目标是保证吞吐量和周转时间(从提交到终止的时间)。
    吞吐量:单位时间内通过某网络(接口,信道)的数据量

    • FCFS(first comed first served)
      • SJF(short job first)
      • SRTF(short remaining time first )
  • 交互系统,要求实时性强

    • 时间片轮转
      • 优先级调度
      • 多级反馈队列(时间片轮转和优先级调度的结合)
线程实现方式

???

进程同步四种方式
  • 同步四种方式:
  1. 临界区
    为了互斥访问临界资源,每个进程在进入临界区之前,需要先进行检查。

  2. 同步和互斥
    1.互斥也称为间接制约关系,指多个进程在同一时刻只有一个进程能进入临界区
    2.同步也称为直接制约关系,它是指为了完成某种任务而建立的多个进程需要有一定的工作次序

  3. 信号量机制
    –原语:
    一种特殊的程序段,其执行只能一气呵成,不能被中断
    –一对原语:
    wait(S)与signal(S),简称为PV操作
    可以理解为自定义的函数,里面的信号量S其实就是函调时传入的一个参数
    –实现同步
    1.设同步信号量S=0
    2.在前操作后执行V(S)
    3.在后操作前执行P(S)
    –实现互斥
    只需将同步信号量设置为1
    –PV操作
    P:如果信号量大于零,就对其进行减 1 操作;如果信号量等于 0,进程进入 waiting 状态,等待信号量大于零。
    V:对信号量执行加 1 操作,并唤醒正在 waiting 的进程

  4. 管程
    –信号量机制编写程序困难,易出错,管程可以更方便得实现进程互斥和同步
    –管程中定义共享数据(如生产者模型中的缓冲区)
    –管程中定义访问这些共享数据的“入口”,如生产函数和消费函数
    –管程有很多入口(函数),但一次只开放一个入口(一次只能调用一个函数),只能让一个进程进入(如生产者模型中的缓冲区只能互斥访问)
    –管程中定义条件变量及等待唤醒等操作以解决同步问题
    –这些互斥,同步关系不需程序员关心,调用即可

  • 其它定义:
  1. 临界资源
    1.一段时间内只允许一个进程使用的资源,如打印机,
    2.访问临界资源时需要互斥得进行,逻辑上分为:进入区,临界区,退出区,剩余区(其它处理),入与出是负责实现互斥的代码段

  2. 临界区
    对临界资源的访问那段代码被称为临界区

进程通信的五种方式、生产者和消费者
  • 管道(匿名管道、命名管道)
    –管道是指用于连接读写进程的一个共享文件,是在内存中开辟的一个大小固定的缓冲区
    –管道只能采用半双工通信
    –各进程互斥地访问管道
    –数据以字符流的形式写入管道,管道写满,写进程的write()的系统调用被阻塞,同样,管道为空时,read()×
    –写满才能读,读空才能写

  • 消息队列
    –进程通过操作系统提供的发送消息和接收消息这两个原语进行数据交换
    –发送方通过发送原语将消息挂在消息队列(中介邮局或接收方的信箱,对应间接与直接通信)
    –接收方通过接收原语接收与处理
    –发送数据大的时候,此模型不适用,因为发送消息(拷贝)这个过程就需要很多时间来读写内存

  • 共享内存(临界区的概念)
    –以虚拟内存为基础,系统加载进程的时候,分配给进程的内存是虚拟内存空间。让两个进程各自拿出一块儿虚拟地址空间来,映射到同一个物理内存中。就完成共享机制了。
    –解决拷贝耗时很长的问题,共享内存是最快的一种进程通信的方式,因为进程是直接对内存进行存取的
    –进程对共享内存的访问是互斥的
    –通常用信号量来实现互斥

  • 信号量
    –可以来保证进程间的操作的同步与互斥
    –互斥信号量初始值定义为1,当进程访问临界区发现其为0时就知道有其他进程正在访问

  • 套接字
    –套接字可以实现两个不同的机器之间的进程通信,(IP地址:端口号)

举个例子:

  • 手写生产者和消费者!三个信号量
    –注意三个关系:一个互斥与两个同步,对应三个信号量
    –缓冲区为空时,消费者需要等待生产者生产,满时后者需等前者消费,对应两个工作次序问题,因此需设两个同步信号量
    –实现互斥的P操作一定要放在实现同步的P操作之后,
    –V操作不会导致进程阻塞,可以交换顺序
    –实现互斥是在同一进程中进行一对PV操作,而实现同步是分开进行的

“”"
mutex = 1
empty = N
full = 0

def P(S):
S -= 1
if S < 0:
block() # 如果小于0,代表资源没了

def V(S):
S += 1
if S <= 0:
wakeUp() # 如果小于等于0,代表有进程仍然在等待,通知他们ok了

def producer():
P(empty) # 生产者生产一个产品,消耗一个空缓冲区
P(mutex) # 临界区上锁
# … 临界区
V(mutex)
V(full) # 非空闲缓冲区数量加1

def Consumer():
P(full) # 消费者消耗一个非空闲缓冲区
P(mutex) # 临界区上锁

# ....   临界区

​ V(mutex)
​ V(empty) # 闲缓冲区数量加1
“”"

死锁
死锁产生的四个条件
  • 互斥条件
    是资源分配是互斥的,资源要么处于被分配给一个进程的状态,要么就是可用状态。
  • 占有和等待条件
    进程在请求资源得不到满足的时候,进入阻塞等待状态,且不释放已占有的资源。
  • 不剥夺条件
    已经分配给一个进程的资源不能强制性地被抢占,只能等待占有他的进程释放。
  • 环路等待条件
    有两个或者两个以上的进程组成一条环路,该环路中的每个进程都在等待下一个进程释放所占有的资源。
如何预防死锁?如果发生死锁如何解决?

首先要尽量避免死锁的发生,可以从两个角度考虑。

  • 预防策略

    • 破坏互斥条件
      - 假脱机打印机技术允许若干个进程同时输出,由假脱机管理进程将每个进程用户的打印请求表挂到假脱机文件队列中,无需等待
      • 破坏占有和等待条件
      • 举例:规定所有进程在开始执行前请求所需要的全部资源。
      • 破坏不剥夺条件
        • 允许进程强行从资源占有者那里夺取某些资源
      • 破坏环路的等待条件
        • 给资源统一编号,进程只能按编号顺序来请求资源。
  • 死锁避免算法-银行家算法

    • 安全状态
      - 如果没有死锁发生时,并且所有进程突然对某个资源提出最大需求,也仍然存在某种调度次序能够使一个进程运行完毕,则称这个状态是安全的。
      • 拒绝不安全申请
        • 某个进程对某个资源提出申请时,判断该请求是否会使得系统进入不安全状态,如果是,就拒绝请求,否则再对其进行分配。

如果真的发生死锁

  • 首先需要检测死锁,检测有向图中是否存在环。

  • 死锁恢复(从下到上逐渐变态苛刻)

    • 撤销进程

      • 撤销所有死锁的进程

        • 逐个撤销陷入死锁的进程
      • 资源剥夺策略

        • 从陷于死锁的进程中逐个强迫放弃所占用的资源,直到死锁消失
          • 从另外的进程强行剥夺资源分配给死锁进程
    • 鸵鸟策略

      • 因为解决死锁问题的代价很高,因此鸵鸟策略这种不采取任务措施的方案会获得更高的性能。
      • 当发生死锁时不会对用户造成多大影响,或发生死锁的概率很低,可以采用鸵鸟策略。
写出和分析死锁的代码 或 生产者消费者代码
  • 生产者消费者,对临界区上锁。
    比如生产者此时要产生一个产品,如果先对临界区上锁,然后检测缓冲区已满,这时就进入等待消费者消耗产品的状态,而消费者想消费产品时,必须先检测临界区是否上锁,此时临界区已经被生产者占有,这样就形成了死锁。
数据库和 Java 中如何避免死锁

内存管理
内存管理有哪四个功能?

内存分配
内存回收
地址映射()
内存保护

内存管理的两大种机制?连续 / 非连续

连续:分块儿:每个进程分个块儿,容易造成碎片

不连续:
- 分页:分层大小相等的页
- 分段:有意义的段
- 段页:每个段内不连续

分页和分段有什么区别?
  • 都是离散管理的

  • 分页的页面大小是固定的,分段不固定。

  • 分页没意义,分段有意义。

  • 分页内存利用率高,分段难以分配大的连续内存。

分页管理的快表和多级页表是干什么的?

快表:
why?

  • 为了加快逻辑地址到物理地址的转化,原来的转化过程需要访问两次内存。

  • 引入快表之后,快表里放了最近使用的页表项,快表是个 cache,根据局部性原理最近使用的页表项很可能再次被访问到,所以就会变成一次访问内存。

多级页表:
why?

  • 原来虚拟地址空间是 4GB,如果页的大小是 4KB 的话,需要 1M 个页表项来映射这么多页,一个页表项一般是 4B 大小,这样的话就需要 4MB 的内存空间来存放这些页表项,也就是大概 1K 个页来存放。

  • 引入多级页表以后,我一个一级页表项可以映射的大一点,映射 4MB 的内存,这样只需要 1K 个页表项来映射主内存,然后每个一级页表项再映射 1K 个二级页表项,每个二级页表项再映射 4KB 的内存。

  • 当我使用到哪个一级页表项时,再把对应的二级页表项 load 到内存里。

虚拟地址和物理地址?为什么要有虚拟地址?

答:why?为什么用虚拟地址?从用物理地址直接操作寄存器的后果来答。

  • 如果直接操作物理地址,用户程序可以直接访问底层物理地址,很容易破坏操作系统,造成系统崩溃。

  • 想要同时运行多个程序很难,多个程序可能对同一个物理地址进行操作,发生崩溃。

  • 所以用虚拟地址,让操作系统来管理虚拟地址到物理地址的映射,避免发生崩溃。我们在使用 C++ 的指针的时候,其实指针就是一个虚拟地址,操作系统里有一个叫 MMU 的地址转换单元会把虚拟地址转换为物理地址。

虚拟内存是干什么的?如何实现虚拟内存?

why?
为什么要有虚拟内存呢?因为传统的内存管理是一次性把所有的作业都 load 到内存里,并且一直驻留到运行结束。作业很大的时候,是没有办法一次性装入内存的。

how?

  • 但是在一段时间内只需要少部分数据就可以保证程序的正常运行。
  • 所以在程序运行的开始,只把少部分很快就要用到的程序和数据 load 到内存里,暂时用不到的部分放在外存里。
  • 如果在运行过程中发生缺页,就从外存调入要用到的页面。
  • 如果调页的时候发现内存满了,就根据一些策略把不用的页调出去。
  • 而在 os 的管理下,让程序认为自己拥有连续可用的内存,产生独享主存的错觉,这就是虚拟内存。
页面置换算法
  • 是什么
    当使用请求分页存储来管理内存时,发生缺页中断,就是要访问的页面不在内存中,这时就需要操作系统把其调入主存后再进行访问。
    而在发生缺页中断时,内存中没有空闲的页面,就必须在内存中根据一定的策略挪出一些不用的页面,可以把页面置换算法看成是淘汰机制

  • 怎么办
    FIFO:先到先出算法

LRU:Least Recently Used
最近最久未使用页面置换算法

LFU:Least frequently used
最少使用算法,把使用最少的页面淘汰掉

OPT 页面置换法,最佳页面置换:不可实现,不可预测哪个是不用的。

局部性原理?
  • 时间局部性原理:
    1.如果程序中一条指令一旦执行,不就以后该指令就很有可能再次执行

2.如果某数据被访问过,不就以后该数据很可能再次被访问。

3.原因是存在大量循环

  • 空间局部性原理:
    1.一旦程序访问了某个存储单元,不久后,其附近的存储单元也将被访问,
    2.即在一段时间内程序所访问的地址通常集中在一个范围内。

3.因为指令通常时顺序存放顺序执行的。

静态链接与动态链接

???

Linux

文件系统
  • 从文件系统的角度分析数据恢复原理
硬链接与软链接
  • 软相当于快捷方式

  • 硬链接相当于源文件的小名(文件名为大名)

  • 建软链接命令
    ln -s <被链接源文件> <链接名>:
    没有 -s 建的是一个 硬链接

  • 建链接注意事项
    0.源文件要使用绝对路径,相对路径在移动链接文件后不能再正常使用

1.Linux 中,文件名 和 文件的数据 是分开存储的,保存在磁盘的不同位置

2.软链接的文件名,其保存的数据为链接到源文件(文件名)的完整路径,因此将源文件删除无法再访问其中的数据

3.硬链接相当于源文件的小名(文件名为大名),因此即使大名没了也可以通过小名访问到存储在存储在磁盘中另外一个位置的文件数据,要完整得删除一个文件不仅要删除源文件,还要删除硬链接

进程管理
  • 能够使用常用的命令,比如 cat 文件内容查看、find 搜索文件,以及 cut、sort 等管线命令。了解 grep 和 awk 的作用。
僵尸进程与孤儿进程
父子进程

一般情况下,子进程是由父进程创建,而子进程和父进程的退出是无顺序的

孤儿进程

一个父进程退出,而它的一个或多个子进程还在运行,那么这些子进程将成为孤儿进程。

孤儿进程将被 init 进程(进程号为 1)所收养,并由 init 进程对它们完成状态收集工作。

由于孤儿进程会被 init 进程收养,所以孤儿进程不会对系统造成危害。

僵尸进程

一个子进程的进程描述符在子进程退出时不会释放,只有当父进程通过wait() 获取了子进程信息后才会释放。

如果子进程退出,而父进程并没有调用wait() 或 waitpid(),那么子进程的进程描述符仍然保存在系统中,这种进程称之为僵尸进程。

系统所能使用的进程号是有限的,如果产生大量僵尸进程,将因为没有可用的进程号而导致系统不能产生新的进程。

要消灭系统中大量的僵尸进程,只需要将其父进程杀死,此时僵尸进程就会变成孤儿

  • SIGCHLD

当一个子进程改变了它的状态时(停止运行,继续运行或者退出),有两件事会发生在父进程中:
1.得到 SIGCHLD 信号;
2.waitpid()或wait()调用会返回

其中子进程发送的 SIGCHLD 信号包含了子进程的信息,比如进程ID、进程状态、进程使用CPU的时间等。

在子进程退出时,它的进程描述符不会立即释放,这是为了让父进程得到子进程信息,父进程通过 wait() 和 waitpid() 来获得一个已经退出的子进程的信息

  • wait()

父进程调用 wait() 会一直阻塞,直到收到一个子进程退出的 SIGCHLD 信号,之后 wait() 函数会销毁子进程并返回。

  • waitpid()

作用和 wait() 完全相同,但是多了两个可由用户控制的参数pid和options

常用命令
  • 能够使用常用的命令,比如 cat 文件内容查看、find 搜索文件,以及 cut、sort 等管线命令。了解 grep 和 awk 的作用。
目录/文件操作命令
  1. 目录切换
    cd usr: 切换到该目录下 usr 目录
    cd …(或cd…/):切换到上一层目录
    cd /: 切换到系统根目录
    cd - :最近两次工作目录来回切
    cd 空/~:切回当前目录的主目录

  2. 目录(文件)的增删改查

    mkdir [-p] <目录名>:
    增加目录,p表示递归建立

touch <文件名>: 文件的创建


删除有很多命令,只需记住一个:
rm [-rf] <文件或目录> :
f表强制,r表递归删除
举例:根目录下 rm -rf * ,重装系统


mv <目录/文件/压缩包名> <新名字>:对文件/目录/压缩包 进行重命名。

mv <目录/文件/压缩包名> <新位置>: 移动位置。

cp [-r] <目录/文件/压缩包名> <新位置/新位置&新名字>: -r 代表递归拷贝,位置后面加上/名字时表重命名

vim <文件名>:vim 编辑器是 Linux 中的强大组件,是 vi 编辑器的加强版,相当于windows下的记事本,使用步骤: vim 文件------>进入文件----->命令模式------>按i/a/o进入编辑模式----->编辑文件 ------->按Esc回到命令模式----->输入:wq / q! (:表示进入底行模式,wq 代表写入内容并退出,即保存;q!代表强制退出不保存)。


tree [目录名]:以树状图格式显示当前目录结构

ls [-lha] [x*]:l表示以列表形式展现,h表以人性化方式显示文件大小,a表显示所有(包括隐藏文件),可与通配符搭配使用,x* 表查找以x开头的文件

cat [文件名]:用来查看文件内容、创建文件,一次显示所有的内容

more [文件名]:用于分屏显示文件内容,每次只显示一页内容

grep 搜索文本 搜索范围 [-nvi]:
显示行号,不存在此文本的行,忽略大小写

find <目录> <参数>
目录省略的话表当前目录
① 列出当前目录及子目录下所有文件和文件夹:
find .
② 在 /home 目录下查找以 .txt 结尾的文件名:
find /home -name “*.txt”

  1. 打包和压缩
    压缩
    tar -zcvf <打包压缩后的文件名> <要打包压缩的文件>:
    z:调用 gzip 压缩命令进行压缩
    c:打包文件
    v:显示运行过程
    f:指定文件名

解压
tar -xvf <压缩文件名> [-C 目标路径]
x:代表解压
v:显示运行过程
f:指定文件名

  1. 其它
    重定向 >和 >>
    将本应显示在终端上的内容 输出/追加 到指定文件中,> 表覆盖,>>表追加
    eg:ls -lha >a,再执行cat a,则显示ls -lha的内容

管道 |
将一个命令的输出通过管道 做为另一个的输入
eg:
ls -lha ~|more:
分页显示ls内容
ls -lha ~|grep do:
搜索ls内容中的do关键字

进程等系统信息命令

文档:14. Linux 进程管理.note
链接:http://note.youdao.com/noteshare?id=8d34aad067847a3430a7534a6f91e408&sub=8C5F90176E1142A385F7E714F699BB23

  • 进程简介
    1.在 linux 中,每一个程序都是有自己的一个进程,每一个进程都有一个 id 号!
    2.每一个进程呢,都会有一个父进程!
    3.进程可以有两种存在方式:前台!后台运行!
    4.一般的话服务都是后台运行的,基本的程序都是前台运行的!

  • 常用命名
    ps -aux:
    查看进程的详细状况
    pstree -pu:目录树结构来看父子关系
    -p 显示父id
    -u 显示用户组
    top:
    动态显示运行中的进程并且排序
    kill [-9] :
    进程代号终止指定代号的进程,-9表示强行终止

  • ps

    • aux
      • l
      • ef
  • pstree

    • apu
  • top

    • d 2
  • netstat

    • anp | grep port
远程管理命令
  • 关机/重启
    shutdown [-r] [时间]:
    -r表重新启动,时间不设置默认1min

  • 查看或配置网卡信息
    ifconfig:查看计算机当前网卡配置信息
    ping ip地址:检测到目标ip地址的连接是否正常

  • 远程登录
    简介:
    SSH 是一种加密的网络传输协议,通过SSH客户端可以远程连接到运行了SSH服务器的远程机器上

ssh [-p port] user@remote
user 是在远程机器上的用户名,如果不指定的话默认为当前用户
remote 是远程机器的地址,可以是 IP域名,或者是 别名
portSSH Server 监听的端口,如果不指定,就为默认值 22

  • 权限管理
    chmod -r <文件名 / 目录名>:修改文件的权限,xyz 分别代表文件所有者的权限、文件所有者所属组的权限、其他用户的权限。
权限管理命令
  • 权限修改
    chmod +/-rwx 文件名|目录名:
    一次性修改拥有者/权限

  • 组管理 终端命令
    groupadd <组名>:添加组
    groupdel <组名>:删除组
    cat /etc/group:确认组信息,组信息会保存在 /etc/group 文件中
    chgrp -R 组名 文件/目录名:递归修改文件/目录的所属组

  • 用户管理 终端命令
    useradd -m -g 组 新建用户名:添新用户,-m 自动建立用户家目录,-g 指定用户所在的组,否则会建立一个和同名的组

userdel -r 用户名:删除用户,-r选项会自动删除用户家目录

passwd 用户名:设置用户密码

cat /etc/passwd | grep 用户名:确认用户信息新建用户后,用户信息会保存在 /etc/passwd 文件中

usermod -g 组:用户名修改用户的主组(passwd 中的 GID)

计网

资料

  • 《计算机网络 自顶向下方法》
  • 《计算机网络》
  • 《TCP/IP 详解 卷 1:协议》
  • 《UNIX 网络编程 卷 1:套接字联网 API》
  • 《Linux 多线程服务端编程》
  • 《图解 HTTP》

网络基础

OSI 体系
常见的计算机网络体系结构
  1. OSI的七层体系结构
    -(法律上的国际标准)
    – 从下往上依次为物理层、数据链路层、网络层、运输层、会话层、表示层、应用层

  2. TCP/IP的四层体系结构
    -(事实上的国际标准)
    – 从下往上依次为网络接口层、网际层、运输层、应用层
    – 网络接口层并没有规定什么具体的内容,目的是为了可以互连各种各样的网络接口。
    – 网际层的核心协议是IP协议,它可以互连各种不同的网络接口,并给运输层的TCP协议和UDP协议提供服务。
    – 运输层的TCP协议在享受IP协议提供的服务后,可向应用层的相应协议(例如,HTTP,SMTP等)提供可靠传输的服务。
    – 运输层的UDP协议在享受IP协议提供的服务后,可向应用层的相应协议(例如,DNS,RTP等)提供不可靠传输的服务。
    – 因此,使用IP协议可以互连不同的网络接口(IP over everything);IP协议可以为各种网络应用提供服务(Everything over IP)。

  3. 适用教学的五层协议的原理体系结构
    – 由于TCP/IP为了互连各种网络接口,其网络接口层并没有什么具体内容,这对于我们学习计算机网络原理来说,不够完整。
    – 因此,结合OSI和TCP/IP的优点,提出一种五层协议的原理体系结构,以适用于教学。
    – 五层协议的原理体系结构从下往上依次为物理层、数据链路层、网络层、运输层、应用层。

OSI 七层、TCPIP 五层、各层之间如何提供服务?

一般指的是 TCP/IP 从上往下答!

  1. 横向看:为哪两个对象间提供服务?应用程序?进程?主机?主机?传输媒体?

  2. 纵向看:为上层提供什么服务?在这一层就把这个数据的形式说出来了。

  3. 有什么协议?

应用层:

-为应用程序间提供通信和交互的协议。
-DNS、HTTP、SMTP、FTP等。
-数据称为:报文

运输层:

-为两台主机中的进程间提供通用的数据传输服务。
-为上层提供服务:把应用层的报文封装成 TCP报文段UDP用户数据报进行传送。
-TCP、UDP

网络层

-为多个网络上的两台主机提供通信服务。
-为上层提供服务:把运输层产生的报文段或用户数据报封装成IP数据报进行传送。
-IP、ARP、ICMP、IGMP

数据链路层

-为单段链路上的两台主机提供通信服务。
-为上层提供服务:把IP数据报封装成,在链路上进行传递。
-CSMA PPP

物理层:

-解决使用何种信号来传输比特的问题
-为上层提供服务:尽可能为数据链路层屏蔽传输媒体和通信手段的差异,把帧拆分成比特流在传输媒介上进行传输。
-时分复用、频分、码分多址、波分复用等!

主机的浏览器如何与Web服务器进行通信?
  1. 总结
    主机和Web服务器之间基于网络的通信,实际上是主机中的浏览器应用进程与Web服务器中的Web服务器应用进程之间基于网络的通信

  2. 发送方发送
    -应用层按照HTTP协议的规定构建一个HTTP请求报文
    -运输层给HTTP请求报文添加一个TCP首部,使之成为TCP报文段
    -网络层给TCP报文段添加一个IP首部,使之成为IP数据报
    -数据链路层给IP数据报添加一个首部和一个尾部,使之成为帧
    -物理层先将帧看做是比特流,前面添加前导码,后将装有前导码的比特流变换成相应的信号发送给传输媒体

  • 注意:前导码使接收方的时钟同步
    -信号通过传输媒体到达路由器
  1. 路由器转发
    -物理层将信号变为比特流,然后去掉前导码后,将其交付给数据链路层
    -数据链路层将帧的首部和尾部去掉后,将其交付给网络层,这实际交付的是IP数据报
    -网络层解析IP数据报的首部,从中提取目的网络地址
    -提取目的网络地址后查找自身路由表。确定转发端口,以便进行转发
    -网络层将IP数据报交付给数据链路层
    -数据链路层给IP数据报添加一个首部和一个尾部,使之成为帧,传给物理层
    -物理层同上

  2. 接收方接收
    发送的逆过程
    -物理层将信号变换为比特流,然后去掉前导码后成为帧,交付给数据链路层
    -数据链路层将帧的首部和尾部去掉后成为IP数据报,将其交付给网络层
    -网络层将IP数据报的首部去掉后成为TCP报文段,将其交付给运输层
    -运输层将TCP报文段的首部去掉后成为HTTP请求报文,将其交付给应用层
    -应用层对HTTP请求报文进行解析,然后给主机发回响应报文

为何七层->五层
  1. 为何要分层
    1.1 计算机网络是个非常复杂的系统,早在阿帕网(全球互联网的始祖)设计的时候就提出来分层的概念
    1.2 “分层”可将庞大而复杂的问题,转化为若干较小的局部问题
  2. 7->5
    2.1 七层理论完整,但既复杂又不实用
    2.2 商用,现在基本所有的架构用的都是五层结构
以太网
网络:

网络(Network)由若干结点(Node)和连接这些结点的链路(Link)组成。

互连网(互联网):

多个网络通过路由器互连起来,这样就构成了一个覆盖范围更大的网络,即互连网(互联网)。因此,互联网又称为“网络的网络(Network of Networks)”。

因特网:

因特网(Internet)是世界上最大的互连网络(用户数以亿计,互连的网络数以百万计)。

局域网
  • 局域网是一种典型的广播信道,主要特点是网络为一个单位所拥有,且地理范围和站点数目均有限。
  • 主要有以太网、令牌环网、FDDI 和 ATM 等局域网技术,目前以太网占领着有线局域网市场。
以太网

–以太网(Ethernet)是一种计算机局域网技术。IEEE组织制定其技术标准
–以太网使用交换机替代了集线器,交换机是一种链路层设备,它不会发生碰撞,能根据 MAC 地址进行存储转发。

internet与Internet的区别

– 前者泛指多个计算机网络互连而成的网络。在这些网络之间的通信协议可以是任意的
– 后者是一个专用名词,它指当前全球最大的、开放的、由众多网络互连而成的特定计算机网络,它采用TCP/IP协议族作为通信的规则,其前身是美国的ARPANET
– 任意把几个计算机网络互连起来(不管采用什么协议),并能够相互通信,这样构成的是一个互连网(internet) ,而不是因特网(Internet)。 因为其只用TCP/IP协议

网络硬件设备
  • 集线器、交换机、路由器的作用,以及所属的网络层。
    https://www.cnblogs.com/gtea/p/12713766.html

集线器

–工作在物理层

–信号在线路中传播会进行衰减,集线器的作用就是对信号进行再生放大,从而扩大了网络的传输距离

交换机

–工作在数据链路层
–交换机转发的消息叫做
–集线器的信道利用率低 ,如果同时收到两个不同接口的帧,那么就发生了碰撞
–交换机有很多个端口,每个端口都能够连接一台计算机
–交换机具有自学习能力,学习的是交换表的内容,交换表中存储着 MAC 地址到接口的映射。

路由器

工作在网络层
路由器转发的消息叫做IP数据报。
交换机只能转发局域网内的帧。如果网络A的主机想要发消息给网络B的主机就需要路由器了。

数据链路层
基本问题
  1. 封装成帧
  2. 透明传输
  3. 差错检测
信道分类
  1. 广播信道
    –一对多通信,一个节点发送的数据能够被广播信道上所有的节点接收到。

–所有的节点都在同一个广播信道上发送数据,因此需要有专门的控制方法进行协调,避免发生冲突(冲突也叫碰撞)。

–主要有两种控制方法进行协调,一个是使用信道复用技术,一是使用 CSMA/CD 协议

  1. 点对点信道
    – 一对一通信。

–因为不会发生碰撞,因此也比较简单,使用 PPP 协议进行控制。

信道复用技术

频分,时分,统计时分,波分,码分

CSMA/CD 协议

–Carrier Sense Multiple Access with Collision Detection
多点接入 :说明这是总线型网络,许多主机以多点的方式连接到总线上。
载波监听 :每个主机都必须不停地监听信道。在发送前,如果监听到信道正在使用,就必须等待。
碰撞检测 :在发送中,如果监听到信道已有其它主机正在发送数据,就表示发生了碰撞。虽然每个主机在发送数据之前都已经监听到信道为空闲,但是由于电磁波的传播时延的存在,还是有可能会发生碰撞。

PPP 协议

互联网用户通常需要连接到某个 ISP 之后才能接入到互联网,PPP 协议是用户计算机和 ISP 进行通信时所使用的数据链路层协议。

MAC 地址

– MAC 地址是链路层地址,长度为 6 字节(48 位),用于唯一标识网络适配器(网卡)。
– 一台主机拥有多少个网络适配器就有多少个 MAC 地址。例如笔记本电脑普遍存在无线网络适配器和有线网络适配器,因此就有两个 MAC 地址。

虚拟局域网
  • 出现原因:

所有站点都属于同一个广域网
巨大的广播域会带带来广播风暴,难以管理和维护以及一些潜在的安全问题

–虚拟局域网可以建立与物理位置无关的逻辑组,而这些网段具有某些共同的需求。

–只有在同一个虚拟局域网中的成员才会收到链路层广播信息。

–每一个 VLAN 的帧都有一个明确的标识符,指明发送这个帧的计算机是属于哪一个 VLAN

网络层
可靠传输与不可靠传输
  • 可靠传输

网络层对以下的分组丢失分组失序分组重复的传输错误采取措施,使得接收方能正确接受发送方发送的数据,就是可靠传输,

  • 不可靠传输

反之,如果什么措施也不采取,则是不可靠传输

IP 数据报
  • 结构
    – 一个 IP 数据报由首部和数据两部分组成。
    – 首部的前一部分是固定长度,共 20 字节,是所有 IP 数据报必须具有的。
    –在首部的固定部分的后面是一些可选字段,其长度是可变的。

  • 知道首部放什么信息
    版本号:放ipv4还是ipv6
    生存时间TTL,防止无法交付的数据报在互联网中不断兜圈子。以路由器跳数为单位,当 TTL 为 0 时就丢弃数据报
    协议:本次的数据上交给哪个协议进行处理 TCP UDP ICMP
    首部长度 : 占 4 位,因此最大值为 15。值为 1 表示的是 1 个 32 位字的长度,也就是 4 字节。因为固定部分长度为 20 字节,因此该值最小为 5。如果可选字段的长度不是 4 字节的整数倍,就用尾部的填充部分来填充。

IP 地址
  • IP地址的定义
    IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。共32位

  • 几种类型?
    IP 地址的编址方式经历了三个历史阶段
    分类
    IP地址 = {< 网络号 >,< 主机号 >}
    由两部分组成,网络号和主机号,其中不同分类具有不同的网络号长度,并且是固定的。
    子网划分
    – {<网络号>,<子网号>,<主机号>}
    通过在主机号字段中拿一部分作为子网号,把两级 IP 地址划分为三级 IP 地址
    无分类
    IP地址= {<网络前缀号>,<主机号>}

  • 划分子网的原因
    –IP地址空间的利用率有时很低,可以从主机号部分借一部分比特作为子网号
    –为新增网络申请新的网络号会增加其他路由器中路由表记录的数量,需要等待时间和花费更多的费用
    – 路由器可以把其他子网看成一个整体来进行计算。对于目的地在其他子网的数据包,路由器只需要让数据包到达那个子网即可,而剩下的工作就由子网内部解决了

  • 子网掩码是干什么的?
    –32比特的子网掩码可以表明分类IP地址的主机号部分被借用了几个比特作为子网号
    –使用连续的比特1来对应网络号和子网号,连续的比特0来对应主机号
    –一个B类地址的默认子网掩码为 255.255.0.0,如果 B 类地址的子网占两个比特,那么子网掩码为 11111111 11111111 11000000 00000000,也就是 255.255.192.0
    –(IP 地址) AND (子网掩码) = 网络地址

  • 如何判断两个IP地址属于同一个子网?
    与下面问题等同:在IP数据报的发送与转发过程中,源主机如何知道目的主机是否与自己在同一个网络中,是直接交付,还是间接交付?

–两个IP同时和源地址的子网掩码进行相与,然后判断是否相等
–相等就在同一个网络,属于直接交付
–不相同,就不在同一个网络中,属于间接交付,传输给主机所在网络的默认网关由其帮忙转发

默认网关
用户为了让本网络中的主机能和其他网络中的主机进行通信,就必须给其指定本网络的一个路由器的接口,由该路由器帮忙进行转发,所指定的路由器该接口的IP地址,也被称为默认网关

ARP 协议
  • 为何存在这个协议?
    网络层实现主机之间的通信,而链路层实现具体每段链路之间的通信。因此在通信过程中,IP数据报的源地址和目的地址始终不变,而MAC地址随着链路的改变而改变。
  • 作用:
    由目的IP地址获取MAC地址
    (在以太网环境中,数据的传输所依赖的是MAC地址而非IP地址)
  • 工作流程
    • 在一个子网内
      主机 A 想往主机 B 发信息时,会先在自己的 ARP 缓存表中查找是否有对应 主机B IP 地址的 MAC 地址,如果没有,则发送一次 广播 ARP 请求分组,主机 B 和主机 A 在同一个局域网,则主机 B 收到 ARP 请求分组时,会回发一个 ARP 响应分组,里面带有自己的 MAC 地址,随后主机 A 向其ARP 缓存表中写入主机 B 的 IP 地址到 MAC 地址的映射

    • 不在一个子网内
      主机 A 会先把子网掩码和目的 IP 进行相与,发现不一个网段,下一跳就直接找默认网关就可以了,
      如果 ARP 缓存里没有默认网关的 MAC 地址,也需要先发一个 ARP 请求分组,等默认网关给他回一个 ARP 响应分组后,就拿到了默认网关的 MAC 地址。
      路由器会帮他广播,找到主机 B 的 MAC 地址,然后主机 B 会回答一个 ARP 响应分组给 主机 A 然后就拿到了!

MAC与IP并存
  1. MAC地址必不可少
    链路层地址,用于唯一标识网络适配器(网卡)

  2. 为何需要IP地址?
    – 只用MAC地址太慢且不可能实现!
    只用MAC地址的话,路由器需要记住每
    个MAC地址所在的子网是哪一个,而世界上有2的48次个MAC地址,这就意味着即使我们给每个MAC地址只留1字节的储存空间,每个路由器也需要256 TB的内存!这显然是不可能实现的。

– IP相当于现住地址!
IP地址是和地域相关的。对于位于同一个子网上的设备,我们给他们分配的IP地址前缀都是一样的。这个前缀就像邮政编码一样。路由器通过其可以识别设备在哪个子网上。现在,路由器只需要记住每个子网的位置,大大减少了路由器所需要的内存。

  1. 有了IP地址能不能去掉MAC地址?
    – 学生四处求学不断修改快递地址

IP地址是要设备上线以后,才能根据他进入了哪个子网来分配的,在设备还没有IP地址的时候(或者分配IP地址的过程中),我们还需要用MAC地址来区分不同的设备。

  1. 总结:都不能少!
    总之,MAC地址就像自己的ID号,而IP地址就像带着邮政编码的住址,各有各的用途。缺一不可。
ICMP 协议
功能:

是网络层的协议,主要作用是更有效得转发IP数据报和提高交付成功的机会,让网络中的节点能够报告差错情况异常情况

结构:

本质还是个 IP 数据报,IP数据报的数据段用 ICMP 报文代替了而已。

报文分类(差错报文和询问报文)
  • 差错报文的四种类型

    • 终点不可达
      当路由器和主机没办法交付数据,就向源头发送一个终点不可达报文。

      • 时间超过( traceRoute)
        如果路由器发现数据的 TTL 为 0,那么丢弃该数据,并向源头发送一个时间超过报文。可以用于 traceRoute

      • 参数问题
        若路由器或主机发现IP数据报的首部有错误,就发给源头一个参数问题报文。

      • 改变路由
        路由器给主机发送这个报文,告诉他有更好的路径。

  • 询问报文的两种类型

    • 回声请求或回答报文(ping)
      主机或路由器向一个特定的主机发送回声(echo)请求报文,目的主机收到后回一个回答报文。

      • 时间戳请求报文
        向服务器请求一个时间戳,用来时钟同步和测时间。
  • 两种应用:

  1. ping 命令
    – 来测试两台主机之间的连通性
    – 原理:通过向目的主机发送 ICMP Echo 请求报文,目的主机收到之后会发送 Echo 回答报文。Ping 会根据时间和成功响应的次数估算出数据包往返时间以及丢包率
    – 再具体点讲就是发送ICMP报文必须先知道目的主机的MAC地址,这就用到了ARP协议,分是否在同一个子网的情况讨论

只会问Linux的ping命令底层如何实现

  1. 跟踪路由(traceroute)
    – 来测试IP数据报从源主机到目的主机需要经过哪些路由器
    – 原理:
    1.源主机向目的主机发送一连串TTL递增的 IP 数据报,如 TTL 为 1 的数据报,经过第一个路由器就会给源主机发一个时间超过差错报告报文。重复步骤上述步骤
    2.直到最后一个数据报刚刚到达目的主机,主机不转发数据报,也不把 TTL 值减 1,发送的 IP 数据报封装的是无法交付的 UDP 用户数据报,并由目的主机发送终点不可达差错报告报文
    3.源主机知道了到达目的主机所经过的路由器 IP 地址以及到达每个路由器的往返时间
VPN与NAT
  • VPN出现得原因
    IP 地址的紧缺,一个机构能够申请到的IP地址数往往远小于本机构所拥有的主机数
    互联网并不很安全,一个机构内也并不需要把所有的主机接入到外部的互联网
    –假定在一个机构内部的计算机通信也是采用 TCP/IP 协议,那么从原则上讲,对于这些仅在机构内部使用的计算机就可以由本机构自行分配其 IP 地址(专用地址)。

  • NAT的功能
    – 专用网内部的主机使用本地 IP 地址,并又想和互联网上的主机通信时,可以使用 NAT 来将本地 IP 转换为全球 IP。

  • NAPT
    NAT的局限性:NAT 将本地 IP 和全球 IP 一一对应,这种方式下拥有 n 个全球 IP 地址的专用网内最多只可以同时有 n 台主机接入互联网。
    –NAT 转换表把传输层的端口号也用上了,使得多个专用网内部的主机共用一个全球 IP 地址。

路由器相关
  • 组成
    1.功能上
    路由选择和分组转发。
    2.实际结构
    交换结构、一组输入端口 一组输出端口。

  • 路由选择协议
    [具体见标题栏链接]
    1.域内路由选择:

RIP:

OSPF

2.域间路由选择:

BGP

传输层
UDP 和 TCP 区别?
分点
  1. 有无连接?
    TCP

  2. 拥塞控制?
    TCP

  3. n对n?
    TCP 1V1

  4. 是否拆分数据?传输数据大小?

总结

UDP 协议是面向无连接的,尽最大可能交付,没有拥塞控制,直接把应用层的报文拿下来,然后加个 UDP 首部,就算结束了。支持一对一,一对多,多对一,多对多的交互通信。

TCP 协议是面向连接的,提供可靠的交付,有流量控制、拥塞控制、超时重传等保证可靠连接的一些机制。把应用层传下来的数据看成字节流,拆分成最适合传输的大小,封装TCP报文段来传输。每一条 TCP 连接使能是一对一的。

UDP 和 TCP 分别用于什么场景?
总答

UDP:音视频实时通话
TCP:文件传输 邮件传输

细答

1.实时音视频是可以而且应该用 UDP 的,一方面因为它常常涉及到网络穿透,另外一方面它不需要重传。——我需要实时的看到你的图像跟声音,至于中间丢一帧什么的完全不重要。而为了重传往往会造成延迟与不同步,考虑一下,某一帧因为重传,导致 0.5 秒以后才到,那么整个音视频就延迟了0.5秒。
考虑一下接收方视频,如果使用 TCP 丢包重传导致视频的中间延迟了0.5秒,那么后续的同化全都会比发送方延迟 0.5 秒。这种延迟是累加的,随着持续丢帧,延迟会越来越大,达到数秒,甚至分钟级,这会严重影响即时性比较强的音视频通话的用户体验。
2.如果出现卡顿掉帧,就是 UDP 的结果,如果是 TCP 协议,那么是直接视频黑屏,然后又重新有了,不会出现卡顿掉帧,因为 TCP 是面向连接的,他的确认重传机制保证了他收到的数据是可靠的,连续的!

让你设计一个可靠的 UDP 你如何设计?
  1. 数据完整性 –>
    加上 CRC 验证字段

  2. 乱序到达 –>
    加上一个数据包序列号 SEQ

  3. 丢包 –>
    需要确认和重传机制,就是和 Tcp 类似的 Ack 机制

TCP 连接,三次握手,四次挥手、为什么三次握手四次挥手、为什么等待2MSL时间?
  • 理解三次握手以及四次挥手具体过程

  • 三次握手的原因

  • 四次挥手原因

  • TIME_WAIT 的作用。

TCP 连接,三次握手,四次挥手的客户端服务器的状态演变
  • 三次握手:

    • 客户端:SYN_SEND、ESTABLISHED
      • 服务器:LISTEN、SYN_RCVD、ESTABLISHED
  • 四次挥手

    • 客户端:FIN_WAIT_1、FIN_WAIT_2、TIME_WAIT、CLOSE
      • 服务端:CLOSE_WAIT、LAST_ACK

只需要记住三次握手期间的半连接状态,和四次挥手期间的客户端状态演变即可

TCP 连接,三次握手期间丢包分别会发生什么事情?SYN FLOOD 是什么意思?

https://blog.csdn.net/plokmju88/article/details/103884145

  • 第一次客户端发的 SYN 丢了:
    • 客户端迟迟接不到响应,超时重传。
  • 第二次服务端发的 SYN 和 ACK 丢了
    • 客户端迟迟接不到响应,超时重传
  • 第三次客户端发的 ACK 丢了?
    • 因为第三次发完 ACK 之后,随时接下来会继续往服务端发数据,我看过一篇博客里写的是发数据时会带上 ACK,所以客户端响应的 ACK 包丢了,服务器也能够通过之后的包来建立连接。
  • 故意不发送第三次 ACK 呢?
    • 洪水攻击,服务器在等待第三次握手时是处于半连接状态(SYN_RCVD),也是需要耗费资源的,如果有攻击者故意不发送第三次 ACK,让大量连接处于半连接状态,那么会把服务器资源耗尽,洪水攻击的目的就达到了。
TCP 可靠传输
  • 设计可靠 UDP 协议?
    三个角度来思考

  • 基本的控制两条

    • 切分:拆分成适合传输的块儿
      • 排序:给发送的每一个块儿编号,接收端按块儿排序!
  • 发送端控制

    • 超时重传两公式
      • 流量控制 ARQ 协议
      • 拥塞控制 四个算法
  • 接收端控制

    • 校验和
      • 丢弃重复
TCP 为什么要有心跳检测?具体怎么操作的?

https://blog.csdn.net/m0_47984232/article/details/108253344

应用层
DNS
  • 定义
    域名解析协议,提供了域名和 IP 地址之间相互转换的服务。

  • 传输层用的什么协议?为什么?
    1.可以使用 UDP 或 TCP,但一般用 UDP 因为,只要一个请求,一个应答就 ok 了
    2.UDP 协议传输的内容不能超过 512 字节,一般上客户端向 DNS 服务器查域名,返回的内容都不超过 512 字节,用 UDP 就够了。
    3.区域传送用 TCP
    –DNS 是分布式数据库,区域传送,就是 主 DNS 服务器上的数据有变化了,需要向下传送变化的那部分数据时,因为数据必然很大,并且要保证传输可靠,所以不能用 UDP。

  • DNS 默认端口号是什么
    53

DHCP 协议

知道是干什么的就行了

  • 为用户提供即插即用的联网方式,不需要手动配置IP地址信息。
  • 自动为用户配置 IP、子网掩码、网关
其他协议
  • FTP
    两台计算机间的文件传输协议

  • SMTP、POP3、IMAP

电子邮件系统

  • 由三部分组成
    1.用户代理
    电子邮件客服端软件

2.邮件服务器

3.邮件协议
发送协议(SMTP)
读取协议(POP3和IMAP)

  • SMTP

  • POP3
    1.用户只能以下载并删除方式下载并保留方式从邮件服务器下载邮件到用户方计算机。
    2.不允许用户在邮件服务器上管理自己的邮件(创建文件夹,进行分类等)

  • IMAP
    1.客户端和服务器上的邮件保持同步,如果不手动删除邮件,那么服务器上的邮件也不会被删除。
    2.用户可以在计算机中操控邮件服务器上的邮件

综合问题
敲击 URL 后发生了什么

http://www.scr2019.top/blog/12

HTTP

  • 概念你都说不出来?注意,协议就是为了传信息的,和OSI七层架构一样,只需要把横向看的概念说出来就ok了。

具体就是:HTTP协议是用于从 Web 服务器传输 html 到本地浏览器的传送协议

URI 和 URL 概念

URI 统一资源标识符,相当于身份证

URL 统一资源定位符,相当于住址

URI 是URL的子集,URL 在 URI 的基础上增加了定位能力

URI 除了包含 URL,还包含 URN(统一资源名称)

请求报文、响应报文头都有什么字段?
请求报文:
  • 请求行 request line
    请求方法、URL、协议版本
  • 请求头 request header
    每个首部都有名称,以及对应的值
  • 请求体 request body
响应报文:
  • 状态行 response line
    协议版本、状态码以及描述
    如:200 ok
  • 响应头 response header
  • 响应体 response body
首部字段种类
  • 通用首部字段
  • 请求首部字段
  • 响应首部字段
  • 实体首部字段

直接引出下面一群知识点

  • 请求报文:cookie信息、请求方式get还是post

  • 响应报文:响应状态码、Cookie信息

GET 与 POST 区别
  1. 作用
    get用于拿数据 post用于写数据
  2. 参数
    get会把参数直接带在url后,而post会放在data里。
  3. 长度限制
    get有最大数据长度限制(视浏览器而定),而 post 没有最大数据长度限制。
  4. 发送data方式
    get会把 header 和 data 一起发送出去,而 post 会先发 header 收到 100 响应状态码之后再发 data
  5. 安全与幂等性
    get 是幂等的,post 不是幂等的。
    幂等是指对同一个URL的多个请求应该返回同样的结果,所有的安全方法也都是幂等的
HTTP 状态码
  • 100 continue:

    • 目前为止都很正常,客户端可以继续发送请求或者忽略这个响应
      –举个例子:post请求会先发headers,得到100响应状态码之后,再发data
  • 200 成功

    • 200 ok
  • 3xx 重定向

    • 301 M P 永久重定向:
      请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替
      • 302 found 临时重定向
        与301类似。但资源只是临时被移动。客户端应继续使用原有URI
  • 4xx 是客户端请求错误

    • 400 bad request 请求报文中存在语法错误
      • 403 f 请求被拒绝
      • 404 n f资源不存在
  • 5xx 是服务器错误

    • 500 Internal server error 服务器在执行请求时发生错误
    • 503 service unavailable 服务器处于超负荷或正在停机维护状态,现在无法处理请求

注意:除了3XX,其它都是从00开始的

转发和重定向区别?
本质区别:

转发是服务器行为,
重定向是客户端行为。

请求转发特点:
  1. 浏览器只发出一次请求,收到一次响应。
  2. 请求所转发到的资源中可以直接获取到请求中所携带的数据
  3. 浏览器地址栏显示的为用户所提交的请求路径,不会改变
  4. 只能跳转到当前应用的资源中
重定向特点:
  1. 浏览器发出至少两次请求,接收到至少两次响应。
  2. 重定向到的资源不能直接获取到用户提交请求中所携带的数据。
  3. 浏览器地址栏显示的为重定向的请求路径,而非用户提交请求的路径。也正因如此,重定向的一个很重要的作用是,防止表单的重复提交(恶意刷新页面,每刷新一次,就重新提交一次)
  4. 重定向不仅可以跳转到当前应用的其它资源,也可以跳转到其它应用中的资源。
如何选择

一般选转发,重定向只有两个应用主要应用场景
1.需要跳转到其它应用
2.提交表单页面,防止表单重复提交(恶意刷新页面,每刷新一次,就重新提交一次)

Cookie 和 Session
  1. cookie:
    what:cookie 是保存在客户端浏览器里的一种信息载体。
    why:用来保存一些站点的用户数据,这样能够为用户定制一些功能,比如免登陆功能。
    how:服务器发送的响应报文的首部有一个 set-cookie 字段,客户端在拿到这个响应后把这个字段的内容保存到浏览器中。在客户端再次发送请求同类资源时,就会把 cookie 一起携带在请求中,发送到服务端。

  2. session
    what:服务器会给每个浏览器创建一个 session 对象,保存在服务器里。
    why:存储在浏览器的 cookie 不安全,可能会有一些 js 脚本能拿到 cookie 的信息,所以存储在服务器更加安全一些。
    how:使用 session 维护用户登陆状态如下
    用户登陆时,把用户名密码表单,放入 http 请求报文中。
    服务器收到后,为其创建一个 session,并创建一个名为 sessionID 的 cookie,sessionID 就映射了服务器里的 session。
    客户端收到这个 cookie 后,将其保存起来,把 sessionID 保存在 cookie 里。
    客户端之后对同一个服务器进行请求时,会把 cookie 也带上去,服务器收到之后提取出 sessionID,从中读取出用户信息。

  3. 区别
    1.cookie 存放在客户端,session 存放在服务器端故更安全
    2.cookie以键值对的形式存在,可以用来做用户认证存储上限一般为4K
    session中的键值对不在一起:
    key值是随机产生的字符串,value值是session的内容,依赖于cookie将每个用户对应的key值保存到浏览器中; session没有具体的大小限制,可以存储的数据量比cookie大

  4. 其他临场发挥:
    生命周期:都是可以设置的
    作用域:都是可以设置的

禁用 Cookie 还能用 Session 吗?

URL 重写技术,把 sessionID 直接写到 URL 里传上去就可以了。

长短连接、流水线(Http1.0与1.1)

短连接:访问一个图很多的网站,如果对每个图建个TCP连接,会耗费大量资源,
长连接:建立一个长时间的连接,在这个连接过程中我可以不断的发请求。
流水线:默认情况下,HTTP 请求是按顺序发的,下一个请求只有在当前请求收到响应之后才会被发出,有点像停止等待协议。
而在收到下一个请求之前,可能需要很长时间。
流水线就是在一个 HTTP 长连接下连续发出请求,不用等待响应返回,减少延迟。

http1.1与1.1与区别

  • 长短连接
    1.1 之前默认短,后长
  • 错误状态响应码
    1.1 新增了一些错误状态响应码
  • 缓存处理
  • 带宽优化以及网络连接的使用
缓存、max-age 字段在请求和响应头里的意思、Expires 字段
  • Expires 和 max-age 的区别

  • [Expires vs max-age, which one takes priority if both are declared in a HTTP response?

    ](https://stackoverflow.com/questions/7549177/expires-vs-max-age-which-one-takes-priority-if-both-are-declared-in-a-http-resp)

  • Expires:绝对时间

  • Cache-control:max-age:相对时间

HTTP 和 HTTPS 的区别

HTTPs1
HTTPs2

  1. 首先说技术出现的背景:点出HTTP存在的问题,有三个(窃听、伪装、篡改)
  2. 点出HTTPS不是新的协议,是运行在SSL协议之上的,SSL协议又运行在TCP之上。
  3. 通过SSL协议,采用对称加密和非对称加密的混合加密方式,HTTPS有了加密(对标窃听)、认证(对标伪装)、完整性保护(对标篡改)功能。

分别说说加密、认证、完整性保护是怎么实现的?

  • 加密:通过对称加密和非对称加密一起使用。
  • 认证:非对称加密的问题是公钥可能被第三防伪造,所以就引入了 CA 来保证服务器是真实可靠的。
  • 防篡改:把摘要(通过md5算法得到的值)单独加密发过去,这样解密的时候对内容进行 md5 算法计算,和摘要进行比对,如果不一样那么就是被篡改了。
    http也这么做但是可以被解密后重新计算摘要。但https就不会,我没有私钥是破解不出完整的报文的,也就没办法对摘要进行重新计算。

助记:认证是怎么认证的,HTTPS传输对称加密的密钥时用的是非对称加密,传输过去之后,用的是对称加密。而我在非对称加密时存在一个问题,就是公钥伪造的问题。
所以就引入了大家都信任的证书颁发机构(Certificate Authority, CA),服务器需要先去找CA认证,CA验明身份后用自己的私钥给服务器的信息(包括服务器的共钥)加密,叫做签名,然后服务器拿到这个证书之后发给客户端,客户端本身就内置了CA的公钥,这样就可以验证服务器的身份了。

对称加密/非对称加密,为什么会不安全呢?
各自具体过程
  • 对称加密:
    注意有个交换钥匙的过程,这个过程如果在线上的话仍然存在风险
  • 非对称加密
    1.A用自己的私钥,对Hash生成的数据摘要加密,生成数字签名,用B的公钥对数据进行加密,二者一起发给B
    2.B收到后先用自己的私钥解密数据,生成摘要,再用A的公钥对数字签字进行解密得到A生成的数据摘要,对比一致的话信任B
    3.可能在最开始的时候存在中间C,双向伪造自己的身份
各自特点
  1. 对称:效率高,但不安全。
  2. 非对称:效率低,但安全。
  3. 从不安全的核心来说,非对称加密时,公钥有可能被伪造,所以如果有一个大家都信任的机构,他的公钥大家都信任,都知道是正确的,这样就可以保证拿到的信息就是对方所签发的。
SSL 连接过程
是什么

SSL 是安全套接字,是用于加密和验证应用程序和Web服务器之间发送数据的协议。用于提供身份验证,HTTPS 的 S 其实指就是 SSL 协议。

简单概括怎么做:

1.通过CA体系交换public key
2.通过非对称加密算法,交换用于对称加密的密钥
3.通过对称加密算法,加密正常的网络通信

具体怎么做

1.客户端向服务器发起SSL连接请求
2.服务器把自己的证书发给客户端的浏览器。
3.客户端浏览器检查服务器过来的证书是不是 CA 签发的,如果是,就继续执行协议,如果不是,就发出一个警告,询问是否继续。
4.继续协议:从证书中把服务器的公钥拿下来,用公钥加密通信用的对称密钥,发给服务器。
5.服务器用自己的私钥对其解密,拿到对称密钥。
6.接下来就可以进行数据传输,服务器和客户端双方用相同的对称密钥对数据加密,可以保证安全。

HTTP/2
版本比较
HTTP 与 FTP

数据库

资料

  • 《MySQL 必知必会》
  • Leetcode
  • 《高性能 MySQL》
  • 《MySQL 技术内幕》
  • 《Redis 设计与实现》
  • 《Redis 实战》
  • 《大规模分布式存储系统》

SQL

手写查询汇总

select 查询列表 ⑦
from 表1 别名 ①
连接类型 join 表2 ②
on 连接条件 ③
where 筛选 ④
group by 分组列表 ⑤
having 筛选 ⑥
order by排序列表 ⑧
limit 起始条目索引,条目数; ⑨

分组查询时:

  1. 查询列表必须要求是分组函数和group by 后出现的字段,其实也可以不包括group by 后的字段,但最好加上
  2. having 里的字段一定包括在查询列表中
手写连接查询
SQL99语法
  1. 内外连接的区别
    内:取出两张表中匹配到的数据,匹配不到的不保留(有公共列id)
    外:取出连接表中匹配到的数据,匹配不到的也会保留,其值为NULL
  2. 内连接
    语法:
    select 查询列表
    from 表1 别名
    【inner】 join 表2 别名 on 连接条件
    where 筛选条件
    group by 分组列表
    having 分组后的筛选
    order by 排序列表
    limit 子句;

特点:
①表的顺序可以调换
②内连接的结果=多表的交集
③n表连接至少需要n-1个连接条件

分类:
等值连接
非等值连接(查询员工的工资级别)
自连接(查询员工的上级)

  1. 外连接
    语法:
    select 查询列表
    from 表1 别名
    left|right|full【outer】 join 表2 别名
    on 连接条件
    where 筛选条件
    group by 分组列表
    having 分组后的筛选
    order by 排序列表
    limit 子句;

特点:
①查询的结果=主表中所有的行,如果从表有和它匹配的项将显示匹配行,如果从表没有匹配的则显示null(女孩子的男朋友)
②left join 左边的就是主表,right join 右边的就是主表
full join 两边都是主表
③一般用于查询除了交集部分的剩余的不匹配的行

  1. 交叉连接

语法:
select 查询列表
from 表1 别名
cross join 表2 别名;

特点:
类似于笛卡尔乘积

连接与子查询
  • 嵌套在其他语句内部的select语句称为子查询或内查询

  • 按出现位置分类
    select后面
    例:查询每个部门的员工个数:员工表(某些部门可能没有员工)和部门表(全)

    • 仅仅支持标量子查询
      from后面
      将子查询结果充当一张表,必须起别名
    • 表子查询
      where或having后面:
      例:查询最低工资大于50号部门最低工资的部门id和其最低工资
      ①查询50号部门的最低工资
      ②查询每个部门的最低工资
      ③ 在②基础上用having筛选,满足min(salary)>①
    • 标量子查询
    • 列子查询
    • 行子查询
      exists后面
      先进行主查询,子查询起到一个过滤作用,与前几种不同(先子后主)
    • 标量子查询
    • 列子查询
    • 行子查询
    • 表子查询
DML:增删改
插入
  • 方式
    1.insert into 表名(字段名,…) values(值,…);
    2.insert into 表名 set 字段=值,字段=值,…;
  • 区别
    1.方式一支持一次插入多行,语法如下:
    insert into 表名【(字段名,…)】 values(值,…),(值,…),…;
    2.方式一支持子查询,语法如下:
    insert into 表名
    查询语句;
删除
  • 方式一:使用delete
    一、删除单表的记录★
    语法:delete from 表名 【where 筛选条件】【limit 条目数】

二、级联删除[补充]
语法:(delete后面写谁删谁)
delete 别名1,别名2 from 表1 别名
inner|left|right join 表2 别名
on 连接条件
【where 筛选条件】

  • 方式二:使用truncate
    语法:truncate table 表名

  • 区别
    1.truncate删除后,如果再插入,标识列从1开始
    delete删除后,如果再插入,标识列从断点开始
    2.delete可以添加筛选条件
    3.truncate效率较高
    4.truncate没有返回值
    delete可以返回受影响的行数
    5.truncate不可以回滚

修改
  • 一、修改单表的记录 ★
    update 表名 set 字段=值,字段=值 【where 筛选条件】;

  • 二、修改多表的记录【补充】
    update 表1 别名
    left|right|inner join 表2 别名
    on 连接条件
    set 字段=值,字段=值
    【where 筛选条件】;

drop、delete、truncate

DDL:库表管理与约束
库的管理

一、创建库
create database 【if not exists】 库名【 character set 字符集名】;
二、修改库
alter database 库名 character set 字符集名;
三、删除库
drop database 【if exists】 库名;

表的管理

一、创建表 ★
create table 【if not exists】 表名(
字段名 字段类型 【约束】,
。。。
字段名 字段类型 【约束】
)
二、修改表
1.添加列
alter table 表名 add column 列名 类型 【first|after 字段名】;
2.修改列的类型或约束
alter table 表名 modify column 列名 新类型 【新约束】;
3.修改列名
alter table 表名 change column 旧列名 新列名 类型;
4 .删除列
alter table 表名 drop column 列名;
5.修改表名
alter table 表名 rename 【to】 新表名;

三、删除表
drop table【if exists】 表名;

四、复制表
1、复制表的结构
create table 表名 like 旧表;
2、复制表的结构+数据
create table 表名
select 查询列表 from 旧表【where 筛选】;

常见约束

NOT NULL:非空,该字段的值必填
UNIQUE:唯一,该字段的值不可重复
DEFAULT:默认,该字段的值不用手动插入有默认值
CHECK:检查,mysql不支持
PRIMARY KEY:主键,该字段的值不可重复并且非空 unique+not null
FOREIGN KEY:外键,该字段的值引用了另外的表的字段

主键和唯一
1、区别:
①、一个表至多有一个主键,但可以有多个唯一
②、主键不允许为空,唯一可以为空

2、相同点
都具有唯一性
都支持组合键,但不推荐

外键:
1、用于限制两个表的关系,从表的字段值引用了主表的某字段值
2、外键列和主表的被引用列要求类型一致,意义一样,名称无要求
3、主表的被引用列要求是一个key(一般就是主键)
4、插入数据,先插入主表
5、删除数据,先删除从表

  • 添加约束的时机
    创建表时或修改表时

  • 如何合理使用列级约束和表级约束
    由于check在SQL中都不管用,外键在列级约束中不管用,我们最好:
    1.外键全部都用表级
    2.主键,非空,唯一,默认都用列级

  • 自增长列
    特点:
    1、不用手动插入值,可以自动提供序列值,默认从1开始,步长为1
    auto_increment_increment
    如果要更改起始值:手动插入值
    如果要更改步长:更改系统变量
    set auto_increment_increment=值;
    2、一个表至多有一个自增长列
    3、自增长列只能支持数值型
    4、自增长列必须为一个key

视图
  • 定义
    视图(view)是一种虚拟存在的表,只保留了sql逻辑,本身并不包含数据。作为一个select语句保存在数据字典中的。

  • 视图的作用
    1.简单:提高了重用性,简化复杂的sql操作,不必知道它的查询细节
    3.安全:保护数据,提高安全性

  • 何时能更新视图,不包含下列
    ➢聚合函数(max,min,avg等分组函数);
    ➢distinct 子句;
    ➢group by 子句;
    ➢having 子句;
    ➢union 和 union all 子句;
    ➢外连接

存储过程
  • 含义:
    一组预先编译好的SQL语句的集合,理解成批处理语句

  • 好处:
    1、提高代码的重用性
    2、简化操作
    3、减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率

  • 创建 ★
    create procedure 存储过程名(参数模式 参数名 参数类型)
    begin
    存储过程体
    end
    注意:
    1.参数模式:in、out、inout,其中in可以省略
    2.存储过程体的每一条sql语句都需要用分号结尾

  • 调用
    call 存储过程名(实参列表)
    举例:
    调用in模式的参数:call sp1(‘值’);
    调用out模式的参数:set @name; call sp1(@name);select @name;
    调用inout模式的参数:set @name=值; call sp1(@name); select @name;

  • 查看
    show create procedure 存储过程名;

  • 删除
    drop procedure 存储过程名;

触发器

数据库系统原理

事务 ACID
事务定义

事务就是一组满足 ACID 特性的操作,要么都执行,要么都不执行。
比如转账,

事务特性
  • 原子性(Atomicity)
    原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。

  • 一致性(Consistency)
    事务必须使数据库从一个一致性状态变换到另外一个一致性状态,以转账为例,转账动作完成后,两人账户总金额数未变

  • 隔离性(Isolation)
    事务的隔离性是指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰

  • 持久性(Durability)
    持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响

性质关系

不是一种平级关系:
1.首先只有满足一致性,事务的执行结果才是正确的。
2.在无并发的情况下,事务串行执行隔离性一定能够满足。此时只要能满足原子性,就一定能满足一致性
3.在并发的情况下,多个事务并行执行,事务不仅要满足原子性,还需要满足隔离性,才能满足一致性
4.事务满足持久化是为了能应对系统崩溃的情况。

并发错误

在并发环境下,事务的隔离性很难保证,因此会出现很多并发一致性问题

  • 脏读:
    理解
    两个事务都没有结束的时候,在编写事务的阶段产生互相干涉
    举例
    在我这个事务执行的过程中,读了其他事务修改未提交的数据。(A给B转账3000,C读B账户,A回滚,C读到的是脏数据)

  • 不可重复读:
    理解
    一旦其中一个事务结束提交后,便能对另一个还未结束的事务的字段产生影响
    举例
    在我这个事务内,多次读取同一个数据,在读取过程中其他事务对数据做了修改,造成我这个事务前后读到的数据不一样,就是不可重复读。

  • 幻读:
    理解
    本质上仍属于不可重复读
    第一个事务在编写事务的阶段插入了一些新的行,第一个事务结束提交后会对第二个还未提交的事务产生影响,
    举例
    在我这个事务执行的过程中,我多次读取同一段数据,在读取过程中其他事务插入了几行数据,造成我这个事务发现前后读到的数据的行数不一样,好像发生了幻觉一样。

隔离级别
  • 读未提交(READ UNCOMMITED):
    什么都不解决。

  • 读已提交(READ COMMITED):
    可以解决脏读问题。

  • 可重复读(REPEATABLE READ):
    可以解决脏读和不可重复读问题。

  • 可串行化(SERIALIZABLE):
    可以解决所有问题。

  • orcael:
    支持的 2 种事务隔离级别,READ COMMITED(默认为第二种), SERIALIZABLE

  • sql:
    支持 4 种事务隔离级别,默认的事务隔离级别为第三种: REPEATABLE READ

封锁

封锁的类型以及粒度,两段锁协议,隐式和显示锁定。

乐观锁与悲观锁

文档:01. xxx 乐观锁 悲观锁http://note.youdao.com/noteshare?id=82024ead03a7d24c5ae7f2ccdd876ef0&sub=6B0F4CE5E6BA46EABFED209C0DBCB2FA

当要对数据库中的一条数据进行修改的时候,为了避免同时被其他人修改,最好的办法就是直接对该数据进行加锁以防止并发。这种借助数据库锁机制,在修改数据之前先锁定,再修改的方式被称之为悲观并发控制

三大范式
  • 首先说为什么需要范式,范式是用来干什么的?(其实范式就是用来约束数据库表的创建原则的,不能随心所欲的创建,需要满足一定的要求)(如果不满足,就会出现很多增删改查上的错误)(举个例子,有一张表学生号和课程号作为主键,学生姓名、课程名字、课程成绩作为非主属性的表发生 冗余信息、插入错误、删除错误、更改错误)

  • 第一大范式:不可分割

  • 第二大范式:非主属性完全函数依赖于主键(还拿刚才那张表来讲,学生号推出 xxx 学生号 + 课程号 确认成绩 两个主键确认课程成绩)学生姓名部分依赖于主键,所以可以对表进行拆分,拆成两张表。

  • 第三大范式:非主属性不传递函数依赖于主键,比如我现在来了个表。(学生号、学生名、学院名、院长名)院长名就是传递函数依赖于学生号,可以对表进行拆分。

SQL 与 NoSQL

MySQL不香吗,为什么还要noSQL?https://zhuanlan.zhihu.com/p/136257627

MySQL

索引、五个优化方法、失效写法

提纲:下面是答案,不要看。

  • why?

  • mysql底层用的什么?

  • 和B对比、和hash对比、和红黑对比

  • 用B+优缺点

  • 最佳实践,不能给所有的都创建

  • InnoDB 的两种索引机制,回表操作

  • 哪些操作会使得索引失效呢?

  • 首先你要说索引是干什么的?(是一种数据结构,可以加快我们的检索速度)

  • 然后直接点出MySQL的底层默认是InnoDB引擎,用的是B+树索引

    • B+树是一种典型的N叉树,其每个节点有N个子节点就对应着 N个key
      • 指针指向的子节点中所存放的key,大于等于该指针左边的key,小于该指针右边的key
      • 除了叶子节点以外,其余所有节点只存索引,不放数据
      • 叶子节点是一个链表,存了所有的数据,B+树的搜索总是可以到达叶子节点的。
  • 和B树做比较

    • 先点出来宏观上,都是为了增加结点的容量,降低树高。
      • 扫库扫表
      • 磁盘IO效率上高
      • 范围查找效率高,前者只需遍历其链表的叶子节点,B树的每个节点都有数据,所以范围查找的话需要中序遍历。
      • 查询稳定性,如果B树查一次就直接命中和查到叶子节点才命中的效率不同。而B+就很稳定,因为只有叶子节点有数据。
  • 和hash索引

    • hash索引的随机查找速度很快,但是没有范围查找的能力
  • 和红黑树比较

    • 出度。
  • 用了B+树做索引有什么优缺点?

    • 优点无非就是加快检索速度,减少分组排序的过程,把随机IO变成顺序IO
      • 缺点呢就是空间换时间,为一列创建索引需要把这一列复制出来,并且维护索引需要一定的时间。
  • 最佳实践是什么?

    • MAX MIN
      • WHERE
      • ORDER BY、GROUP BY
      • 外键
  • MySQL 的 InnoDB 两种索引,回表操作

    • 聚集:就是主键索引,叶子放了主键和数据
      • 非聚集,就是非主键索引,叶子放了主键,如果不能覆盖查询(比如想要名字列,而名字列本身就是索引)需要回表操作。
  • 哪些操作会使索引失效?

    • % 开头的like

      • OR 前后没一起使用索引
      • 数据出现隐式转化,原来是varchar,变为了int
      • AND 需要满足最左匹配原则。
InnoDB 聚簇索引的优点?
  • 优点

A:可以把相关数据保存在一起,如:实现电子邮箱时,可以根据用户ID来聚集数据,这样只需要从磁盘读取少量的数据页就能获取某个用户全部邮件,如果没有使用聚集索引,则每封邮件都可能导致一次磁盘IO

B:数据访问更快,聚集索引将索引和数据保存在同一个btree中,因此从聚集索引中获取数据通常比在非聚集索引中查找要快

  • 缺点
    A:耗费空间:首先就是利用空间换了时间,索引虽然节省了时间,但每对一列创建一个索引,就会把该索引对应的列的值全部拿出来建一个 B+ 树,耗费空间

B:更新耗费时间:创建索引和维护索引的时候,需要耗费一定的时间,对表中数据进行增删改的时候,数据改了索引也得跟着改。

InnoDB 的隔离级别默认是什么?MySQL 事务是如何实现的?(MVCC、NKL)
  • 默认是第三个级别:可重复读

  • MVCC 多版本并发控制,实现提交读和可重复读这两种隔离级别。

    • 用了读写锁技术 + 多版本控制思想。写操作更新最新版本的快照,读操作读旧版本的快照。
      • 因为脏读和不可重复读最根本的原因是读了其他事务没有提交的修改,所以在读操作的时候,MVCC规定只能读取已经提交过的快照,没有提交的快照和已提交的是两个版本,互相不干涉。
  • 幻读问题靠 MVCC+next-key locks 解决,具体就是加行锁和间隙锁来锁定一段表,可以解决幻读的问题

查询优化
InnoDB 与 MyISAM 区别

只知道 InnoDB 支持事务,MyISAM 不支持事务。

InnoDB 的叶子节点是单向还是双向的?
  • 数据页是双向的
  • 每个节点里面单条数据是单向的
水平切分与垂直切分
主从复制
日志
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值