进程和线程

287 阅读27分钟

1、进程

程序启动后,在内存里分配了一块资源,准备运行的,是分配资源的基本单位

CPU要运行程序,从内存中main函数开始将指令一条条读入寄存器,结合程序计数器,顺序执行。main函数位于主线程,操作系统对于线程是看不见的,线程在进程内部,自己分配调度、执行

1.1 进程的定义和特征

1.1.1 进程的定义

程序并发执行时会有以下特征:

  • 间断性:由于程序之间共享系统资源,多个程序同时运行时,会有执行->暂停->执行的活动规律

  • 失去封闭性:单个程序执行时,其独占全机资源,资源的状态只有当前程序能够改变,程序的执行结果不会被外部影响;但多个程序并发执行时,资源的状态会被其他程序影响,每个程序都会受到影响,所以说程序失去了封闭性

  • 不可再现性:程序经过多次执行后,虽然执行环境和初始条件相同,但得到的结果并不相同 为了协调这些问题,让程序能够并发执行,引入了进程的概念。

  • PCB :进程控制块,一个用来描述进程的基本情况和活动过程的数据结构

  • 进程实体:由程序段、相关的数据段和PCB 3部分构成了进程实体

  • 进程:存在多种定义方式

    • 程序的一次执行
    • 一个程序及其数据在处理机上顺序执行时发生的活动
    • 进程是具有独立功能的程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个最小单位
    • 进程是程序实体的运行过程,是系统进行资源分配和调度的一个独立单位
  • 创建进程:创建进程实体的PCB

  • 撤销进程:撤销进程实体的PCB

1.1.2 进程的特质

  • 动态性:进程是进程实体的执行过程,具有一定的生命周期,由创建而产生,由调度而执行,由撤销而消亡,但程序只是有序指令的集合,存放在介质中,是静态的
  • 并发性:多个进程同时存在于内存当中,在一段时间内同时运行
  • 独立性:进程实体是一个能独立运行、独立获得资源和独立接受调度的基本单位
  • 异步性:进程按各自的、不可预知的速度向前推进

1.2 进程的基本状态和转换

进程在并发过程当中间断性运行,所以在进程的生命周期当中存在多种状态,进程的三种基本状态如下:

  • 就绪状态:进程已经处于准备好运行的状态,分配到了运行所需要的除了CPU以外的资源,只要获得CPU就可以执行。多个处于就绪状态的进程按照优先级排成一个队列,称为就绪队列
  • 执行状态:进程已经获得了CPU,程序处于执行状态,多机处理系统当中,有多个进程处于执行状态
  • 阻塞状态:正在执行的进程由于某些事件,如IO请求、申请缓存区失败等引发了进程调度,当前执行的进程受到阻塞,让处理机去处理另一个就绪的进程,多个受到阻塞的进程组成了阻塞队列,按照受阻塞的原因又分为不同的阻塞队列

1.2.1 进程的三种状态的基本转换

  • 就绪 -> 执行,通过进程调度
  • 执行 -> 就绪 分配到的时间片用完
  • 执行 -> 阻塞 没有临界资源可用,IO等待
  • 阻塞 -> 就绪 获得了执行需要的临界资源,IO完成

1.2.2 进程的其他状态

  • 创建状态:申请空白PCB,向PCB写入用于控制和管理进程的信息,为该进程分配运行时需要的资源,将该进程转入就绪状态并插入就绪队列
  • 终止状态:根据终止的进程标识符,从PCB集合中找到该进程的PCB,如果进程正处于执行状态,应该立即终止该进程的执行,该进程若有子孙进程,应将所有的子孙进程终止,将被终止的进程的全部资源归还给父进程或归还给系统,将PCB清空,将PCB空间返还系统

1.3 进程管理中的数据结构

进程控制块:PCB是用于描述进程当前情况和管理进程运行的全部信息,是操作系统中最重要的记录型数据结构

