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

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

教材学习内容总结

第八章 异常控制流

控制流:控制转移序列。

控制转移:从一条指令到下一条指令。

异常控制流:现代操作系统通过使控制流发生突变来对系统状态做出反应,这些突变称为异常控制流。

程序计数器中指令的地址的过渡称为控制转移,控制转移的序列称为处理器的控制流。最简单的是平滑流。跳转、调用和返回等指令会造成平滑流的突变,来对内部的程序状态中的变化做出反应。系统也需要能够对系统状态的变化做出反应,这些系统状态不能被内部程序变量捕获,系统通过使控制流突变来完成,这些突变称为异常控制流(ECF)。ECF发生在系统的各个层次,包括异常、系统调用、信号和非本地跳转等。

异常是异常控制流的一种形式,它一部分由硬件实现,一部分由操作系统实验。

异常处理

异常处理程序完成处理后,根据异常事件的类型会(执行一种):

将控制返回给当前指令(事件发生时正在执行的)。

将控制返回给下一条指令(没有异常将会执行的)。

终止被中断的程序。

异常表是一张跳转表,表目k包含异常k的处理程序的地址,在系统启动时由操作系统分配和初始化。系统中每种可能的异常都分配了一个唯一的非负整数的异常号。

进程

1.进程(操作系统层):逻辑控制流,私有地址空间,多任务,并发,并行,上下文,上下文切换,调度。

2.进程就是一个执行中的程序实例。系统中的每个程序都是运行在某个进程的上下文中的。进程提供给应用程序的关键抽象:a)一个独立的逻辑控制流 ;b)一个私有的地址空间。

进程控制

进程有三种状态:

1.运行。进程在CPU上执行,或等待被执行(会被调度)。

2.停止。进程被挂起(不会被调度)。收到 SIGSTOP 、 SIGTSTP 、 SIDTTIN 、 SIGTTOU 信号,进程停止,收到 SIGCONT 信号,进程再次开始运行。

3.终止。进程永远停止。原因可能是:收到终止进程的信号,从主程序返回,调用 exit 函数。

创建新进程可以使用 fork 函数。新创建的子进程和父进程几乎相同,它获得父进程用户级虚拟地址空间和文件描述符的副本,主要区别是它们的PID不同。 fork 函数调用一次,返回两次;父子进程是并发运行的,不能假设它们的执行顺序;两个进程的初始地址空间相同,但是是相互独立的;它们还共享打开的文件。因为有相同的程序代码,所以如果调用 fork 三次,就会有八个进程。

进程终止时,并不会被立即清除,而是等待父进程回收,称为僵死进程。父进程回收终止的子进程时,内核将子进程退出状态传给父进程,然后抛弃该进程。如果回收前父进程已经终止,那么僵死进程由 init 进程回收。

回收子进程可以用 wait 和 waitpid 等函数。

第十章

Unix I/O

I/O

1、输入就是从I/O设备拷贝数据到贮存,输出就是从主存拷贝数据到I/O设备。

2、所有的I/O设备都被模型化为文件,而所有的输入输出都被当做对相应文件的读/写。
打开文件

1、过程:应用程序向内核发出请求,要求内核打开相应的文件,内核返回文件描述符(一个小的非负整数)。

2、内核记录有关这个文件的所有的信息,应用程序只需要记住这个描述符。

3、Unix外壳创建的每个进程开始时都有三个打开的文件:
标准输入(描述符为0)
标准输出(描述符为1)
标准错误(描述符为2)
分别对应头文件
改变当前的文件位置

1、对于每个打开的文件,内核保持着一个文件位置k,初始为0。这个位置是从文件开头起始的字节偏移量。

2、应用程序可以通过seek操作显式的设置文件的当前位置为k。

读写文件

1、读操作:从文件拷贝n>0个字节到存储器,从当前文件位置k开始,然后将k增加到k+n。

2、写操作:从存储器拷贝n>0个字节到一个文件,从当前文件位置k开始,然后更新k。

3、给定一个大小为m字节的文件,k >= m 时执行读操作会触发一个称为end-of-file(EOF)的条件,应用程序能检测到这个条件,但是文件结尾处并没有明确的“EOF符号”。

关闭文件

过程:应用通知内核关闭文件,内核释放文件打开时的数据结构,恢复描述符,释放存储器资源。

用RIO包健壮地读写

RIO包会自动处理不足值。

RIO提供了两类不同的函数:

无缓冲的输入输出函数。这些函数直接在存储器和文件之间传送数据,没有应用级缓冲,对将二进制数据读写到网络和从网络读写二进制数据尤其有用。

带缓冲的输入函数。这些函数允许高效地从文件中读取文本行和二进制数据(函数从内部缓冲区中拷贝一个文本行,当缓冲区变空的时候,会自动地调用read重新填满缓冲区),这些文件的内容缓存在应用级缓冲区内,类似于像printf这样的标准I/O函数提供的缓冲区。带缓冲的RIO输入函数是线程安全的,它在同一个描述符上可以被交错地调用。

标准I/O和I/O函数

ANSI C定义了一组高级输入输出函数,称为标准I/O库。提供了打开和关闭文件的函数(fopen和fclose),读和写字节的函数(fread和fwrite),读和写字符串的函数(fgets和fputs),格式化I/O函数(scanf和printf)

标准I/O库将一个打开的文件模型化为一个流。一个流就是一个指向FILE类型的结构的指针。

I/O关系

Unix I/O是在操作系统内核中实现的。

较高级别的RIO和标准I/O函数都是基于Unix函数来实现的。

RIO函数是专为本书开发的read和write的健壮的包装函数。他们自动处理不足值,并且为读文本行提供一种高效的带缓冲的方法

标准I/O函数提供了Unix函数的一个更加完整的带缓冲的替代品,包括格式化的I/O例程。标准I/O流,从某种意义上是全双工的,但对流的限制和对套接字的限制有时会相互冲突。

限制一:跟在输出函数之后的输入函数

限制二:分在输入函数的输出函数

因此,建议在网络套接字上不要使用标准 I/O函数来进行输入和输出,而要使用健壮的RIO函数。

教材学习中的问题和解决过程

问题:为什么在网络套接字上不要使用标准 I/O函数来进行输入和输出,而要使用健壮的RIO函数?

回答:网上查询得,标准I/O流,从某种意义上是全双工的,但对流的限制和对套接字的限制有时会相互冲突。

限制一:跟在输出函数之后的输入函数,
限制二:分在输入函数的输出函数,
因此,建议在网络套接字上不要使用标准 I/O函数来进行输入和输出,而要使用健壮的RIO函数。

其他(感悟、思考等,可选)

本周学习了系统的输入、输出,了解了一些I/O函数,只看书的页数的话,本章的页数很少,相较于之前几周感觉轻松不少。但是,页数少并不意味着不重要或是用时少,认真去理解系统的输入、输出对于我们理解程序的运行至关重要,而每一个函数的参数、不同情况的返回值也需要我们仔细研读。

posted @ 2017-10-29 19:42  20155331  阅读(252)  评论(0编辑  收藏  举报