操作系统与网络基础问答详解

内容分享1天前发布
0 0 0

table {
border-collapse: collapse;
width: 100%;
margin-bottom: 1rem;
}
th, td {
border: 1px solid #ddd;
padding: 8px;
text-align: left;
}
th {
background-color: #f2f2f2;
}
tr:nth-child(even) {
background-color: #f9f9f9;
}
pre {
background-color: #f8f8f8;
padding: 15px;
border-radius: 4px;
overflow-x: auto;
}

1、互联网属于局域网(LAN)还是广域网(WAN)?

互联网与广域网的关系

互联网属于

广域网(WAN)


广域网

通常用于连接不同建筑物、城市或国家。而互联网连接了全球范围内的计算机和网络,符合广域网

覆盖范围大

的特点。

2、资源利用率问题在不同类型的操作系统中以不同形式出现。列出在以下场景中必须谨慎管理的资源:a. 大型机或小型计算机系统;b. 连接到服务器的工作站;c. 手持设备

a. 大型机或小型计算机系统:CPU时间、内存、I/O设备等资源需要被谨慎管理,以确保所有可用资源得到高效利用,且每个用户不会占用超过其应得的份额。

b. 连接到服务器的工作站:用户有专用资源,但也共享网络、文件服务器、计算服务器和打印服务器等资源,操作系统需在个人可用性和资源利用率之间进行权衡,所以这些共享资源都需要谨慎管理。

c. 手持设备:由于功率、速度和接口的限制,主要为个人可用性设计操作系统,但单位电池续航的性能也很重要,因此电池电量、CPU资源等需要谨慎管理。

3、描述对称多处理和非对称多处理之间的区别。多处理器系统的三个优点和一个缺点是什么?

对称多处理与非对称多处理的区别

处理方式区别


非对称多处理

每个处理器被分配特定任务

有主处理器控制

其他处理器听从主处理器指令或有预定义任务

存在主从关系


对称多处理

每个处理器执行操作系统内的所有任务

所有处理器都是对等的

不存在主从关系

多处理器系统的优点


增加吞吐量



– 通过增加处理器数量,有望在更短时间内完成更多工作


规模经济



– 成本低于等效的多个单处理器系统

– 可共享外设、大容量存储和电源


提高可靠性



– 若功能能在多个处理器间合理分配

– 一个处理器故障不会使系统停止,只会使其变慢

多处理器系统的缺点

可能导致内存访问模式从

统一内存访问

变为

非统一内存访问

造成性能损失

4、集群系统与多处理器系统有何不同?属于一个集群的两台机器要合作提供高可用性服务需要什么条件?

集群系统与多处理器系统的区别

集群系统与多处理器系统的不同之处在于:


集群系统

由两个或多个独立系统(节点)连接在一起组成。

通常共享存储。

通过局域网(LAN)或更快的互连(如Infiniband)紧密相连。


多处理器系统

则是将多个CPU集中在一起完成计算工作。

集群系统的协作要求

两台属于一个集群的机器要合作提供高可用性服务,需要满足以下条件:


共享存储


通过局域网或更快的互连紧密相连


运行一层集群软件



– 每个节点能监控其他节点。

– 若被监控机器故障,监控机器可接管其存储并重启功能。


部分集群技术还需包含分布式锁管理器(DLM)

5、区分分布式系统的客户端 – 服务器模型和对等(P2P)模型。

在客户端 – 服务器模型中,客户端和服务器有明确区分,服务器易成为瓶颈。而在对等模型中,系统内所有节点都是对等的,每个节点可根据情况充当客户端或服务器,服务可由网络中多个节点提供。

6、中断的目的是什么?陷阱和中断有什么区别?用户程序能否有意生成陷阱?如果可以,目的是什么?

中断与陷阱

中断的目的是使操作系统能根据不同类型的中断决定采取何种行动,实现系统的中断驱动结构。

陷阱

陷阱是由错误(如除零错误、无效内存访问)或用户程序请求操作系统服务而产生的

软件生成的中断

陷阱属于中断的一种特殊情况。

用户程序能有意生成陷阱,目的是请求操作系统提供服务。

