zoukankan      html  css  js  c++  java
  • 20135333苏正生——信息安全系统设计基础第十二周学习总结

    第十二章 并发编程

    三种基本概念:
    1.进程
    2.I/O多路复用
    3.线程

    第一节 基于进程的并发编程

    构造并发程序常用函数:

    fork
    exec
    waitpid
    

    独立地址空间
    1.优点:防止虚拟存储器被错误覆盖

    2.缺点:开销有时会很高,共享状态信息才需要IPC机制

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

    事件驱动程序:将逻辑流模型化为状态机。

    状态机:状态、输入事件、转移
    流程:
    1.select函数检测到输入事件
    2.add_client函数创建新状态机
    3.check_clients函数执行状态转移,并且完成时删除该状态机。
    相关函数:

    init_pool()
    add_client()
    check_clients()
    

    第三节 基于线程的并发编程

    一、线程执行模型

    1.主线程
    2.对等线程
    3.主线程切换到对等线程

    二、Posix线程

    Posix线程是C程序中处理线程的一个标准接口。
    万能函数:

    void func(void parameter)
    typedef void (uf)(void para)
    

    三、创建线程

    1.创建线程:

    pthread_create函数
    #include <pthread.h>
    typedef void *(func)(void *);
    
    int pthread_create(pthread_t *tid, pthread_attr_t *attr, func *f, void *arg);
    

    功能:创建一个新的线程,带着一个输入变量arg,在新线程的上下文运行线程例程f。
    2.查看线程ID

    pthread_self函数
    #include <pthread.h>
    
    pthread_t pthread_self(void);
    

    功能:返回调用者的线程ID(TID)

    四、终止线程

    1.终止线程的方式:隐式终止、显示终止

    2.pthread_exit函数

    #include <pthread.h>
    
    void pthread_exit(void *thread_return);
    

    3.pthread_cancle函数

    #include <pthread.h>
    
    void pthread_cancle(pthread_t tid);
    

    五、回收已终止线程的资源

    pthread_join函数:

    #include <pthread.h>
    
    int pthread_join(pthread_t tid,void **thrad_return);
    

    六、分离线程

    pthread_detach函数

    #include <pthread.h>
    
    void pthread_detach(pthread_t tid);
    

    功能:分离可结合线程tid。

    七、初始化线程:pthread_once函数

    #include <pthread.h>
    pthread_once_t once_control = PTHREAD_ONCE_INIT;
    
    int pthread_once(pthread_once_t *once_control, void (*init_routine)(void));
    

    第四节 多线程程序中的共享变量

    一、线程存储器模型
    二、将变量映射到存储器
    三、共享变量

    第五节 用信号量同步线程

    一、进度图

    进度图转换规则:
    合法的转换是向右或者向上,即某一个线程中的一条指令完成
    两条指令不能在同一时刻完成,即不允许出现对角线
    程序不能反向运行,即不能出现向下或向左
    而一个程序的执行历史被模型化为状态空间中的一条轨迹线。

    线程循环代码的分解:
    H:在循环头部的指令块
    L:加载共享变量cnt到线程i中寄存器%eax的指令。
    U:更新(增加)%eax的指令
    S:将%eax的更新值存回到共享变量cnt的指令
    T:循环尾部的指令块
    临界区使用原则:有空让进、无空等待、多中择一、让权等待

    二、信号量

    信号量定义:

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

    定义对信号量的两个原子操作——P和V

    P(wait)

    wait(s)
    s.count :=s.count-1;
    if s.count<0 then
    begin
    进程阻塞;
    进程进入s.queue队列;
    end;
    

    V(signal)

    signal(s)
    s.count :=s.count+1;
    if s.count ≤0 then
    begin
    唤醒队首进程;
    将进程从s.queue阻塞队列中移出;
    end;
    

    【每个信号量在使用前必须初始化】

    三、使用信号量来实现互斥

    详见“《操作系统》第六章”
    第七节 并发问题

    一、线程安全性

    四个不相交的线程不安全函数类以及应对措施:

    不保护共享变量的函数——用P和V这样的同步操作
    保持跨越多个调用的状态的函数——重写
    返回指向静态变量的指针的函数——①重写;②使用加锁-拷贝技术。

    二、可重入性

    1.显式可重入的:
    2.隐式可重入的:

    三、竞争

    四、死锁

    心得总结

    本周的学习和操作系统课程的内容有很多是重复的,虽然说在操作系统中花了很多篇幅来描述的内容,在本书里仅仅列了一章来讲解,可以说是一个缩影。但是结合操作系统的课程来说,一个讲了详细的概念,一个给了大量的代码用来实验,相辅相成,互为表里。确实对一些知识的认识和理解程度有所加深,对一些细节的过程有了实践上的感知和理解。

  • 相关阅读:
    7. Reverse Integer
    4. Median of Two Sorted Arrays
    微服务实战系列(四)-注册中心springcloud alibaba nacos-copy
    微服务实战系列(五)-注册中心Eureka与nacos区别-copy
    Restful、SOAP、RPC、SOA、微服务之间的区别-copy
    从SOA到RPC、SOAP、REST-copy
    spring-session实现分布式集群session的共享-copy
    深入理解 RESTful Api 架构-copy
    RESTful 架构详解-copy
    SpringBoot使用MyBatis-Generator详解-copy
  • 原文地址:https://www.cnblogs.com/suzhengsheng/p/5024736.html
Copyright © 2011-2022 走看看