家庭作业汇总

2.59

编写一个C表达式,生成一个字,由x的最低有效字节和y中剩下的字节组成。

只用一个C表达式实现,那么就用逻辑符号,(先都看成二进制)将x的最低有效位和1与,不变,其他位与0与,均为0。同样对y进行处理,之后将它们相加(逻辑符号或可实现)。

 

 

 

6.42(未选,但作为6.436.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分

 

 

 

 

posted on 2015-11-22 20:36  20135211李行之  阅读(400)  评论(0编辑  收藏  举报