一、现代计算机的基石:冯诺依曼体系

现代的计算机 ,大多遵守冯诺依曼体系结构。这个体系主要包括输入设备存储器输出设备运算器控制器这五个部分,其中运算器和控制器共同组成了中央处理器(CPU)

冯·诺依曼(John von Neumann),他在现代计算机、博弈论、核武器和生化武器等领域都做出了卓越贡献,被后人称为 “现代计算机之父” “博弈论之父”。
在这里插入图片描述

(一)各组件的功能与特点

  1. CPU(中央处理器):作为计算机的“大脑”,CPU主要负责进行算术运算逻辑判断
    CPU两个重要指标:
    • CPU的频率:分为基频和睿频,频率越高,计算速度越快
    • CPU的核心数:CPU核心数越多,效率越高
  2. 存储器:存储器分为外存内存, 用于存储数据,并且计算机中的数据都是以二进制方式存储的。
    • 内存的访问速度较快,但断电后数据会丢失;
    • 外存(硬盘、U盘)的存储容量较大,数据可以长期保存,但访问速度相对较慢。
    • 存储空间方面,硬盘的容量通常远大于内存,而CPU内部的缓存容量则更小,三者的关系可以表示为:硬盘 > 内存 >> CPU
    • 数据访问速度方面,CPU内部缓存的速度最快,其次是内存,硬盘的速度最慢,即:CPU > 内存 > 硬盘
  3. 输入设备:常见的有键盘、鼠标、扫描仪、麦克风。
  4. 输出设备:常见的输出设备有显示器、打印机、音箱。

(二)数据流、指令流与控制流

在这里插入图片描述

在冯诺依曼体系中,计算机的工作过程伴随着数据流指令流控制流的流动。

  • 数据流:计算机中数据的传输和处理过程,例如我们在编辑文档时,输入的文字数据会经过内存传递到CPU进行处理,处理后的结果再传递回内存,最后通过显示器输出。

  • 指令流:计算机中指令的执行序列,计算机通过逐条执行指令来完成相应的任务。每条指令都包含操作码操作数

    • 操作码:计算机要执行的操作,例如加法、减法、移动数据
    • 操作数:指示操作的对象,包括数据的地址、寄存器编号。
  • 控制流:对指令流和数据流的控制和协调,由控制器来完成。控制器根据指令的要求,控制计算机各个组件之间的协调工作,确保指令能够按照正确的顺序执行,数据能够准确地传输和处理。

二、逻辑门

门电路是一种基本的逻辑电路,能够实现1位(bit)的基本逻辑运算,常见的门电路包括非门(NOT GATE)、与门(AND GATE)、或门(OR GATE)和异或门(XOR GATE)等。

1. 非门(NOT GATE)

非门的功能是对输入信号进行取反操作,即输入为TRUE时,输出为FALSE;输入为FALSE时,输出为TRUE。它的结构相对简单,通过一个电子开关和接地线等组件就可以实现。
在这里插入图片描述
非门的真值表:

输入 输出
1 0
0 1

2. 与门(AND GATE)

与门需要两个输入信号,只有当两个输入信号都为TRUE时,输出才为TRUE;否则,输出为FALSE
在这里插入图片描述
与门的真值表:

输入1 输入2 输出
1 1 1
1 0 0
0 1 0
0 0 0

3. 或门(OR GATE)

或门只要其中一个输入信号为TRUE,输出就为TRUE;只有当两个输入信号都为FALSE时,输出才为FALSE在这里插入图片描述
或门的真值表如下:

输入1 输入2 输出
1 1 1
1 0 1
0 1 1
0 0 0

4. 异或门(XOR GATE)

异或门的逻辑是:当两个输入信号不同时,输出为TRUE;当两个输入信号相同时,输出为FALSE。它可以通过与门、非门和或门等基本门电路组合而成。

在这里插入图片描述
异或门的真值表:

输入1 输入2 输出
1 1 0
1 0 1
0 1 1
0 0 0

在实际应用中,异或门常用于数据加密、校验等场景。

例如,在数据传输过程中,我们可以通过异或运算对数据进行加密,接收方再通过相同的异或运算对数据进行解密,从而保证数据的安全性。

门电路是计算机中逻辑运算的基础,通过将这些基本的门电路进行不同的组合,可以构建出更复杂的逻辑组件,如加法器、乘法器、寄存器等,为计算机的运算和存储功能提供支持。

三、算术逻辑单元(ALU)

