1.有关高速缓存的说法正确的是()

A . 高速缓存的容量可以用C=SEB 来计算

B高速缓存容量为2048,高速缓存结构为( 32 ,8,8,32)

C . 直接映射高速缓存要:组选择、行匹配、字抽取

D . 当程序访问大小为2的幂的数组时,直接映射高带缓存中常发生冲突不命中

答案:acd

2.下面代码中,对数组x填充后,采用直接映射高速缓存,所有对x和y引用的命中率为()
Image 5.png
A . 1
B . 1/4
C . 1/2
D . 3/4

答案:d

3.The following table gives the parameters for a number of different caches. For
each cache, determine the number of cache sets (S), tag bits (t), set index bits (s),
and block offset bits (b)

Image 4.png
A .
第三行S为1
B .
第一行t为24
C .
第二行b为5
D .
第三行s的值为0

答案:acd

4.有关缓存的说法,正确的是()

A . LRU策略指的是替换策略的缓存会选择最后被访问时间距现在最远的块

B . 不同层之间以字节为传送单元来回复制

C . 缓存不命时,决定哪个块是牺牲块由替换策略来控制

D . 空缓存的不命中叫冲突不命中

答案:ac

5.下面说法正确的是()
A .
存储层次结构中最小的缓存是寄存器
B .
存储层次结构的中心思想是每一层都缓存来自较低一层的数据对象
C .
L4主存可以看作是L5:本地磁盘的缓存
D .
L4主存可以看作是L6的缓存

答案:abc

6.下面代码的步长是()

A .
1
B .
N
C .
NN
D .
N
N*N
答案:c

7.下面代码中()局部性最差

1 #define N 1000
2 3
typedef struct {
4 int vel[3];
5 int acc[3];
6 } point;
7 8
point p[N];

A .
1 void clear1(point *p, int n)
2 {
3 int i, j;
4 5
for (i = 0; i < n; i++) {
6 for (j = 0; j < 3; j++)
7 p[i].vel[j] = 0;
8 for (j = 0; j < 3; j++)
9 p[i].acc[j] = 0;
10 }
11 }

B .
1 void clear2(point *p, int n)
2 {
3 int i, j;
4 5
for (i = 0; i < n; i++) {
6 for (j = 0; j < 3; j++) {
7 p[i].vel[j] = 0;
8 p[i].acc[j] = 0;
9 }
10 }
11 }

C .
1 void clear3(point *p, int n)
2 {
3 int i, j;
4 5
for (j = 0; j < 3; j++) {
6 for (i = 0; i < n; i++)
7 p[i].vel[j] = 0;
8 for (i = 0; i < n; i++)
9 p[i].acc[j] = 0;
10 }
11 }

D .
不确定

答案:c

8.程序中()语句具有良好的局部性
A .
顺序
B .
分支
C .
循环
D .
以上都是

答案:c

9.下面代码,()具有差的空间局部性。
A .
1 int sumvec(int v[N])
2 {
3 int i, sum = 0;
4
5 for (i = 0; i < N; i++)
6 sum += v[i];
7 return sum;
8 }

B .
1 int sumarrayrows(int a[M][N])
2 {
3 int i, j, sum = 0;
4 5
for (i = 0; i < M; i++)
6 for (j = 0; j < N; j++)
7 sum += a[i][j];
8 return sum;
9 }

C .
1 int sumarraycols(int a[M][N])
2 {
3 int i, j, sum = 0;
4 5
for (j = 0; j < N; j++)
6 for (i = 0; i < M; i++)
7 sum += a[i][j];
8 return sum;
9 }

D .
以上都不对

答案:c

10.有关局部性原理,说法正确的是()
A .
程序访问一个向量,步长越小或短,空间局部性越好
B .
局部性有两种形式:空间局部性,时间局部性
C .
程序访问一个向量,步长越大空间局部性越好。
D .
硬件、OS,应用程序都会用到局部性原理

答案:abd

11.下面说法正确的是()
A .
CPU通过内存映射I/O向I/O设备发命令
B .
DMA传送不需要CPU的干涉
C .
SSD是一种基于闪存或Flash的存储技术
D .
逻辑磁盘块的逻辑块号可以翻译成一个(盘面,磁道,扇区 )三元组。
答案:abcd

12.下面()是I/O总线
A .
USB
B .
PCI
C .
网卡
D .
图形卡