1.3.1 PCB作用

  • 作为独立运行的基本单位的标志
  • 能够实现间断性运行方式。
    • PCB保留了自己运行时的CPU现场信息,提供给该进程再次被调用时恢复CPU现场
  • 提供进程管理需要的信息
    • 根据PCB记录的程序和数据在内存或外存的指针,找到相应的程序和数据
    • 在进程访问的过程当中,如果要访问文件系统中的文件或者IO设备都要借助PCB中的信息
    • 记录该进程需要的全部资源
  • 提供进程调度所需要的信息
    • 记录进程当前处于何种状态,只有状态处于就绪才能够被调度
    • 通过等待时间,已执行的时间判断进程的优先级
  • 实现与其他进程的同步和通信
    • 采用信号量机制时,每个进程都设置了相应的用于同步的信号量
    • 记录用于实现进程间用于通信的区域或者通信队列指针

1.3.2 PCB存储的信息

  • 进程标识符:用于唯一标识一个进程
  • 处理机状态:也叫做处理机的上下文,由处理机当中各种寄存器的内容组成
    • 通用寄存器
    • 指令计数器
    • 程序状态字PSW
    • 用户栈指针,用户栈指的是用户进程存放过程和系统调用参数及调用地址
  • 进程调度信息
    • 进程的状态
    • 进程的优先级
    • 进程调度需要的其他信息,如等待时间总和、进程已经执行的时间等等
    • 事件:阻塞原因

1.3.3 PCB的组织方式

  • 线性方式:实现简单、开销小,每次查找的时候都需要扫描整张表
  • 链接方式:将具有相同状态的PCB链接成一个队列,每个队列由1个指针指向它,有执行指针、就绪队列指针、阻塞队列指针、空闲队列指针等
  • 索引方式:根据进程状态不同建立索引表,如就绪索引表、阻塞索引表等等,PCB则由一张线性表结构存储,每个索引表内的表目记录PCB在PCB表内的位置

1.4 进程的同步

进程的同步是对于多个相互进程在执行次序上进行协调,使并发执行的进程能够按照一定的规则或时序共享系统资源,并且很好地相互合作,从而使程序的执行有可再现性

  • 两种形式的制约关系
    • 间接相互制约:共享系统资源(CPU、IO设备等)导致的,使用前要提出申请,不能直接使用
    • 相互制约关系:为了完成某项任务建立了两个或者多个进程,这些进程将为了同一项任务的完成而相互合作
  • 临界资源:诸多硬件资源都属于临界资源,诸进程通过互斥方式实现对这种资源的共享
  • 临界区:每个进程访问临界资源的那段代码称为临界区,访问之前应该对临界资源进行检查,查看其是否在被访问,访问之后应该将临界区恢复为未被访问的状态

  • 一个访问临界资源的循环过程描述如下:

    • 进入区:检查临界资源是否在被访问,如果没有则可以访问临界资源;如过有则在这里等待
    • 临界区:访问临界资源
    • 退出区:将临界资源正在被访问的标志恢复为未被访问
    • 除了上述几个区域的进程的其他区域
  • 同步机制应该遵循的规则

    • 空闲让进:没有进程处于临界区的时候,临界资源处于空闲状态,运行一个请求进入临界区的进程立刻进入自己的临界区
    • 忙则等待:已经有进程进入临界区的时候,临界资源正在被访问,其他要访问临界资源的进程必须等待,保证对临界资源的互斥访问
    • 有限等待:保证在有限时间内能够进入自己的临界区,以免陷入死等状态
    • 让权等待:当进程不能进入自己的临界区时,应该即刻释放处理机,以免进程陷入忙等状态

1.4.1 硬件同步机制

