2024-2025-1 20241329 《计算机基础与程序设计》第九周学习总结
作业信息
作业归属课程:https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP
作业要求:https://www.cnblogs.com/rocedu/p/9577842.html#WEEK09
作业目标:操作系统责任;内存与进程管理;分时系统;CPU调度;文件、文件系统;文件保护;磁盘调度
作业正文:https://www.cnblogs.com/incamellia/p/18565575
教材学习内容总结
《计算机科学概论(第七版)》第10章
-
操作系统的责任
操作系统(OS)是一个大型的程序系统,它负责计算机的全部软、硬件资源的分配、调度工作,控制并协调多个任务的活动,实现信息的存取和保护。操作系统提供了用户接口,使用户获得良好的工作环境。操作系统的核心功能包括作业管理(系统调用接口)、进程管理、内存管理、文件系统管理以及设备管理。这些功能共同确保了计算机系统的稳定运行和高效利用。 -
内存与进程管理
- 内存管理:操作系统需要明确内存中有哪些程序以及它们驻留在内存的什么位置。这涉及到内存的分配和回收,以及内存的保护等。内存管理方法包括单块内存管理、固定分区法、动态分区法以及页式内存管理法等。
单块内存管理:把应用程序载入一段连续的内存区域。
固定分区法:把内存分成特定数目的分区以载入程序,这些分区的大小不一定要相同,但是操作系统初始引导时它的大小就固定了。
动态分区法:根据容纳程序的需要对内存进行分区,分区大小可变化。
页式内存管理法:把内存划分为大小固定的页,载入内存时存储在帧中。 - 进程管理:进程是程序执行过程中的动态表示法。操作系统需要跟踪进程的进展以及所有中间状态,这包括进程的创建、调度、执行、等待资源以及执行结束等各个阶段。进程管理确保了计算机系统中的多个程序能够有序、高效地运行。
-
分时系统
分时系统是一种允许多个用户同时与一台计算机进行交互的操作系统。它借鉴了多道批处理的流水线式处理思想,将CPU切换的时间无限细分,使得每个用户都能独占计算资源的使用权。分时系统通过连接多个带有显示器和键盘的终端,同时允许多个用户通过自己的键盘以交互的方式使用计算机,共享主机中的资源。这种系统提高了计算机的利用率和用户的满意度。 -
CPU调度
CPU调度是操作系统的核心任务之一,其目的是在多个进程之间合理分配CPU时间,以提高系统的整体性能和效率。调度涉及从就绪队列中选择一个进程并为其分配CPU资源,从而实现进程的切换和执行。
- 调度准则:CPU调度需要遵循一系列准则,包括最大化CPU利用率、提高系统吞吐量、缩短进程的周转时间、减少进程的等待时间和响应时间等。
- 调度算法:书中介绍了多种常见的CPU调度算法,如先来先服务(FCFS)、最短作业优先(SJF)、优先级调度、时间片轮转(RR)以及多级反馈队列调度等。每种算法都有其特点和适用场景,例如SJF算法可以最小化平均等待时间,但难以预测下一个任务的长度;而时间片轮转则适用于分时系统,但可能导致平均等待时间较长。
- 抢占式与非抢占式调度:调度方式分为抢占式和非抢占式。抢占式调度允许操作系统强制当前运行的进程放弃CPU,以响应更高优先级的进程;而非抢占式调度则依赖于进程自愿释放CPU。
- 多处理器调度问题:在多处理器系统中,调度需要考虑负载均衡,确保各处理器的工作量均衡分配。这涉及到任务的迁移和多核处理器的特性,如统一内存访问和多线程技术。
- 实时调度:对于需要严格时间约束的应用,实时调度算法被用来确保任务在规定时间内完成。这类调度通常要求更高的响应时间和更低的延迟。
《计算机科学概论(第七版)》第11章
- 文件与文件系统
- 文件:在计算机中,所有存储工具中存放的内容都被称为文件。文件是计算机存储数据的基本单位,通常由文件名和后缀名组成,文件名由用户定义,后缀名则定义了文件的类型。
- 文件系统:文件系统是操作系统中负责管理和存储文件的系统结构。它提供了文件的创建、删除、修改、查找和访问等功能。文件系统通过目录结构来组织文件,使得用户可以方便地管理和访问文件。
- 文件保护
- 文件保护机制确保文件的安全性,防止未经授权的访问。在多用户系统中,文件保护尤为重要,以防止一个用户访问另一个用户的文件。
- 文件保护方法包括口令保护、加密保护和访问控制。
- 访问控制表(ACL)用于记录各个用户对文件的访问权限,确保文件的安全性和独特性。
- 磁盘调度
- 磁盘调度算法用于优化磁盘访问顺序,减少磁头移动时间,提高磁盘性能。
- 常见的磁盘调度算法包括先来先服务(FCFS)、最短寻道时间优先(SSTF)、扫描(SCAN)算法等,选择合适的调度算法可以显著提高磁盘的I/O效率。
《C语言程序设计》第8章
- 一维数组的定义和初始化
- 定义:一维数组是C语言中最基本的数据结构之一,用于存储一组相同类型的元素。
定义一维数组的基本格式为:数据类型 数组名[数组元素个数];
- 初始化一维数组时,可以使用以下几种方式:
完全初始化:在定义时为所有元素赋值。int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
部分初始化:只为部分元素赋值,未赋值的元素默认为0。int a[10] = {0, 1, 2}; // 前三个元素为0, 1, 2,其余为0
不指定长度:在初始化时提供所有元素的值,编译器会自动计算数组长度。int a[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
- 二维数组的定义和初始化
- 定义:二维数组可以看作是一个表格,由行和列组成。
定义二维数组的基本格式为:数据类型 数组名[行数][列数];
- 初始化二维数组时,可以使用以下几种方式:
分行初始化:逐行赋值。int b[3][4] = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} };
不分行初始化:按顺序赋值。int b[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
省略行数:如果提供了所有元素的值,可以省略行数。int b[][4] = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} };
-
向函数传递一维数组和二维数组
在C语言中,数组作为函数参数传递时,实际上传递的是数组的首地址。因此,函数内部对数组的修改会影响到原数组。
一维数组:传递时使用不带方括号的数组名。void func(int arr[], int size) { // 函数体 }
二维数组:传递时同样使用不带方括号的数组名。void func(int arr[][4], int rows) { // 函数体 }
-
排序和查找
排序和查找是数组操作中的常见算法。
- 排序算法:
冒泡排序:通过多次遍历数组,每次比较相邻元素并交换位置。
选择排序:每次从未排序部分选择最小(或最大)元素,放到已排序部分的末尾。
插入排序:将未排序部分的元素逐个插入到已排序部分的适当位置。 - 查找算法:
线性查找:逐个比较数组元素,直到找到目标元素或遍历完所有元素。
二分查找:要求数组已排序,通过不断缩小查找范围来定位目标元素。
教材学习中的问题和解决过程
问题:冒泡排序、选择排序、插入排序之间有什么区别吗
- 原理不同:
冒泡排序:通过比较相邻元素并交换位置,将较大的元素逐渐“冒泡”到数组的末尾。
选择排序:每次从未排序的序列中找出最小(或最大)的元素,并将其放置在已排序序列的末尾。
插入排序:将未排序的元素插入到已排序序列的适当位置,保持序列有序。 - 实现难度:
插入排序相对简单,易于理解和实现,尤其适用于部分已经排好序的数据集。
选择排序和冒泡排序的实现也较为简单,但选择排序需要额外的存储空间来记录最小值的位置。 - 稳定性:
冒泡排序和插入排序是稳定的排序算法,即相等的元素在排序前后保持相对顺序。
选择排序是不稳定的,因为即使在有序情况下,也需要遍历所有元素进行比较和交换。 - 适用场景:
插入排序适用于部分已经排好序的数据集,效率较高。
选择排序适用于小规模数据排序,时间复杂度较低,但稳定性差。
冒泡排序适用于大规模数据排序,稳定性好,但不适用于实时性要求高的场景。