家庭作业
12.18
原理:(L,U,S)为一个临界区,这个临界区不能和其他进程的临界区交替。
A、不安全B、安全C、不安全
9.13
这道题答案补充一下。
题目如下图所示:
A、虚拟地址
13 12 11 10 9 8 7 6 5 4 3 2 1 00 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返回0return ( Fgets(s, size, stream) );elsereturn NULL;}int main(){char buf[MAXLINE];while(1){bzero(buf, MAXLINE); //将字符数组buf全部清零if( tfgets(buf, sizeof(buf), stdin) != NULL )printf( "read:%s\n", buf );elseprintf( "timed out\n" ); //超时}exit(0);}