2022-复习

⼀、选择题

1.线性表的顺序存储结构是⼀种(A )。
A.随机存取的存储结构 B. 顺序存取的存储结构
C.索引存取的存储结构 D. 散列存取的存储结构

2.栈和队列具有相同的( B)。
A.抽象数据类型 B. 逻辑结构 C.存储结构 D.运算

3.具有10个叶⼦结点的⼆叉树中有(B)个度为2的结点。
A. 8
B. 9
C.10
D.11

设节点总数为n, n 0 , n 1 , n 2 n_0,n_1,n_2 n0,n1,n2分别为叶子结点,只有一个孩子的节点,有两个孩子的节点。那么就有 n = n 0 + n 1 + n 2 = n 1 + 2 ∗ n 2 + 1 n = n_0+n_1 + n_2 = n_1+2*n_2+1 n=n0+n1+n2=n1+2n2+1化简可得 n 0 = n 2 + 1 n_0 = n_2+1 n0=n2+1又因为 n 0 = 10 n_0 = 10 n0=10所以 n 2 = 9 n_2 = 9 n2=9

4.下列选项中,不属于OSI体系机构中物理层功能的是(D)。
A. ⽐特0和1使⽤何种电⼦信号表⽰
B. 1个⽐特持续多⻓时间
C. 传输能否在两个⽅向上同时进⾏
D. 避免快速发送⽅“淹没”慢速接受⽅

D是流量控制,属于数据链路层、网络层、传输层的功能。物理层并没有这一功能。

5.下列选项中,必须在核⼼态下执⾏的指令是(D)。
A.从内存中取数 B. 将运算结果装⼊内存 C. 算术运算 D. 输⼊/输出.

输入输出涉及到硬件操作,必须转为相对更为安全的核心态才能进行。
相关操作:
1.屏蔽所有中断指令,在核心态下执行。
2.读时钟日期指令,在用户态下执行。
3.设置时钟日期指令,在核心态下执行。
4.改变存储映像图指令,在核心态下执行。
5存取某地址单元的内容指令,在用户态下执行;(*)
6.停机指令,在核心态下执行。

⼆. 填空题

1.⼀个进程的基本状态可以从其他两种基本状态转变过去,这个基本的状态⼀定是(就绪态)

创建完成
运行结束
获得CPU时间片
时间片用完
等待资源
获得资源
创建态
运行态
销毁态
就绪态
阻塞态

2.⼀个计算机系统中,进程的最⼤数⽬主要受到(内存)限制。
进程创建需要占用系统内存来存放PCB的数据结构,所以,一个系统能够创建的进程总数是有限的,进程的最大数目取决于系统内存的大小,由系统安装时已经确定(若后期内存增加了,系统能够创建的进程总数也应增加,但是一般需要重新启动)。

3.⼀次分配所有资源的⽅法可以预防死锁的发⽣,它破坏死锁4个必要条件中
的(申请并保持)。

在这里插入图片描述
4.某系统中共有11台磁带机,X个进程共享此磁带机设备,每个进程最多请求使⽤3台,则系统必然不会死锁的最⼤X值是(5 )。
2 ∗ X = 11 − 1 2 * X = 11 - 1 2X=111

5.在段⻚式分配中,CPU每次从内存中取⼀次数据需要(3 ) 次访问内存
在不考虑快表的情况下,n级页表访问n+1次内存。段页式分配和二级页表分配都访问3次内存。

三. 概念论述题

1.协议与服务有何区别?
协议是水平的,服务是垂直的。
协议是“水平的”,即协议是控制两个对等实体进行通信的规则。但服务是“垂直的”,即服务是由下层通过层间接口向上层提供的。

协议与服务的关系
协议的实现是向上一层提供服务的基础,而上层只能看到下层提供的服务,却看不到下层实现的协议。

2.数据链路(即逻辑链路)与链路( 即物理链路)有何区别?
链路只是指一个节点到与之相邻的另一个节点的物理线路,其中间没有其他的交换节点。链路只是一条路径的组成部分。
数据链路是指链路再加上一些必要的通信协议来控制数据的传输。

3.⽗进程创建⼦进程和主程序调⽤⼦程序有何不同?
父进程创建子进程,父进程会与子进程并行执行。而主程序调用子程序,会先执行子程序,在子程序执行完毕之后再返回主程序调用点处继续执行。
在这里插入图片描述
4.何为管程?
管程是一种数据结构,分散在各处的pv语句不好管理,为了便于管理提出了管程这一概念
管程包括(数据结构定义、操作、初始化)
1.局部于管程的共享数据结构说明;
2.对该数据结构进行操作的一组过程;
3.对局部于管程的共享数据设置初始值的语句;

四. 简答题

1.死锁发⽣的条件?
四个条件:互斥、请求并保持、不剥夺、环路等待。
造成死锁的原因:资源竞争、进程推进顺序非法。

2.处理死锁有哪三种策略?

