家庭作业: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);
}