2024-2025-1 20241319 《计算机基础与程序设计》第九周学习总结

作业信息

这个作业属于哪个课程 2024-2025-1-计算机基础与程序设计
这个作业要求在哪里 https://www.cnblogs.com/rocedu/p/9577842.html#WEEK09
这个作业的目标 操作系统责任 内存与进程管理 分时系统 CPU调度 文件、文件系统 文件保护 磁盘调度
作业正文 https://www.cnblogs.com/wchxx/p/18566368

教材学习内容总结

  1. 内存与进程管理

    • 内存管理:涉及内存的分配与回收,包括静态分配和动态分配。主要技术有分区分配、分页、分段和虚拟内存。
    • 进程管理:包括进程的创建、执行、同步、通信和终止。进程是操作系统进行资源分配和调度的基本单位。
    • 进程同步:确保多个进程在并发执行时能够协调一致,避免数据不一致和竞态条件。
    • 进程调度:决定哪个进程将获得CPU时间片,以实现多任务处理。
  2. 分时系统

    • 概念:允许多个用户同时使用计算机系统,每个用户感觉像是独占系统。
    • 调度:分时系统的CPU调度算法需要公平地分配CPU时间给各个用户进程。
    • 交互性:分时系统强调用户交互,提供快速响应。
  3. CPU调度

    • 调度算法:包括先来先服务(FCFS)、短作业优先(SJF)、轮转(RR)、优先级调度等。
    • 上下文切换:在进程间切换时保存和恢复CPU状态的过程。
    • 性能指标:如吞吐量、响应时间、周转时间等。
  4. 文件、文件系统

    • 文件概念:文件是数据的逻辑集合,文件系统是操作系统中用于管理文件的结构。
    • 文件操作:包括文件的创建、删除、读取和写入。
    • 目录结构:文件系统的层次结构,用于组织文件。
    • 文件存储:文件在磁盘上的存储方式,如连续分配、链表分配等。
  5. 文件保护

    • 访问控制:控制用户对文件的访问权限,如读、写、执行。
    • 完整性保护:确保文件不被未授权修改。
    • 保密性:保护文件内容不被未授权访问。
  6. 磁盘调度

    • 调度算法:如先进先出(FIFO)、最短寻道时间优先(SSTF)、扫描(SCAN)和循环扫描(C-SCAN)等。
    • 性能优化:减少磁盘寻道时间和旋转延迟,提高I/O效率。
  7. 数组名与指针

在C语言中,数组名可以被看作是一个指向数组第一个元素的指针。这意味着当你有一个数组时,你可以通过数组名来访问数组的第一个元素。例如:

int arr[5] = {1, 2, 3, 4, 5};
int *ptr = arr; // ptr 现在指向 arr 的第一个元素

这里,arrptr 都指向同一个地址,即数组 arr 的第一个元素的地址。

  1. 访问数组元素

你可以通过指针算术来访问数组的元素。例如:

int value = *(ptr + 2); // 访问数组的第三个元素,等同于 arr[2]

这里,*(ptr + 2) 等同于 arr[2],因为 ptr 指向数组的开始,ptr + 2 移动到数组的第三个元素的地址,然后解引用得到该元素的值。

  1. 指针与数组遍历

你可以使用指针来遍历数组:

for (int *p = arr; p < arr + 5; p++) {
    printf("%d ", *p);
}

这个循环使用指针 p 遍历数组 arrp 从数组的开始移动到数组的结束。

  1. 多维数组与指针

对于多维数组,指针的使用稍微复杂一些,但概念是相似的。例如,对于一个二维数组:

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 指向第二个一维数组的第三个元素,然后解引用得到该元素的值。

  1. 指针数组与数组指针
  • 指针数组:一个数组,其元素都是指针。
  • 数组指针:一个指针,它指向一个数组。

例如:

int *arrPtr[5]; // 指针数组,包含5个指向 int 的指针
int arr[5];    // 一个包含5个 int 的数组
int (*arrPtr2)[5] = &arr; // 数组指针,指向一个包含5个 int 的数组
  1. 函数参数中的数组和指针

当数组作为函数参数时,它实际上被传递为指向数组第一个元素的指针。因此,你可以在函数中通过这个指针来访问和修改数组的元素。

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的学习




posted @ 2024-11-24 21:01  20241319吴辰曦  阅读(23)  评论(0)    收藏  举报