班级链接 | 2024计算机基础与程序设计 |
---|---|
作业要求 | 第九周作业 |
作业目标 | ①操作系统责任 ②内存与进程管理 ③分时系统 ④CPU调度 ⑤文件、文件系统 ⑥文件保护 ⑦磁盘调度 |
教材学习内容总结
《计算机科学概论》第10、11章
第10章
- 操作系统定义:
操作系统(OS)是具有操作硬件特殊权限的程序,负责运行和管理其他程序 - 主要责任:
主要负责管理计算机资源(如内存、输入/输出设备等)和为人机交互提供界面 - 程序加载方式:
操作系统是开机第一个启动的程序,负责启动其他程序,早期操作系统采用批处理方式 - 抽象硬件:
操作系统通过提供API来抽象硬件,称为设备驱动程序,使得程序员可以标准化地与硬件交互 - 多任务处理:
操作系统能够在单个CPU上通过共享时间来运行多个程序 - 虚拟内存:
操作系统通过虚拟内存技术隐藏内存的复杂性,允许程序的内存大小灵活增减 - 动态内存分配:
操作系统自动处理虚拟内存和物理内存之间的映射 - 内存保护:
操作系统通过给程序分配专用的内存范围来隔离程序,防止互相影响和病毒 - 多用户支持:
操作系统可以处理多用户的访问,开发了分时操作系统
第11章
- 文本文件和二进制文件:
文件的基本分类包括文本文件和二进制文件 - 文件操作:
介绍文件的创建、读取、写入和删除等基本操作 - 文件访问:
介绍文件的访问权限和模式 - 文件保护:
涉及文件的安全性和保护措施 - 目录树:
文件系统中目录的组织结构通常以树状结构展示 - 路径名:
在文件系统中定位文件的方法,包括绝对路径和相对路径的概念 - 先到先服务磁盘调度法:
是一种基本的磁盘调度算法,即按照请求的顺序进行处理 - 最短寻道时间优先磁盘调度法:
是一种优化磁盘访问时间的调度算法 - SCAN磁盘调度法:
是另一种磁盘调度算法,通过减少磁头移动来优化性能
《C语言程序设计》第8章
- 一维数组的定义和初始化:
一维数组的声明、定义以及初始化的方法。 - 二维数组的定义和初始化:
二维数组的声明、定义以及初始化的技巧。 - 向函数传递一维数组:
介绍将一维数组作为参数传递给函数的方法,并在函数中处理数组。 - 排序和查找:
基本的排序算法(如冒泡排序、选择排序等)和查找算法(如线性查找、二分查找等)。 - 向函数传递二维数组:
介绍将二维数组作为参数传递给函数的方法,并在函数中对二维数组进行操作。
教材学习中的问题与解决过程
问题1:数组在内存中是如何连续存储的?
AI:
数组在内存中的连续存储是指数组的元素在内存中是按照顺序一个接一个地存放的,没有间隔。这种存储方式有以下几个特点:
- 连续的内存块:
当一个数组被创建时,操作系统会为该数组分配一个连续的内存块。这意味着数组的第一个元素的地址紧接着就是第二个元素的地址,以此类推。 - 内存地址计算:
由于数组元素在内存中是连续存放的,所以可以通过基地址(数组首元素的地址)加上元素的偏移量(索引乘以元素大小)来计算任意元素的地址。例如,如果数组的基地址是A,每个元素大小是size,那么第i个元素的地址就是A + i*size。 - 提高访问效率:
连续存储可以提高数据访问效率。现代计算机的CPU缓存系统是按照块(block)来加载数据的,当数据在内存中连续存放时,CPU可以预加载一个数据块到缓存中,这样当访问连续数据时,就可以减少缓存未命中的情况,提高访问速度。 - 简化内存管理:
连续存储简化了内存管理。操作系统只需要记录数组的起始地址和总大小,就可以管理整个数组的内存。 - 内存对齐:
连续存储有助于内存对齐。许多计算机系统要求数据按照特定的边界对齐,连续存储可以保证数组元素按照这些边界对齐,从而提高内存访问效率。 - 数组越界:
由于数组元素是连续存储的,数组越界(访问数组之外的内存)可能会导致未定义行为,包括程序崩溃或者数据损坏。 - 动态数组实现:
在一些编程语言中,动态数组(如C++中的std::vector或Java中的ArrayList)虽然在内部可能不是完全连续的(可能因为扩容需要重新分配内存),但对外表现为连续存储,以提供随机访问的能力。 - 数组操作:
连续存储使得数组操作(如复制、比较)更加高效,因为可以通过简单的内存块复制来实现。 - 编程语言支持:
大多数编程语言都支持数组的连续存储,提供了便捷的语法来声明和操作数组。
连续存储是数组区别于其他数据结构(如链表)的一个重要特性,它为数组提供了快速的随机访问能力,同时也带来了内存利用率和灵活性上的一些限制。
问题2:为什么数组名可以作为指向其首元素的指针使用?
AI:
在C语言中,数组名可以作为指向其首元素的指针使用,这是由C语言的语法和内存模型决定的。以下是几个关键原因:
- 语言设计:
C语言的设计允许数组名在大多数表达式中被解释为指向数组首元素的指针。这是C语言的一个基本特性,它使得处理数组更加灵活和高效。 - 内存模型:
在内存中,数组是一块连续的内存区域。数组名实际上代表的是这块内存区域的起始地址。因此,当数组名被用作指针时,它指向的是数组的第一个元素。 - 语法糖:
在C语言中,数组名作为指针使用是一种“语法糖”。这意味着在编写代码时,可以使用数组名来访问数组的首元素,而在内部,编译器会将其处理为指向首元素的指针。 - 指针运算:
当数组名被用作指针时,可以进行指针运算。例如,array + 1 表示指向数组第二个元素的指针,因为指针运算会根据数组元素的大小自动进行偏移。 - 函数参数传递:
在C语言中,函数参数的传递是通过值进行的,但对于数组,实际上是传递数组首元素的地址。因此,当数组作为参数传递给函数时,数组名自然被用作指针。 - 内存访问:
通过将数组名视为指针,可以直接访问数组中的元素,而不需要额外的间接访问操作。这简化了数组元素的访问方式。 - 兼容性:
这种设计使得C语言与底层硬件的内存模型紧密兼容,允许程序员以接近硬件的方式操作内存,这对于性能优化和底层编程非常重要。 - 数组操作:
许多数组操作,如复制、比较和搜索,都需要通过指针来实现。将数组名视为指针简化了这些操作的实现。 - 标准库函数:
C语言标准库中的许多函数,如memcpy、memcmp和memmove,都接受指向内存块的指针作为参数。将数组名作为指针使用,可以方便地与这些函数配合。 - 历史原因:
C语言的这种设计也受到了其历史背景的影响。C语言起源于早期的操作系统和编译器开发,这种设计反映了对内存操作的直接控制需求。
综上所述,数组名在C语言中可以作为指向其首元素的指针使用,这是由C语言的设计、内存模型和实用性共同决定的。这种特性使得C语言在处理数组时非常灵活和高效。
基于AI的学习
学习进度条
计划学习时间:25h
实际学习时间:25h