2024-2025-1 20241312《计算机基础与程序设计》第九周学习总结
作业信息
这个作业属于哪个课程 | <班级的链接>(2024-2025-1-计算机基础与程序设计) |
---|---|
这个作业要求在哪里 | <作业要求的链接>(如2024-2025-1计算机基础与程序设计第一周作业) |
这个作业的目标 | 操作系统责任 |
内存与进程管理 | |
分时系统 | |
CPU调度 | |
文件、文件系统 | |
文件保护 | |
磁盘调度 | |
作业正文 | https://www.cnblogs.com/songjialinsjl/p/18565271 |
教材学习内容总结
-
操作系统责任:
操作系统(OS)是管理计算机硬件与软件资源的系统软件,它负责提供用户与计算机硬件之间的交互界面,同时负责分配和管理系统资源,如处理器时间、内存空间和文件存储。 -
内存与进程管理:
- 内存管理:操作系统负责内存的分配和回收,确保程序运行时有足够的内存空间,同时防止不同程序间的内存冲突。
- 进程管理:操作系统需要创建、调度、管理和终止进程。进程是程序执行的实体,操作系统通过进程管理确保程序能够并发执行。
-
分时系统:
分时系统是一种操作系统,它允许多个用户同时使用计算机资源。系统将CPU时间分成短的时间段,每个用户或进程轮流使用这些时间段,从而创建了多任务处理的假象。 -
CPU调度:
CPU调度(或称进程调度)是操作系统决定哪个进程应该获得CPU时间的技术。调度算法的目标包括公平性、响应时间、吞吐量和优先级处理等。 -
文件、文件系统:
- 文件:文件是数据存储的基本单位,操作系统提供创建、读取、写入和删除文件的功能。
- 文件系统:文件系统是组织和管理文件存储和检索的方式,它包括文件的命名、存储、检索和保护。
-
文件保护:
文件保护确保文件只能被授权的用户访问和修改。操作系统通过权限控制和访问控制列表(ACLs)来实现文件保护。 -
磁盘调度:
磁盘调度是操作系统决定磁盘请求处理顺序的算法。由于磁盘I/O操作相对较慢,磁盘调度算法(如先进先出、最短寻道时间优先等)旨在减少寻道时间和旋转延迟,提高磁盘性能。
教材学习中的问题和解决过程(先问 AI)
问题一:指针怎么指向二维数组?
回答:在C语言中,二维数组可以通过指针来访问和操作。二维数组本质上是一个数组的数组,因此可以通过多种方式使用指针来指向和操作二维数组。以下是几种常见的方法:
1. 指向整个二维数组
你可以直接让指针指向二维数组的首地址:
int arr[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
int (*ptr)[4] = arr; // ptr指向整个二维数组
在这里,ptr
是一个指向含有4个整数的数组的指针,即指向二维数组的第一行。
2. 指向二维数组的一行
你也可以让指针指向二维数组的某一行:
int *rowPtr = arr[0]; // rowPtr指向二维数组的第一行
在这里,rowPtr
是一个指向整型的指针,指向二维数组的第一行的第一个元素。
3. 通过指针访问二维数组元素
通过指针访问二维数组的元素,你可以使用以下方式:
// 指向整个二维数组
int (*ptr)[4] = arr;
int elem1 = ptr[1][2]; // 访问第二行第三列的元素,等同于arr[1][2]
// 指向二维数组的一行
int *rowPtr = arr[0];
int elem2 = rowPtr[3]; // 访问第一行第四个元素,等同于arr[0][3]
4. 使用指针遍历二维数组
你可以使用指针来遍历二维数组:
int arr[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
int (*ptr)[4] = arr;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
printf("%d ", ptr[i][j]);
}
printf("\n");
}
5. 动态分配二维数组
你还可以通过指针动态分配二维数组:
int rows = 3;
int cols = 4;
int (*arr)[4] = malloc(rows * sizeof(*arr)); // 分配整个数组
if (arr != NULL) {
for (int i = 0; i < rows; i++) {
arr[i] = malloc(cols * sizeof(int)); // 分配每一行
if (arr[i] == NULL) {
// 处理内存分配失败
}
}
}
// 使用arr...
// 释放内存
for (int i = 0; i < rows; i++) {
free(arr[i]);
}
free(arr);
在动态分配的情况下,你需要分别分配每一行的内存,并确保最后释放每一行以及整个数组的内存。这样可以提供更大的灵活性,但也需要更多的内存管理。
问题二:p+n*i+j在二维数组中分别什么意思
回答:表达式 p + n*i + j
在二维数组的上下文中通常用于计算元素的偏移量或索引。这里,p
是基指针或起始索引,n
是数组的列数,i
是行索引,j
是列索引。这个表达式可以用来计算二维数组中特定元素的内存地址。
解释表达式 p + n*i + j
:
p
:基指针或起始索引。n
:二维数组的列数。i
:行索引。j
:列索引。
表达式的作用:
这个表达式计算了从基指针 p
开始,到达二维数组中位置 (i, j)
的元素的偏移量。这在指针算术中非常有用,特别是当处理动态分配的二维数组或通过指针访问数组元素时。
示例:
假设我们有一个二维数组 arr
,其大小为 3
行 4
列,我们想通过指针访问位置 (1, 2)
的元素。
#include <stdio.h>
int main() {
int arr[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
int rows = 3, cols = 4;
int i = 1, j = 2;
int *ptr = &arr[0][0]; // 基指针指向数组的开始
// 计算偏移量
int offset = cols * i + j;
int elem = *(ptr + offset); // 通过指针访问元素
printf("Element at (%d, %d) is: %d\n", i, j, elem); // 应该输出7
return 0;
}
在这个示例中,ptr
是指向数组 arr
第一个元素的指针。表达式 ptr + offset
计算了到达位置 (1, 2)
的元素的指针。通过解引用这个指针,我们得到了该位置的元素值。
总结:
表达式 p + n*i + j
是一种在二维数组中计算元素偏移量的方法,这在通过指针访问和操作数组元素时非常有用。它允许你直接跳到数组中的任何位置,而不需要逐个遍历行和列。