7、直接内存访问(DMA)用于高速 I/O 设备,以避免增加 CPU 的执行负载。a. CPU 如何与设备接口来协调数据传输?b. CPU 如何知道内存操作何时完成?c. 当 DMA 控制器传输数据时,CPU 可以执行其他程序。这个过程会干扰用户程序的执行吗?如果会,请描述会造成哪些形式的干扰。

a. CPU 向设备驱动程序发出指令,设备驱动程序加载设备控制器内的适当寄存器,设备控制器检查寄存器内容并启动数据传输。设备控制器向 DMA 控制器发送数据,DMA 控制器在接收到 DMA 确认信号后将数据传输到内存。

b. 当整个数据传输完成后,DMA 控制器会中断 CPU,以此告知 CPU 内存操作已完成。

c. 当 DMA 控制器占用内存总线时,CPU 暂时无法访问主内存,不过仍可访问其一级和二级缓存中的数据项。这种周期窃取会减慢 CPU 计算速度,但将数据传输工作卸载到 DMA 控制器通常会提高整个系统的性能。

8、请说明缓存有用的两个原因。它们解决了哪些问题?又引发了哪些问题?如果缓存可以做得和它为之缓存的设备一样大(例如,一个和磁盘一样大的缓存),为什么不把它做得那么大并去掉该设备呢?

缓存的价值与挑战

缓存的两个主要原因


提高数据访问速度


信息从高速缓存读取比从原存储系统读取更快。


减少对原存储系统的访问


降低原存储系统的压力。

解决的问题

减少CPU等待时间

提高系统性能

避免或推迟物理磁盘I/O操作

引发的问题

缓存大小有限,需要管理缓存,选择合适的替换策略

存在缓存数据与原数据不一致的风险

缓存与存储设备的关系

即便缓存能做得和设备一样大,也不能去掉设备:

缓存是临时存储数据

设备用于长期存储数据

成本因素:

缓存成本高

设备成本相对低

数据持久性:

设备断电数据不丢失

缓存可能丢失数据

9、描述一种用于实施内存保护以防止程序修改其他程序关联内存的机制。

内存保护的实现方式

可使用

基址寄存器



限长寄存器

来实现内存保护。


基址寄存器

保存最小合法物理内存地址。


限长寄存器

指定地址范围大小。


CPU硬件

会将用户模式下生成的每个地址与这两个寄存器的值进行比较:

若程序在用户模式下试图访问操作系统内存或其他用户的内存,会触发一个

陷阱

到操作系统。

操作系统将此视为

致命错误

特权指令与操作系统控制

基址和限长寄存器只能由操作系统使用

特殊的特权指令

加载。


特权指令

只能在

内核模式

下执行。

只有操作系统在内核模式下运行,因此只有操作系统能更改这两个寄存器的值,防止用户程序修改其内容。

10、以下环境最适合哪种网络配置?a. 宿舍楼层 b. 大学校园 c. 一个州 d. 一个国家

a. 宿舍楼层适合局域网(LAN),它可连接同一楼层内的计算机;

b. 大学校园适合局域网(LAN)或城域网(MAN),LAN可连接校园内不同建筑的计算机,MAN也能满足校园内建筑物之间的连接需求;

c. 一个州适合广域网(WAN),能连接州内不同地区的建筑;

d. 一个国家适合广域网(WAN),可连接国内不同城市、地区的建筑。

11、定义以下类型操作系统的基本特性:a. 批处理 b. 交互式 c. 分时 d. 实时 e. 网络 f. 并行 g. 分布式 h. 集群 i. 手持设备


a. **批处理操作系统**:用户将作业成批提交,系统自动依次处理,减少人工干预,提高系统吞吐量。

b. **交互式操作系统**:用户与系统通过命令或图形界面实时交互,系统及时响应操作。

c. **分时操作系统**:多个用户通过终端同时使用计算机,系统将CPU时间分成时间片,轮流为各用户服务。

d. **实时操作系统**:能在严格的时间限制内完成任务,对外部事件及时响应,可靠性高。

e. **网络操作系统**:支持计算机联网,提供网络通信和资源共享功能,管理网络中的软硬件资源。

f. **并行操作系统**:支持多个处理单元同时执行任务,提高计算速度和效率。

g. **分布式操作系统**:将多个计算机通过网络连接,如同一个整体,资源可共享,任务可分布处理。

h. **集群操作系统**:将多台计算机连接成集群,协同工作,提高系统性能、可用性和容错能力。