算术逻辑单元是计算机中进行算术运算和逻辑运算的核心部件,相当于计算机的“数学大脑”。

算术单元:实现数字运算

算术单元负责计算机里的所有数字操作,如四则运算等。

1. 半加器(Half Adder)

半加器用于进行两个1位数的相加,它有两个输入(A和B)和两个输出(进位和和)。其工作原理是通过异或门实现“和”的计算,通过与门实现“进位”的计算。

半加器的真值表:

A B 进位
0 0 0 0
0 1 0 1
1 0 0 1
1 1 1 0

例如当A=1,B=1时,异或门的输出(和)为0,与门的输出(进位)为1
在这里插入图片描述

2. 全加器(Full Adder)

半加器只能处理两个1位数的相加,无法处理来自低位的进位。而全加器可以进行三个1位数的相加,这三个数分别是两个加数(A和B)以及来自低位的进位(C)。全加器有三个输入(A、B、C)和两个输出(进位,和)。

全加器可以通过两个半加器和一个或门来构建:

  1. 用一个半加器对A和B进行相加,得到一个中间和和一个中间进位;
  2. 用另一个半加器将中间和与来自低位的进位C进行相加,得到最终的和;
  3. 用或门将两个中间进位进行或运算,得到最终的进位。

全加器的真值表:

A B C 进位
0 0 0 0 0
0 0 1 0 1
1 0 0 0 1
0 1 1 1 0
1 1 0 1 0
1 0 1 1 0
1 1 1 1 1

在这里插入图片描述

逻辑单元:实现逻辑操作

逻辑单元主要用来进行逻辑操作,最基本的操作包括与、或、非操作,同时也可以进行多位数字的比较等复杂逻辑运算。

以8位数非0判断器为例:

在这里插入图片描述
8位非0判断器的功能是判断一个8位二进制数是否为0,如果不为0,则输出TRUE;如果为0,则输出FALSE。

构建方法:先将A7和A6通过或门连接,其输出再与A5通过或门连接,以此类推,直到最后与A0通过或门连接,最终的或门输出就是判断结果。

逻辑单元在计算机中有着广泛的应用,在程序的条件判断(if-else语句)、循环控制(for循环、while循环)等方面,都需要逻辑单元进行逻辑运算,以确定程序的执行流程。

五、控制单元(CU)与指令执行

控制单元主要功能是根据程序中的指令,产生相应的控制信号,协调和控制计算机的各个部件按照正确的顺序执行操作,以完成指令所规定的任务。

为了能够有序地执行程序中的指令,控制单元需要借助程序计数器(PC,Program Counter)和指令寄存器(IR,Instruction Register)这两个重要的寄存器。
在这里插入图片描述

1. 程序计数器(PC)

程序计数器用于保存下一条要执行的指令在内存中的地址

在计算机启动时,程序计数器会被初始化为程序入口地址(即程序中第一条指令的地址)。当一条指令被取出来并开始执行后,程序计数器会自动递增,指向当前指令的下一条指令的地址,从而保证程序能够按照指令的顺序依次执行。

2. 指令寄存器(IR)

指令寄存器用于保存当前正在执行的指令

当控制单元根据程序计数器的值从内存中取出一条指令后,会将这条指令存入指令寄存器中,然后对指令进行解码和分析,确定指令的操作码和操作数,进而产生相应的控制信号,指挥各个部件执行指令所规定的操作。

在指令执行过程中,指令寄存器中的指令保持不变,直到下一条指令被取出并存入指令寄存器中。

指令的组成与类型

指令是指导CPU进行工作的命令,它是计算机能够理解和执行的最小操作单位。一条完整的指令通常由操作码(opcode)和操作数(operand)两部分组成。

1. 操作码(opcode)

操作码用于表示指令要执行的操作类型,例如加法、减法、乘法、除法、数据移动、逻辑运算、跳转等。不同的操作码对应不同的操作,CPU通过识别操作码来确定要执行的操作。

操作码的位数决定了指令系统中可以包含的指令种类数量,例如4位操作码可以表示2⁴=16种不同的操作。

2. 操作数(operand)

操作数是指令要操作的数据或数据的地址,它指示了指令执行过程中所需要的具体数据来源或结果的存放位置。

操作数构成:

  • 立即数:直接包含在指令中的数据
  • 寄存器编号:表示操作数存放在某个寄存器中
  • 内存地址:表示操作数存放在内存的某个地址单元中。

