2017-2018-1 20155328 《信息安全系统设计基础》第13周学习总结

本周任务是找出《深入理解计算机系统》这本书中自己认为最重要的一章,我选择的是第八章《异常控制流》。理解异常控制流的重要性表现在:它将帮助我们理解重要的系统概念;理解应用程序是如何与系统交互的;理解并发;理解软件异常如何工作。

教材学习内容总结

本章要点

  • 异常

    • 概念:异常就是控制流中的突变,用来响应处理器状态的某些变化。

    • 异常类似于过程调用,两者的区别是:

      • 过程调用时,跳转到处理程序之前,处理器将返回地址压入栈中;而异常时,根据异常的不同类型,返回地址必是当前指令或下一条指令。

      • 处理器会把一些额外的处理器状态压入栈中。

      • 如果控制从用户程序转移到内核,所有的项目都被压到内核栈中。

      • 异常处理程序运行在内核模式下。

    • 异常的类别:

      • 中断:异步发生,是来自处理器外部I/O设备的结果。

      • 陷阱:有意的异常,是执行一条指令的结果。

      • 故障:由错误情况引起,可能会被故障程序修正。

      • 终止:不可恢复的致命错误造成的结果。

  • 进程:执行中程序

    • 一个逻辑流在执行时间上与另一个流重叠,称为并发流。

    • 处理器通过设置模式位来提供限制应用可以执行的指令以及它可以访问的地址空间范围的功能。没有设置模式位时,进程运行在用户模式中。

    • 上下文切换:用于实现多任务

- `getpid`返回调用进程的PID,`getppid`返回父进程PID。

- `fork`用于创建新的子进程。被使用一次,返回两次:在父进程中返回子进程的PID,在子进程中返回0.

- 当一个进程终止时,会被保持在一种已经终止的状态中,直到它被父进程*回收*。

- 一个进程可以用`waitpid`函数来等待它的子进程终止或停止。`setpgid`可用于改变自己或者其他进程的进程组。
  • 信号

    • getpgrp用于返回当前进程的进程组ID。

本章习题

练习题8.1 考虑三个具有下述起始和结束时间的进程:

进程 起始时间 结束时间
A 0 2
B 1 4
C 3 5

对于每对进程,指出它们是否并发地运行:

进程对 并发的?
AB
AC
BC

A在执行期间B执行,两者有重叠的执行时间,所以AB是并发的,BC同理;而在C开始执行时,A已经执行结束,两者没有重叠的执行时间,所以AC不是并发运行的。

练习8.2考虑下面的程序:

int main()
{
    int x=1;
    
    if(Fork()==0)
        printf("p1:x=%d\n",++x);
    printf("p2:x=%d\n",--x);
    exit(0);
}

子进程的输出是什么?父进程的输出是什么?

运行子进程时,fork()的返回值为0,所以输出两次,输出为:

p1:x=2
p2:x=1

运行父进程时fork的返回值不为0,所以输出一次:

p2:x=0

练习8.3列出下面程序所有可能的输出序列:

int main()
{
    if(Fork()==0)
    {
        printf("a"),fflush(stdout);
    }
    else
        {
            printf("b"),fflush(stdout);
            waitpid(-1,NULL,0);
        }
    printf("c"),fflush(stdout);
    exit(0)
}

父进程调用fork()函数后,子进程满足if中的条件,会打印a,然后打印c;而父进程会执行b,挂起等待子进程终止。打印的最后一项是父进程的c。

子进程直接执行完成,则输出为acbc;父进程先执行后挂起等待子进程执行完成,则输出为bacc;子进程执行后父进程执行,则输出为abcc。

练习8.4考虑下面的程序:

int main()
{
    int status;
    pid_t pid;
    
    printf("Hello\n");
    pid=Fork();
    printf("%d\n",!pid);
    if(pid!=0){
        if(waitpid(-1,&status,0)>0){
            if(WIFEXITED(status)!=0)
                printf("%d\n",WEXITSTATUS(status));
        }
    }
    printf("bye\n");
    exit(2);
}

这个程序会产生多少输出行?这些输出行的一种可能的顺序是什么?

这个程序会产生6个输出行。可能有:Hello 1 0 bye 2 bye

代码托管

上周错题总结

5.有关Linux虚拟内存系统,下面说法正确的是(BCE)

A .
题图中是内核虚拟存储器

B .
题图中是进程虚拟存储器

C .
Linux中的PCB是task_struct结构的

D .
Linux中的PCB是mm_struct结构的

E .
Linux中的PCB中的mm_struct描述了虚拟内存的当前状态

6.给定32位虚拟地址空间和24位的物理地址,页面大小为8K,下面说法正确的是(BCE)

A .
VPN=13

B .
VPN=19

C .
PPO=13

D .
VPO=11

E .
PPN=11

13.Determine the number of page table entries (PTEs) that are needed for the following combinations of virtual address size (n) and page size (P )

A .
第一行需要16个

B .
第一行需要8个

C .
第一行需要8个

D .
第四行需要1M个

E .
第四行需要256K个

F .
第四行需要2M个

G .
第四行需要512K个

答案:AG

结对及互评

点评模板:

  • 博客中值得学习的或问题:
    • xxx
    • xxx
    • ...
  • 代码中值得学习的或问题:
    • xxx
    • xxx
    • ...
  • 其他

本周结对学习情况

结对同学:20155325

本周我因为家里的急事赶回了老家,所以还没有与结对同学互相学习得太多,等回学校补充此部分。

尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。

参考:软件工程软件的估计为什么这么难软件工程 估计方法

  • 计划学习时间:20小时

  • 实际学习时间:15小时

  • 改进情况:

(有空多看看现代软件工程 课件
软件工程师能力自我评价表
)

参考资料