i. **手持设备操作系统**:体积小、功耗低,界面简单易用,适合手持设备操作,支持触摸等交互方式。

12、手持电脑固有的权衡是什么?

手持电脑的优缺点

优点

方便是手持电脑的主要优势

便携性使其易于携带和使用

随着网络连接的增多和功能的拓展,其用途不断扩大

缺点

功能存在局限性

设备尺寸小导致以下问题:

内存较少

处理器速度较慢

显示屏较小

内存需要高效管理

操作系统和应用设计不能过度消耗处理器

输入方法和显示受物理空间限制

13、命令解释器的目的是什么?为什么它通常与内核分开?

命令解释器的作用与设计

命令解释器的主要目的是获取并执行用户指定的下一个命令。许多该层面的命令用于操作文件,如:

创建

删除

列出

打印

复制

执行

命令解释器通常与内核分开,是因为有些操作系统将其视为特殊程序,在作业启动或用户登录时运行。像 Windows 和 UNIX 就采用这种方式,并且在有多个命令解释器可供选择的系统中,用户可基于个人偏好选择使用。分开设计也使系统更具灵活性。

14、为了启动一个新进程,命令解释器或 shell 必须执行哪些系统调用?

为了启动一个新进程,shell 需执行

fork()

系统调用创建新进程,再通过

exec()

系统调用将所选程序加载到内存并执行。

15、系统程序的目的是什么?

系统程序与服务概述

系统程序旨在满足许多常见的用户请求。不同层次的请求类型如下:

请求层次


系统调用层

:提供基本功能,包括:

进程控制

文件操作

设备操作


更高级别的请求

:由以下组件处理,并转换为一系列系统调用:

命令解释器

系统程序

系统服务分类


程序控制


状态请求


I/O请求


注意

:程序错误也可视为隐式的服务请求。

16、列出操作系统提供的五项服务,并解释每项服务如何为用户带来便利。在哪些情况下,用户级程序无法提供这些服务?请解释原因。

操作系统提供的五项服务及其为用户带来的便利


用户界面


提供多种形式的用户界面,如命令行界面、批处理界面和图形用户界面,方便用户与系统交互,降低操作难度。


程序执行


能将程序加载到内存并运行,还能正常或异常结束程序,让用户无需关心程序在内存中的管理和执行细节。


I/O操作


为运行的程序提供I/O功能,用户不能直接控制I/O设备,操作系统提供了操作手段,提高效率和保护设备。


文件系统操作


允许程序读写、创建、删除文件和目录,搜索文件,管理文件权限等,方便用户对文件进行管理。


通信


支持进程间信息交换,无论是同一计算机上的进程还是不同计算机上的进程,便于用户进行多进程协作。


在某些情况下,用户级程序无法提供的服务


I/O操作


用户通常不能直接控制I/O设备,操作系统需要对设备进行统一管理和调度,以保证效率和安全性,用户级程序难以做到。


资源分配


操作系统需要统筹管理多种资源,如CPU周期、主内存、文件存储和I/O设备等,根据不同情况进行合理分配,用户级程序无法获取全局资源信息进行有效分配。


保护和安全


操作系统要确保所有对系统资源的访问都受到控制,防止不同进程相互干扰,还要抵御外部攻击,用户级程序难以实现如此全面的保护和安全机制。

17、用户是否可以使用操作系统提供的系统调用接口开发新的命令解释器?

可以。系统调用提供了操作系统服务的接口,用户可利用这些接口开发新的命令解释器。操作系统的系统调用能实现基本功能,如:

进程控制

文件和设备操作

这些功能为开发命令解释器提供了基础。用户可基于这些系统调用实现命令解释器获取和执行用户指定命令的功能。

18、为什么策略和机制的分离是可取的?

策略与机制分离的优势

策略和机制分离具有灵活性,因为策略可能会随地点或时间变化。如果不进行分离,每次策略的改变都需修改底层机制;而分离后则可以使用通用机制来避免这种情况。

示例说明

若机制与策略适当分离,给予某些程序优先级的机制可支持不同的策略决策。

操作系统对比


微内核操作系统

:通过实现基本的原始构建块将策略和机制分离,允许通过用户创建的内核模块或用户程序添加更高级的机制和策略。


Windows 等操作系统

:机制和策略均编码在系统中,缺乏这种灵活性。

