2017-2018-1 20155318 《信息安全系统设计基础》第十周课上测试及课下作业
课上测试
- 解析:填充消除了冲突不命中,对于x和y数组,只有在引用第0个和第4个元素的时候发生不命中。因而命中率为75%。
- 解析:高速缓存容量为2048,高速缓存结构为(( 32 ),8,8,32)
- 解析:不同层之间是以块为大小传输单元在层与层之间复制,空缓存的不命中叫强制性不命中或冷不命中
- 解析:存储器层次结构的每一层都缓存来自较低一层的数据。缓存存储器是分块的,数据总是以块为基本单位在每一层之间传递,块的大小只在相互传递的两层之间相同
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
- 解析:函数clear1步长为1,clear2步长大于1的模式,clear3在结构间来回切换,因此空间局部性中clear3是最差的
- 解析:循环具有良好的空间局部性和时间局部性。
- 解析:程序访问一个向量,步长越小或短,空间局部性越好
- 解析:磁盘以扇区大小的块来读写数据。
- 解析:因为磁盘容量=柱面数 * 磁盘面数 * 扇区数 * 字节数=4x2x100000x400x512=163.84GB
- 解析:每个扇区包含相等数量的数据位(通常是512字节)
- 解析:用来传输数据的总线线路可以分为三个类型:数据线、地址线和控制线
- 解析:DRAM、SRAM是易失性存储器,PROM可以用紫外线进行擦除
- 解析:RAM分为静态SRAM和动态DRAM。SRAM比DRAM更快
- SRAM(静态):高速缓存存储器。将每个位存储在一个双稳态的存储器单元里面。
- DRAM(动态):将每个位存储为对一个电容的充电。存储单元对干扰(如光线、噪音等)很敏感;当电容的电压被扰乱之后就永远不会恢复。
- 解析:程序具有良好的局部性表现在倾向于从存储器层次结构中的较高层次处访问数据。
Linux下IPC机制
- IPC在linux下的多个进程间的通信机制,它是多个进程之间相互沟通的一种方法。
- 在linux下有多种进程间通信的方法:半双工管道、命名管道、消息队列、信号、信号量、共享内存、内存映射文件,套接字等等。
- 使用这些机制可以为linux下的网络服务器开发提供灵活而又坚固的框架
- 共享内存:允许两个或多个进程共享一定的存储区,因为不需要拷贝数据,所以这是最快的一种IPC。
#include <sys/ipc.h>
#include <sys/shm.h>
- 创建或访问共享内存
* int shmget(key_t key,size_t size,int shmflg);
- 附加共享内存到进程的地址空间
* void *shmat(int shmid,const void *shmaddr,int shmflg);//shmaddr通常为NULL,由系统选择共享内存附加的地址;shmflg可以为SHM_RDONLY
- 从进程的地址空间分离共享内存
* int shmdt(const void *shmaddr); //shmaddr是shmat()函数的返回值
- 控制共享内存
* int shmctl(int shmid,int cmd,struct shmid_ds *buf);
* struct shmid_ds{
struct ipc_perm shm_perm;
};
- cmd的常用取值有:
- IPC_STAT获取当前共享内存的shmid_ds结构并保存在buf中
- IPC_SET使用buf中的值设置当前共享内存的shmid_ds结构
- IPC_RMID删除当前共享内存
-
举例:进程write将键盘上输入的字符串存储到共享内存,read进程将共享内存中的数据读出来
-
运行结果如下:
-
管道: 用来连接不同进程之间的数据流
-
在两个程序之间传递数据的最简单的方法是使用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程序启动之前完成。
- 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()函数通常用来实现父子进程之间的通信。
-
命名管道: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上的执行方式。