在这里插入图片描述
3.分布式系统中的通信延迟依赖于哪⼏个因素?
总时延 = 发送时延 + 传输时延 + 排队时延 + 处理时延 总时延 = 发送时延 + 传输时延 + 排队时延 + 处理时延 总时延=发送时延+传输时延+排队时延+处理时延

发送时延 = 数据长度 信道宽度 ,传输时延 = 信道长度 信道传播速度 发送时延 = \frac{数据长度}{信道宽度},传输时延 = \frac{信道长度}{信道传播速度} 发送时延=信道宽度数据长度,传输时延=信道传播速度信道长度
排队时间和处理时延和所选择的处理调度算法相关。

4.系统冗余有哪四种类型?
(1)硬件冗余:应用附加硬件来实现故障检测及容错:典型的列子如双机比较系统,三模表决系统等。
(2)软件冗余:应用附加软件来实现故障检测及容错。典型例子如故障诊断程序、软件实现的比较器、表决器等。
(3)信息冗余:应用附加信息来实现检错或纠错。典型的例子有检错码及纠错码。
(4)时间冗余:应用附加的时间以执行系统的功能,实现检错或容错,典型的例子有指令复制,程序卷回等。

五.综合应⽤题

1. Q是⼀个队列,S是⼀个空栈,实现将队列中的元素逆置的算法。

#include <stdio.h>
// Q是⼀个队列,S是⼀个空栈,实现将队列中的元素逆置的算法
int Q[100],S[100];
// 暂时以数组代表队列和栈
int top = -1;
// 栈顶指针,入栈S[++top] = value  出栈value = S[top--]
int front = -1,rear = -1;
// 队头和队尾指针 入队Q[++rear] = value 出队 value = Q[++front]

void printQueue(){
    
    
    // 输出队列元素
    for(int i=front+1;i<=rear;i++)
        printf("%d ",Q[i]);
    printf("\n");
}

void reverseQueue(){
    
    
    // 利用栈将队列元素逆置
    while (front < rear) {
    
    
        // 当队列非空
        S[++top] = Q[++front];
        // 队列元素依次入栈
    }
    while (top>=0) {
    
    
        // 当栈非空
        Q[++rear] = S[top--];
        // 栈元素依次入队
    }
}
int main(void) {
    
    
    for(int i=1;i<=5;i++)
        Q[++rear] = i;
    // 初始化队列元素为1,2,3,4,5
    printQueue();
    reverseQueue();
    printf("逆置后\n");
    printQueue();

    return 0;
}

2. 某银⾏计算机系统要实现-⼀个电⼦转账系统,基本业务流程是:⾸先对转出⽅和转⼊⽅的账户进⾏加锁,然后进⾏转账业务,最后转出⽅和转⼊⽅对账户进⾏解锁。若不采取任何措施,系统会不会发⽣死锁?为什么?
会发生死锁,因为对转出⽅和转⼊⽅的账户进⾏加锁并不是同时进行的。举例,如果A要给B转账由进程1负责,但刚好B也要给A转账由进程2负责。那么有可能进程1先对A账户进行加锁同时申请对B账户加锁,进程2先对B账户进行加锁同时申请对账户A进行加锁。那么二者就形成了环路等待,产生了死锁。

3. 已知: 1个项⽬中的1名⼯程师只会有1名经理; 1个项⽬中的1名经理会
带领多名⼯程师做该项⽬; 1名经理和他⼿下的1名⼯程师可能参与多个项
⽬。创建关系型数据库表格,体现出三者之间的关系。

在这里插入图片描述
4. 采⽤任意代码(框架)实现-⼀个简单的分布式应⽤,要求客户端向服务端发出⼀个字符串,服务端收到此字符串之后,向客户端发出回复“hello"。

Server

import socket

# 指定IP为本机IP 端口号任意指定为6666
ip_port = ('127.0.0.1', 6666)
# 最多可以连接back_log个客户端
back_log = 1
# 创建一个TCP套接字
serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定端口号
serverSocket.bind(ip_port)  # 绑定哪个ip就要运行在哪台机器上
# 设置半连接池
serverSocket.listen(back_log)  # 让服务器聆听来自客户的TCP请求

connectionSocket, addr = serverSocket.accept()  # 当客户敲门,创建了一个新的套接字,为这个客户服务
   
msg = connectionSocket.recv(1024).decode('utf-8')  # # 每次最多接收1k字节,并将报文转码

# print(msg)

connectionSocket.send("Hello".encode('utf-8'))
serverSocket.close()

Client

import socket
# 创建客户端套接字
clientSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 发起和服务器的TCP连接
clientSocket.connect(('127.0.0.1', 6666))
clientSocket.sendall("12345".encode('utf-8'))
msg = clientSocket.recv(1024).decode('utf-8')  # # 每次最多接收1k字节,并将报文转码
print(msg)
clientSocket.close()

猜你喜欢

转载自blog.csdn.net/Kilig___/article/details/129661268
今日推荐