教材内容总结

本周学习的是教材第八章的内容,主要学习的是关于异常控制流和第十章系统级的内容。

异常控制流

1、进程控制

进程:执行中的程序实例。
子进程的创建、使用和回收。
加载函数的使用。

2、异常控制流(ECF)
控制流:指令执行的序列。
控制流突变:

在任何情况下,当处理器检测到有事件发生时,他就会通过异常表进行跳转,执行异常处理程序。

异常可以分为四类:中断、陷阱、故障、终止。

中断是异步发生的,是来自处理器外部的I/O设备的信号的结果。硬件中断不是由任何一条专门的指令造成的,从这个意义上来说,它是异步的,而其他异常时同步发生的,是执行当前指令的结果。
陷阱是有意的异常,是执行一条指令的结果。陷阱最重要的用途是在用户程序和内核之间提供一个向过程一样的接口。
故障由错误情况引起,它可能能够被故障处理程序修正。如果错误能够修正,它就将控制返回到引起故障的命令,否则将返回到内核中的abort例程,终止引起故障的应用程序。
终止是不可恢复的致命错误造成的影响,通常是硬件错误。终止从不将控制返回给应用程序。

异常是允许操作系统提供进程的概念所需要的基本结构快。进程的经典定义就是一个执行中的程序的实例。系统中的每个程序都是运行在某个进程的上下文中,上下文由程序正确运行所需的状态组成,状态包括存放在存储器中的程序代码和数据,它的栈、通用目的寄存器的内容、程序计数器、环境变量以及打开文件描述符的集合。

一个进程为每个程序提供它自己的私有地址空间,一般来说,和这个空间中的某个地址相关联的那个存储器字节是不能被其他进程读或者写的,从这个意义上说,这个地址空间是私有的。

在Linux中,可以通过fork函数新建一个子进程,子进程得到与父进程用户级虚拟地址空间相同的但是相互独立的一份拷贝,包括文本、数据、bss段、堆以及用户栈。子进程还获得与父进程任何打开文件描述符相同的拷贝,这意味着当父进程调用fork时,子进程可以读写父进程打开的任何文件。在父进程中fork函数返回子进程的pid值,而在子进程中fork函数返回0,因此fork函数调用一次却返回两次(一次在父进程,一次在子进程)。

当一个进程由于某种原因终止时,内核并不是立即把它从系统中清除掉,相反,进程被保持在僵死状态,必须由父进程回收。如果父进程还没有回收僵死子进程就终止了,内核会安排init进程来回收它们。即使僵死进程没有运行,他们仍然消耗系统的存储器资源。

练习题

系统级

Unix I/O

Unix文件:m个字节的序列
I/O设备:网络、磁盘和终端
Unix I/O :将设备映射为文件的方式,允许Unix内核引出一个简单、低级的应用接口。
描述符:打开文件时,内核返回一个小的非负整数。 Unix外壳创建的每个进程开始时都有三个打开的文件:标准输入(描述符为0)、标准输出(描述符为1)、标准错误(描述符为2)。 改变当前的文件位置:文件位置为k,初始为0。 seek操作:显式地设置文件的当前位置为k。
EOF:是一个条件,而不是一个符号。
关闭文件:内核释放文件打开时创建的数据结构,并将这个描述符恢复到可用的描述符池中。无论一个进程因为何种原因终止时,内核都会关闭所有打开的文件并释放它们的存储器资源。

课本上的问题以及解决

本章内容是关于系统及I/O的知识点,在之前几章的学习都有所接触问题总的不大,但是在10.2中关于打开和关闭文件的open函数中的第三个参数的使用存在问题。书上p597写了一个例子,文件的拥有者有读写权限,而其他的用户都有读权限。而答案为什么给出的是umask(DEF _ UMASK);fd = Open("foo.txt",O _CREATE|O _TRUNC|O _WRONLY,DEF _MODE);给出的O _WRONLY是只读,而并不是读写操作,是如何完成的读写操作?而其也具体的权限参数是什么?根据上面的解释知道是Open函数的第二个flags参数是指明了进程打算如何访问这个文件,第三个mode _t mode参数是指明文件的访问权限,结合图10—1会知道具体的访问权限。后来通过看书,发现自己忽略掉了一点就是每个进程都有一个umask,它是通过调用umask函数来设置的。这样以来之前对于这个答案有所定义给定了mode和umask默认值:

define DEF _MODE S _IRUSR|S _IWUSR|S _IRGRP|S _ IWGRP|S _IROTH|S _IWOTH #define DEF _UMASK S _IWGRP|S _IWOTH,

这样在结合之前的Open函数就解决了我的问题。

代码调试和解决过程

在运行书上代码的时候出现了如下问题

显示自己没有头文件,然后我上网查看了相应的问题后,就解决了问题。

缺少csapp.h的头文件,这是书的作者编写的一个头文件,使用的时候要把此头文件csapp.h和csapp.c文件包含到你的系统中。先到网上下载这两个文件,下载地址(http://download.csdn.net/detail/tzasd89812/4206284);

在命令行下输入sudo mv csapp.h csapp.c /usr/include指令将文件移到/usr/include中(需要用到sudo权限);
打开csapp.h头文件,在#end if前面加上一句

include

由于csapp.c中包含线程的一部分,所以编译的时候要加上-lpthread选项,否则很多错误,此时编译运行即可成功。

代码托管

学习与感悟

这次我们学习的是两章的内容,说实话,这两章的内容确实非常多。但是这两章对于我们系统的学习有着很大的帮助。

学习进度条

        | 代码行数(新增/累积)| 博客量(新增/累积)|学习时间(新增/累积)|重要成长  |

| -------- | :----------------😐:----------------😐:---------------: |:-----: |
| 目标 | 5000行 | 30篇 | 400小时 | |
| 第一周 | 10 /10 | 1/1 | 10/10 | |
| 第二周 | 40 /70 | 2/4 | 18/38 | |
| 第三周 | 150/200 | 3/7 | 15/60 | |
|第四周 | 160/210 |6/8| 23/70

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

计划学习时间:13小时

实际学习时间:17小时

改进情况:多提出问题,多解决问题。

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

参考资料
《深入理解计算机系统V3》学习指导
...