对临界区进行管理时,将标志看作一个锁,锁开时进入,锁关时候等待。每个要进入临界区的进程必须先对锁进行测试,如果锁没有打开,必须等待,知道锁被打开。但锁是打开的时候,必须立刻将其锁上,以阻止其他的进程进入临界区域。为了放置多个进程同时检测到锁为打开的情况,测试和关闭必须是连续的

  • 1.关中断:在进入锁测试之前关闭中断,直到完成锁测试并上锁后才能打开中断,这样在进程进入临界区的时间里,操作系统不会产生中断,也就不会引发调度,不会发生进程或者线程的切换,保证了对锁的测试和关闭操作的连续和完成,但存在一些缺点
    • 滥用关中断可能造成严重后果
    • 关中断时间过长影响系统的效率,限制了处理器交叉处理的能力
    • 关中断不适用于多处理器的CPU,一个处理器关中断,其他进程有可能在其他处理器执行相同的临界代码段
  • 2.利用Test-and-Set指令执行互斥
    • TS指令可以看作函数过程,当调用TS指令时,会返回要获取资源的锁的开关状态,返回之前,不论锁的状态是开是关,锁都会标记为关
      • 锁之前是关,返回关的状态,返回之前标记为关,表示其他进程占用了这个资源
      • 锁之前是开的,返回开的状态,返回之前立刻将锁标记为关,表示锁被刚刚正在请求这个资源的进程占用了
    • 当一个进程不再占用这个资源时,需要立刻标记锁为打开,其他资源会去抢占
  • 3.利用swap指令实现进程的互斥
    • 每个临界资源存在一个全局变量lock,初始为false
    • 每个进程都有一个key,初始为true
    • swap就是用来交换key和lock的值的
      • 如果lock为false,交换后key会得到false,表示锁是打开的,lock会变成true,表示资源被占用,从打开变为锁上
      • 如果lock为true,交换后key和value都会是true,key表示获取到锁的状态是关闭的,lock表示自己还在被其他进程占用
    • 进程进入临界区前,不断用swap交换key和锁的状态,直到自己获取了这把锁
    • 进程操作完占用的数据后,及时将lock设置为false,让其他资源抢占
    • 这种方式会让其他进程忙等,就是其他进程获取不到临界资源却占用了CPU,处于一个循环中不断swap地一个状态

1.4.2 信号量机制

  • 1.整型信号量
    • S用来表示资源数目
    • wait(S) 原子操作,用于获取一个资源,当S<=0时一直等待,当S > 0时,将S--.表示获取到了
    • signal(S) 原子操作,用于增加一个资源,S++,表示资源使用后的释放动作
  • 2.记录型信号量
    • 整型信号量依然存在忙等的情况,记录型信号量解决了这个问题,实现了让权等待
    • 记录型信号量semaphore是一个结构体,包括记录了资源数量的value,和进程链表指针
    • wait(semaphore * S) 用于获取一个资源,S.value--,如果S.value因此小于0,说明获取不到,阻塞链表中所有的等待进程,实现让权等待
    • signal(swmaphore * S) 用于释放一个资源,S.value++,之后判断S.value<=0,如果满足,说明有其他进程处于因为请求这个资源而被阻塞的状态,这个时候唤醒被阻塞的进程
  • 3.And信号量
    • 上述信号量说的都是并发进程请求一个临界资源的情况,如果需要多种临界资源,则需要通过多次单独的wait()操作,有可能出现死锁情况
    • And信号量用于一个进程需要同时获得两个或者更多的共享资源才能开始执行任务,意思是进程需要的资源,要么全给,要么全都不给,这样可以避免死锁情况发生
    • Swait(S1,S2,S3,...,Sn) 用于获取多个临界资源,如果有一个临界资源<=0,就将当前进程放入第一个Si<=0的等待队列,表示该进程阻塞,将其程序计数器设置为Swait()的开始位置
    • Ssignal(S1,S2,S3,..,Sn) 用于归还多个临界资源,对于每一个被归还的临界资源,唤醒其等待队列中的进程
  • 4.信号量集
    • 如果对于同一种临界资源进程需要多个,用上述信号量就需要通过多次的申请wait(),低效的同时增加了死锁的概率。为了保证系统安全性,在需要的临界资源数据小于某一下限值的时候,必须进行管制,不予分配
    • 信号量集是在And信号量的基础上进行扩充,申请资源时带上临界资源的分配下限和资源的需求数目,当存在一种临界资源的需求数目得不到满足,就不予分配
    • Swait(S1,t1,d1,...,Sn,tn,dn) Si表示请求的临界资源现有数量,ti表示临界资源数量Si>=ti时,才会进行分配,即临界资源始终会有一定的富余,di表示当前进程请求的资源的数量
    • Ssignal(S1,d1,...,Sn,dn) 归还临界资源的时候带着归还的数量
  • 利用信号量实现互斥
    • 某一临界资源只有1个,各个进程之间需要进行互斥的访问,则为其设置一个互斥的信号量mutex,初值为1
    • 每个进程在访问该临界资源,进入临界区前,都需要进行wait()操作,如果成功,该进程获取到临界资源,进入临界区,如果失败,那么该进程会被阻塞,并在其他进程signal()的时候被唤醒
    • wait()和sigal()操作必须要成对出现
  • 利用信号量实现前驱关系
    • 两个并发执行的进程,P1里面有语句S1,P2里面有语句S2,希望S2能够在S1之后执行,但程序的并发会让每个进程都按照不可预知的速度向前推进
    • 可以添加一个信号量S,初值为0,在P1的S1语句后signal(S),在P2的S2语句前wait(S),这样就能够实现一个异步进程之间的同步关系
    • 通过多个信号量,可以实现多个进程之间的同步

