作业信息
这个作业属于哪个课程 | 2024-2025-1-计算机基础与程序设计 |
---|---|
这个作业要求在哪里 | https://www.cnblogs.com/rocedu/p/9577842.html#WEEK09 |
这个作业的目标 | 操作系统责任 内存与进程管理 分时系统 CPU调度 文件、文件系统 文件保护 磁盘调度 |
作业正文 | https://www.cnblogs.com/wchxx/p/18566368 |
教材学习内容总结
-
内存与进程管理:
- 内存管理:涉及内存的分配与回收,包括静态分配和动态分配。主要技术有分区分配、分页、分段和虚拟内存。
- 进程管理:包括进程的创建、执行、同步、通信和终止。进程是操作系统进行资源分配和调度的基本单位。
- 进程同步:确保多个进程在并发执行时能够协调一致,避免数据不一致和竞态条件。
- 进程调度:决定哪个进程将获得CPU时间片,以实现多任务处理。
-
分时系统:
- 概念:允许多个用户同时使用计算机系统,每个用户感觉像是独占系统。
- 调度:分时系统的CPU调度算法需要公平地分配CPU时间给各个用户进程。
- 交互性:分时系统强调用户交互,提供快速响应。
-
CPU调度:
- 调度算法:包括先来先服务(FCFS)、短作业优先(SJF)、轮转(RR)、优先级调度等。
- 上下文切换:在进程间切换时保存和恢复CPU状态的过程。
- 性能指标:如吞吐量、响应时间、周转时间等。
-
文件、文件系统:
- 文件概念:文件是数据的逻辑集合,文件系统是操作系统中用于管理文件的结构。
- 文件操作:包括文件的创建、删除、读取和写入。
- 目录结构:文件系统的层次结构,用于组织文件。
- 文件存储:文件在磁盘上的存储方式,如连续分配、链表分配等。
-
文件保护:
- 访问控制:控制用户对文件的访问权限,如读、写、执行。
- 完整性保护:确保文件不被未授权修改。
- 保密性:保护文件内容不被未授权访问。
-
磁盘调度:
- 调度算法:如先进先出(FIFO)、最短寻道时间优先(SSTF)、扫描(SCAN)和循环扫描(C-SCAN)等。
- 性能优化:减少磁盘寻道时间和旋转延迟,提高I/O效率。
-
数组名与指针
在C语言中,数组名可以被看作是一个指向数组第一个元素的指针。这意味着当你有一个数组时,你可以通过数组名来访问数组的第一个元素。例如:
int arr[5] = {1, 2, 3, 4, 5};
int *ptr = arr; // ptr 现在指向 arr 的第一个元素
这里,arr
和 ptr
都指向同一个地址,即数组 arr
的第一个元素的地址。
- 访问数组元素
你可以通过指针算术来访问数组的元素。例如:
int value = *(ptr + 2); // 访问数组的第三个元素,等同于 arr[2]
这里,*(ptr + 2)
等同于 arr[2]
,因为 ptr
指向数组的开始,ptr + 2
移动到数组的第三个元素的地址,然后解引用得到该元素的值。
- 指针与数组遍历
你可以使用指针来遍历数组:
for (int *p = arr; p < arr + 5; p++) {
printf("%d ", *p);
}
这个循环使用指针 p
遍历数组 arr
。p
从数组的开始移动到数组的结束。
- 多维数组与指针
对于多维数组,指针的使用稍微复杂一些,但概念是相似的。例如,对于一个二维数组:
int arr[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
你可以将二维数组看作是指针的数组,每个指针指向一个一维数组:
int (*ptr)[4] = arr; // ptr 指向 arr 的第一个元素,即第一个一维数组
然后,你可以使用指针来访问二维数组的元素:
int value = *(*(ptr + 1) + 2); // 访问第二行第三列的元素,等同于 arr[1][2]
这里,*(ptr + 1)
指向第二个一维数组,*(ptr + 1) + 2
指向第二个一维数组的第三个元素,然后解引用得到该元素的值。
- 指针数组与数组指针
- 指针数组:一个数组,其元素都是指针。
- 数组指针:一个指针,它指向一个数组。
例如:
int *arrPtr[5]; // 指针数组,包含5个指向 int 的指针
int arr[5]; // 一个包含5个 int 的数组
int (*arrPtr2)[5] = &arr; // 数组指针,指向一个包含5个 int 的数组
- 函数参数中的数组和指针
当数组作为函数参数时,它实际上被传递为指向数组第一个元素的指针。因此,你可以在函数中通过这个指针来访问和修改数组的元素。
void printArray(int arr[], int size) {
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
}
在这个函数中,arr
实际上是一个指针,指向传入的数组的第一个元素。
教材中遇到的问题及解决
在学习C语言中的数组和指针时,你可能会碰到以下一些常见问题及其解答:
问题1:如何正确地遍历二维数组?
解答:
二维数组可以看作是数组的数组,或者指针的数组。在C语言中,遍历二维数组通常有两种方式:
int arr[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
// 方法1: 使用嵌套循环
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
printf("%d ", arr[i][j]);
}
}
// 方法2: 使用指针
int (*row)[4] = arr; // row 指向一个包含4个int的数组
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
printf("%d ", (*row)[j]);
}
row++; // 移动到下一行
}
问题2:如何将数组作为参数传递给函数?
解答:
在C语言中,数组作为参数传递给函数时,实际上是传递数组首元素的地址。因此,函数接收到的是一个指针。为了在函数中使用数组,你需要知道数组的大小。
void printArray(int arr[], int size) {
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
}
int main() {
int myArray[5] = {1, 2, 3, 4, 5};
printArray(myArray, 5); // 传递数组和大小
return 0;
}
问题3:指针数组和数组指针有什么区别?
解答:
指针数组是一个数组,其元素都是指针,而数组指针是一个指针,它指向一个数组。
int *ptrArray[10]; // 指针数组:一个包含10个int指针的数组
int arr[10];
int (*arrayPtr)[10] = &arr; // 数组指针:一个指向包含10个int的数组的指针
问题4:如何动态分配一个二维数组?
解答:
动态分配二维数组通常需要两步:首先分配行,然后为每一行分配列。
int **allocate2DArray(int rows, int cols) {
int **array = malloc(rows * sizeof(int*)); // 分配行指针
for (int i = 0; i < rows; i++) {
array[i] = malloc(cols * sizeof(int)); // 为每行分配列
}
return array;
}
void free2DArray(int **array, int rows) {
for (int i = 0; i < rows; i++) {
free(array[i]); // 释放每行
}
free(array); // 释放行指针
}
基于AI的学习