zoukankan      html  css  js  c++  java
  • 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函数,只看书的页数的话,本章的页数很少,相较于之前几周感觉轻松不少。但是,页数少并不意味着不重要或是用时少,认真去理解系统的输入、输出对于我们理解程序的运行至关重要,而每一个函数的参数、不同情况的返回值也需要我们仔细研读。

  • 相关阅读:
    QTP自动化测试进阶
    疯狂Java实战演义
    软件开发之韵:和谐敏捷
    Android应用开发详解
    操作系统直接决定了计算机系统的整体性能
    iBATIS框架源码剖析
    PHP 5完全攻略
    天气地图系统
    OpenSolaris系统管理
    Asp.net MVC 3实例学习之ExtShop(三)——完成首页
  • 原文地址:https://www.cnblogs.com/dd1174751354/p/7750863.html
Copyright © 2011-2022 走看看