1.4.3 管程

  • 信号量机制方便有效,但是访问临界资源的同时,进程需要自己进程signal和wait,大量的同步操作会分散到各个进程当中
  • 管程:由代表共享资源的数据结构以及由该共享数据结构实施操作的一组过程所组成的资源管理程序,共同构成了一个操作系统管理模块,称之为管程
  • 管程的组成部分
    • 管程名称
    • 局部于管程的共享数据结构说明
    • 对于该数据结构进行操作的一组过程
    • 对于局部于管程的共享数据设置初始值的语句
  • 管程包含了面向对象的思想,它将表征共享资源的数据结构及其对数据结构操作的一组过程,包括同步机制,都集中并封装在一个对象内部,隐藏了内部的实现细节。管程内部的数据结构只有封装于管程内部的过程能够访问,管程外的过程都不能访问它;封装于内部的过程也只能访问管程内的数据结构
  • 所有的进程要访问临界资源时,通过管程实现间接访问,管程每次只允许一个进程进入管程执行管程内部的过程,从而实现了进程的互斥访问

1.5 进程通信

进程通信指的是进程之间信息的交换。

  • 进程的互斥和同步也需要在进程之间交换一定的信息,一般归结为低级的进程通信,其具备以下特点:
    • 效率低
    • 不方便,OS为进程提供了共享存储器进行进程通信,但相关共享数据结构设计、数据传送、进程的互斥和同步必须由程序员去实现
  • 在进程之间需要传送大量的数据时,应当利用OS提供的高级通信工具
    • 使用方便,OS隐藏了进程通信的具体细节,向用户提供了一组用于实现高级通信命令的原语
    • 高效地传输大量数据

