家庭作业:12.18,9.13,8.25,2.62

家庭作业

12.18

原理:(L,U,S)为一个临界区,这个临界区不能和其他进程的临界区交替。

A、不安全
B、安全
C、不安全

9.13

这道题答案补充一下。

题目如下图所示:

A、虚拟地址

13    12    11    10    9    8    7    6    5    4    3    2    1    0
0     0     0     0     0    0    0    1    0    0    0    0    0    0

地址翻译

参数
VPN 0X01
TLB索引 0X01
TLB标记 0X00
TLB命中
缺页
PPN -

下图所示当VPN=1时,有效位为0,PPN无。所以就没有物理地址。

2.62

int_shifts_are_arithmetic()
int int_shifts_are_arithmetic(){
    int x = -1;
    return (x>>1) == -1;
}

8.25

#include "csapp.h"


static sigjmp_buf env; //当调用sigsetjmp函数时将当前调用环境保存在缓冲区env中,以供后面siglongjum使用

static void handler(int sig)
{
Alarm(0);  //如果有以前为进程登记的尚未超时的闹钟时钟,而且本次调用的secs值是0,则取消以前的闹钟时钟,其余留值仍作为alarm函数的返回值。
siglongjmp(env, 1); //当控制到达这里时执行跳转,即重新跳回sigsetjmp处继续执行,此时sigsetjmp返回非零
}

char *tfgets( char *s, int size, FILE *stream )
{
Signal( SIGALRM, handler ); //当内核向alarm函数的调用进程发送一个信号时,捕获该信号


Alarm(5);  //alarm函数在5秒内向调用进程发送一个SIGALRM信号

/*
**(alarm函数不发送信号) 不会发生非本地跳转,于是sigsetjmp返回0,程序执行Fgets,tfgets函数返回指向输入行的指针。
** (alarm发送信号)发生非本地跳转,sigsetjmp返回非零,tfgets函数返回NULL。 
*/
if( sigsetjmp(env, 1) == 0 )  //设定一个可以被信号处理程序使用的非本地跳转,设定成功后sigsetjmp返回0
return ( Fgets(s, size, stream) );
else
return NULL;
}

int main()
{
char buf[MAXLINE];


while(1)
{
bzero(buf, MAXLINE); //将字符数组buf全部清零

if( tfgets(buf, sizeof(buf), stdin) != NULL )
printf( "read:%s\n", buf );
else
printf( "timed out\n" ); //超时
}
exit(0);
}

posted @ 2016-12-21 17:30  20145204张亚军  阅读(220)  评论(0编辑  收藏  举报