根据操作数的数量,指令可以分为零操作数指令、一操作数指令、二操作数指令和三操作数指令等。

3. 常见指令类型

  • LOAD指令:用于将数据从内存加载到寄存器中。
    例如:LOAD_A 1110 其中LOAD_A是操作码,表示将数据加载到A寄存器中;1110是操作数,表示内存地址(这里1110是4位二进制数,对应十进制的14),这条指令的功能是将内存地址14中的数据加载到A寄存器中。
  • STORE指令:用于将寄存器中的数据写入内存中。
    例如:STORE_A 1101,其中STORE_A是操作码,表示将A寄存器中的数据写入内存中,1101是操作数,表示内存地址(对应十进制的13),这条指令的功能是将A寄存器中的数据写入内存地址13中。
  • ADD指令:用于进行加法运算。
    例如,ADD 01 00指令,其中ADD是操作码,表示进行加法运算,01和00是操作数,分别表示两个寄存器的编号,假设01表示B寄存器,00表示A寄存器,这条指令的功能是将A寄存器和B寄存器中的数据相加,并将结果存入B寄存器中。
  • JMP指令:用于实现程序的跳转。
    例如:JMP 0010指令,其中JMP是操作码,表示程序跳转,0010是操作数,表示跳转目标地址(对应十进制的2),这条指令的功能是将程序计数器的值修改为2,使程序下一条执行内存地址2中的指令。

指令本身也是一个数字,它以二进制形式保存在内存的某个区域中。当计算机执行程序时,控制单元会按照程序计数器的指示,从内存中依次取出指令,存入指令寄存器,然后对指令进行解码和执行。

CPU的基本工作流程:指令周期

CPU的基本工作流程是按照指令周期来进行的,一个指令周期通常包括取码阶段(Fetch Phase)、解码阶段(Decode Phase)和执行阶段(Execute Phase)三个阶段。

为了更清晰地展示CPU的工作流程,我们以一个具体的例子来进行说明。假设内存中的指令和数据如下表所示(地址从0到15,数据以8位二进制形式表示):

地址 数据
0 00101110
1 00011111
2 10000100
3 01001101
4 00000000
5 00000000
6 00000000
7 00000000
8 00000000
9 00000000
10 00000000
11 00000000
12 00000000
13 00000000
14 00000011
15 00001110

同时定义以下几条指令:

指令 功能说明 4位opcode 操作的地址或者寄存器
LOAD_A 从RAM的指定地址,将数据加载到A寄存器 0010 4位RAM地址
LOAD_B 从RAM的指定地址,将数据加载到B寄存器 0001 4位RAM地址
STORE_A 将数据从A寄存器写入RAM的指定地址 0100 4位RAM地址
ADD 计算两个指定寄存器的数据的和,并将结果放入第二个寄存器 1000 2位的寄存器ID,2位的寄存器ID

初始状态下,寄存器A和寄存器B的值都为0,程序计数器(PC)的值为0,指令寄存器(IR)为空。

在这里插入图片描述

1. 取码阶段(Fetch Phase)

在取码阶段,控制单元(CU)根据程序计数器(PC)的值,从内存中取出对应的指令,并将其存入指令寄存器(IR)中,同时将程序计数器的值递增,为取下一条指令做好准备。

在这里插入图片描述

在我们的例子中,初始时PC的值为0,控制单元根据PC的值(0),从内存地址0中取出数据00101110,并将其存入指令寄存器(IR)中。此时,IR中的值为00101110,PC的值递增为1。

2. 解码阶段(Decode Phase)

在解码阶段,控制单元对**指令寄存器(IR)**中的指令进行解码,分析指令的操作码和操作数,确定指令要执行的操作以及操作数的来源或去向。

在这里插入图片描述

对于IR中的指令00101110,我们将其拆分为4位操作码4位操作数(因为LOAD_A指令的操作码是4位,操作数是4位RAM地址)。操作码为0010,通过查询指令表可知,0010对应的指令是LOAD_A,功能是从RAM的指定地址将数据加载到A寄存器;操作数为1110,将其转换为十进制是14,即RAM的地址为14。

3. 执行阶段(Execute Phase)

在执行阶段,控制单元根据解码阶段得到的信息,产生相应的控制信号,指挥各个部件执行指令所规定的操作。

在这里插入图片描述

在这个例子中,指令是LOAD_A 14,控制单元会向内存发出控制信号,要求从内存地址14中读取数据。内存地址14中的数据是00000011,将其传输到A寄存器中,此时A寄存器的值变为00000011(对应十进制的3)。
在这里插入图片描述

