day3 3.13
1以下关于冯·诺依曼结构和哈佛结构的描述中,不正确的是()。
冯·诺依曼结构的计算机中程序和数据共用一个存储空间
冯·诺依曼结构中程序计数器负责提供程序执行所需要的地址
哈佛结构的计算机在一个机器周期内可同时获得指令字和操作数
哈佛结构中取指和执行不能完全重叠。
选项A冯·诺依曼结构中,程序空间和数据空间是合在一起的,也就是程序和数据共用一个存储空间,该描述正确。
选项B在冯·诺依曼结构中,程序计数器的作用是提供程序执行所需要的地址,用于指引程序的执行流程,该描述正确。
选项C哈佛结构是程序指令储存和数据储存分开的结构,数据和指令的储存可以同时进行,所以在一个机器周期内可同时获得指令和操作数,该描述正确。
选项D根据哈佛结构的解析,哈佛结构的取指指令和执行在流水线上是可以重叠的,并非取指和执行不能完全重叠,所以该描述不正确。
假设某系统总线在一个总线周期中并行传输4字节信息,一个总线周期占用2个时钟周期,总线时钟频率为100MHz,则总线带宽是()。
100MB/s
200MB/S
400MB/S
800MB/S
带宽 = 每个总线周期传输的数据量 / 一个总线周期所用的时间
1. 明确已知条件:
-
一个总线周期传输 4 字节 信息
-
一个总线周期占用 2 个时钟周期
-
总线时钟频率 = 100 MHz = 100×106100×106 Hz
2. 计算总线周期时间:
-
每个时钟周期的时间为:
Tclk=1100×106秒=10 nsTclk=100×1061秒=10 ns
-
一个总线周期 = 2 个时钟周期:
Tbus cycle=2×10 ns=20 nsTbus cycle=2×10 ns=20 ns
3. 计算带宽:
带宽 = 每个总线周期传输的数据量 / 一个总线周期所用的时间