答案:b

13.图中磁盘一个扇区的访问时间约为()ms
A .
10
B .
5
C .
6
D .
8
E .
12
答案:a

14.有关磁盘操作,说法正确的是()
A .
对磁盘扇区的访问时间包括三个部分中,传送时间最小。
B .
磁盘以字节为单位读写数据
C .
磁盘以扇区为单位读写数据
D .
读写头总处于同一柱面

答案;ac

15.计算下面磁盘的容量():4个盘片,100000个柱面,每条磁道400个扇区,每个扇区512个字节
A .
81.92GB
B .
40.96GB
C .
163.84
D .
327.68GB

答案:c

16.有关磁盘,说法正确的是()
A .
磁盘的读取时间为毫秒级
B .
每张磁盘有一个表面
C .
表面由磁道组成
D .
每个扇区的面积不同,包含的数据位的数量也不一样
答案;ac

17.根据携带信号不同,总线可分为()

A .
系统总线
B .
数据总线
C .
内存总线
D .
地址总线
E .
控制总线

答案:bde

18.关于非易失性存储器,下面说法正确的是()
A .
DRAM是非易失性存储器
B .
SRAM是非易失性存储器
C .
PROM只能编程一次
D .
EEPROM可以用紫外线进行擦除
E .
存在ROM中的程序通常被称为固件
答案:ce

19.通过使用两个时钟沿作为控制信号,对DRAM进行增强的是()
A .
FPM DAM
B .
SDRAM
C .
DDR SDRAM
D .
VRAM
E .
EDO DRAM

答案:c

20.有关RAM的说法,正确的是()
A .
SRAM和DRAM掉电后均无法保存里面的内容。
B .
DRAM将一个bit存在一个双稳态的存储单元中
C .
一般来说,SRAM比DRAM快
D .
SRAM常用来作高速缓存
E .
DRAM将每一个bit存储为对一个电容充电
F .
SRAM需要不断刷新
G .
DRAM被组织为二维数组而不是线性数组

答案:adeg

21.有关计算机存储系统,下面说法正确的是()
A .
程序具有良好的局部性表现在倾向于从存储器层次结构中的较低层次处访问数据,这样节省时间
B .
存储层次涉用不同容量,成本,访问时间的存储设备
C .
存储层次设计基于局部性原理
D .
“存储山”是时间局部性和空间局部性的函数
答案:bcd

课下linux下pc实现:

IPC进程间通信(Inter-Process Communication)就是指多个进程之间相互通信,交换信息的方法。Linux IPC基本上都是从Unix平台上继承而来的。主要包括最初的Unix IPC,System V IPC以及基于Socket的IPC。另外,Linux也支持POSIX IPC。

System V,BSD,POSIX

System V是Unix操作系统最早的商业发行版之一。它最初由AT&T(American Telephone & Telegraph)开发,最早在1983年发布。System V主要发行了4个版本,其中SVR4(System V Release 4)是最成功的版本。BSD(Berkeley Software Distribution,有时也被称为Berkeley Unix)是加州大学于1977至1995年间开发的。在19世纪八十年代至九十年代之间,System V和BSD代表了Unix的两种主要的操作风格。它们的主要区别如下:

Linux系统的操作风格往往介于这两种风格之间。

POSIX(Portable Operating System Interface [for Unix])是由IEEE(Institute of Electrical and Electronics Engineers,电子电气工程协会)开发的。现有的大部分Unix都遵循POSIX标准,而Linux从一开始就遵循POSIX标准。

最初的Unix IPC

1、信号

信号是Unix/Linux系统在一定条件下生成的事件。信号是一种异步通信机制,进程不需要执行任何操作来等待信号的到达。信号异步通知接收信号的进程发生了某个事件,然后操作系统将会中断接收到信号的进程的执行,转而去执行相应的信号处理程序。

(1)注册信号处理函数

   #include <signal.h>
        /*typedef void (*sighandler_t)(int);  sighandler_t signal(int signum,sighandler_t handler);*/
        * void (*signal(int signum, void (*handler)(int)))(int);  //SIG_IGN && SIG_DFL
        * int sigaction(int signum, const struct sigaction *act,struct sigaction *oldact);

(2)发送信号

  #include <signal.h>
        * int kill(pid_t pid,int sig); //#include <sys/types.h> 
        * int raise(int sig);            //kill(getpid(),sig);
        * unsigned int alarm(unsigned int seconds); //(#include <unistd.h>) seconds秒后,向进程本身发送SIGALRM信号。