至此,第一条指令(LOAD_A 14)的执行周期完成。接下来,CPU会按照同样的流程执行下一条指令,此时PC的值为1,控制单元从内存地址1中取出指令00011111,存入IR中,然后进行解码和执行。

通过这个例子,我们可以看到CPU的基本工作流程是一个不断循环的过程:取码→解码→执行→取码→解码→执行……直到程序执行完毕(遇到停机指令)或出现异常情况。
在这里插入图片描述
需要注意的是,在电子计算机中,CPU的指令周期是由一个时钟来驱动的。

CPU主频:时钟的振荡每秒次数,可以近似地看作CPU每秒执行的指令数。时钟频率越高,CPU的运算速度通常越快,但这并不是绝对的,因为CPU的运算速度还受到指令的复杂度、流水线技术的应用、缓存的大小等因素的影响。

六、编程语言的发展

CPU只能识别和执行二进制形式的指令。但对于人类来说,直接使用二进制指令进行编程是非常困难和繁琐的,因此编程语言应运而生。

编程语言的发展经历了从机器语言汇编语言,再到高级语言的过程。

(一)程序

所谓程序,就是一组指令以及这组指令要处理的数据。

狭义上来说,程序通常表现为一组文件,这些文件中保存着程序的指令和数据。例如我们在计算机上安装的各种软件,如办公软件、游戏程序、浏览器等,都是由程序组成的。

以Java开发环境(JDK)为例,JDK是由多个程序组成的,其中bin文件夹下的exe文件(如java.exejavac.exe等)可以粗略地认为是按照规定格式保存的指令文件,这些文件中包含了Java程序运行和编译所需的各种指令。

(二)早期编程:机器语言

在计算机发展的早期,还没有编程语言,程序员需要直接使用二进制指令来编写程序。机器语言是计算机能够直接识别和执行的语言,它由一系列0和1组成的指令构成。

这种编程方式非常繁琐、容易出错,而且可读性极差,一旦程序出现错误,排查和修改都非常困难。同时,由于不同计算机的指令系统不同,为一种计算机编写的机器语言程序无法在另一种计算机上运行,程序的可移植性非常差。

Altair 8800是最早的一批微型电脑之一,用户需要控制开关,一个一个bit地将程序录入到电脑中,这就是早期机器语言编程的真实写照。

(三)汇编语言

为了克服机器语言编程的困难,汇编语言应运而生。汇编语言是一种面向机器的编程语言,它用助记符(LOAD_A、ADDSTORE_A)来代替机器语言中的二进制指令,用符号地址来代替内存地址或寄存器编号。

汇编语言与机器语言是一一对应的,每一条汇编语言指令都对应一条机器语言指令。程序员使用汇编语言编写程序后,需要使用汇编器(assembler)将汇编语言程序翻译成机器语言程序,计算机才能执行。

相比机器语言,汇编语言具有以下优点:

  1. 可读性好:助记符和符号地址更符合人类的思维习惯,更容易理解和记忆,程序的可读性大大提高。
  2. 易于调试和修改:由于程序的可读性提高,当程序出现错误时,排查和修改都更加方便。

但汇编语言也存在一些缺点:

  1. 面向机器:汇编语言依赖于具体的计算机指令系统,不同计算机的汇编语言语法和指令不同,程序的可移植性差。
  2. 需要了解硬件细节:程序员需要熟悉计算机的硬件结构,如寄存器的数量和用途、内存的地址空间等,编程门槛较高。

(四)高级语言

随着计算机技术的发展和应用需求的不断增加,汇编语言已经无法满足大规模、复杂程序的开发需求。为了进一步提高编程效率,屏蔽硬件细节,让程序员能够专注于业务逻辑的实现,高级语言应运而生。

高级语言是一种面向问题或面向对象的编程语言,它独立于具体的计算机硬件,具有更接近人类自然语言的语法和结构,更容易学习和使用。常见的高级语言有CC++JavaPythonC#等。

以C语言为例,程序员使用C语言编写程序后,需要经过编译(compile)和链接(link)两个过程将其转换为机器语言程序。

首先,编译器(compiler)将C语言源程序翻译成汇编语言程序;然后,汇编器将汇编语言程序翻译成目标代码(机器语言程序);最后,链接器(linker)将目标代码与其他相关的目标代码(如库函数的目标代码)链接在一起,生成可执行程序

