计算机系统知识
- 计算机硬件基础
1.1 计算机组成原理
• 中央处理器(CPU):
o CPU是计算机的核心部件,负责执行指令并进行算术与逻辑运算。它由控制单元、运算单元和寄存器组组成。
o 控制单元(CU):负责从内存中提取指令、解码并执行这些指令,协调各个部件工作。
o 运算单元(ALU):负责算术运算和逻辑运算。
o 寄存器组:用于临时存储数据和指令,常见寄存器有通用寄存器、程序计数器(PC)、指令寄存器(IR)。
• 内存和外部存储器:
o 内存(主存储器):用于临时存储正在使用的数据和程序。主存储器是易失性的(如RAM),当计算机关闭时,数据会丢失。
o 外部存储器(辅存):如硬盘、SSD,用于长期存储数据。相比内存,存取速度较慢,但容量更大且是非易失性的。
• 输入/输出设备(I/O设备):
o 主要用于数据的输入和输出,如键盘、鼠标(输入),显示器、打印机(输出)。
o I/O设备通过I/O接口与计算机系统通信。
1.2 指令系统与数据通路
• 指令系统:CPU支持的所有指令集合。每条指令通常包括操作码和操作数。
o 操作码:决定执行的操作类型(如加法、减法、加载数据等)。
o 操作数:操作码所作用的数据。
• 数据通路:数据在CPU和内存之间的传输路径。数据通路包括寄存器、总线和ALU等组件。 - 存储系统
2.1 存储器的层次结构:
• 寄存器:最快速、最小容量的存储器,位于CPU内部,用于存储指令执行期间所需的临时数据。
• 缓存(Cache):比主存快,但容量较小,用于缓存经常使用的数据,减少CPU访问内存的延迟。
• 主存:计算机的主要存储器,CPU直接从这里读取和写入数据。典型主存是随机存取存储器(RAM)。
• 辅存:如硬盘、SSD,用于永久存储大量数据。尽管速度较慢,但可以存储的数据量远大于主存。
2.2 虚拟内存:
• 虚拟内存是一种将物理内存与磁盘相结合的技术,通过内存管理将不常用的部分数据暂时存储在磁盘上,从而实现对大程序的支持。
• 常用的虚拟内存管理机制是分页(Paging)和分段(Segmentation)。分页中,内存被分成固定大小的页,而分段中,内存被分为不等长的段。 - 数据表示与编码
3.1 进制转换
• 二进制(Binary,Base-2):使用0和1两个数字来表示数据,是计算机内部数据表示的基础。
• 八进制(Octal,Base-8):使用0到7八个数字,常用于简化二进制的表示。
• 十六进制(Hexadecimal,Base-16):使用0到9和A到F,常用于表示内存地址和简化二进制数据表示。
• 十进制(Decimal,Base-10):人类最常用的数字系统。
• 重要公式:
o 二进制转十进制:从右到左,每一位乘以2的幂。
o 十进制转二进制:使用除2取余法。
3.2 数据的存储方式
• 原码、反码和补码:用于表示有符号数的不同编码方式。
o 原码:最高位为符号位,正数为0,负数为1。
o 反码:正数的反码与原码相同,负数的反码为原码符号位不变,其他位取反。
o 补码:正数的补码与原码相同,负数的补码为反码加1。补码用于简化计算机中的加减法运算。
程序设计语言基础知识 - 程序设计语言概述
1.1 语言分类
• 机器语言:最底层的语言,由二进制码组成,直接与硬件交互,运行效率最高,但可读性差,程序员使用极少。
• 汇编语言:是机器语言的符号表示,使用助记符代替二进制指令,虽然依赖硬件,但可读性相对提高。
• 高级语言:包括C、Java、Python等语言,使用接近自然语言的符号和结构,平台无关,程序员常用。
1.2 编译型与解释型语言
• 编译型语言:如C、C++,程序在执行前需经过编译器将代码翻译为机器码,一次编译后可执行效率高,但调试过程较为复杂。
• 解释型语言:如Python、JavaScript,代码逐行解释执行,无需编译过程,适合快速开发和调试,但执行速度较慢。
1.3 语法与语义
• 语法:规定程序的书写规则,比如如何声明变量、编写条件语句等。语法错误会导致编译或解释失败。
• 语义:描述程序的行为或意义,即每一条合法语法的实际操作结果。 - 语法结构
2.1 数据类型
• 基本数据类型:包括整数、浮点数、字符和布尔值等。不同编程语言的基本数据类型命名和大小可能有所不同,如C中的int、float,Python中的int、float等。
• 复合数据类型:包括数组、结构体(struct)、类等,允许将多个基本数据类型组合在一起形成更复杂的数据结构。
2.2 变量、常量、标识符、关键字
• 变量:用于存储数据,变量名是内存地址的标识符。变量名的命名要符合语言的命名规则,不得与关键字冲突。
• 常量:与变量类似,但其值在程序运行期间不会改变。例如C语言中的const关键字。
• 标识符:程序中用来标识变量、常量、函数等元素的名称。
• 关键字:语言预定义的保留字,如if、for、while,不允许用作标识符。
2.3 运算符与表达式
• 运算符:包括算术运算符(+,-,*,/),关系运算符(==,!=,>,<),逻辑运算符(&&,||,!)等。
• 表达式:由变量、常量和运算符组成的计算语句,返回一个值。例如a + b、x > y。
2.4 流程控制
• 顺序结构:代码从上至下依次执行,没有分支或跳转。
• 选择结构:如if-else、switch-case,根据条件判断执行不同的代码块。
• 循环结构:如for、while、do-while循环,用于重复执行一段代码,直到条件不满足。 - 程序结构
3.1 函数与子程序
• 函数:将一组语句封装在一个块内,通过名称调用。可以接受参数并返回值,便于代码的复用和逻辑分离。
• 子程序(Subroutine):类似函数,通常不返回值。某些编程语言使用“子程序”来指代功能类似的代码块。
3.2 递归与迭代
• 递归:函数自己调用自己,通常用于解决分治问题,如计算阶乘、斐波那契数列等问题。
• 迭代:通过循环结构重复执行某些操作,直到条件满足。迭代在某些情况下效率高于递归,特别是当递归存在深度限制时。
3.3 模块化编程
• 将程序划分为多个相互独立的模块,每个模块负责实现特定功能,有利于提高程序的可读性和可维护性。 - 面向对象编程基础
4.1 类与对象
• 类:是面向对象编程的核心概念,用于定义对象的属性和行为。类是对象的模板。
• 对象:是类的实例,代表现实世界的实体。对象通过类的构造函数创建,拥有类定义的属性和方法。
4.2 封装、继承、多态
• 封装:将数据(属性)和操作数据的方法(行为)封装在一起,通过访问控制(如private、public等)来隐藏细节,增强数据安全性。
• 继承:子类继承父类的属性和方法,避免重复代码。子类可以扩展或重写父类的方法。
• 多态:同一操作在不同对象上表现出不同的行为。多态可以通过函数重载、运算符重载、接口实现等方式实现。
4.3 构造函数与析构函数
• 构造函数:在创建对象时自动调用,用于初始化对象的属性。
• 析构函数:对象被销毁时调用,用于释放资源或进行清理操作(例如关闭文件、释放内存等)。
数据结构 - 线性数据结构
1.1 数组
• 数组是最基本的线性数据结构,存储在连续的内存空间中,可以通过下标快速访问任意元素。
• 特点:
o 时间复杂度:查找和访问元素的时间复杂度为O(1),插入和删除的时间复杂度为O(n)(需要移动其他元素)。
o 缺点:数组大小固定,不易扩展。
• 应用:适用于需要频繁随机访问的场景,如静态表数据。
1.2 链表
• 链表是一种通过节点连接的线性结构,每个节点包含数据和指向下一个节点的指针。
• 单向链表:每个节点只指向下一个节点。
• 双向链表:每个节点有两个指针,分别指向前后节点。
• 循环链表:最后一个节点指向头节点,形成循环结构。
• 特点:
o 插入和删除操作时间复杂度为O(1),不需要像数组那样移动大量元素。
o 查找元素的时间复杂度为O(n),因为需要遍历链表。
• 应用:适用于插入、删除频繁的场景,如动态表数据。
1.3 栈与队列
• 栈:后进先出(LIFO)的数据结构,只有栈顶可以进行插入和删除操作。常用操作包括push(入栈)和pop(出栈)。
o 应用:常用于函数调用、递归、表达式求值等。
• 队列:先进先出(FIFO)的数据结构,插入操作在队尾,删除操作在队首。常用操作包括enqueue(入队)和dequeue(出队)。
o 应用:适用于任务调度、资源管理等场景。 - 非线性数据结构
2.1 树
• 树是一种分层的数据结构,由节点组成。每个节点包含数据和指向子节点的指针。
• 二叉树:每个节点最多有两个子节点。
o 二叉搜索树(BST):左子树的所有节点值小于根节点,右子树的所有节点值大于根节点。插入、查找、删除的时间复杂度为O(log n)。
• 平衡二叉树:如AVL树、红黑树,确保树的高度保持平衡,防止极端情况下的退化。
• 应用:树结构用于表示层级关系的数据,如文件系统、数据库索引等。
2.2 图
• 图是一种由节点和边组成的非线性结构,节点之间通过边连接。图可以是有向图或无向图。
• 图的存储方式:
o 邻接矩阵:使用二维数组表示图的连接关系。
o 邻接表:为每个节点维护一个链表,链表中存储该节点的邻居。
• 图的遍历算法:
o 深度优先搜索(DFS):通过递归或栈的方式,从起始节点沿着一个方向尽可能深地访问。
o 广度优先搜索(BFS):通过队列,从起始节点依次访问所有相邻节点,再依次访问相邻节点的邻居。
• 应用:图用于表示网络关系,如社交网络、城市地图等。 - 查找与排序
3.1 查找算法
• 顺序查找:从头到尾依次查找,时间复杂度为O(n)。适用于无序数据。
• 二分查找:要求数据有序,通过不断折半查找目标元素,时间复杂度为O(log n)。适用于有序数组。
3.2 排序算法
• 冒泡排序:通过不断交换相邻元素的位置,使得每一轮遍历后最大的元素被“冒泡”到数组末端。时间复杂度为O(n^2)。
• 选择排序:每次遍历选出最小的元素,并将其放到正确的位置。时间复杂度为O(n^2)。
• 插入排序:将元素插入到已排序的部分中,时间复杂度为O(n^2),但在小规模数据或几乎有序的情况下性能较好。
• 快速排序:选择一个基准元素,将比基准小的元素放在其左边,比基准大的元素放在其右边,然后递归排序子数组。时间复杂度为O(n log n),平均情况下表现非常好。
• 归并排序:使用分治法,将数组一分为二,递归排序子数组,最后合并两个有序数组。时间复杂度为O(n log n)。 - 散列(哈希)
4.1 散列表与哈希函数
• 散列表:通过哈希函数将键映射到数组的某个索引,从而实现快速查找、插入和删除操作。时间复杂度通常为O(1)。
• 哈希函数:将输入(键)映射为数组中的索引。理想的哈希函数能将不同的输入均匀分布在数组中,避免冲突。
4.2 冲突解决方法
• 开放地址法:当发生冲突时,使用线性探测、二次探测或双重散列法来寻找下一个可用位置。
• 链地址法:将发生冲突的元素存储在一个链表中,每个链表对应一个哈希表中的槽位。
操作系统知识 - 操作系统概述
1.1 操作系统的功能与分类
• 操作系统(OS):是管理计算机硬件和软件资源的系统软件,提供用户与计算机交互的接口。
• 操作系统的主要功能:
o 进程管理:管理程序的执行,包括进程的创建、调度和终止。
o 内存管理:管理计算机的内存资源,跟踪每个进程所使用的内存空间,并分配和释放内存。
o 文件管理:管理文件的存储和访问,提供文件操作接口。
o 设备管理:控制和协调外部设备(如硬盘、打印机、网络接口)的操作。
• 操作系统的分类:
o 批处理操作系统:用于在无交互的情况下批量处理任务。
o 分时操作系统:允许多个用户通过时间片轮转共享计算机资源。
o 实时操作系统:在指定的时间限制内响应外部事件,常用于嵌入式系统。
1.2 操作系统结构
• 单内核结构:操作系统的所有功能在一个单独的内核中实现。
• 微内核结构:将操作系统功能划分为多个模块,核心功能(如进程管理、内存管理)由微内核处理,其他功能由外部服务实现。
1.3 系统调用
• 系统调用:操作系统提供给用户程序的接口,允许程序请求操作系统执行特权操作(如文件读写、内存分配、进程控制)。
• 常见系统调用类型:
o 进程控制(fork, exec)
o 文件管理(open, read, write, close)
o 设备管理(ioctl, read, write)