19、微内核方法进行系统设计的主要优点是什么?在微内核架构中,用户程序和系统服务如何交互?微内核方法的缺点是什么?

微内核方法的优缺点

主要优点


易于扩展操作系统

:新服务添加到用户空间,无需修改内核,修改内核时改动也较少。


易于移植

:操作系统更易从一种硬件设计移植到另一种。


更高的安全性和可靠性

:多数服务以用户进程而非内核进程运行,一个服务失败不影响其他部分。

架构示例

在微内核架构中,以

Tru64 UNIX

为例,

Mach 内核

将 UNIX 系统调用映射为消息传递给相应的用户级服务。

缺点


性能下降

:微内核方法可能因系统功能开销增加导致性能下降。例如,

Windows NT

最初采用分层微内核组织,相比

Windows 95

性能较低。

20、对于操作系统设计者来说,使用虚拟机架构的主要优点是什么?对于用户来说,主要优点是什么?

操作系统的优点

对于操作系统设计者


无需频繁中断正常系统运行

:可在虚拟机上进行开发,避免对主系统造成影响。


实现系统整合

:将多个独立系统在一台系统的虚拟机上运行,优化资源利用。


应用部署更灵活

:应用管理更简单,减少调优工作,技术支持更直接。

对于用户


多操作系统并行运行

:可在开发者工作站上同时运行多个操作系统,便于在不同环境中快速移植和测试程序。


便捷的测试环境

:质量保证工程师可在多个环境中测试应用,无需为每个环境购买、供电和维护计算机。

21、描述短期调度、中期调度和长期调度之间的区别。

调度类型概述

短期调度(CPU调度器)

从就绪进程中选择进程并分配CPU

执行频率高,通常至少每100毫秒执行一次

要求速度快

长期调度(作业调度器)

从进程池中选择进程并加载到内存中执行

执行频率低,可能几分钟才执行一次

控制多道程序的程度

中期调度

将进程从内存中移除(换出)以减少多道程序的程度

之后再重新引入内存(换入)继续执行

目的可能是改善进程组合或释放内存

22、构建一个进程树。在UNIX或Linux系统上,使用命令ps -ael来获取进程信息,使用命令man ps来获取有关ps命令的更多信息。在Windows系统上,使用任务管理器获取进程信息。

构建进程树的步骤

按照以下步骤构建进程树:

在 UNIX 或 Linux 系统中

使用命令

ps -ael

获取进程信息。

使用命令

man ps

了解

ps

命令的更多详情。

在 Windows 系统中

使用任务管理器获取进程信息。

根据所获取的信息构建进程树。

23、编写一个使用 fork() 系统调用的 C 程序,在子进程中生成斐波那契数列。数列的项数将在命令行中提供。例如,如果提供的是 5,子进程将输出斐波那契数列的前五项。由于父进程和子进程有各自的数据副本,因此需要子进程来输出数列。让父进程调用 wait() 函数,在退出程序之前等待子进程完成。进行必要的错误检查,确保在命令行中传递的是一个非负数字。

以下是实现该功能的 C 程序:


#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <wait.h>

