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

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

    第十二章 并发编程

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

    应用级并发
    访问慢速设备

    人机交互

    通过推迟工作以降低延迟

    服务多个客户端

    在多核机器上进行并行计算

    进程

    进程并发服务器:在父进程中接受客户端连接请求,再创建一个新的子进程来为每个新客户端提供服务。

    进程共享文件表,但不共享用户地址空间。

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

    使用select函数,要求内核挂起进程,只有在一个或多个I/O事件发生后,才将控制返回给应用程序

    两个输入:读集合 读集合的基数n

    事件驱动程序:流因为某种事件而前进

    状态机:状态,输入事件和转移

     基于线程的并发编程

    线程:运行在进程上下文中的逻辑流

    线程上下文:线程ID,栈,栈指针,程序计数器,通用目的寄存器和条件码

    运行在一个进程里的线程共享该进程的虚拟地址空间,包括代码,数据,堆,共享库和打开的文件

     Posix线程

    void *thread(void *vargp);
    int main()
    {
       pthread_t tid;
       Pthread_create(&tid, NULL, thread, NULL);
       Pthread_join(tid,NULL);
       exit(0);
    }
    
    void *thread(void *vargp)
    {
       printf(“Hello , world
    ”);
       return NULL;
    }
    

    pthread_create返回时,参数tid包含新创建线程的ID

    pthread_join函数会阻塞,直到进程tid终止,将线程例程返回的(void*)指针赋值为thread_return指向的位置,然后回收已终止线程占用的所有存储器资源。

     多线程程序的共享变量

    一个变量是共享的,当且仅当多个线程引用这个变量的某个实例

    寄存器从不共享,虚拟存储器总是共享的

     同步线程

    一般而言,你无法预测操作系统能否为你的线程选择一个正确的顺序

    不安全区:毗邻不安全区的状态并不是不安全区的一部分

     信号量

    信号量s是具有非负整数值得全局变量

    信号量不变性:一个正确初始化了的信号量不可能有一个负值。

     基于预线程化的并发服务器

    服务器由一个主线程和一组工作者线程构成

    主线程不断接受连接请求,并将得到的连接描述符放在一个有限的缓冲区中

    每个工作者线程反复地从共享缓冲区中取出描述符,为客户端服务,然后等待下一个描述符

    并行程序:一个运行在多个处理器上的并发程序

    并行程序往往写为每个核上只运行一个线程

     加速比:

    强扩展: Sp = T1 / Tp

    Tk是k个核上的运行时间,p为处理器核的数量

    绝对加速比:T1为程序顺序执行版本的执行时间的Sp

    相对加速比:T1位程序并行版本在一个核上的执行时间的Sp

     效率:Ep = Sp / p = T1 / (p*Tp)

    线程安全:当且仅当一个函数被多个并发线程反复调用时,他会一直产生正确结果
    四类线程不安全函数:

    1 不保护共享变量的函数

    2 保持跨越多个调用的状态的函数

    3 返回指向静态变量的指针的函数

    4 调用线程不安全函数的函数

    可重入性:当函数被多个线程调用,不会引用任何共享数据

    显式可重入:所有函数参数都是传值传递,所有数据引用都是本地自动栈变量

    隐式可重入:显式可重入加上一些参数是引用传递(指向非共享数据的指针)

    竞争:当一个程序的正确性依赖于,一个线程要在另一个线程到达y点之前到达它的控制流中的x点,就会发生竞争

    线程化的程序必须对任何可行的轨迹线都正确工作

    死锁:一组线程被阻塞了,等待一个永远也不会为真的条件。

    死锁不总是可以预测的,而错误常常不可重复。

    互斥锁加锁顺序规则:如果对于程序中每对互斥锁(s,t),给所有的锁分配一个全序,每个线程按照这个顺序来请求锁,并且按照逆序来释放,那么它就是无死锁的。

    参考资料:《深入理解计算机系统》(第二版)

  • 相关阅读:
    Redis 启动与授权
    ssh客户端乱码
    centos修改oracle字符集
    netty 基础知识
    推送技术
    oracle 12C安装问题
    Labview学习之路(十三)常用快捷键积累
    Labview学习之路(十二)如何让图片做前面板背景
    UCOSIII(一)常用函数积累
    Keil出现错误
  • 原文地址:https://www.cnblogs.com/20135319zl/p/5023793.html
Copyright © 2011-2022 走看看