1.5.1 进程通信的类型

  • 1.共享存储器系统

    • 基于共享数据结构的通信方式:各个进程公用某些数据结构来实现进程之间的数据交换,仅适用于传递少量的数据,通信效率低下,属于低级通信
    • 基于共享存储区的通信方式:在内存中划出一块共享存储区域,诸进程可通过对该共享区的读或写交换信息,实现通信,数据的形式、位置以及访问方式都是由进程负责。进程需要在通信前向系统申请获得共享存储区的一个分区,将其附加到自己的地址空间中,对其中的数据进行正常读写,完成后将这块区域归还给共享存储区
  • 2.管道通信系统

    • 管道:用于连接一个读进程和一个写进程实现它们之间通信的一个共享文件
    • 写进程以字符流的形式将大量的数据送入管道
    • 读进程从管道中接收数据
    • 为了协调双方的通信,管道必须具备以下三方面的协调能力:
      • 互斥,一个进程在对pipe进行读写时,其他进程必须等待
      • 同步,写进程写入一定量数据后不能继续写,需要等待读进程读取;读进程读空管道后也不能继续读,需要等待写进程写入
      • 确定对方是否存在,存在才进行通信
  • 3.消息传递系统

  • 进程将通信的数据封装到消息(message)中,利用操作系统提供的一组通信命令(原语),在进程之间进行消息传递,完成进程的数据交换,按照实现方式的不同,可以分为两大类

    • 直接通信方式:发送进程利用OS所提供的发送原语,直接将消息发送给目标进程
    • 间接通信方式:发送和接收进程,都通过中间实体(邮箱)的方式进行消息的发送和接收
  • 4.客户机-服务器系统

  • 是主要用于网络环境下的主流的双向通信实现机制

    • 套接字:一个通信标识类型的数据结构,包含了通信目的地址、通信使用的端口号、通信网络的传输层协议、进程所在的网络地址以及针对客户或服务器程序提供的不同系统调用(API)等,是进程通信和网络通信的基本构建。通常分为两类:
      • 基于文件型:通信进程处于同一机器的环境下,一个套接字关联到一个特殊的文件,通信双方通过对这个特殊的文件的读写进行通信
      • 基于网络型:通信双方进程运行在不同的主机的网络环境下,被分配了一对套接字,一个属于接收者进程(服务器端),一个属于发送进程(客户端)。发送者需要知道接收者,接收进程通过监听端口等待客户请求,一旦收到请求,就接受来自发送进程的连接,建立连接后,双方实现通信,通信结束时,系统通过关闭进程的套接字撤销连接
    • 远程过程调用和远程方法调用:调用RPC(Remote Procedure Call)这个通信协议,用于通过网络连接的系统。该协议允许一台主机上的进程调用另一台主机上的进程,对于程序元来说是常规的过程调用,不需要为此编程。当涉及到面向对象编程的时候,远程过程调用被称为远程方法调用

2、线程

进程的提出解决了在单处理机环境下的程序并发执行问题,提高资源的利用率和系统的吞吐量,线程的提出是为了提高程序并发执行的程度,减少程序在并发执行时所付出的时空开销,使OS具有更好的并发性。 线程是资源调度、任务运行的基本单位。

  • 程序并发执行的时空开销
    • 创建进程,分配其必须的、除处理机以外的所有资源
    • 撤销进程,系统在撤销进程时,必须对其之前占有的资源进行回收操作,然后再撤销PCB
    • 进程切换,对进程进行上下文切换的时候,需要保留当前进程的CPU环境,设置新选中进程的CPU环境 由于进程是一个资源的拥有者,因而在创建、撤销和切换中,系统必须为之付出较大的时空开销,这就限制了系统中设置的进程的数据,而且进程切换也不宜过于频繁,从而限制了并发调度的进一步提高。对于后面出现的多处理器、多核处理器来说,如果只有进程会很受限制,引入线程,将线程作为调度和分派的基本单位,可以有效改善多处理器系统的性能。

2.1 线程和进程的比较

