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

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

    教材学习内容总结

    •并发:逻辑控制流在时间上重叠
    •并发程序:使用应用级并发的应用程序称为并发程序
    •三种基本的构造并发程序的方法:
    ①进程:用内核来调用和维护,有独立的虚拟地址空间,显式的进程间通信机制
    ②I/O多路复用:应用程序在一个进程的上下文中显式的调度控制流
    ③线程:运行在一个单一进程上下文中的逻辑流,由内核进行调度。

    基于进程的并发服务器

    •构造并发程序最简单的方法就是使用进程
    •需要一个SIGCHLD处理程序,来回收僵死子进程的资源
    •父子进程必须关闭各自的connfd拷贝
    •套接字的文件表表项中的引用计数,直到父子进程的connfd都关闭了,到客户端的连接才会终止
    •进程的模型:共享文件表
    •echo服务器必须响应两个相互独立的I/O时间:
    ①网络客户端发起连接请求
    ②用户在键盘上键入命令行
    •基本思路:使用select函数,要求内核挂起进程,只有在一个或多个I/O事件发生后,才将控制返回给应用程序
    •将描述符集合看成是n位位向量:b(n-1),……b1,b0
    每个位bk对应于描述符k,当期仅当bk=1,描述符k才表明是描述符集合的一个元素。可以做以下三件事:
    ①分配它们
    ②将一个此种类型的变量赋值给另一个变量
    ③用FDZERO、FDSET、FDCLR和FDISSET宏指令来修改和检查它们
    •状态机就是一组状态、输入事件和转移,转移就是将状态和输入时间映射到状态,自循环是同一输入和输出状态之间的转移
    •事件驱动器的设计优点:
    ①比基于进程的设计给了程序员更多的对程序行为的控制
    ②每个逻辑流都能访问该进程的全部地址空间
    ③不需要进程上下文切换来调度新的流。
    •事件驱动器的设计缺点:
    ①编码复杂
    ②不能充分利用多核处理器

    基于线程的并发编程

    •线程:运行子啊进程上下文中的逻辑流
    •线程有自己的线程上下文,包括一个唯一的整数线程ID、栈、栈指针、程序计数器、通用目的寄存器和条件码
    •所有运行在一个进程里的线程共享该进程的整个虚拟地址空间
    •主线程:每个进程开始生命周期时都是单一线程
    •对等线程:某一时刻,主线程创建的对等线程
    •每个对等线程都能读写相同的共享数据
    •Posix线程是在处理C程序中处理线程的一个标准接口
    •线程例程:线程的代码和本地数据被封装在一个线程例程中。每一个线程例程都以一个通用指针作为输入,并返回一个通用指针
    •通过pthread_create函数创建一个新的线程
    •一个线程的终止方式:
    ①当顶层的线程例程返回时,线程会隐式的终止
    ②通过调用pthread_exit函数,线程会显示地终止。如果主线程调用pthread_exit,它会等待所有其他对等线程终止,然后再终止主线程和整个进程
    ③对某个对等线程调用Unix的exit函数,该函数终止进程以及所有与该进程相关的线程
    ④另一个对等线程通过以当前线程ID作为参数调用pthread_cancle函数来终止当前线程
    •通过调用pthread_join函数等待其他线程终止
    •在任何一个时间点上,线程是可结合的或者是分离的
    •pthread_once函数允许初始化与线程例程相关的状态

    多线程程序中的变量共享

    •寄存器是从不共享的,而虚拟存储器总是共享的
    •全局变量:虚拟存储器的读/写区域只会包含每个全局变量的一个实例
    •本地自动变量:定义在函数内部但没有static属性的变量
    •本地静态变量:定义在函数内部并有static属性的变量
    •变量v是共享的,当且仅当它的一个实例被一个以上的线程引用

    用信号量同步线程

    •共享变量引入了同步错误的可能性
    •线程i的循环代码分解为五部分:
    Hi:在循环头部的指令块
    Li:加载共享变量cnt到寄存器%eax的指令,%eax表示线程i中的寄存器%eax的值
    Ui:更新(增加)%eax的指令
    Si:将%eaxi的更新值存回到共享变量cnt的指令
    Ti:循环尾部的指令块
    •进度图将指令执行模式化为从一种状态到另一种状态的转换
    •对于线程i,操作共享变量cnt内容的指令构成了一个临界区
    •两个临界区的交集形成的状态空间区域称为不安全区域
    •接触到任何不安全区的轨迹线就叫做不安全轨迹线
    •二元信号量:将每个共享变量与一个信号量s联系起来,然后用P(S)和V(s)操作将这种临界区包围起来,这种方式来保护共享变量的信号量
    •互斥锁:以提供互斥为目的的二元信号量
    •计数信号量:一个被用作一组可用资源的计数器的信号量
    •信号量的作用:
    ①提供互斥
    ②调度对共享资源的访问
    •生产者—消费者问题:生产者产生项目并把他们插入到一个有限的缓冲区中,消费者从缓冲区中取出这些项目,然后消费它们
    •读者—写者问题:
    ①读者优先,要求不让读者等待,除非已经把使用对象的权限赋予了一个写者。
    ②写者优先,要求一旦一个写者准备好可以写,它就会尽可能地完成它的写操作。
    ③饥饿就是一个线程无限期地阻塞,无法进展
    •可重入函数:当它们被多个线程调用时,不会引用任何共享数据
    •可重入函数是线程安全函数的一个真子集
    •显式可重入:没有指针,没有引用静态或全局变量
    •隐式可重入:允许它们传递指针
    •竞争:当一个程序的正确性依赖于一个线程要在另一个线程到达y点之前到达它的控制流中的x点时,就会发生竞争
    •死锁:一组线程被阻塞了,等待一个永远也不会为真的条件
    •死锁是不可预测的

    本周代码托管截图

    http://git.oschina.net/SJZGM10/CSAPP2E/tree/master/src/12conc?dir

    学习进度条

    博客量(新增/累积) 学习时间(新增/累积) 重要成长
    目标 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
    第十二周 1/17 20/260
    第十三周 1/18 20/280

    参考资料

  • 相关阅读:
    解决Java版CKFinder无法显示缩略图问题
    python视频教程大全
    关于Linux vi命令 vi命令一览表
    Python快速教程
    Linux的概念与体系
    每天一个linux命令目录
    每天一个linux命令(31): /etc/group文件详解
    每天一个linux命令(30): chown命令
    每天一个linux命令(29):chgrp命令
    十大Material Design开源项目
  • 原文地址:https://www.cnblogs.com/SJZGM10/p/6143062.html
Copyright © 2011-2022 走看看