第1章:操作系统和计算机网络

1. 操作系统和计算机网络组成目标概述

1.1. 核心知识

操作系统和网络知识很庞大,大多内容枯燥无味,主功最常用的,符合2/8原则。

操作系统:

  • 内核、性能、磁盘IO、内存、CPU
  • 进程、线程、文件、中断

计算机网络

  • OSI七层模型、TCP、IP四层模型和组合
  • 网络通讯、TCP、UDP、HTTP1.0、HTTP2.0、网络安全攻防、DNS、CDN

1.2. 为什么?

系统性能优化和生产环境问题:

  • 从操作系统------网络------应用程序------存储等多方面 诊断和优化
  • 接口突然响应慢、服务器内存、CPU占用率高、Redis、MySQL查询慢、如何排查?
  • 接口性能优化,如何进行分析和下手操作,是否有流程方法论?

要学会什么:

  • 认识对应的内容知识体系------有【全局认识】
  • 掌握常用的分析诊断工具------合适的场景用合适的工具,制作自己的【脑图】
  • 逐步优化自己的诊断思路

1.3. 性能优化的方法论

性能优化主要从应用程序性能维度和操作系统资源维度来看。

应用程序性能维度:

  • 提高吞吐量Throughput
  • 降低延迟Latency

操作系统资源维度:

  • CPU使用率
  • 内存使用率
  • 磁盘IO使用率

我们需要选择指标 评估系统和应用程序现状;设置性能优化的目标 ;进行链路基准测试分析 全链路性能瓶颈;优化 系统和应用程序;验证优化后的性能指标。

2. 计算机硬件组成系统结构

计算机的组成部分:运算器、控制器、存储器、输入设备、输出设备。

控制器【CU】:计算机指挥系统,用来控制计算机其他组件的运行。

运算器【ALU】:运算功能,用来完成各种二进制编码做算术运算和逻辑运算,包括加减乘除、与或非运算,控制器+运算器=CPU。

存储器:计算机的记忆功能,用来存储数据。分为内存和外存。内存比如内存条,临时存储,断电丢失数据;外存比如机械硬盘,持久存储,断电不丢失数据。

IO设备:可以将数据输入到计算机,或接收计算机输出数据的外部设备。分为输出(output)和输入(input)。

运算器控制器联系十分紧密,两大部件多数集成在同一芯片,统称为中央处理器。

3. 操作系统和进程

3.1. 什么是操作系统?

  • 运行在计算机上最重要的一种程序,管理计算机的所有硬件和软件。
  • 用户通过系统OS来操作使用计算机硬件,属于中间件。

3.2. 现代操作系统核心功能

进程管理:操作系统为进程分配任务,解决处理器的调度、分配和回收等。

处理器管理:CPU的管理和分配,比如 分配进程 CPU调度执行。

内存管理:持久化存储的管理和分配,比如 磁盘文件写入。

I/O管理:输入/输出设备的管理,比如键盘输入和网络收发

3.3. 进程

一个具有独立功能的程序对某个数据集在处理机上的执行过程,也是操作系统分配资源的基本单位。

操作系统中专门给进程抽象了一个专门的数据结构,叫做进程控制块(PCB)。

每一个进程均有一个PCB,在创建进程是创建PCB,伴随进程运行的全过程,直到进程撤销而撤销。

PCB数据结构包含进程的多数信息:

  • 程序ID(PID,进程句柄):一个进程都必须对应一个唯一PID,一般是整形数字
  • 特征信息:一般分系统进程、用户进程、或者内核进程等
  • 进程状态:运行、就绪、阻塞,表示进程现的运行情况
  • 优先级:表示获取CPU控制权的优先级大小
  • 提供进程管理、调度所需要的信息

进程状态:

  • 新建态:进程正在被创建,操作系统为进程分配资源,初始化PCB
  • 就绪态:具备运行条件,但没有空闲的CPU导致不能运行,万事具备,只少一个CPU
  • 运行态:占有CPU,并在CPU上运行指令
  • 阻塞态:等待某一事件而暂时不能运行
  • 退出态:从系统中退出,操作系统会回收进程拥有的资源、撤销PCB

进程、线程之间的关系:

  • 进程:
    1. 本质上是一个独立执行的程序,进程是操作系统进行资源分配和调度的基本概念
    2. 操作系统进行资源分配和调度的一个独立单位
  • 线程:
    1. 是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中实际运作单位
    2. 一个进程中可以并发多个线程,每条线程执行不同的任务,切换受系统控制
  • 重点:
    1. 进程拥有多个线程的时候,这些线程会共享相同的虚拟内存和全局变量资源,这些资源上下文切换时不需要更改
    2. 同进程内的线程切换,要比多进程间的切换资源消耗更少的资源,所以并发中用多线程代替多进程的原因
    3. 线程上下文切换的两种情况:
      1. 前后两个线程不同进程,此时资源不共享,线程上下文切换和进程的上下文切换一样
      2. 前后两个线程属于统一个进程。同进程虚拟内存共享,在切换的时候虚拟内存等资源就保持不动,只需要切换线程的私有数据,寄存器等不共享的数据

