本篇博客简单介绍计算机的基础知识,为后续学习做个铺垫。
目录
1.1.1 运算器(Arithmetic Logic Unit,ALU)
一、计算机的基本组成
1.1 计算机组成五大部件
1.1.1 运算器(Arithmetic Logic Unit,ALU)
它也叫做也叫算数逻辑单元,完成对数据的各种常规运算,如加减乘除,也包括逻辑运算,移位,比较等。
1.1.2控制器 (Control Unit,CU)
负责从存储器中取指令,并解释这些指令以控制整个计算机系统的操作。控制器协调并控制其他各部件的工作。它是整个计算机系统的控制中心,它指挥计算机各部分协调地工作,保证计算机按照预先规定的目标和步骤有条不紊地进行操作及处理。
- 取指令(Fetch):从存储器中取出当前需要执行的指令。
- 译码(Decode):将取出的指令进行解释和翻译,以确定所需的操作。
- 执行(Execute):根据译码结果,控制ALU、存储器和输入输出设备执行相应的操作。
- 控制信号生成:生成各种控制信号,以协调各部件的工作。
1.1.3 存储器(Memory)
存储器用于存储数据和指令,是计算机的重要组成部分。存储器可以分为主存储器和辅存储器两类:
主存储器(Main Memory):
- 随机存取存储器(RAM):用于存储当前正在处理的数据和指令,速度快,但断电后数据会丢失。
- 只读存储器(ROM):用于存储固化程序或数据,断电后数据不丢失。
辅存储器(Secondary Memory):
- 硬盘(HDD)和固态硬盘(SSD):用于长期存储数据和程序,容量大,但速度相对主存储器慢。
- 光盘(CD/DVD)、U盘、磁带等:用于数据的备份和传输。
1.1.4 输入设备 (Input Devices)
输入设备用于将外界的信息输入到计算机中, 把人所熟悉的信息如,图片,声音,文字,转换为计算机能够识别的信息存储起来。常见的输入设备包括:
- 键盘:用于输入文本和命令。
- 鼠标:用于指示和选择屏幕上的项目。
- 扫描仪:将纸质文件转换为电子文件。
- 麦克风:用于音频输入。
1.1.5 输出设备
输出设备用于将计算机处理后的结果输出给用户, 把计算机机能识别的信息转换为人能识别的信息,进行呈现。,常见的输出设备包括:
- 显示器(Monitor):显示计算机的视觉输出,如文本、图像和视频。
- 打印机(Printer):将电子文档打印成纸质文档。
- 扬声器(Speakers):输出音频信号。
1.5.6 总结
一台计算机可以抽象成下图: CPU 中包含控制器和运算器, 内存就是存储器。I/O 设 备就是输入设备和输出设备,如:键盘、显示器、鼠标、硬盘、网卡。 所有设备都只能直接和内存打交道
1.2 系统总线
1.2.1 概念
计算机的系统总线是一种通信系统,用于在计算机的各个主要部件之间传输数据、地址和控制信号。总线的主要作用是实现计算机内部各部件的连接与通信,确保数据能够高效、准确地在各部件之间传输。系统总线是计算机架构中的关键组件,决定了计算机的性能和效率。
1.2.2 系统总线的组成
系统总线通常包括以下几种总线:
数据总线(Data Bus):
- 作用:用于传输数据。在CPU、内存和其他外围设备之间传输实际的数据。
- 特点:数据总线的宽度(位数)直接影响数据传输的速度。例如,32位的数据总线一次可以传输32位的数据。
地址总线(Address Bus):
- 作用:用于传输地址信息,指示数据的源地址或目的地址。
- 特点:地址总线的宽度决定了系统可以寻址的内存空间大小。例如,32位的地址总线可以寻址4GB的内存空间。
控制总线(Control Bus):
- 作用:用于传输控制信号,协调和控制计算机各部件的操作。
- 特点:控制信号包括读/写信号、中断请求信号、时钟信号等。
1.2.3 系统总线的作用
系统总线在计算机系统中起到以下主要作用:
- 数据传输:在CPU、内存和外围设备之间传输数据,是计算机执行程序和处理数据的基础。
- 地址传递:传输数据的源地址和目的地址,确保数据能够正确地读写到指定的位置。
- 控制信号传输:传输各种控制信号,以协调和控制计算机各部件的操作,确保系统按预期工作。
1.2.4 系统总线工作原理
系统总线通过一系列步骤实现数据、地址和控制信号的传输:
CPU发出指令:
- CPU通过控制总线发出控制信号,指示接下来的操作类型(读或写)。
地址传输:
- CPU通过地址总线发送数据的目标地址(对于写操作)或源地址(对于读操作)。
数据传输:
- 对于写操作,CPU通过数据总线发送数据到目标地址。
- 对于读操作,CPU通过数据总线接收来自源地址的数据。
控制信号传输:
- 在整个过程中,控制总线传输的信号协调各部件的时序,确保各操作按照预期的顺序进行。
1.3 指令
1.3.1 指令的概念
指令是程序的基本构成单位,一个程序由多条指令按照一定的顺序组成。计算机通过顺序执行这些指令来完成特定的任务。编写程序时,程序员通常使用高级编程语言,这些语言会被编译成低级的机器指令,供计算机执行。计算机的指令是特定的二进制代码,告诉计算机执行特定的操作。这些指令是计算机执行程序的基本单位,指挥处理器完成各种任务,包括算术运算、数据传输和逻辑操作等。指令通常由操作码(opcode)和操作数(operand)组成。总之,计算机指令是指挥计算机完成各种操作的基本命令,是计算机程序的基础,通过指令的组合和执行,计算机能够完成复杂的计算和处理任务。
1.3.2 指令的组成
操作码(Opcode):
- 操作码是指令中的一部分,用于指定将要执行的操作类型(如加法、减法、数据传输等)。每种操作都有一个唯一的操作码。
操作数(Operand):
- 操作数是指令中的一部分,指定操作所需的数据或数据的地址。操作数可以是直接数据、寄存器地址或内存地址。
1.3.3 指令的执行过程
指令的执行过程通常分为以下几个阶段:
取指令(Fetch):
- 从内存中读取下一条指令,并将其放入指令寄存器。
译码(Decode):
- 对取出的指令进行译码,确定指令的操作码和操作数。
执行(Execute):
- 根据译码结果,执行相应的操作,如进行算术运算、数据传输等。
存储(Store)(如果需要):
- 将执行结果存储到指定的位置(如寄存器或内存)。
1.3.4 指令集架构
指令集架构是计算机架构的一部分,定义了处理器支持的所有指令类型及其格式。常见的指令集架构包括:
CISC(Complex Instruction Set Computer):
- 特点:指令复杂,数量多,每条指令可以执行多个低级操作。
- 代表:x86架构。
RISC(Reduced Instruction Set Computer):
- 特点:指令简单,数量少,每条指令执行一个低级操作,易于流水线化处理。
- 代表:ARM架构。
1.3.5 指令与程序的关系
指令是程序的基本单元,程序是由一系列指令组成的指令序列。通过顺序执行这些指令,取指令(Fetch):从内存中读取下一条指令。译码(Decode):解释指令的操作码和操作数,确定要执行的操作。执行(Execute):执行指令所指定的操作。存储(Store),计算机完成特定任务。高级编程语言简化了程序的编写过程,编译器负责将这些程序转换为机器指令,供计算机执行。指令和程序之间的关系可以类比为建筑中的砖块和建筑物,指令是构建程序的基本元素,程序是由这些基本元素有序组合而成的完整体系。
二、操作系统
2.1 概念
操作系统(Operating System,OS)是计算机系统中的一类基础软件,负责管理计算机硬件资源,并为应用程序提供基本服务。操作系统作为计算机系统与用户之间的桥梁,协调硬件和软件资源,使得计算机能够高效、安全、稳定地运行。在整个计算机软硬件架构中,操作系统的定位是:一款纯正的“搞管理”的软件。
2.2 操作系统的主要功能
进程管理(Process Management):
- 创建和终止进程:负责创建新进程和终止已完成或出错的进程。
- 进程调度:决定哪个进程在什么时候运行,以保证系统资源的高效利用和公平分配。
- 进程同步与通信:提供机制使得进程可以同步运行和相互通信,避免资源冲突和死锁。
内存管理(Memory Management):
- 内存分配和释放:管理系统内存的分配和释放,确保每个进程都有足够的内存空间运行。
- 内存保护:防止进程非法访问其他进程的内存空间。
- 虚拟内存:通过分页或分段技术,使得系统看起来有更多的内存空间,提升系统的多任务处理能力。
文件系统管理(File System Management):
- 文件和目录管理:提供创建、删除、读取、写入和修改文件和目录的功能。
- 文件权限管理:控制用户对文件的访问权限,保证文件数据的安全性和隐私性。
- 存储设备管理:管理硬盘、SSD等存储设备的数据读写,优化存储性能。
设备管理(Device Management):
- 设备驱动程序:提供与硬件设备交互的接口,隐藏硬件细节,使应用程序可以统一地访问各种设备。
- I/O调度:优化输入输出操作的顺序和时机,提高系统的整体性能和响应速度。
用户界面(User Interface):
- 命令行界面(CLI):通过命令行与操作系统进行交互,如UNIX、Linux等操作系统的终端。
- 图形用户界面(GUI):提供图形化界面,使用户可以通过图标、窗口等直观方式与操作系统交互,如Windows、macOS等。
安全和权限管理(Security and Access Control):
- 用户认证:通过用户名和密码等方式验证用户身份。
- 权限管理:控制用户对系统资源的访问权限,防止未授权的操作。
- 安全审计:记录和监控系统活动,检测和防范安全威胁。
2.3 操作系统的类型
单用户操作系统:
- 设计用于一个用户同时使用的系统,例如MS-DOS。
多用户操作系统:
- 支持多个用户同时使用系统资源,例如UNIX、Linux、Windows Server。
实时操作系统(Real-Time Operating System,RTOS):
- 对实时应用提供快速响应和高可靠性,如VxWorks、RTEMS。
嵌入式操作系统:
- 专为嵌入式系统设计的操作系统,通常体积小、效率高,如FreeRTOS、Embedded Linux。
分布式操作系统:
- 管理和协调多个计算机系统资源,使其作为一个整体来工作,如Amoeba、Plan 9。
2.2 设计操作系统的目的
- 与硬件交互,管理所有的软硬件资源
- 为用户程序(应用程序)提供一个良好的执行环境
2.3 如何理解操作系统的管理作用
2.4 常见的操作系统
Windows:
- 由微软开发,广泛用于个人计算机和服务器,具有图形用户界面(GUI),支持广泛的硬件和软件。
macOS:
- 由苹果公司开发,专用于Macintosh计算机,基于UNIX,提供稳定的性能和友好的用户界面。
Linux:
- 开源操作系统,基于UNIX,广泛用于服务器、桌面和嵌入式系统,具有高度可定制性。
UNIX:
- 多用户、多任务操作系统,具有稳定性和安全性,广泛用于服务器和工作站。
Android:
- 基于Linux内核的移动操作系统,广泛用于智能手机和平板电脑,由谷歌开发和维护。
2.5 系统调用和库函数的概念
2.5.1 系统调用
2.5.1.1概念
系统调用是用户程序向操作系统内核请求服务的接口。用户程序通过系统调用可以访问操作系统的核心功能,如文件操作、进程控制、内存管理和网络通信等。这些功能是用户程序直接无法访问的,必须通过系统调用来实现。
2.5.1.2 作用
系统调用使得用户程序能够利用操作系统提供的底层服务和硬件资源,而不必直接操控硬件设备。它们提供了一种受控和安全的方式来执行特权操作。
2.5.1.3 特点
- 内核模式与用户模式:系统调用涉及从用户模式切换到内核模式,因为系统调用需要访问受保护的内核资源。
- 中断机制:通常,系统调用是通过触发软件中断(例如x86架构中的
int 0x80
或syscall
指令)来实现的,这使得CPU从用户模式切换到内核模式。- 性能开销:由于模式切换和内核执行的开销,系统调用比普通函数调用慢。
2.5.1.4 举例
以Linux为例,打开文件的系统调用可能如下:
int fd = open("/path/to/file", O_RDONLY);
在内核中,open
系统调用最终会触发一个软件中断,让内核代码来处理这个请求。
2.5.2 库函数
2.5.2.1 概念
库函数是指在程序库中定义的函数,提供应用程序开发中常用的功能,如字符串操作、数学计算、输入输出等。库函数通常运行在用户模式下,不需要进入内核模式。
2.5.2.2 作用
库函数使得开发者可以重用代码库中已有的功能,而不必从头实现这些功能。这提高了开发效率和代码的可维护性。
2.5.2.3 特点
- 用户模式:库函数在用户模式下运行,不涉及内核模式切换。
- 性能:由于库函数不涉及内核模式切换,调用开销通常比系统调用小。
- 实现:库函数可以是标准库(如C标准库中的
printf
、strlen
等)或者第三方库。
2.5.3 系统调用和库函数的区别
执行模式:
- 系统调用:涉及用户模式到内核模式的切换。
- 库函数:通常在用户模式下执行。
功能范围:
- 系统调用:提供直接访问操作系统核心功能和硬件资源的能力。
- 库函数:提供常用的编程功能,但不直接访问操作系统核心功能和硬件资源。
开销:
- 系统调用:由于涉及模式切换和内核执行,开销较大。
- 库函数:调用开销较小,因为它们不需要模式切换。
接口:
- 系统调用:由操作系统定义,通常通过标准的API(如POSIX)来访问。
- 库函数:由程序库定义,可以是标准库函数或第三方库函数。
库函数有时会调用系统调用来完成其功能。例如,printf
库函数在最终实现文件输出时,会使用write
系统调用.
三、进程概论
操作系统的进程管理包括进程的创建、调度、同步、通信和终止。通过进程控制块(PCB)记录进程信息,操作系统能够有效地管理多个并发进程。调度算法决定进程的运行顺序,而同步和通信机制则确保进程间的协调与数据交换。进程管理的有效实施,使得操作系统能够高效、安全地运行和管理系统资源。
3.1 进程的概念
进程(Process)是操作系统中最基本的执行单元,是一个正在运行的程序实例。一个进程不仅包括可执行程序的代码,还包括程序的当前状态、所需的系统资源以及执行过程中所需的上下文信息。理解进程的概念对于掌握操作系统的工作机制至关重要。一个进程是动态的执行实体,而程序是静态的代码和数据。
通过系统调用获取进程标示符 PID:
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
printf("pid: %d\n", getpid());
printf("ppid: %d\n", getppid());
exit(0);
}
3.2 进程的组成部分
一个进程由以下几个部分组成:
1. 可执行程序代码(Text Segment)
包含程序的机器指令,是进程将要执行的代码部分。
2. 数据段(Data Segment)
包括已初始化的全局变量和静态变量。
3. 堆(Heap)
用于动态内存分配,在运行时由程序请求分配和释放。
4. 栈(Stack)
用于存储函数调用时的局部变量、参数、返回地址等。栈的大小通常是有限的,并在函数调用和返回时动态变化。
5. 进程控制块(PCB, Process Control Block)
进程控制块是操作系统用来管理进程的关键数据结构,包含进程的状态信息、调度信息、资源分配信息等。
进程控制块(PCB)
PCB是进程管理的核心数据结构,包含以下信息:
- 进程标识符(PID):唯一标识一个进程。
- 进程状态:表示进程当前所处的状态(如就绪、运行、等待、终止等)。
- 程序计数器:指向进程将要执行的下一条指令的地址。
- CPU寄存器:包括通用寄存器、程序状态字(PSW)、栈指针等。
- 内存管理信息:描述进程的地址空间布局,包括基址寄存器、限长寄存器、页表指针等。
- I/O状态信息:包括进程使用的I/O设备和打开的文件描述符。
- 账户信息:进程的资源使用情况,如CPU时间、内存使用量等。
3.3. 进程的生命周期
进程从创建到终止经历多个状态转换,这些状态包括:
1. 新建(New)
进程正在被创建,尚未进入就绪队列。
2. 就绪(Ready)
进程已准备好运行,等待被调度到CPU上执行。
3. 运行(Running)
进程正在CPU上执行指令,是唯一实际占用CPU的状态。
4. 等待(Waiting/Blocked)
进程在等待某个事件(如I/O操作完成),暂时无法继续执行。
5. 终止(Terminated)
进程已完成执行或被操作系统强制终止,正在从系统中清除。
3.2 进程的状态
3.3 进程的并发与并行
3.3.1 并发
3.3.1.1 概念
并发是指在单个处理器上通过快速切换来执行多个任务。尽管在任何时刻只有一个任务在执行,但多个任务在宏观上似乎是同时进行的。并发的目标是提高系统的响应性和资源利用率。
3.3.1.2 实现方式
并发通常通过时间分片(Time Slicing)来实现,操作系统将CPU时间分成小片段,每个片段分配给不同的进程或线程。任务之间的切换非常快,以至于用户感觉这些任务是同时执行的。
3.3.1.3. 优点
- 提高系统响应性:用户不必等待一个任务完成再开始另一个任务。
- 更好地利用系统资源:CPU可以在等待I/O操作完成时执行其他任务。
假设有两个进程A和B,在并发系统中,执行情况可能如下:
时间片1:执行进程A
时间片2:执行进程B
时间片3:执行进程A
时间片4:执行进程B
...
在任何时刻,只有一个进程在执行,但从整体上看,A和B是同时进行的。
3.3.2 并行
3.3.2.1 概念
并行是指在多个处理器(或多核处理器)上同时执行多个任务。每个处理器独立执行一个任务,多个任务在同一时刻真正同时进行。
3.3.2.2 实现方式
并行通常依赖于多处理器或多核架构。每个处理器或内核可以独立执行一个进程或线程,达到真正的同时执行。
3.3.2.3 优点
- 提高处理速度:多个任务同时进行,可以更快地完成计算密集型任务。
- 充分利用多核处理器的能力:提高计算资源的利用率。
假设有两个进程A和B,在并行系统中,执行情况可能如下:
时间点1:处理器1执行进程A,处理器2执行进程B
时间点2:处理器1执行进程A,处理器2执行进程B
...
在每个时刻点上,A和B是真正同时进行的。
并发与并行的区别
1. 执行方式
并发:通过快速切换来执行多个任务,在单个处理器上实现。
并行:通过同时执行来完成多个任务,在多个处理器或多核处理器上实现。
2. 处理器要求
并发:可以在单处理器系统上实现。
并行:需要多处理器或多核处理器系统。
3. 性能提升
并发:提高系统响应性和资源利用率。
并行:提高处理速度和计算效率。
4. 资源管理
并发:需要复杂的调度算法来管理任务的快速切换。
并行:需要协调多处理器或多核之间的任务分配和数据共享。
4. 示例应用
并发应用
多任务操作系统:允许用户同时运行多个应用程序(如文字处理器、浏览器和音乐播放器)。
Web服务器:处理多个用户请求,每个请求作为一个独立的任务。
并行应用
科学计算:如气象模拟、基因分析等需要处理大量数据的任务,可以在多处理器系统上并行处理。
图形处理:如渲染大型3D场景,在多核GPU上并行执行。
三、内存管理
3.1 简单分页 逻辑页 物理页 页表
在 Linux 操作系统中,简单分页 (Simple Paging) 是虚拟内存管理的基本机制之一,涉及到逻辑页、物理页和页表。
1. 逻辑页 (Logical Page)
逻辑页是进程虚拟地址空间中的一个固定大小的单位,通常大小为 4KB。每个进程都有自己的虚拟地址空间,逻辑页是其中的基本单位,用于管理进程的内存访问。进程中的逻辑页是连续的,逻辑页号从零开始递增。2. 物理页 (Physical Page)
物理页是实际存在于物理内存中的一页数据。物理页也是固定大小的,通常与逻辑页大小相同。Linux 内核负责管理物理内存,将进程的逻辑页映射到物理页上。3. 页表 (Page Table)
页表是 Linux 内核用于实现虚拟内存管理的关键数据结构。它是一个存储了逻辑页到物理页映射关系的表格。对于每个进程,都有一个对应的页表,用于将进程的虚拟地址翻译成物理地址。4. 简单分页机制
在简单分页机制下,页表是一个简单的数组,其中每个元素对应着一个逻辑页。页表的索引是逻辑页号,而每个页表项存储着该逻辑页对应的物理页号。5. 虚拟地址到物理地址的转换过程
当进程访问虚拟地址时,Linux 内核通过以下步骤将其转换为物理地址:
- 从虚拟地址中提取出逻辑页号。
- 使用进程的页表,查找该逻辑页号对应的页表项。
- 从页表项中获取对应的物理页号。
- 将物理页号与虚拟地址中的页内偏移组合,得到最终的物理地址。
在由父进程复制而来的子进程,两个进程同一个变量,地址相同,其实是虚拟地址相同(逻辑地址),内容不同其实是被映射到了不同的物理地址!
3.2 虚拟内存
虚拟内存是一种计算机内存管理技术,它使得每个进程都能够拥有比实际物理内存更大的地址空间,而不受物理内存大小的限制。虚拟内存通过将进程的虚拟地址空间映射到物理内存和磁盘上的存储空间,从而提供了以下几个重要的功能:
3.2.1. 内存抽象
虚拟内存提供了一种抽象,使得每个进程都认为自己拥有连续的、私有的内存空间。每个进程的虚拟地址空间通常是从 0 开始的连续地址范围,这种抽象简化了程序员的内存管理任务,使得编写和调试程序更加容易。
3.2.2. 内存隔离
虚拟内存使得每个进程都被隔离开来,互不干扰。每个进程都有自己的虚拟地址空间,即使它们运行在同一台计算机上,也不会直接访问彼此的内存空间。这种隔离性提高了系统的安全性和稳定性。
3.2.3. 虚拟内存到物理内存的映射
虚拟内存中的地址并不直接对应于物理内存中的地址,而是通过页表等数据结构进行映射。这样的映射关系使得操作系统能够动态地将虚拟地址空间中的页映射到实际的物理内存页或者硬盘上的交换空间,从而实现了内存的管理和调度。
3.2.4. 虚拟内存管理
虚拟内存管理涉及到页面置换、内存分配、地址翻译等一系列复杂的操作。当系统中的物理内存不足时,操作系统可以通过将不常用的内存页面交换到磁盘上的交换空间,从而腾出物理内存空间给其他进程使用。这种管理方式允许系统运行更多的进程,并且能够更加灵活地适应不同程序的内存需求。
以上就是全部内容!请务必掌握,这是后续学习的基础,欢迎大家点赞加关注评论,您的支持是我前进最大的动力!下期再见!