操作系统期末考复盘

简答题4题*5`    20分
计算题2题*5`    10分
综合应用2题*10`  20分
程序填空1题10`   10分

1、简答题(8抽4

1、在计算机系统上配置OS的目标是什么?作用主要表现在哪个方面?

        在计算机系统上配置OS,主要目标是实现:方便性、有效性、可扩充性和开放性。
        OS的作用主要表现在以下3个方面:

                ①OS作为用户与计算机硬件系统之间的接口;

                ②OS作为计算机系统资源的管理者;

                ③OS实现对计算机资源的抽象。

2、试说明推动OS发展的主要动力是什么。

    推动OS发展的主要动力表现在:

        ①计算机系统资源的利用率不断提高:

        ②方便用户;

        ③器件不断更新换代;

        ④计算机体系结构不断发展;

        ⑤新的应用需求不断被提出。 

3、什么是前趋图?请画出下列4条语句的前趋图。

        S1: a=xty; S2: b=z+1; S3: c=a-b; S4: w=c+1;

 (1)前趋图(precedence graph)是一个有向无环图,记为DAG ( directed acyclic graph),用于描述进程间执行的前后关系。

前趋图

4、何谓作业和JCB ( job control block,作业控制块) ? 

 ①、作业包含通常所说的程序和数据,还配有作业说明书。系统根据该说明书对程序的运行进行控制。批处理系统中是以作业为基本单位将其从外存调入内存的

 ②、JCB是作业在系统中存在的标志。为了管理和调度作业,为每个作业设置一个JCB, 用于记录管理和调度作业所需的全部信息。

5、什么是临界资源?什么是临界区?

①、在计算机中有许多资源一次仅允许一个进程使用,我们把一次仅允许 一个进程使用的资源称为临界资源,如打印机和一些共享变量等。

②、进程中访问临界资源的那段代码称为临界区

 6、存储器管理的基本任务,是为多道程序的并发执行提供良好的存储器环境。请问:“良
好的存储器环境”应包含哪几个方面?

 “良好的存储器环境”应包含:

        ①让每道程序“各得其所”在不受干扰的环境中运行还可以使用户从存储空间的分配、保护等烦琐事务中解脱出来;

        ②向用户提供更大的存储空间使更多的作业能同时运行,或使更大的作业能在较小的内存空间中运行;

        ③为用户在信息的访问、保护、共享以及动态链接等方面提供方便;

        ④使存储器有较高的利用率

7、试说明/O系统的基本功能。

I/O系统的基本功能主要包括:

        ①隐藏物理设备的细节;

        ②保证OS与设备无关;
        ③提高处理机和IO设备的利用率;

        ④控制I/O设备;确保对设备的正确共享;

        ⑥处理错误。

8、一个比较完善的文件系统应具备哪些功能?

文件存储空间管理。通过文件存储空间管理,能使文件“各得其所”.并且能尽量提高文件存储空间的利用率。

目录管理。通过目录管理,能实现文件“按名存取”,提高文文件的检索速度,解决文件的命名冲突问题(允许文件重名),并能实现文件共享。

文件读/写管理。通过文件读/写管理,可以实现文件数据的快速读/写。

文件安全性管理。通过采取多级文件保护等措施,可以实现对系统中文件的保护,防止文件被偷窃、修改和破坏。

用户接口管理。文件系统向用户提供一个统一的、方便使用的接口,用户通过该接口可以方便地获得如文件存取、创建、删除、修改等文件管理服务。

2、计算题 ( 4 抽 2 )

1、某请求调页系统,页表保存在寄存器中。若个被替换的页未被修改过,则处理 一个缺页中断需要8ms ;若被替换的页己被修改过,则处理一个缺页中断需要20ms。内存存取时间为1us,访问页表的时间可忽略不计。假定70%被替换的页被修改过,为保证有效存取时间不超过2μs,可接受的最大缺页率是多少?

                EAT = (1−缺页率) × 内存存取时间 + 缺页率 × (缺页中断处理时间)

2、某分页式虚拟存储系统,用于页面交换的磁盘的平均访问与传输时间 是20ms,页表保存在内存中,访问时间为1μs,即每引用一次指令或数据就需要访问内存 2次。为改善性能,可以增设一个联想寄存器,若页表项在联想寄存器中,则只要访问1 次内存。假设80%的访问对应的页表项在联想寄存器中,剩下的20%中有10%的访问(即总数的2% )会产生缺页。请计算有效访问时间。

                EAT=EAT-TLB命中 ​+ EAT-TLB未命中无缺页 ​+ EAT-TLB未命中有缺页

  1. 第一部分是TLB命中的情况,这时只需要一次内存访问,因此时间是0.80×1μs
  2. 第二部分处理的是TLB未命中但没有缺页的情况,这时需要两次内存访问(一次访问页表,一次访问数据),因此时间是0.18×(2×1μs)。
  3. 第三部分处理的是TLB未命中且发生缺页的情况。这里不仅包括两次内存访问(和第二部分相同),还需要从磁盘读取数据,这是磁盘访问时间 20 ms20000,之后还需要一次额外的内存访问来将数据从磁盘写入到内存中,总时间为0.02×(1μs+1μs+20000μs+1μs)。

3、对于容量为200GB的硬盘,若采用FAT文件系统且盘块大小设定为 4KB,则请问其FAT表项长度应当选用16位还是32位(采用二进制表示)? 其FAT共须占用多少字节的空间?

求出  盘块号 = 硬盘大小 / 盘块大小  将盘块号转换成 二进制表示,比如50M =>  50<2^6     M = 2^20 ,所以50M <= 2^26 所以至少26位,但是盘块二进制位数的分类只有32M 64M……,故选择32M,用 盘块二进制位数 / 8,再用求出的盘块号 乘上 盘块二进制位数 / 8的值。

4、某个容量为1.44MB的软盘,共有80个柱面,每个柱面上有18个盘块,盘块大
小为1KB,盘块和柱面均从0开始编号。文件A依次占据了20、500、750、900这4个
盘块,其FCB位于51号盘块上,磁盘最后- -次访问的是 50号盘块。若采用隐式链接分配
方式,则请计算顺序存取该文件的全部内容需要的磁盘寻道距离。

用盘块去除以每个柱面的盘块数,就是磁道号

51 / 18 = 220 / 18 = 1500 / 18 = 27750 / 18 = 41900 / 18 =50

(2-2)+(2-1)+(27-1)+(41-27)+(50-41) = 50

3、综合应用 

页面置换算法:

缺页数:当内存中不存在该页时,将该页调入内存中的数量。

缺页率:缺页数 / 总页数

1、最页面置换算法

 

2、先进先出页面置换算法

 

3、最近最久未使用页面置换算法

 

4、最少使用页面置换算法

5、Clock页面置换算法

6、改进型Clock页面置换算法

 银行家算法

 安全序列有时候是不唯一的

4、程序填空 (2 抽一 )

1、生产者 -- 消费者

#include <stdio.h>
#include <pthread.h>
#define MAX 18 /* 要生产的最大数量 */

pthread_mutex_t the_mutex;  // 互斥锁,提供对共享资源的互斥访问
pthread_cond_t condc, condp;  // 条件变量,用于线程间的信号传递
int buffer = 0;  // 缓冲区,生产者和消费者之间共享的数据

void *producer(void *ptr) /* 生产数据 */
{ 
    int i;
    for (i = 1; i <= MAX; i++) {
        pthread_mutex_lock(&the_mutex);  // 获取对缓冲区的独占访问权
        while (buffer != 0) pthread_cond_wait(&condp, &the_mutex);  // 缓冲区非空,等待
        buffer = i; /* 将项目放入缓冲区 */
        printf("产品 %d 已生产。\n", buffer);
        sleep(1);  // 模拟一些处理时间
        pthread_cond_signal(&condc);  // 唤醒消费者
        pthread_mutex_unlock(&the_mutex);  // 释放对缓冲区的访问权
    }
    pthread_exit(0);
}

void *consumer(void *ptr) /* 消费数据 */
{ 
    int i;
    for (i = 1; i <= MAX; i++) {
        pthread_mutex_lock(&the_mutex);  // 获取对缓冲区的独占访问权
        while (buffer == 0) pthread_cond_wait(&condc, &the_mutex);  // 缓冲区为空,等待
        printf("产品 %d 已消费。\n", buffer);
        buffer = 0; /* 从缓冲区取出项目 */
        pthread_cond_signal(&condp);  // 唤醒生产者
        pthread_mutex_unlock(&the_mutex);  // 释放对缓冲区的访问权
    }
    pthread_exit(0);
}

int main(int argc, char **argv)
{
    pthread_t pro, con;
    pthread_mutex_init(&the_mutex, 0);  // 初始化互斥锁
    pthread_cond_init(&condc, 0);  // 初始化消费者条件变量
    pthread_cond_init(&condp, 0);  // 初始化生产者条件变量
    pthread_create(&con, 0, consumer, 0);  // 创建消费者线程
    pthread_create(&pro, 0, producer, 0);  // 创建生产者线程
    pthread_join(pro, 0);  // 等待生产者线程结束
    pthread_join(con, 0);  // 等待消费者线程结束
    pthread_cond_destroy(&condc);  // 销毁消费者条件变量
    pthread_cond_destroy(&condp);  // 销毁生产者条件变量
    pthread_mutex_destroy(&the_mutex);  // 销毁互斥锁
}

2、读者 -- 写者

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

#define M 6 // 读者数量
#define N 2 // 写者数量

int rc = 0; // 当前读者数量
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; // 用于互斥地修改rc变量 
pthread_mutex_t db = PTHREAD_MUTEX_INITIALIZER; // 用于读、写以及写、写之间的互斥 

void *read(void *arg) {
    pthread_mutex_lock(&mutex); // 锁定互斥锁mutex,用于修改rc变量
    rc = rc + 1;
    if (rc == 1) pthread_mutex_lock(&db); // 如果是第一个读者,锁定互斥锁db
    pthread_mutex_unlock(&mutex); // 解锁互斥锁mutex,允许其他读者进入
    printf("reader %d is reading\n", arg); // 打印读者正在读
    sleep(1); // 模拟读操作,休眠1秒
    printf("reader %d is leaving\n", arg); // 打印读者正在离开
    pthread_mutex_lock(&mutex); // 锁定互斥锁mutex,用于修改rc变量
    rc = rc - 1;
    if (rc == 0) pthread_mutex_unlock(&db); // 如果是最后一个读者,解锁互斥锁db
    pthread_mutex_unlock(&mutex); // 解锁互斥锁mutex
}

void *write(void *arg) {
    pthread_mutex_lock(&db); // 锁定互斥锁db,用于写操作
    printf("writer %d is writing\n", arg); // 打印写者正在写
    sleep(1); // 模拟写操作,休眠1秒
    printf("writer %d is leaving\n", arg); // 打印写者正在离开
    pthread_mutex_unlock(&db); // 解锁互斥锁db
}

int main() {
    pthread_t readers[M], writers[N]; // 定义M个读者线程和N个写者线程
    int i;
    for (i = 0; i < M; ++i)
        pthread_create(&readers[i], NULL, read, (void *) i); // 创建M个读者线程
    for (i = 0; i < N; ++i)
        pthread_create(&writers[i], NULL, write, (void *) i); // 创建N个写者线程
    sleep(6); // 主线程休眠6秒,等待读者和写者线程执行
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/320697.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

操作系统复习 七、八章

操作系统复习 七、八章 文章目录 操作系统复习 七、八章第七章 内存管理内存管理的基本要求和原理覆盖与交换连续分配管理方式非连续分配管理方式基本分段存储管理方式段页式管理方式补充 第八章 虚拟内存虚拟内存的基本概念请求分页管理方式易混知识点页面置换算法页面分配策略…

memory泄露分析方法(java篇)

#memory泄露主要分为java和native 2种&#xff0c;本文主要介绍java# 测试每天从monkey中筛选出内存超标的app&#xff0c;提单流转到我 首先&#xff0c;辨别内存泄露类型&#xff08;java&#xff0c;还是native&#xff09; 从采到的dumpsys_meminfo_pid看java heap&…

案例:新闻数据加载

文章目录 介绍相关概念相关权限约束与限制完整示例 代码结构解读构建主界面数据请求下拉刷新总结 介绍 本篇Codelab是基于ArkTS的声明式开发范式实现的样例&#xff0c;主要介绍了数据请求和touch事件的使用。包含以下功能&#xff1a; 数据请求。列表下拉刷新。列表上拉加载…

Redis高并发高可用(主从复制、哨兵)

复制 在分布式系统中为了解决单点问题,通常会把数据复制多个副本部署到其他机器,满足故障恢复和负载均衡等需求。Redis也是如此,它为我们提供了复制功能,实现了相同数据的多个Redis 副本。复制功能是高可用Redis的基础,哨兵和集群都是在复制的基础上实现高可用的。 默认…

C++11 异常

C异常概念 在C中&#xff0c;异常是程序在执行过程中遇到意外情况或错误时抛出的一种机制。当程序运行过程中发生异常&#xff0c;可以通过抛出异常、捕获异常和处理异常来改变程序的正常执行流程。 抛出异常&#xff1a;在程序中&#xff0c;可以使用关键字 throw 来抛出异常…

Android基于Matrix绘制PaintDrawable设置BitmapShader,以手指触点为中心显示原图像圆图,Kotlin(3)

Android基于Matrix绘制PaintDrawable设置BitmapShader&#xff0c;以手指触点为中心显示原图像圆图&#xff0c;Kotlin&#xff08;3&#xff09; 在 Android基于Matrix绘制PaintDrawable设置BitmapShader&#xff0c;以手指触点为中心显示原图像圆图&#xff0c;Kotlin&#…

【小白专用】C# 连接 MySQL 数据库

C# – Mysql 数据库连接 1. 配置环境 #前提&#xff1a;电脑已安装Mysql服务&#xff1b; Visual Studio 安装Mysql依赖库&#xff1a; 工具 -> NuGet 包管理器 -> 管理解决方案的 NuGet程序包 —> 搜索&#xff0c; 安装Mysql.Data (Oracle); (安装成功后&…

libcurl开源库的编译与使用全攻略

libcurl简介 libcurl 是一个广泛使用的、支持多种协议的、开源的客户端URL传输库&#xff0c;提供了许多用于数据传输的API&#xff0c;例如文件传输、FTP、HTTP、HTTPS、SMTP等。libcurl 的主要特点包括 支持多种协议&#xff1a;libcurl 支持多种协议&#xff0c;如 HTTP、F…

【昕宝爸爸小模块】线程的几种状态,状态之间怎样流转

➡️博客首页 https://blog.csdn.net/Java_Yangxiaoyuan 欢迎优秀的你&#x1f44d;点赞、&#x1f5c2;️收藏、加❤️关注哦。 本文章CSDN首发&#xff0c;欢迎转载&#xff0c;要注明出处哦&#xff01; 先感谢优秀的你能认真的看完本文&…

什么是信噪比

大家好&#xff0c;今天给大家介绍什么是信噪比&#xff0c;文章末尾附有分享大家一个资料包&#xff0c;差不多150多G。里面学习内容、面经、项目都比较新也比较全&#xff01;可进群免费领取。 “信噪比”是电子技术中经常用到的一个词组&#xff0c;知道它的确切含义有一定意…

Day02

今日任务&#xff1a; 977 有序数组的平方209 长度最小的子数组59 螺旋矩阵Ⅱ 977 有序数组的平方 题目链接&#xff1a;https://leetcode.cn/problems/squares-of-a-sorted-array/ 双指针问题&#xff0c;以及数组本身时有序的&#xff1b; 思路&#xff1a; 左、右两个…

unet脑肿瘤分割完整代码

U-net脑肿瘤分割完整代码 代码目录数据集网络训练测试 代码目录 数据集 https://www.kaggle.com/datasets/mateuszbuda/lgg-mri-segmentation dataset.py 在这里插入代码片import os import numpy as np import glob from PIL import Image import cv2 import torchvision fr…

如何在“Microsoft Visual Studio”中使用OpenCV构建应用程序

我在这里描述的所有内容都将应用于 OpenCV 的界面。我首先假设您已经阅读并成功完成了 Windows 中的安装教程。因此&#xff0c;在进一步操作之前&#xff0c;请确保您有一个包含 OpenCV 头文件和二进制文件的 OpenCV 目录&#xff0c;并且您已按照此处所述设置环境变量 设置 O…

多智能体强化学习(概念知识,不涉及具体算法)

目录 一、前置知识1.factored value function2.partially observable MDP (POMDP) problem.2.2 Decentralized-POMDP problem2.3 networked decentralized partially observable Markov decision processes (ND-POMDP) problem2.4 上述两种算法的区别 3. Mean Field Multi-Agen…

深信服超融合HCI版本升级,6.0.0R5升级至6.8.0R2

超融合升级&#xff0c;需要满足以下条件及前期准备&#xff1a; 确认HCI的升级序列号有效升级时长大概在一个半小时&#xff0c;安全起见&#xff0c;需预留至少三至四小时窗口期升级前&#xff0c;需要将所有虚拟机关机&#xff0c;涉及到业务无法访问&#xff0c;需提前通知…

redis中的string相关的部分命令

redis命令手册 redis中文官网查看文档 挨个进行输出调试 Redis Setnx 命令 Redis Getrange 命令 Redis Mset 命令 redis 127.0.0.1:6379> MSET key1 "Hello" key2 "World" OK redis 127.0.0.1:6379> GET key1 "Hello" redis 127.0.0.1:…

datavrap-各种各样的条形图(含详细操作步骤)

静态条形图&#xff1a;正确设置数据即可&#xff0c;导出的图形不会随着时间变化 最普通的静态条形图 黑色系风格的静态条形图 动态条形图&#xff1a;导出的图形会随着时间变化 普通的动态条形图 带数字滚动效果的动态条形图 简单的Top排行榜动态条形图 格式更丰富的Top排行榜…

牛客周赛 Round 28 解题报告 | 珂学家 | 组合数学 + 离散化树状数组

前言 整体评价 还是E稍微有点意思&#xff0c;新周赛好像比预期要简单一些, _. 欢迎关注 珂朵莉 牛客周赛专栏 珂朵莉 牛客小白月赛专栏 A. 小红的新周赛 思路: 模拟 #include <bits/stdc.h>using namespace std;int main() {int res 0;for (int i 0; i < 6; i…

【算法练习】leetcode算法题合集之数组和哈希表篇

重建数组&#xff08;高频&#xff09; LeetCode283.移动零 LeetCode283.移动零 双指针&#xff0c;记录已经处理好的序列的尾部 class Solution {public void moveZeroes(int[] nums) {int k 0;for (int i 0; i < nums.length; i) {if (nums[i] ! 0) {swap(nums, i, k)…

【前后端的那些事】开源!前后端环境搭建+树形结构表格实现

文章目录 1. 前后端项目环境搭建2. table-tree2.1 后端准备2.2 前端准备 前言&#xff1a;最近写项目&#xff0c;发现了一些很有意思的功能&#xff0c;想写文章&#xff0c;录视频把这些内容记录下。但这些功能太零碎&#xff0c;如果为每个功能都单独搭建一个项目&#xff0…