高级语言具有以下优点:

  1. 屏蔽硬件细节:程序员不需要了解具体的计算机硬件结构,只需关注业务逻辑的实现,降低了编程门槛。
  2. 可移植性好:高级语言程序通常可以在不同的计算机平台上运行,只需进行少量的修改或重新编译(具体取决于编程语言和编译器的支持)。
  3. 编程效率高:高级语言具有丰富的语法结构和库函数,能够快速实现复杂的功能,大大提高了编程效率。

高级语言的缺陷:高级语言程序翻译成的机器语言程序通常比汇编语言程序或机器语言程序的执行效率低,代码体积大。但随着编译器技术的不断发展,高级语言程序的执行效率已经越来越接近汇编语言程序。

Java语言相对于C语言更高级一些,它采用了虚拟机(JVM)的技术,Java程序首先被编译成字节码(bytecode),然后由JVM将字节码翻译成机器语言程序并执行。这种方式使得Java程序具有更好的可移植性,可以在任何安装了JVM的计算机平台上运行,而不需要重新编译。

七、操作系统

随着计算机硬件的不断发展和软件的日益复杂,计算机系统中需要管理的资源越来越多,如CPU、内存、外存、输入输出设备等。为了有效地管理这些资源,提高计算机的利用率和易用性,操作系统(Operating System,OS)应运而生。操作系统是一组管理计算机资源的软件的统称,它是计算机硬件和应用程序之间的桥梁,为应用程序提供了一个良好的运行环境。

(一)常见的操作系统

目前,常见的操作系统有很多种,根据应用场景的不同,可以分为桌面操作系统、服务器操作系统、移动操作系统等。

  1. 桌面操作系统:主要用于个人计算机(PC),为用户提供图形化的操作界面,方便用户进行办公、娱乐、学习等活动。
    常见的桌面操作系统有Windows系列、macOS系列、Linux系列。
  2. 服务器操作系统:主要用于服务器,为Web服务器、数据库服务器、邮件服务器等服务器应用程序提供稳定、高效的运行环境。
    常见的服务器操作系统有Windows Server系列、Linux系列(CentOS、Red Hat Enterprise Linux)、Unix系列(Solaris、AIX)等。
  3. 移动操作系统:主要用于智能手机、平板电脑等移动设备,为移动应用程序提供运行环境,支持触摸操作、移动网络等功能。
    常见的移动操作系统有Android系列、iOS系列、鸿蒙操作系统。

(二)操作系统的定位与分层视图

从计算机系统的分层结构来看,操作系统位于应用程序和计算机硬件之间,它向下管理计算机硬件资源,向上为应用程序提供服务。计算机系统的分层视图如下:
在这里插入图片描述

  1. 应用程序层:包括各种用户使用的软件,如Word、Excel、PowerPoint等办公软件、游戏程序、浏览器、聊天软件等。应用程序通过操作系统提供的接口来调用计算机硬件资源,实现各种功能。
  2. 操作系统层:负责管理计算机的硬件资源,为应用程序提供统一的、抽象的接口,协调应用程序之间的资源分配和调度,确保计算机系统的稳定、高效运行。
  3. 硬件层:计算机的各种硬件设备,包括处理理器(CPU)、主存(内存)、输入输出设备、外存等。

操作系统的主要作用是将复杂的硬件操作抽象为简单的接口,提供给应用程序使用,使得应用程序开发者不需要了解具体的硬件细节,就能够开发出能够在不同硬件平台上运行的应用程序。同时,操作系统还负责管理和分配硬件资源,避免多个应用程序之间因争夺资源而产生冲突,提高资源的利用率。

(三)操作系统的基本功能

操作系统具有多种功能,其中最基本、最重要的功能包括以下两个方面:

  1. 防止硬件被失控的应用程序滥用
    在计算机系统中,多个应用程序可能会同时运行,如果没有操作系统的管理,这些应用程序可能会随意访问和修改计算机的硬件资源,导致系统崩溃或数据丢失。操作系统通过引入进程、内存保护等机制,对应用程序的行为进行限制和监控,防止应用程序滥用硬件资源。

  2. 向应用程序提供简单一致的机制来控制复杂而又通常大相径庭的低级硬件设备
    不同的计算机硬件设备(如不同品牌、不同型号的显卡、声卡、打印机等)其硬件结构和工作原理可能存在很大的差异,如果应用程序需要直接控制这些硬件设备,就需要了解各种硬件设备的细节,这会给应用程序开发带来很大的困难。