// 计算斐波那契数列的函数
void fibonacci(int n) {
    int a = 0, b = 1, c;
    for (int i = 0; i < n; i++) {
        if (i == 0) {
            printf("%d ", a);
        } else if (i == 1) {
            printf("%d ", b);
        } else {
            c = a + b;
            printf("%d ", c);
            a = b;
            b = c;
        }
    }
    printf("
");
}

int main(int argc, char *argv[]) {
    if (argc != 2) {
        fprintf(stderr, "Usage: %s <number of Fibonacci sequence>
", argv[0]);
        return 1;
    }
    int n = atoi(argv[1]);
    if (n < 0) {
        fprintf(stderr, "Please enter a non - negative number.
");
        return 1;
    }
    pid_t pid = fork();
    if (pid < 0) {
        fprintf(stderr, "Fork Failed
");
        return 1;
    } else if (pid == 0) {
        fibonacci(n);
    } else {
        wait(NULL);
    }
    return 0;
}

该程序首先检查命令行参数的数量和传递的数字是否为非负。然后使用

fork()

创建子进程,子进程调用

fibonacci

函数计算并输出斐波那契数列,父进程使用

wait()

等待子进程完成。

24、设计一个程序输出斐波那契数列,采用的方法是在父进程和子进程之间建立一个共享内存段,让子进程将斐波那契数列的内容写入共享内存段,父进程在子进程完成后输出该数列。已知要使用POSIX共享内存来构建该程序,首先需要为共享内存段创建数据结构,使用如下结构体:#define MAX_SEQUENCE 10 typedef struct { long fib_sequence[MAX_SEQUENCE]; int sequence_size; } shared_data; 请描述父进程和子进程的执行步骤以及如何实现进程同步。

设计输出斐波那契数列程序的另一种方法

本题介绍了设计输出斐波那契数列程序的另一种方法,即通过在父进程和子进程间建立共享内存段来实现。

共享内存段的设计

给出了共享内存段的数据结构定义。

父进程的执行步骤

接受参数。

创建并附加共享内存段。

设置数列大小。

创建子进程并等待其完成。

输出数列。

分离并移除共享内存段。

子进程的执行步骤

将数列写入共享内存。

完成写入后分离共享内存段。

进程同步方法

使用

wait()

系统调用实现父子进程同步。

确保父进程在子进程完成写入操作后才输出数列。

25、编写一个C程序,该程序接收一个共享内存段的标识符。此程序将调用shmctl()函数来获取其shm_ds结构。然后,它将输出该共享内存段的以下值:段ID、键、模式、所有者用户ID、大小、附加次数。

以下是一个满足需求的C程序示例:


#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <errno.h>

int main(int argc, char *argv[]) {
    if (argc != 2) {
        fprintf(stderr, "Usage: %s <segment_id>
", argv[0]);
        return 1;
    }
    int segment_id = atoi(argv[1]);
    struct shmid_ds shmbuffer;
    if (shmctl(segment_id, IPC_STAT, &shmbuffer) == -1) {
        perror("shmctl");
        return 1;
    }
    printf("Segment ID: %d
", segment_id);
    printf("Key: %ld
", (long)shmbuffer.shm_perm.__key);
    printf("Mode: %o
", shmbuffer.shm_perm.mode);
    printf("Owner UID: %d
", shmbuffer.shm_perm.uid);
    printf("Size: %lu bytes
", (unsigned long)shmbuffer.shm_segsz);
    printf("Number of attaches: %d
", shmbuffer.shm_nattch);
    return 0;
}

代码说明:


参数检查

:程序首先检查命令行参数的数量是否正确。如果不正确,将输出使用说明并退出。


获取共享内存段标识符

:从命令行参数中获取共享内存段的标识符。


调用

shmctl()

函数

:使用

shmctl()

函数获取共享内存段的

shmid_ds

结构。如果调用失败,将输出错误信息并退出。


输出共享内存段信息

:从

shmid_ds

结构中提取所需信息并输出。

26、请用 Java 编写一个程序来实现求和函数,该函数计算从 0 到用户输入的整数之间所有整数的和。

以下是用 Java 重写的执行求和函数的程序:


class Sum {
    private int sum;
    public int getSum() {
        return sum;
    }
    public void setSum(int sum) {
        this.sum = sum;
    }
}
class Summation implements Runnable {
    private int upper;
    private Sum sumValue;
    public Summation(int upper, Sum sumValue) {
        this.upper = upper;
        this.sumValue = sumValue;
    }
    public void run() {
        int sum = 0;
        for (int i = 0; i <= upper; i++)
            sum += i;
        sumValue.setSum(sum);
    }
}
public class Driver {
    public static void main(String[] args) {
        if (args.length > 0) {
            if (Integer.parseInt(args[0]) < 0)
                System.err.println(args[0] + " must be >= 0.");
            else {
                // 创建要共享的对象
                Sum sumObject = new Sum();
                int upper = Integer.parseInt(args[0]);
                Thread thrd = new Thread(new Summation(upper, sumObject));
                thrd.start();
                try {
                    thrd.join();
                    System.out.println("The sum of " + upper + " is " + sumObject.getSum());
                } catch (InterruptedException ie) {
                }
            }
        } else
            System.err.println("Usage: Summation <integer value>");
    }
}

该程序通过创建一个实现

Runnable

接口的

Summation

类来执行求和操作,在

main

方法中创建线程并启动,最后等待线程执行完毕并输出结果。

© 版权声明

相关文章

暂无评论

none
暂无评论...