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
进程、线程之间的关系:
- 进程:
- 本质上是一个独立执行的程序,进程是操作系统进行资源分配和调度的基本概念
- 操作系统进行资源分配和调度的一个独立单位
- 线程:
- 是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中实际运作单位
- 一个进程中可以并发多个线程,每条线程执行不同的任务,切换受系统控制
- 重点:
- 进程拥有多个线程的时候,这些线程会共享相同的虚拟内存和全局变量资源,这些资源上下文切换时不需要更改
- 同进程内的线程切换,要比多进程间的切换资源消耗更少的资源,所以并发中用多线程代替多进程的原因
- 线程上下文切换的两种情况:
- 前后两个线程不同进程,此时资源不共享,线程上下文切换和进程的上下文切换一样
- 前后两个线程属于统一个进程。同进程虚拟内存共享,在切换的时候虚拟内存等资源就保持不动,只需要切换线程的私有数据,寄存器等不共享的数据
进程的创建:
- 进程一般是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,只有1,2都为空才会去调度3;队列的时间片为N,假如1中的作业经过N个时间片后还没有完成,则进入到2队列,以此类推。
- 反馈:表示如果有新的进程加入优先级高的队列,立刻停止当前正在进行的进程,转而去运行优先级高的队列。
总结
:
一个好的调度算法考虑以下几个方面
- 公平-保证每个进程得到合理的CPU时间
- 高效-使CPU保持忙碌的状态,总是有进程在CPU上运行
- 响应时间-使交互用户的响应时间尽可能短
- 周转时间- 使交互用户等待输出时间尽可能短
- 吞吐量- 使单位时间内处理的进程数量尽可能多
不同系统和版本支持的调度算法不一样
- Linux采用动态优先队列调度
- BSD采用多级反馈队列调度
- Windows采用抢先多任务调度
- 解决方案应用(内容爬去解析平台,区分大小站点)
负载均衡算法: nginx/fegin/dubbo......