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

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

    教材学习内容总结

    第十一章 网络编程

    第一节

    要知道客户端-服务器模型。

    第二节

    这一节以前计网讲过,三种网络、网桥、路由器。

    第三节

    TCP/IP、UDP、IP地址、域名(DNS);刘念老师讲的java web主要涉及HTTP。

    第四节

    套接字接口就是一组函数:客户端有一组,服务器也有一组,最终两端分别通过clientfd(套接字描述符)和connfd(已连接描述符)传送数据。

    第五节

    这节东西刘念老师的课程涉及大多数,只不过这本书的代码全是c代码。

    HTML、URL的概念,HTTP请求和响应的格式、状态码(404经常见);服务器向子进程传参用到了上周讲的fork和execve函数;子进程的输出用dup2重定向到connfd。

    第六节

    讲了一个完整的程序,里面涉及到很多函数,前几节内容的深化。

    并发编程

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

    构造并发程序用到上周所学的函数:

    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程序中处理线程的一个标准接口。

    三、创建线程

    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.隐式可重入的

    调用线程小心的传递指向非共享数据的指针。

    三、竞争

    竞争发生的原因:

    一个程序的正确性依赖于一个线程要在另一个线程到达y点之前到达它的控制流中的x点。也就是说,程序员假定线程会按照某种特殊的轨迹穿过执行状态空间,忘了一条准则规定:线程化的程序必须对任何可行的轨迹线都正确工作。

    消除方法:

    动态的为每个整数ID分配一个独立的块,并且传递给线程例程一个指向这个块的指针

    四、死锁

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

    课本代码问题及解决过程:

    在看p640代码时13、14、15行看不懂

    解决过程:仔细看书P641的内容,并上网查涉及到的函数的用法。

    首先,TINY只支持GET方法。

    接着,调用strcasecmp函数进行比较,看两个字符串是否相等。相等就不执行这段代码了。

    不相等时,说明不是GET方法,执行下面的代码,包含状态码(501,对照p636的表知他的描述就是服务器不支持请求方法法)、状态消息和一个解释错误的HTML文件。

    实践

    condvar

    由于调用了pthread,gcc编译的时候要加上-lpthread选项。

    在pthread库中通过条件变量来阻塞等待一个条件,或者唤醒等待这个条件的线程。

    count

    由于结果相互覆盖 ,因此是5000

    countwithmutex

    引入mutex,防止多线程的冲突

    cp_t.c

    用法:./cp_t [源文件名] [目的文件名] [创建线程数]

    createthread

    打印进程和线程ID

    semphore

    share

    本周代码托管

    我在这!

    学习进度条

     代码行数(新增/累积)博客量(新增/累积)学习时间(新增/累积)重要成长
    目标 5000行 30篇 400小时  
    第一周 200/200 1/2 20/20  
    第二周 300/500 1/3 18/38  
    第三周 150/650 1/4 20/58  
    第四周 200/850 1/5 22/80  
    第五周 200/1050 1/6 24/104  
    第六周 220/1270 1/7 25/129  
    第七周 523/995 1/8 20/149  
    第八周 263/1213 2/10 21/170  
    第九周 40/1253 2/12 20/190  
    第十周 21/1274 2/14 24/214  
    第十一周 183/1325 2/16 22/226  
    第十二周 895/1890 3/14 30/256  
    第十三周 473/2363 1/25 25/281
  • 相关阅读:
    (转)SpringBoot使用@Value给静态变量注入
    关于Oracle to_date函数的高级用法
    Nginx实践篇(5)- Nginx代理服务
    SpringBoot @Autowired中注入静态方法或者静态变量
    SpringBoot MAVEN编译报错Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.0:
    SpringBoot项目中禁用HttpClient那些嘈杂的日志
    生成SQL Server数据字典
    SqlServer 查看最近执行过的语句
    为二级域名注册ssl证书,并强制使用https对http进行跳转
    CentOS 7 配置nginx并默认强制使用https对http进行跳转
  • 原文地址:https://www.cnblogs.com/bosswsc/p/6160115.html
Copyright © 2011-2022 走看看