家庭作业汇总
2.59
编写一个C表达式,生成一个字,由x的最低有效字节和y中剩下的字节组成。
只用一个C表达式实现,那么就用逻辑符号,(先都看成二进制)将x的最低有效位和1与,不变,其他位与0与,均为0。同样对y进行处理,之后将它们相加(逻辑符号或可实现)。
6.42(未选,但作为6.43和6.44的原型和参考)
首先6.43(两星),6.44(两星)这两道题是根据6.42改变过来的,6.42中采用嵌套循环,将buffer中的所有数据清零
pixel类型的结构体
struct pixel{
char r;
char g;
char b;
char a;
} ;
二维数组buffer定义为pixel类型,这个类型的结构体中含有四个数。首先cptr指向buffer[0][0].r(即第一项)时,后面的buffer[0][0].g,buffer[0][0].b,buffer[0][0].a均未被读入,所以第一次未命中,因为一行四个字节,所以读入buffer[0][0].r时把后面三项也读入了,这样再访问buffer[0][0].g等三项时均命中。所以不命中率为25%
6.43
将6.42中的嵌套循环改为以下代码
//sizeof(char)==1;
char *cptr = (char*)buffer;
for(;cptr<(((char*)buffer)+640*480*4);cptr++)
*cptr=0;
代码依旧是将数组清零,第一行把数组从pixel类型转为char类型,cptr首先指向buffer数组的起始位置,依次往后,初始为空,cptr指向buffer[0][0].r高速缓存不命中,然后高速缓存把4字节数据都调到自己的第一行,后三个就会命中,这样就同6.42中结果一样,不命中率为25%
6.44
将6.42中的代码修改如下
//sizeof(int)==4;
int *cptr = (int*)buffer;
for(;cptr<(((int*)buffer)+640*480);cptr++)
*cptr=0;
因为int本身就是4字节的,而第一行将buffer从pixel型强制转换为int型,所以cptr每指向数组一次,就一次指向了原结构体中的四项。首次cptr指向buffer[0][0]高速缓存不命中,高速缓存把4字节的数据调入,第二次cptr指向buffer[0][1],高速缓存再次不命中,所以此时的高速缓存不命中率为100%。
8.9
A开始5结束7 B开始2结束4
C开始3结束6 D开始1结束8
根据题目画出一下表格,最左边框为0,每一个格为一个时间片,就可以得到一下表格,所以在同一纵列中为并发的进程
|
|
|
|
A |
A |
|
|
B |
B |
|
|
|
|
|
|
C |
C |
C |
|
|
D |
D |
D |
D |
D |
D |
D |
所以,AB不并发,AC,AD,BC,BD,CD是并发运行
8.13
代码关键部分
int x=3;
if(Fork() != 0)
printf("x=%d\n",++x);
printf("x=%d\n",--x);
子进程Fork为0,所以直接打印x=2;
父进程执行if内的语句,先打印x=4然后x=3就像下图这样
→x=2
→x=4→x=3
所以只要满足上面的拓扑排序即可
8.16
代码关键部分
int counter=1;
int main()
{
if(fork()==0){
counter--;
exit(0);
}
else{
Wait(NULL);
printf("counter=%d\n",++counter);
}
exit(0);
子进程fork为0,执行if语句,将它的寄存器里的counter设为0;然后父进程等子进程执行完后,再执行else语句,它的寄存器里的counter值未受子进程的影响,所以打印的是counter=2
汇总
2.59(两星),6.43(两星),6.44(两星),8.9(一星),8.13(一星),8.16(一星)
均独立完成,共9分