4. 答案:
200 MB/s200 MB/s
操作系统中,防止任务优先级反转的方法有
时间片轮转和优先级继承
时间片轮转和天花板
先来先服务
优先级继承和优先级天花板
A选项:时间片轮转和优先级继承时间片轮转:是一种进程调度方法,按固定时间片分配CPU给不同进程,与防止优先级反转无关。优先级继承:虽然优先级继承是解决优先级反转的方法之一,但该选项中时间片轮转不是,所以A错误。
D选项:优先级继承和优先级天花板优先级继承协议:当一个任务阻塞了高优先级任务时,该任务会提升自身优先级到被阻塞的最高优先级任务的优先级,退出临界区后恢复原优先级,用于解决优先级反转。上大号
优先级天花板协议:通过信号量的优先级天花板(信号量的优先级天花板为使用该信号量的任务的最高优先级),任务获取信号量执行临界区时,优先级提升到信号量的优先级天花板,解决优先级继承协议中的死锁等问题。因此,优先级继承和优先级天花板是防止任务优先级反转的方法,D正确。
以下描述中不属于嵌入式操作系统特点的是
面向应用,可以进行裁剪和移植
用于特定领域,不需要支持多任务
可靠性高,无须人工干预独立运行,并处理各类事件和故障
要求编码体积小,能够在嵌入式系统的有效存储空间内运行
A选项嵌入式操作系统面向特定应用场景,为了适配不同的硬件和应用需求,可以进行裁剪(去掉不需要的功能模块)和移植(将系统移植到不同的硬件平台上),这属于嵌入式操作系统的特点,所以A不符合题意。面向过程
B选项嵌入式操作系统通常需要支持多任务。因为嵌入式系统中可能同时有多个任务需要处理,比如一边处理用户输入,一边进行数据传输等,所以"用于特定领域,不需要支持多任务”不属于嵌入式操作系统的。特点,B符合题意
在网络系统设计时,不可能使所有设计目标都能达到最优,下列措施中较为合理的是()。
尽量让最低建设成本目标达到最优
尽量让最短的故障时间目标达到最优。
尽量让最大的安全性目标达到最优
尽量让优先级较高的目标达到最优
A选项
网络系统设计涉及多方面目标,仅让最低建设成本目标达到最优是片面的,因为还需兼顾性能、安全性等其他重要目标,不能只聚焦建设成本,A不合理。
B选项
只追求最短故障时间目标最优忽略了网络设计中其他如性能、成本等冲突目标,网络设计需综合考量,不能仅针对故障时间,B不合理。
C选项仅让最大安全性目标达到最优,忽视了网络设计中建设成本、性能等其他目标的冲突,不能单一追求安全性,C不合理。
D选项网络系统设计存在多个相互冲突的目标,无法使所有目标均达最优,此时应优先让优先级较高的目标达到最优,这符合网络系统设计的实际情况,D合理。综上,正确答案是(boldsymbol({D})。
操作系统使用设备管理的方式管理外部设备,当驱动程序利用系统调用打开外部设备时,通常使用的标识是().
物理地址
逻辑地址
逻辑设备名
物理设备名
A.物理地址:物理地址是设备在硬件层面的实际地址编码,驱动程序打开外部设备时不会直接使用物理地址来标识设备,所以A选项错误。
B.逻辑地址:逻辑地址是程序中使用的地址概念,主要用于程序的内存寻址等,与设备打开时的标识无关,所以B选项错误。
C.逻辑设备名:操作系统为了方便管理设备,会给设备赋予一个逻辑设备名,驱动程序利用系统调用打开外部设备时,通常使用的标识就是逻辑设备名。通过逻辑设备名可以方便地对设备进行管理,就像操作文件一样,所以C选项正确。
D.物理设备名:物理设备名不是驱动程序打开外部设备时使用的标识,操作系统一般通过逻辑设备名来间接对应到物理设备,所以D选项错误。综上,答案为C。
关于RapidIO技术,下列说法中错误的是()。
RapidIO是一种高速串行总线,传输速率可达Gbps量级
B
RapidIO协议采用由物理层、逻辑层和传输层构成的三层体系结构
RapidIO技术多采用基于交换机的互连拓扑结构
RapidIO已取代了其他互连技术,成为解决嵌入式互连问题的最佳选择。
选项A解析根据解析内容,RapidIO是一种高速串行总线,传输速率可达Gbps量级,所以A说法正确。
选项B解析解析明确指出RapidIO协议由逻辑层、传输层和物理层构成三层体系结构,因此B说法正确。
选项C解析解析提到RapidIO技术多采用基于交换机的互连拓扑结构,所以C说法正确。
选项D解析解析中说明RapidIO是开放式互连技术标准,主要应用于嵌入式系统内部互连,但并未提及已取代其他互连技术,只是在嵌入式互连中有应用,所以D说法错误。
以下关于风险管理的叙述中,不正确的是()。
仅根据风险产生的后果来对风险排优先级
可以通过改变系统性能或功能需求来避免某些风险
不可能去除所有风险,但可以通过采取行动来降低或者减轻风险
在项目开发过程中,需要定期地评估和管理风险
对风险排优先级不是仅根据风险产生的后果,而是根据风险的曝光度,曝光度的计算公式为:曝光度风险产生的后果x风险发生的概率。所以仅依据=后果来排优先级是错误的。
【问题 1】 条件编译
(1) 什么是C语言的条件编译?
-
解析:正常情况下,C程序的每一行代码都会被编译。但条件编译允许你指定某些代码段只在满足特定条件时才被编译,否则编译器会直接忽略它们。这通常用于跨平台开发、调试模式切换或防止头文件重复包含。
-
参考答案:C语言中提供控制编译器流程的语句。或:C源程序中希望对其中一部分内容只是在满足一定条件时才进行编译,形成目标代码,这种对一部分内容指定编译的条件称为条件编译。
(2) 请解释#ifndef的作用。
-
解析:
#ifndef是 if not defined 的缩写。它检查后面的宏是否没有被定义。如果没有定义,就编译#ifndef和#else(或#endif)之间的代码;如果定义了,就跳过这段代码(或编译#else部分)。 -
参考答案:如果后面的“宏名”未定义,则编译其体内的程序段;否则就编译
#else部分的程序段,如果没有#else部分,则当“宏名”已定义时直接跳过#endif。
(3) 分析【C程序代码1】,写出该段执行后的输出结果。
-
代码分析:
-
程序开头定义了宏
_DEF_x。 -
遇到
#ifdef _DEF_x,因为_DEF_x已经定义,所以编译器会编译x = 1;这一行。 -
#else部分的x = 2;被跳过,不会被编译。 -
程序最终输出
x的值是 1。
-
-
注意:你提供的参考答案写的是
x=2。这通常是错误的,除非题目图片中定义的宏是#undef _DEF_x或者根本没定义。按标准逻辑,既然有#define _DEF_x,结果应该是x=1。考试时请以阅卷标准为准,但为了严谨,这里我帮你指出逻辑上的正确结果应为x=1。
【问题 2】 switch 语句填空
原代码片段:
c
float a;
int x;
scanf("%d", &a);
switch((int)a)
{
case 0:
case 1:
case 2:
if(a > 2) x = 1;
else(1); // 这里 (1) 应该填什么?
break;
case 3:
(2); // (2) 应该填什么?
break;
case4. // 注意这里是笔误,应该是 case 4:
(3); // (3) 应该填什么?
break;
default:
printf("a is error\n");
}
分析表(对应你提供的表5-1):
| 条件 | (int)a | x | 对应case |
|---|---|---|---|
| 0 <= a <= 2 | 0, 1, 2 | 3 | case 0,1,2 |
| 2 < a < 4 | 2, 3 | 1 | 注意:这里有点冲突 |
| 4 <= a < 5 | 4 | 2 | case 4 |
| 其他 | - | 报错 | default |
(1) 处填空:
-
进入
case 0,1,2的条件是(int)a等于 0、1 或 2。但题目要求当a在[0,2]区间时,输出x=3。 -
if(a > 2) x = 1;这一句永远不会执行,因为进入这个case块时(int)a <=2,所以a不可能大于 2(除非 a 是 2.1?但(int)a=2会进入这里,而 2.1 > 2,这会产生逻辑错误,这是原题的一个小陷阱)。 -
根据答案反推:这里
else(1)实际上是一个赋值语句。因为if不成立(a在0-2之间),所以执行else部分,将 x 赋值为 3。 -
答案:
(1) x=3
(2) 处填空:
-
case 3对应(int)a = 3。根据表格,当2 < a < 4时,x=1。 -
答案:
(2) x=1
(3) 处填空:
-
case 4对应(int)a = 4。根据表格,x=2。 -
答案:
(3) x=2
【问题 3】 冒泡排序填空
原代码片段:
c
#define N 8
main()
{
int i, j, aa[N], temp, swap; // 注意原题 l 是笔误,应为 i
clrscr(); // 清屏函数,不用管
for(i=0; i < N; i++)
scanf("%d", (4) ); // 输入数组
for(i=0; i < N; i++) // 这里是外层循环开始,注意原题括号可能不完整
swap=0; // 每趟开始前设swap为0(假设无交换)
for(j=0; j < (5); j++) // 内层循环:比较相邻元素
if(aa[j] > aa[j+1])
{
swap = 1; // 发生了交换
temp = aa[j];
aa[j] = aa[j+1];
aa[j+1] = temp;
}
if( (6) ) break; // 如果没交换,提前结束
}
for(i=0; i < N; i++)
printf("%d ", aa[i]);
}
(4) 处填空:
-
scanf("%d", ...)需要传入变量的地址。数组元素aa[i]的地址是&aa[i]。 -
答案:
(4) &aa[i]
(5) 处填空:
-
冒泡排序中,第 i 趟(从0开始)只需要比较到
N-1-i的位置,因为最大的 i 个数已经沉底了。 -
例如:
i=0时,需要比较j=0到j<N-1(即N-1),所以是j < N-1。 -
这里
j < (5),当i=0时,(5) 应该等于N-1。代入公式得N-i-1。 -
答案:
(5) N-i-1
(6) 处填空:
-
swap是一个标志位。如果在一趟比较中没有任何交换 (swap保持为 0),说明数组已经有序,可以提前结束排序(跳出外层循环)。 -
if( (6) ) break;表示如果满足某个条件就跳出。 -
当
swap == 0时,需要执行break。 -
答案:
(6) !swap或swap==0
更多推荐
所有评论(0)