zoukankan      html  css  js  c++  java
  • # 20145324 《信息安全系统设计基础》第十一周学习总结

    20145324 《信息安全系统设计基础》第十一周学习总结

    教材学习内容总结

    •从给处理器加电开始,直到断点为止,程序计数器假设一个值的序列a0,a1,……,an-1 ,每个ak是某个相应的指令Ik的地址,每次从ak到ak+1的过渡称为控制转移,这样的控制转移序列叫做处理器的控制流
    •异常控制流ECF:现代系统通过使控制流发生突变来对这些情况作出反应

    异常

    •异常是异常控制流的一种形式,它一部分是由硬件实现的,一部分是有操作系统实现的
    •异常就是控制流中的突变,用来响应处理器状态中的某些变化
    •状态变化成为事件
    •当处理器监测到有时间发生时,通过一张叫做异常表的跳转表,进行一个间接过程调用,到一个专门设计用来处理这类事件的操作系统子程序
    •当异常处理程序完成处理后,根据引起异常的事件的类型,会发生以下三种情况的一种:
    ①处理程序将控制返回给当前指令Icurr,即当事件发生时正在执行的指令
    ②处理程序将控制返回给Inext,即如果没有发生异常将会执行的下一条指令
    ③处理程序终止被中断的程序
    •系统中可能的每种类型的异常都分配了一个唯一的非负整数的异常号
    •异常号是到异常表中的索引,异常表的起始地址放在一个叫做异常表基址寄存器的特殊CPU寄存器里
    •异常的分类:中断、陷阱、故障和终止

    进程

    •异常是允许操作系统提供进程的概念所需要的基本构造块
    •进程的经典定义就是一个执行中的程序的实例
    •进程提供给应用程序的关键抽象:
    一个独立的逻辑控制流,独占地使用处理器
    一个私有的地址空间,独占地使用存储器系统
    •唯一的对应于包含在程序的可执行目标文件中的指令,或者是包含在运行时动态链接到程序的共享对象中的指令。这个PC值的序列叫做逻辑控制流,简称逻辑流
    •并发流:一个逻辑流的执行在时间上与另一个流重叠
    多个流并发地执行的一般现象成为并发
    一个进程和其他进程轮流运行的概念称为多任务
    一个进程执行它的控制流的一部分的每一时间段称为时间片,多任务也叫时间分片
    •并行流:如果两个流并发的运行在不同的处理器核或者计算机上
    •当设置了位模式,进程就运行在内核模式中
    •没有设置位模式时,进程就运行在用户模式中
    •上下文就是内核重新启动一个被抢占的进程所需的状态
    •调度:内核可以决定抢占当前进程,并重新开始一个先前被抢占的进程
    •上下文切换机制:
    ①保存当前进程的上下文
    ②恢复某个先前被抢占的进程被保存的上下文
    ③将控制传递给这个新恢复的进程

    进程控制

    •每个进程都有一个唯一的正数的进程ID
    •进程总处于三种状态
    ①运行:进程要么在CPU上执行,要么在等待被执行且最终会被内核调度
    ②停止:程序的执行被挂起,,且不会被调度
    ③终止:进程用永远停止了。终止原因:1)收到一个信号,默认行为是终止进程;2)从主进程返回3)调用exit函数
    •fork函数调用一次,返回两次
    •当一个进程由于某种原因终止时,进程被保持在一种已终止的状态中,直到它被父进程回收
    •一个终止了但还未被回收的进程称为僵死进程
    •一个进程可以通过调用waitpid函数来等待它的子进程终止或者停止
    •错误条件
    ①如果调用进程没有子进程,那么waitpid返回-1,并且设置errno为ECHILD
    ②如果waitpid函数被一个信号中断,那么返回-1,并设置errno为EINTR
    •sleep函数:将进程挂起一段指定的时间
    •pause函数:让调用函数休眠,直到该进程收到一个信号
    •execve函数:在当前进程的上下文中加载并运行一个新程序,且调用一次从不返回
    •getenv函数:在环境数组中搜素字符串“name =VALUE”,如果找到了,就返回一个指向value的指针,否则它就返回NULL

    信号

    •一个信号就是一条小消息,它通知进程系统中发生了一个某种类型的事件
    •发送信号的两个不同步骤:
    ①发送信号:内核通过更新目的进程上下文中的某个状态,发送一个信号给目的进程
    发送信号的两个原因:
    1)内核监测到一个系统事件,比如被零除错误或者子进程终止
    2)一个进程调用了kill函数,显式地要求内核发送一个信号给目的进程。一个进程可以发送信号给它自己
    ②接收信号:信号处理程序捕获信号的基本思想
    •一个只发出而没有被接收的信号叫待处理信号
    •每个进程都只属于一个进程组,进程组是由一个正整数进程组ID来标识的
    •一个子进程和它的父进程同属于一个进程组
    •进程通过调用kill函数发送信号给其他的进程
    •当内核从一个异常处理程序返回,准备将控制传递该进程p时,它会检查进程p的未被阻塞的待处理信号的集合
    •信号处理问题
    ①待处理信号被阻塞
    ②待处理信号不会排队等待
    ③系统调用可以被中断

    非本地跳转

    •非本地跳转不需要经过正常的调——返回序列
    •非本地跳转是通过setjmp和longjmp函数来提供的
    • setjmp函数只被调用一次,但返回多次
    •longjmp函数被调用一次,但从不返回

    代码学习内容总结

    exec1.c

    装入并运行其它程序的函数
    •编译运行结果

    •代码分析
    运行结果没有显示“ * * * ls is done. bye”,因为在系统处理器中,在执行execvp( "ls" , arglist );时,已经将最后的打印语句覆盖掉了,处理器中并没有这句打印语句,所以不会显示最后一句。

    exce2.c

    装入并运行其它程序的函数
    •编译运行结果

    •代码分析
    与exce1.c的结果相同,看代码可以发现exce2.c把execvp( "ls" , arglist );换成了execvp( "ls" , arglist );

    exec3.c

    装入并运行其它程序的函数
    •编译运行结果

    •代码分析
    与exce1.c的结果相同

    man excel

    forkdemo1.c

    将运行的程序分成2个完全一样的进程,每个进程都启动一个从代码的同一位置开始执行的线程。若成功调用一次则返回两个值,子进程返回0,父进程返回子进程ID;否则,出错返回-1
    •编译运行结果

    •代码分析
    After打印语句打印了两次,第一次打印的After语句是父进程执行的,fork函数的返回值不是0,父进程在执行,第二次打印的After语句是子进程执行的

    forkdemo2.c

    •编译运行结果

    •代码分析
    执行了两次fork函数,一共是四个线程,打印了4次After语句

    forkdemo3.c

    •编译运行结果

    •代码分析
    fork函数将一个进程分成两个进程,并且会返回两次

    forkdemo4.c

    •编译运行结果

    •代码分析
    因为sleep(10)函数,父进程会睡眠10s再执行exit(0)语句

    forkgdb.c

    •编译运行结果

    •代码分析
    先进入父进程的循环,打印parent li:0和parent gi:0,接着休眠一秒,子进程打印child li:0,休眠一秒,子程序和父程序循环进行,直到跳出循环,父进程先结束,退出,出现输入命令的提示行,子进程打印完最后两句,退出

    psh1.c

    执行用户输入的指令,并用数组存储指令
    •编译运行结果

    •代码分析
    while循环输入命令,输入回车换行,调用execute函数将存储命令的数组作为参数传入,实现执行指令的功能

    psh2.c

    在子进程中执行用户输入的指令,利用wait函数,通过父进程,实现循环输入指令
    •编译运行结果

    testbuf1.c

    打印hello,但进程不会结束,输入数据,屏幕上会显示该数据
    •编译运行结果

    •代码分析
    用户需要强制退出,才能退出程序

    testbuf2.c

    打印hello,但进程不会结束,输入数据,屏幕上会显示该数据
    •编译运行结果

    •代码分析
    用户需要强制退出,才能退出程序

    testbuf3.c

    •编译运行结果

    •代码分析
    abcd先打印出来,查看代码stderr的缓冲区为4而stdout为5,可能是因为字符串必须有‘’才能结束

    testpid.c

    显示进程id和其父进程的id
    •编译运行结果

    testpp.c

    •编译运行结果

    •代码分析
    段错误,我也不知道什么原因

    testsystem.c

    执行用户输入的指令
    •编译运行结果

    •代码分析
    使用system(char *command)发出一个DOS命令

    waitdemo1.c

    验证父子进程的调用顺序,测试函数sleep、wait在进程调用中的作用
    •编译运行结果

    •代码分析
    hildcode函数调用了sleep函数,执行完printf("child %d here. will sleep for %d seconds ", getpid(), delay);后,程序休眠4s在继续进行

    waitdemo2.c

    •编译运行结果

    •代码分析
    设置了父进程在子进程结束后的状态位

    freemakeargv.c

    •编译运行结果

    •代码分析
    在源代码下加一个main函数即可运行,但出现了段错误

    makeargv.c

    •编译运行结果

    •代码分析
    在源代码下加一个main函数即可运行,但是看不懂结果

    我觉得main函数应该是argtest那段代码,但是加进去编译不了,我就另外找了一段

    environ.c

    打印设置环境变量的值
    •编译运行结果

    •代码分析
    打印程序开始时的初始环境变量,然后重新设置环境变量,并且打印输出

    environvar.c

    打印外部变量environ的内容
    •编译运行结果

    consumer.c

    判断是否打开文件流,以及是否正常打开文件
    •编译运行结果

    •代码分析
    输出打开文件流的进程号和打开文件进程号,返回打开文件的结果

    producer.c

    •编译运行结果

    •代码分析
    可以输入

    testmf.c

    •编译运行结果

    •代码分析
    创建失败
    源代码运行后是下图,先开始不是很懂发生了什么,查看代码后加一句话,运行结果就比较清楚了

    listargs.c

    打印指令,输出信息
    •编译运行结果

    pipe.c

    实现管道的功能
    •编译运行结果

    pipedemo.c

    将输入输出用管道连接
    •编译运行结果

    •代码分析
    像是打开了一个什么文件,程序需要强制退出

    pipedemo2.c

    •编译运行结果

    •代码分析
    进程先执行父进程,出现1次testing..父进程休眠1s,然后执行子进程,打印"I want a cookie",接着休眠5s,父进程接着打印,出现4次testing..打印"I want a cookie"

    stdinredir1.c

    •编译运行结果

    •代码分析
    输入信息后打印输入,打开文件语句,打开正常后,从文件中读取前三行信息

    stdinredir2.c

    •编译运行结果

    •代码分析
    输入信息后打印输入,打开文件语句,打开失败

    stdinredir1.c

    •编译运行结果

    •代码分析
    输入信息后打印输入,打开文件语句,打开正常后,从文件中读取前三行信息

    testtty.c

    打印缓冲区的内容
    •编译运行结果

    whotofile.c

    •编译运行结果

    •代码分析
    使用完文件后如果不需要该文件用 close()关闭该文件,close()函数返回值,文件顺利关闭则返回0, 发生错误时返回-1,结果显示没有子进程的执行,但fork()返回两个,因此没有打印之后执行的结果是因为close(1)关闭了子进程的输出

    sigactdemo.c

    将标准输入的信息打印到标准输出上
    •编译运行结果

    •代码分析
    需要强制退出

    sigactdemo2.c

    •编译运行结果

    •代码分析
    观察发现每2s打印一次Two seconds passed

    sigdemo1.c

    •编译运行结果

    •代码分析
    观察发现每2s打印一次hello

    sigdemo2.c

    •编译运行结果

    •代码分析
    观察发现每隔1s打印一次haha,并且需要强制退出

    sigdemo3.c

    输入消息,并打印
    •编译运行结果

    •代码分析
    需要强制退出

    本周代码托管截图

    代码调试中的问题和解决过程

    ①编译testpp.c的时候出现段错误

    ②编译argtest.c的时候出现致命错误:argv.h没有那个文件或目录

    •解决方法:把文件夹中的argv.h提取到/usr/include下面(sudo mv argv.h /usr/include),编译时加上-lpthread

    ③编译freemakeargv.c、makeargv.c时均出现了undefined reference to ‘main’


    •解决方法:没有main函数,加一个main函数即可,感觉那个main函数应该是argtest.c中的代码,加进去后都出现一些问题

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

    学习进度条

    博客量(新增/累积) 学习时间(新增/累积) 重要成长
    目标 30篇 400小时
    第零周 1/1 20/20
    第一周 1/2 20/40
    第二周 1/3 20/60
    第三周 1/4 20/80
    第四周 1/5 20/100
    第五周 1/6 20/120
    第六周 1/7 20/140
    第七周 1/8 20/160
    第八周 5/13 20/180
    第九周 1/14 20/200
    第十周 1/15 20/220
    第十一周 1/16 20/240

    参考资料

    参考资料

  • 相关阅读:
    UCenter创始人、Discuz!创始人、Discuz!管理员账号区别
    Linux命令:ps ef |grep java
    ASP.NET结合数据库,发送邮件找回密码
    NET中Eval()方法大全
    必将改变Web的五大技术
    为DataGridTextColumn设置表头样式和单元格样式
    string to float
    .net之生成图表的控件(柱状图,曲线图,饼状图) [转]
    判断一个string是否可以为数字
    从零开始做一个开源项目 学习笔记
  • 原文地址:https://www.cnblogs.com/SJZGM10/p/6100046.html
Copyright © 2011-2022 走看看