线程由于具备许多传统进程所具有的特征,也叫轻型进程或进程元

  • 调度的基本单位

    • 传统OS中,进程是独立调度和分派的基本单位,进程能够独立运行,每次调度都需要进行上下文切换,开销较大
    • 引入线程后,线程是调度和分派的基本单位,线程能够独立运行,线程切换的时候只需要保存和设置少量的寄存器内容,切换代价低于进程。同一进程中线程的切换不会让进程切换,从一个进程的线程切换到另一个进程的线程时,会引起进程的切换
  • 并发

    • 引入线程的OS中,不仅不同进程之间可以并发执行,且在一个进程的多个线程之间也可以并发执行,甚至一个进程内的所有线程都能并发执行,不同进程之间的线程也能够并发执行
  • 拥有资源

    • 进程可以拥有资源,并且作为系统中拥有资源的一个基本单位
    • 线程本身不拥有系统资源,仅有一点必不可少的、能够保证线程独立运行的资源
      • 控制线程运行的线程控制块TCB
      • 指示被执行命令序列的程序计数器
      • 保留局部变量、少数状态参数和返回地址等一组寄存器和堆栈
  • 独立性

    • 同一进程的不同线程之间的独立性要远远低于不同进程之间的独立性
    • 进程之间的独立性是高的,每个进程都会有自己的地址空间和其他资源,不允许其他进程访问
    • 同一进程中的线程为了提高并发性以及提高相互之间的合作,是共享进程的内存地址空间和资源的,一个线程可以访问同一进程下的其他线程的堆栈
  • 系统开销

    • 创建或撤销一个进程时,系统都要为其分配和回收进程控制块,分配或回收其他资源,如内存空间和I/O设备等,线程的创建或撤销所付出的开销要明显更小
    • 进程切换时,涉及到上下文之间的切换,同一进程下的线程之间的切换代价远低于进程
  • 支持多处理器

    • 传统的进程是单线程进程,即便是在多处理器的系统当中,一个进程只能跑在一个处理器上
    • 对于多线程的进程,一个进程的多个线程可以分配到不同的处理器上来执行,将会加速进程的完成

2.2 线程的状态

  • 执行状态:线程获得处理机正在运行
  • 就绪状态:线程已经具备了执行条件,只需要获得CPU就可以再次执行
  • 阻塞状态:线程因为某个事件受阻而处于暂停状态

2.3 线程的数据结构TCB

系统为每个线程配置了一个线程控制块TCB,将所有用于控制和管理进程的信息记录在线程控制块当中,包含的信息有

  • 线程标识符
  • 一组寄存器,包括程序计数器PC,状态寄存器和通用寄存器的内容
  • 线程运行状态
  • 线程优先级别
  • 线程专有存储区,用于存放线程切换时候的现场信息
  • 信号屏蔽,对于某些信号加以屏蔽
  • 堆栈指针

2.4 多线程OS中进程的属性

  • 进程是一个可拥有资源的基本单位
  • 多个线程可以并发执行
  • 进程不再是可以执行的实体

3、总结,什么是进程?什么是线程

  • 进程
    • 进程最开始是为了让单个处理器能够实现程序的并发执行而提出来的概念,在多线程的操作系统当中,进程是资源分配的一个基本单位
    • 进程实体由程序段、数据段和操作系统提供的数据结构PCB组成,称呼进程实体的运行为进程
    • 一个程序启动后,系统为其分配到相应的内存空间,一些其他的资源,然后申请到相应的数据结构PCB,向里面写入相关信息,将其放入的就绪队列当中,这就开启了一个进程
    • 相较于程序,进程是一个动态的概念,具备生命周期,由创建而产生,由调度而执行,由撤销而消亡
    • 并发性,多个进程实体同时存在于内存当中,在一段时间内能够同时运行
    • 异步性,每个进程都在以不可预知的速度向前推进,每个进程也会因为调度或者阻塞等状态的切换断断续续
    • 进程同步,一个是进程之间需要访问同一资源或者数据,需要进行互斥访问,所以会等待,一个是进程之间需要协调配合,比如一个进程的输入依赖于另一个进程的输出,所以虽然进程是异步的但需要进行同步,同步方式有:
      • 硬件同步机制
        • 关中断
        • TS指令
        • Swap指令
      • 信号量机制
        • 整形信号量
        • 记录型信号量
        • And型信号量
        • 信号量集
      • 管程
    • 进程通信
      • 信号量
      • 共享存储器系统
        • 共享数据结构
        • 共享存储区,需要传递信息的时候从内存的共享存储区申请,将其加入自己的区域,写完后进行归还
      • 管道,以文件作为管道,连接一个读进程和写进程,需要进行互斥和同步
      • 消息传递系统,将信息封装成message,通过操作系统的命令来在进程之间进行消息的传递
        • 直接消息传递:原语
        • 间接消息传递:邮箱
      • 客户机服务器系统
        • 套接字
        • 远程过程调用和远程方法调用,RPC通信协议
  • 线程
    • 线程的引入是为了提高系统的并发程度,同时提高多处理器和多核处理器的工作效率
    • 引入线程概念以前,进程可以看做一个线程,也可以看成进程下面只有一个线程,进程是分配资源和调度的基本单位,线程也叫做轻型进程,引入线程之后,进程变成了资源分配的基本单位,线程是调度和任务执行的基本单位,同一进程下的线程共享进程分配到的资源
    • 线程提高的并发在于,同一进程下开启多个线程之后,可以在多个处理器下并发执行,不同的进程之间线程也可以并发执行
    • 开销上,同一进程下的线程之间切换不怎么耗费资源,而进程之间切换非常耗费资源
    • 一个线程由操作系统规定的数据结构TCB,程序计数器和寄存器内容以及堆栈组成,不拥有系统资源,只保留了保障自己能够运行的最少资源
    • 同一进程下的线程共享进程分配到的空间,独立性比较差

