计算机基础

1. 硬件组成

  • 1945年-科学家冯·诺依曼提了一种计算机设计实现架构

    image-20231206002003851
  • 五大组成部分:运算器、控制器、存储器、输入设备、输出设备

    • 控制器 Control Unit 简称 【CU】,用于控制其他组件的运行
    • 运算器 Arithmetic/Logic Unit 简称 【ALU】,用来完成各种二进制编码做算术运算和逻辑运算,控制器+运算器=CPU
    • 存储器 用来存取数据,内存,外存
    • 输入设备 计算机接收外界输入数据的工具,比如键盘、鼠标、麦克风、触摸屏、手写输入板,游戏杆等
    • 输出设备 计算机向外输出数据的工具,比如显示器、音响、打印机等

2. 操作系统

操作系统用于管理计算机中所有的硬件和软件,用户通过操作系统来使用计算机硬件

核心功能:

  • 进程管理:操作系统为进程分配任务,解决处理器的调度、分配和回收等
  • 处理器管理:CPU的管理和分配,比如分配进程,CPU调度执行
  • 内存管理:内存的管理和分配,比如给程序分配内存和释放内存
  • 外存管理:持久化存储的管理和分配,比如磁盘文件读写
  • I/O管理:输入/输出设备的管理,比如键盘输入和网络收发

2.1 进程

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

操作系统给进程抽象了专门的数据结构:进程控制块(Process Control Block 简称 PCB),在操作系统代码中是一个结构体:struct task_struct{...},创建进程时建立PCB,伴随进程运行的全过程,直到进程撤销而撤销。

PCB包含的进程信息:

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

进程状态:

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

进程与线程

  • 进程本质上是一个独立执行的程序,进程是操作系统进行资源分配和调度的基本概念,操作系统进行资源分配和调度的一个独立单位
  • 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位
  • 一个进程中可以并发多个线程,每条线程执行不同的任务,切换受系统控制
  • 进程拥有多个线程的时候,这些线程会共享相同的虚拟内存和全局变量资源,这些资源在上下文切换时不需要修改
  • 同进程内的线程切换,要比多进程间的切换消耗更少的资源

子进程

  • 进程一般由OS内核创建,一个进程也可以去创建另一个进程,这个去创建进程称为父进程,被创建进程称为子进程
  • Nginx的master-worker进程
    • worker是处理真正的请求的,而master负责监控worker进程是否在正常工作

2.2 进程调度算法

  • 进程调度类型
    • 非抢占式调度 Nonpreemptive:
      • 处理机分配给某进程后,进程就会一直运行,直到该进程【完成】或【阻塞】时才会把 CPU 让给其他进程
      • 主要用于【批处理系统】和某些对【实时性要求不严】的系统
    • 抢占式调度 Preemptive
      • 暂停某个正在执行的进程,将已分配给该进程的处理机重新分配给另一个进程
      • 主要用于比较严格的【实时系统】中
  • 先来先服务调度算法(FCFS,first come first served,非抢占式)
    • 按照作业/进程到达的先后顺序进行调度
    • 排在长进程后的短进程的等待时间长,不利于短作业/进程
  • 短作业优先调度算法(SJF, Shortest Job First,非抢占式)
    • 预计执行时间短的进程优先分派处理机,短进程/作业
    • 缩短进程的等待时间,提高系统的吞吐量
  • 高响应比优先调度算法(HRRN,Highest Response Ratio Next,非抢占式)
    • 优先权=响应比=(等待时间+要求服务时间)/要求服务时间
    • 计算优先权信息,增加了系统的开销
  • 时间片轮转调度算法(RR,Round-Robin,抢占式
    • FCFS 的方式按时间片轮流使用CPU 的调度方式,让每个进程在一定时间间隔内都可以得到响应
    • 由于高频率的进程切换,会增加了开销,且不区分任务的紧急程度
  • 优先级调度算法(Priority Scheduling ,有抢占式和非抢占式)
    • 根据任务的紧急程度进行调度,高优先级的先处理,低优先级的慢处理
    • 通常使用【动态优先级】,如果高优先级任务很多且持续产生,那低优先级的就可能很慢才被处理,优先级因素:进程的等待时间、已使用的处理机时间或其他资源的使用情况
  • 多级反馈队列调度算法(Multilevel Feedback Queue,抢占式)
    • 多级:表示有多个队列,每个队列优先级从高到低,同时优先级越高时间片越短
    • 高优先级队列中已没有调度的进程,则调度次优先级队列中的进程
    • 对同个队列中的各个进程,按照时间片轮转法调度
    • 反馈:表示如果有新的进程加入优先级高的队列时,立刻停止当前正在运行的进程,转而去运行优先级高的队列

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

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

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

  • UNIX采用动态优先队列调度
  • BSD采用多级反馈队列调度
  • Windows采用抢先多任务调度