进程的创建:

  • 进程一般是OS内核创建,一个进程也可以去创建另一个进程,这个去创建的进程称为父进程,被创建的进程称为子进程。
  • 应用场景:Nignx的master-worker进程,worker是处理真正的请求的,而master负责监控worker进程是否在正常工作。Redis的AOF和RDB持久化,执行bgsave命令,Redis-Server会fork创建子进程,PDB持久化过程由子进程负责,会在后台异步进行快照操作,由于是进程,所有快照生成同时还可以向应客户端请求。

4. 操作系统的进程调用算法和解决方案

什么是进程调度?

  • Linux是一个多任务操作系统,支持的任务同时运行的数量远远大于CPU的数量
  • 进程调度就是指怎样安排某一个时刻CPU运行那个进程

进程调度类型:

  • 非抢占调度,一旦把处理分配给某个进程后,进程就会一直运行,直到改进程完成或阻塞时才会把CPU让给其他进程。主要用于批处理系统 和某些对实时性要求不严的实时系统。
  • 非抢占式调度,暂停某个正在执行的进程,将已分配给该进程的处理机重新分配给另一个其优先权更高的进程。主要用于比较严格的实时系统中。

先来先服务调度算法(FCFS ,非抢占式):

  • 按照作业或进程到达的先后顺序进行调度,即:优先考虑在系统中等待时间最长的作业。
  • 重点:排在长进程后的短进程的等待时间长,不利于短作业进程。

短作业优先调度算法(SJF ,非抢占式):

  • 预计执行时间短的进程优先分派处理机,短进程作业(要求服务时间最短)。
  • 在实际情况中占用很大比例,为了使他们优先执行,对长作业不友好。
  • 重点:缩短进程的等待时间,提高系统的吞吐量

高响应比优先调度算法(HRRN ,非抢占式):

  • 在每次调度时,先计算各个作业的优先权:优先权=响应比= (等待时间+要求服务时间)/要求服务时间。
  • 因为等待时间与服务时间之和就是系统对该作业的响应时间,所以 优先权=响应比=响应时间/要求服务时间。
  • 选择优先权高的进行服务需要 计算优先权信息,增加了系统的开销 是介于FCFS和SJF之间的一种折中算法。

时间片轮转调度算法(RR,抢占式):

  • FCFS的方法按照时间片轮流使用CPU的调度方式,让每个进 在一定时间间隔内都可以得到响应。
  • 由于高频率的进程切换,会增加了开销,且不区分任务的紧急程度。

优先级调度算法(非抢占式和抢占式):

  • 根据任务的紧急程度进行调度,高优先级的先处理,低优先级的慢处理。
  • 通常使用 动态优先级, 如果高优先级任务很多且持续产生,那低优先级的就可能很慢才被处理。
  • 优先级因素:进程的等待时间,已使用的处理机时间或其他资源的使用情况。

多级反馈队列调度算法(抢占式):

  • 多级:表示有多个队列,每个队列优先级从高到低,同时优先级越高时间片越短。
    1. 高优先级队列中已没有调度的进程,则调度次优先级队列中的进程
    2. 对同队列中的各个进程,按时间片轮转法调度
    3. 比如:1,2,3三个队列,在1中没有进行进程等待时才会去调度2,只有1,2都为空才会去调度3;队列的时间片为N,假如1中的作业经过N个时间片后还没有完成,则进入到2队列,以此类推。
  • 反馈:表示如果有新的进程加入优先级高的队列,立刻停止当前正在进行的进程,转而去运行优先级高的队列。

总结

一个好的调度算法考虑以下几个方面

  • 公平-保证每个进程得到合理的CPU时间
  • 高效-使CPU保持忙碌的状态,总是有进程在CPU上运行
  • 响应时间-使交互用户的响应时间尽可能短
  • 周转时间- 使交互用户等待输出时间尽可能短
  • 吞吐量- 使单位时间内处理的进程数量尽可能多

不同系统和版本支持的调度算法不一样

  • Linux采用动态优先队列调度

  • BSD采用多级反馈队列调度

  • Windows采用抢先多任务调度

  • 解决方案应用(内容爬去解析平台,区分大小站点)

负载均衡算法: nginx/fegin/dubbo......