• 2018-2019-1 20165228 《信息安全系统设计基础》第八周学习总结


    2018-2019-1 20165228 《信息安全系统设计基础》第八周学习总结

    教材学习内容总结

    并发编程

    • 并发:逻辑控制流在时间上重叠

    • 并发程序:使用应用级并发的应用程序称为并发程序。
      三种基本的构造并发程序的方法:

    • 进程,用内核来调用和维护,有独立的虚拟地址空间,显式的进程间通信机制。

    • I/O多路复用,应用程序在一个进程的上下文中显式的调度控制流。逻辑流被模型化为状态机。
      线程,运行在一个单一进程上下文中的逻辑流。由内核进行调度,共享同一个虚拟地址空间。

    • 基于进程的并发编程
      构造并发程序最简单的方法就是用进程。

    • 一个构造并发服务器的自然方法就是,在父进程中接受客户端连接请求,然后创建一个新的子进程来为每个新客户端提供服务。
      基于进程的并发服务器

    • 通常服务器会运行很长的时间,所以我们必须要包括一个 SIGCHLD 处理程序,来回收僵死 (zombie) 子进程的资源。当 SIGCHLD 处理程序执行时, SIGCHLD 信号是阻塞的,而 Unix 信号是不排队的。

    • 父子进程必须关闭它们各自的 connfd 拷贝。父进程必须关闭它的已连接描述符,以避免存储器泄漏。直到父子进程的 connfd 都关闭了,到客户端的连接才会终止。

    进程的优劣

    • 优点:一个进程不可能不小心覆盖另一个进程的虚拟存储器,这就消除了许多令人迷惑的错误。
    • 缺点:独立的地址空间使得进程共享状态信息变得更加困难。为了共享信息,它们必须使用显式的IPC(进程间通信)机制。基于进程的设计的另一个缺点是,它们往往比较慢,因为进程控制和 IPC 的开销很高。

    基于 I/O 多路复用的并发编程

    • I/O多路复用技术的基本思路:使用select函数,要求内核挂起进程,只有在一个或多个I/O事件发生后,才将控制返回给应用程序
    • 状态机就是一组状态、输入事件和转移,转移就是将状态和输入时间映射到状态,自循环是同一输入和输出状态之间的转移。
      I/O 多路复用技术的优劣
    • 优点:
      它比基于进程的设计给了程序员更多的对程序行为的控制。
      一个基于 I/O 多路复用的事件驱动服务器是运行在单一进程上下文中的,因 此每个逻辑流都能访问该进程的全部地址空间。
    • 缺点:编码复杂且不能充分利用多核处理器。
      基于线程的并发编程
    • 线程:运行在进程上下文中的逻辑流。

    线程有自己的线程上下文,包括一个唯一的整数线程ID、栈、栈指针、程序计数器、通用目的寄存器和条件码。所有运行在一个进程里的线程共享该进程的整个虚拟地址空间
    主线程:每个进程开始生命周期时都是单一线程。

    对等线程:某一时刻,主线程创建的对等线程。

    • 进度图
      进度图是将n个并发线程的执行模型化为一条n维笛卡尔空间中的轨迹线,原点对应于没有任何线程完成一条指令的初始状态。

    • 转换规则:
      合法的转换是向右或者向上,即某一个线程中的一条指令完成
      两条指令不能在同一时刻完成,即不允许出现对角线
      程序不能反向运行,即不能出现向下或向左
      信号量定义:

    type semaphore=record
    count: integer;
    queue: list of process
    end;
    var s:semaphore;
    

    读者—写者问题:
    (1)读者优先,要求不让读者等待,除非已经把使用对象的权限赋予了一个写者。
    (2)写者优先,要求一旦一个写者准备好可以写,它就会尽可能地完成它的写操作。
    (3)饥饿就是一个线程无限期地阻塞,无法进展。
    其他并发问题

    • 线程安全
      当且仅当被多个并发线程反复地调用时,它会一直产生正确的结果。

    • 可重入性
      显式可重入的:所有函数参数都是传值传递,没有指针,并且所有的数据引用都是本地的自动栈变量,没有引用静态或全剧变量。
      隐式可重入的:调用线程小心的传递指向非共享数据的指针。

    竞争

    • 发生的原因:一个程序的正确性依赖于一个线程要在另一个线程到达y点之前到达它的控制流中的x点。也就是说,程序员假定线程会按照某种特殊的轨迹穿过执行状态空间,忘了一条准则规定:线程化的程序必须对任何可行的轨迹线都正确工作。
    • 消除方法:动态的为每个整数ID分配一个独立的块,并且传递给线程例程一个指向这个块的指针
      死锁
    • 死锁:一组线程被阻塞了,等待一个永远也不会为真的条件。
  • 相关阅读:
    打包成exe可执行文件的方法
    Html 重要单词归纳
    python基础---递归函数 知识点自查填空题
    python基础---内置函数 和 匿名函数 知识点自查填空题
    python基础---递归函数真题解析
    python 日记 day4。
    python 日记 day5 字典
    python 日记 day3
    python 日记 day4
    python 日记 day1
  • 原文地址:https://www.cnblogs.com/cloud795/p/10018053.html
Copyright © 2020-2023  润新知