(四)进程/任务(Process/Task)

每个应用程序运行于操作系统之上时,操作系统会提供一种抽象,好像系统上只有这个程序在运行,所有的硬件资源都被这个程序在使用。这种假象是通过抽象了一个进程的概念来完成的,进程可以说是计算机科学中最重要和最成功的概念之一。

1. 进程的定义

进程是操作系统对一个正在运行的程序的一种抽象,换言之,可以把进程看做程序的一次运行过程;同时,在操作系统内部,进程又是操作系统进行资源分配的基本单位

一个程序可以对应多个进程,例如,我们可以同时打开多个浏览器窗口,每个浏览器窗口都是一个独立的进程,它们都运行着同一个浏览器程序。每个进程都有自己独立的内存空间、寄存器状态、程序计数器等,进程之间的资源是相互独立的,一个进程的运行不会影响其他进程的运行(除非通过进程间通信机制进行交互)。

2. 进程控制块(PCB,Process Control Block)

计算机内部要管理任何现实事物,都需要将其抽象成一组有关联的、互为一体的数据。在操作系统中,进程也被抽象为进程控制块(PCB)。PCB是一个数据结构,用于存储进程的相关信息,操作系统通过PCB来管理和控制进程。

(五)CPU分配——进程调度(Process Scheduling)

在单CPU单核的计算机系统中,同一时间只能有一个进程在CPU上运行。为了提高CPU的利用率,让多个进程能够并发执行,操作系统采用进程调度机制,对CPU资源进行合理的分配。

操作系统对CPU资源的分配采用的是分时复用,即不同的进程在不同的时间段内使用CPU资源。操作系统会为每个进程分配一个时间片(Time Slice),当一个进程的时间片用完后,操作系统会暂停该进程的运行,将其从运行态变为就绪态,然后从就绪队列中选择另一个进程,为其分配CPU资源,使其开始运行。这个过程称为进程切换(Process Switching)。

  • 在一个CPU核心上,按照分时复用,执行多个进程,称为“并发执行”。在人的视角看起来是同时执行,微观上,是一个CPU在串行执行,切换速度极快。
  • 在多个CPU核心上,同时执行多个进程,称为“并发执行”,此时就是真正的同时执行。

现代CPU在运行进程时,并行和并发是同时存在的。程序猿在写代码时,无法区分这些进程是并行执行还是并发执行,所以会把并行和并发统称为并发

进程调度算法是决定如何从就绪队列中选择进程并为其分配CPU资源的策略。常见的进程调度算法有:

  1. 先来先服务(FCFS,First-Come, First-Served)调度算法:按照进程到达就绪队列的先后顺序进行调度,先到达的进程先获得CPU资源。这种算法的优点是实现简单,公平性好;缺点是可能会导致“短进程等待长进程”的情况,降低系统的整体效率。

  2. 短作业优先(SJF,Short-Job-First)调度算法:选择就绪队列中估计运行时间最短的进程先获得CPU资源。这种算法的优点是可以提高系统的吞吐量(单位时间内完成的进程数量);缺点是可能会导致“长进程饥饿”的情况,即长进程长时间无法获得CPU资源。

  3. 优先级调度算法:为每个进程分配一个优先级,选择就绪队列中优先级最高的进程先获得CPU资源。优先级可以分为静态优先级(在进程创建时确定,整个进程运行期间保持不变)和动态优先级(在进程运行过程中根据进程的实际情况动态调整)。这种算法的优点是可以根据进程的重要性进行调度;缺点是可能会导致“低优先级进程饥饿”的情况。

  4. 时间片轮转(RR,Round-Robin)调度算法:将CPU的时间划分为若干个时间片,每个进程轮流获得一个时间片的CPU使用权,当时间片用完后,无论进程是否执行完毕,都将其暂停,重新放入就绪队列,等待下一次调度。这种算法的优点是可以保证进程的响应时间,实现进程的并发执行;缺点是时间片的大小会影响系统的性能,如果时间片太小,会导致进程切换频繁,增加系统开销;如果时间片太大,会导致进程的响应时间变长。

在实际的操作系统中,通常会采用多种调度算法相结合的方式,以满足不同的应用需求。例如,在Linux操作系统中,采用的是CFS(Completely Fair Scheduler)调度算法,它是一种基于权重的公平调度算法,能够根据进程的优先级和运行时间,动态调整进程的调度权重,确保每个进程都能获得相对公平的CPU资源。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