2024-2025-1 20241328 《计算机基础与程序设计》第九周学习总结
作业信息
这个作业属于哪个课程 | 2024-2025-1-计算机基础与程序设计 |
---|---|
这个作业要求在哪里 | 2024-2025-1计算机基础与程序设计第一周作业 |
这个作业的目标 | - 操作系统责任 - 内存与进程管理 - 分时系统 - CPU调度 - 文件、文件系统 - 文件保护-磁盘调度 |
教材学习内容总结
计算机科学概论(第七版)第10、11章总结
第10章:操作系统基础
1. 操作系统的概念与功能
- 操作系统定义:操作系统是管理计算机硬件和软件资源的程序,它提供用户与计算机硬件之间的接口。操作系统的主要功能是资源管理(CPU、内存、外设等)和任务调度。
- 操作系统的核心功能:
- 进程管理:管理和调度计算机上的各个进程。
- 内存管理:有效分配、回收内存,支持虚拟内存技术。
- 文件系统管理:管理存储设备中的文件,提供文件的存取、存储与保护功能。
- 设备管理:管理计算机外部设备的输入输出操作。
- 用户界面:为用户提供与计算机交互的接口。
2. 进程管理
- 进程的定义:进程是程序的一个执行实例,每个进程都有独立的内存空间和执行状态。
- 进程状态:进程有不同的状态,包括运行态、就绪态、阻塞态等。
- 进程调度:操作系统根据特定的调度算法来决定哪个进程在何时运行,常见的调度算法有:
- 先来先服务(FCFS)
- 短作业优先(SJF)
- 优先级调度
- 时间片轮转(RR)
3. 内存管理
- 内存分配:操作系统负责分配内存给进程使用,常见的内存分配方式有:
- 连续内存分配:为每个进程分配一个连续的内存块。
- 分页系统:将内存划分为固定大小的页,进程使用页来存储数据。
- 分段系统:将进程的内存划分为若干段(如代码段、数据段等)。
- 虚拟内存:通过硬盘空间模拟出比物理内存更大的内存空间,让程序看起来可以使用比实际物理内存更多的内存。
4. 文件系统
- 文件的定义与管理:文件是数据存储的基本单位,操作系统需要管理文件的创建、删除、读取和写入。
- 文件的组织方式:操作系统为文件提供目录结构,文件可以按照文件名进行组织,并支持对文件进行权限控制(如读、写、执行权限)。
- 文件存储:文件通常存储在硬盘或其他外部存储设备上,操作系统通过文件系统来访问和管理这些文件。
5. 输入输出管理
- 输入输出设备:包括键盘、鼠标、显示器、硬盘等外部设备。
- 缓冲区管理:操作系统为I/O操作提供缓冲区,以提高数据传输的效率。
- I/O调度:操作系统通过调度算法优化I/O操作的顺序,以减少等待时间,提高性能。
第11章:数据库系统
1. 数据库系统概述
- 数据库的定义:数据库是一个有组织的数据集合,通过数据库管理系统(DBMS)进行管理,提供高效的数据存储、查询、更新和管理功能。
- 数据库管理系统(DBMS):DBMS是一种软件,它用于管理数据库中的数据,提供数据存取、管理、更新等功能,确保数据的完整性、一致性和安全性。
2. 数据模型
- 层次模型:数据以树形结构组织,记录间有父子关系,适用于层次化的数据存储。
- 网状模型:数据以图形结构组织,记录间可以有多对多的关系,比层次模型更灵活。
- 关系模型:数据以二维表格形式组织,每个表由行(记录)和列(字段)组成。关系模型是目前最常用的数据模型,关系数据库管理系统(RDBMS)采用此模型。
3. 关系数据库
- 表(Relation):数据库中的基本存储单位。每张表包含若干列(属性)和行(记录)。
- 主键(Primary Key):用来唯一标识每条记录的字段,保证表中每条记录的唯一性。
- 外键(Foreign Key):用于建立表之间联系的字段,它指向另一表的主键。
- 数据完整性:包括实体完整性、参照完整性和域完整性等,保证数据在存储和操作过程中的正确性和一致性。
4. SQL语言
- SQL的定义:SQL(结构化查询语言)是一种用于访问和操作数据库的标准语言。
- 数据查询(SELECT):从数据库中查询数据,支持过滤、排序、聚合等操作。
- 数据操作:包括插入(INSERT)、更新(UPDATE)和删除(DELETE)数据。
- 数据定义:包括创建、修改和删除表(CREATE、ALTER、DROP)。
- 数据控制:用于控制用户权限,管理数据库安全性(如GRANT、REVOKE)。
5. 数据库设计
- 实体-关系模型(ER图):一种图形化的数据库设计工具,用来描述数据库中的实体及其之间的关系。
- 规范化:通过消除冗余数据、避免更新异常等方式,将数据库设计为符合一定规范的结构。常见的规范化范式有:
- 第一范式(1NF):要求数据表中的每列都是原子性的。
- 第二范式(2NF):在1NF的基础上,要求消除部分依赖。
- 第三范式(3NF):在2NF的基础上,要求消除传递依赖。
C语言程序设计第8章:指针和数组
1. 指针基础
- 指针的定义:指针是存储内存地址的变量,指针变量的值是另一个变量的地址。通过指针可以访问和操作该地址所指向的数据。
- 指针运算:指针可以进行加法、减法操作,例如,指针加1表示指向下一个同类型数据的内存地址。
- 指针类型:指针的类型必须与所指向的数据类型一致。
2. 指针与数组的关系
- 数组名作为指针:数组名实际上是指向数组首元素的指针。
- 通过指针访问数组元素:可以通过指针运算来访问数组的元素。例如,
*(arr + i)
等同于arr[i]
。 - 二维数组与指针:二维数组的元素可以通过指针操作进行访问。二维数组可以视为指向指针的指针(如
int arr[3][4]
可以视为int *arr[3]
)。
3. 指针与函数
- 通过指针传递参数:使用指针可以传递变量的地址,使得函数能够修改传入的变量。
- 指针作为函数返回值:函数可以返回指针,返回动态分配的内存地址等。
4. 动态内存分配
- 动态内存分配函数:
malloc(size_t size)
:分配一块指定大小的内存,返回该内存的指针。calloc(size_t num, size_t size)
:分配指定数量和大小的内存,并初始化为0。realloc(void *ptr, size_t size)
:调整已经分配内存的大小。free(void *ptr)
:释放之前分配的内存。
5. 多维数组与指针
- 多维数组:多维数组本质上是指向指针的指针。二维数组可以通过指针进行遍历和访问。
..
基于AI的学习
问题 1: 操作系统的主要功能是什么?
回答:操作系统的主要功能包括进程管理、内存管理、文件系统管理、设备管理和用户接口。
问题 2: 什么是进程?进程和程序有什么区别?
回答:进程是程序的一个执行实例,具有自己的内存空间和执行状态。程序是静态的,而进程是动态的,表示程序正在运行的状态。
问题 3: 为什么需要虚拟内存?
回答:虚拟内存允许程序使用比实际物理内存更多的内存,通过将部分数据存储到硬盘来扩展内存,避免因内存不足而导致程序崩溃。
问题 4: 文件系统如何管理文件?
回答:文件系统通过目录结构来管理文件,提供文件的存储、访问、创建、删除等操作,并且对文件进行权限控制。
问题 5: 关系数据库是什么?与层次模型有什么不同?
回答:关系数据库以表格形式组织数据,通过行和列来表示。与层次模型不同,关系数据库可以处理更复杂的多对多关系,不需要像层次模型那样按树形结构组织数据。
问题 6: SQL中的INNER JOIN
和LEFT JOIN
有什么区别?
回答:INNER JOIN
返回两个表中匹配的记录,而LEFT JOIN
返回左表的所有记录,即使右表没有匹配的记录,右表部分会显示为NULL
。
问题 7: 什么是数据库的规范化?为什么要进行规范化?
回答:数据库规范化是将数据表拆分成多个更小的表,以消除冗余和依赖,确保数据一致性。规范化的目的是减少数据冗余,避免数据异常。
问题 8: C语言中的指针是什么?为什么指针重要?
回答:指针是存储内存地址的变量。指针很重要,因为它可以直接操作内存、传递大型数据结构和支持动态内存分配。
问题 9: 数组和指针有什么关系?为什么数组名是指针?
回答:数组名是指向数组第一个元素的指针。数组名本质上是一个常量指针,可以通过指针访问数组的元素。
问题 10: 动态内存分配是如何工作的?如何避免内存泄漏?
回答:动态内存分配通过malloc
、calloc
等函数在运行时分配内存。避免内存泄漏的关键是使用free
函数释放不再使用的内存。
问题 11: C语言中的指针比数组强大在哪些方面?
回答:指针比数组强大,因为指针可以进行算术运算,灵活地操作内存,且可以指向不同类型的数据。数组在编译时已固定大小,而指针可以动态分配内存。
总结
通过这次的苏格拉底式挑战,我们探讨了操作系统、数据库和C语言中的关键知识点,以下是总结:
- 操作系统:涉及进程管理、内存管理、虚拟内存、文件系统等核心功能,进程与程序的区别,以及虚拟内存对程序执行的重要性。
- 数据库:讲解了关系数据库的结构及其与层次模型的不同,SQL中的常见连接操作,以及数据库规范化的必要性。
- C语言:涵盖了指针和数组的关系,指针在内存管理中的重要作用,动态内存分配的使用以及如何避免内存泄漏。
理解这些基础知识对于深入学习操作系统原理、数据库设计和C语言编程至关重要。这些概念为更高阶的计算机科学学习打下了坚实的基础。
代码调试中的问题和解决过程
问题 1: 内存泄漏
问题描述
在使用动态内存分配(如 malloc
或 calloc
)时,我有时会忘记释放内存(使用 free
)。这导致程序运行一段时间后,内存逐渐被耗尽,程序变得缓慢,甚至崩溃。
解决过程
- 我首先检查了所有使用
malloc
、calloc
、realloc
等函数分配的内存,确保每次使用完动态内存后都调用了free
来释放它。 - 我使用了工具如 Valgrind 来检测程序中的内存泄漏。Valgrind 可以帮助我识别未释放的内存,并指出具体的位置。
- 我在每次内存分配后,添加了注释,提醒自己需要在适当的时机释放这些内存,避免忘记。
问题 2: 数组越界
问题描述
在处理数组时,我偶尔会出现数组越界的问题,尤其是在访问数组时,索引超过了数组的有效范围。这通常会导致未定义的行为(如程序崩溃或数据错误)。
解决过程
- 我通过仔细检查代码,确保访问数组时不会超过数组的边界。例如,在处理循环时,我会确保索引小于数组的大小。
- 使用调试器(如 GDB)来逐步调试代码,观察数组的索引和数组长度,帮助我发现越界访问的原因。
- 我还在数组访问时,加入了边界检查的代码。例如,在访问数组元素之前,我会判断索引是否在有效范围内。
其他(感悟、思考等,可选)
学习这些计算机基础知识,让我对计算机科学有了更深刻的理解。每个部分都与实际编程和系统设计紧密相关,帮助我从宏观上理解了计算机如何高效地工作。
-
操作系统让我意识到它不仅是一个“中介”,而且是计算机高效运行的核心。特别是进程管理和内存管理,原来计算机如何调度任务、分配内存,是为了让多个程序并发运行且互不干扰,背后的机制非常复杂但又至关重要。
-
数据库的学习让我看到了数据如何高效存储、检索和管理。关系数据库与其他数据模型(如层次模型)的对比,让我明白了数据结构的选择和设计对系统性能的巨大影响。而SQL的学习,更让我理解了如何用简洁的语句表达复杂的数据操作,增强了我的编程思维。
-
C语言中的指针和内存管理是最让我“震撼”的部分。通过指针操作内存,能够更加灵活地管理程序的数据结构。动态内存分配和释放,虽然看起来简单,但实际上对程序的效率和安全性至关重要。指针不仅让我更接近计算机底层,也让我更加注重资源的合理利用,避免内存泄漏等问题。
总体来说,学习这些知识不仅是了解计算机如何工作的过程,更让我意识到每一行代码背后的系统设计和优化。在日后的编程实践中,我会更加注重效率、稳定性和可维护性,这些基础知识无疑为我后续深入学习其他计算机领域(如算法、网络、分布式系统等)打下了坚实的基础。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 200/200 | 2/2 | 20/20 | |
第二周 | 300/500 | 2/4 | 18/38 | |
第三周 | 500/1000 | 3/7 | 22/60 | |
第四周 | 300/1300 | 2/9 | 30/90 | |
第五周 | 400/1700 | 3/12 | 25/115 | |
第六周 | 500/2200 | 4/16 | 35/150 | |
第七周 | 500/2700 | 5/21 | 40/190 | |
第八周 | 400/3100 | 3/24 | 30/220 | |
第九周 | 300/3400 | 3/27 | 35/255 |
计划学习时间:15小时
实际学习时间:10小时
改进情况:
通过前几周的学习进度,我逐渐意识到自己在时间估算上的差距。起初,计划学习时间总是比实际花费的时间少。随着学习进度的推进,尤其是涉及到编程和调试时,实际学习时间逐渐增加。我已经开始更好地估算每周所需的时间,并逐步提高自己的计划能力。
接下来,我会继续改进估算方法,结合实际情况调整每周的学习计划,争取在接下来的几周内逐渐接近我的学习目标。