(3)信号集

 typedef struct {unsigned long sig[_NSIG_WORDS];} sigset_t;
        * int sigaddset(sigset_t *set,int sig);
        * int sigemptyset(sigset_t *set);

2、管道(Pipe)

管道用来连接不同进程之间的数据流。

(1)在两个程序之间传递数据的最简单的方法是使用popen()和pclose()函数:

 #include <stdio.h>
        FILE *popen(const char *command, const char *open_mode);
        int pclose(FILE *stream);

popen()函数首先调用一个shell,然后把command作为参数传递给shell。这样每次调用popen()函数都需要启动两个进程;但是由于在Linux中,所有的参数扩展(parameter expansion)都是由shell执行的,这样command中包含的所有参数扩展都可以在command程序启动之前完成。

(2)pipe()函数:

   #include <unistd.h>
        int pipe(int pipefd[2]);

popen()函数只能返回一个管道描述符,并且返回的是文件流(file stream),可以使用函数fread()和fwrite()来访问。pipe()函数可以返回两个管道描述符:pipefd[0]和pipefd[1],任何写入pipefd[1]的数据都可以从pipefd[0]读回;pipe()函数返回的是文件描述符(file descriptor),因此只能使用底层的read()和write()系统调用来访问。pipe()函数通常用来实现父子进程之间的通信。

(3)命名管道:FIFO

 #include <sys/types.h>
        #include <sys/stat.h>
        int mkfifo(const char *fifo_name, mode_t mode);

前面两种管道只能用在相关的程序之间,使用命名管道可以解决这个问题。在使用open()打开FIFO时,mode中不能包含O_RDWR。mode最常用的是O_RDONLY,O_WRONLY与O_NONBLOCK的组合。O_NONBLOCK影响了read()和write()在FIFO上的执行方式。

System V IPC

System V IPC指的是AT&T在System V.2发行版中引入的三种进程间通信工具:(1)信号量,用来管理对共享资源的访问 (2)共享内存,用来高效地实现进程间的数据共享 (3)消息队列,用来实现进程间数据的传递。我们把这三种工具统称为System V IPC的对象,每个对象都具有一个唯一的IPC标识符(identifier)。要保证不同的进程能够获取同一个IPC对象,必须提供一个IPC关键字(IPC key),内核负责把IPC关键字转换成IPC标识符。

System V IPC具有相似的语法,一般操作如下:

(1)选择IPC关键字,可以使用如下三种方式:

a)IPC_PRIVATE。由内核负责选择一个关键字然后生成一个IPC对象并把IPC标识符直接传递给另一个进程。
b)直接选择一个关键字。
c)使用ftok()函数生成一个关键字。

(2)使用semget()/shmget()/msgget()函数根据IPC关键字key和一个标志flag创建或访问IPC对象。如果key是IPC_PRIVATE;或者key尚未与已经存在的IPC对象相关联且flag中包含IPC_CREAT标志,那么就会创建一个全新的IPC对象。

(3)使用semctl()/shmctl()/msgctl()函数修改IPC对象的属性。

(4)使用semctl()/shmctl()/msgctl()函数和IPC_RMID标志销毁IPC实例。

System V IPC为每个IPC对象设置了一个ipc_perm结构体并在创建IPC对象的时候进行初始化。这个结构体中定义了IPC对象的访问权限和所有

    struct ipc_perm{
       uid_t uid;   //所有者的用户id
       gid_t gid;   //所有者的组id
       uid_t cuid;  //创建者的用户id
       gid_t cgid;  //创建者的组id
       mode_t mode; //访问模式
       …
    };

1,消息队列

int ftok(const char *pathname, int prj_id);

int msgget(key_t key,int msgflag);

int msgsnd(int msqid,const void *msgp,size_t msgsz,int msgflg);

int msgrcv(int msqid,void *msgp,size_t msgsz,long msgtyp,int msgflg);

2,信号量
int semget(key_t key,int nsems,int semflag);

int semctl(int semid,int semnum,int cmd,…);

int semop(int semid,struct sembuf *sops,unsigned nsops,struct timespec *timeout);

3,共享内存

int shmget(key_t key,size_t size,int shmflag);

int shmctl(int shmid,int cmd,struct shmid_ds *buf);