4、其他

  • CPU计算速度隔着18个月翻一番 摩尔定律 芯片5nm
  • 多个CPU的组合
  • 多核CPU
  • 线程撕裂,超线程 CPU中一个运算器 多组寄存器和程序计数器 线程切换的时候不需要用缓存

CPU和内存之间加了多层缓存,CPU每次都从离它最近的缓存里面去读取数据,一般有3层,CPU内有L1、L2两层,内存和CPU之间也有缓存L3

保护线程,恢复线程。

每个线程调入CPU执行后,会分配到一个时间片,这段时间CPU跑这个线程,时间片用完之后这个线程还没有结束的话,需要对线程暂时保存,寄存器和程序计数器缓存到cache里,之后这个线程再次被分配到时间片的时候,就可以从上次暂停的地方继续。

  • 缓存命中 CPU每次都会从离它最近的缓存里面读取数据,如果缓存里有,那么命中了,如果缓存没有,那么可能去内存里面拿,这个是没有命中,然后这个命中率和调度的块的大小有关,一个数组,他们是相关的,没有必要一个一个从内存读到CPU,可以把全部都送到缓存里,这时候命中率就高,但是每次送到缓存的数据都很大就会让这个等待的时间变长,一个缓存行64字节

  • 页面置换算法

    • FIFO 先进先出
    • LRU 最近最久未使用 按时间排序,最近使用的换出优先级最低,距离上次使用时间最近的换出优先级别最高1
    • LFU 最少使用: 统计一段时间内的页面的使用频数,使用频数最多的优先级最低,使用频数最少的优先级最高,间隔一段时间,对于页面内缓存的内容的使用频数进行更新
  • 线程数是否越多越好 不是,线程之间切换需要消耗资源,线程数量越多花在切换线程的时间也会更多

  • 单核CPU设置为多线程有意义吗 有意义,线程有IO(网络请求的发送、网络请求接收的过程)、计算两个时间点,只有计算的时间才需要用到CPU,可以在IO的时间将其他的线程切换进来进行计算,这样CPU的利用率会更充分

  • 缓存一致性协议 一个缓存行64个字节,假如两个变量存储在同一缓存行,两个变量分别被两个线程访问修改,由于缓存一致协议,一个线程在修改了自己缓存里的该变量时,需要告知另一个线程缓存变量被修改了。为了提高效率,可以通过其他变量凑数,让原先两个变量处于同一缓存行,变为两个变量各一个缓存行,两边的线程修改时就不需要通知对方的缓存

  • 一个线程池内的线程数应该设多少