zoukankan      html  css  js  c++  java
  • 2017-2018-1 20155301 《信息安全系统设计基础》第八周学习总结

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

    教材学习内容总结

    第十二章 并发编程

    1.如果逻辑流在时间上重叠,那么他们就是并发的,硬件异常处理程序、进程和UNIX信号处理程序都是熟悉的例子。并发现象不仅在内核中存在,在应用级别的程序中也存在。

    2.操作系统提供了三种基本的构造并发程序的方法:

    1)、进程。每个逻辑控制流都是一个进程,由内核来调度和维护;

    2)、I/O多路复用。

    3)、线程。

    3.基于进程的并发 echo 服务器.父进程派生一个子进程来处理每个新的连接请求:

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

    2)父子进程必须关闭它们各自的 connfd 拷贝。这对父进程而言尤为重要,它必须关闭它的已连接描述 符,以避免存储器泄漏。

    3)因为套接字的文件表表项中的引用计数,直到父子进程的 connfd 都关闭了,到客户端的连接才会终止。

    4.基于I/O多路复用的并发编程
    1、面对困境——服务器必须响应两个互相独立的I/O事件:1)网络客户端发起的连接请求 2)用户在键盘上键入的命令 ,解决的办法是I/O多路复用技术。
    基本思想是,使用select函数,要求内核挂起进程,只有在一个或多个I/O事件发生后,才将控制返回给应用程序。
    select函数:

    select函数处理类型为fd_set的集合,即描述符集合,并在逻辑上描述为一个大小为n的位向量,每一位b[k]对应描述符k,但当且仅当b[k]=1,描述符k才表明是描述符集合的一个元素。

    使用select函数的过程如下:
    第一步,初始化fd_set集,19~22行;
    第二步,调用select,25行;
    第三步,根据fd_set集合现在的值,判断是哪种I/O事件,26~31行。
    只允许你对描述符集合做的三件事:
    ①分配他们
    ②将一个此种类型的变量赋值给另一个变量
    ③用FD_ZERO、FD_SET、FD_CLR和FD_ISSET宏指令来修改和检查它们

    5.基于线程的并发编程
    线程:运行在进程上下文中的逻辑流。线程由内核自动调度,每个线程都有它自己的线程上下文。
    线程上下文包括:一个唯一的整数线程ID——TID、栈、栈指针、程序计数器、通用目的寄存器、条件码

    6.线程执行模型

    多线程的执行模型在某些方面和多进程的执行模型相似。每个进程开始生命周期时都是单一线程,这个线程称为主线程。在某一时刻,主线程创建一个对等线程,从在此刻开始,两个线程就并发地运行。

    7.创建线程
    调用pthread_create函数来创建其他线程

    # include <pthread.h>
    typedef void *(func)(void *);
    
    int pthread_create(pthread_t *tid, pthread_attr_t *attr, func *f, void *arg);
    
    返回:成功返回0,出错返回非0
    

    8.终止线程
    终止线程的几个方式:

    1)当顶层的线程例程返回时,线程会隐式终止;

    2)线程调用pthread_exit函数,线程会显示终止;如果主线程调用pthread_exit,它会等到所有其他对等线程终止,然后再终止主线程和整个线程,返回值为thread_return;
    pthread_exit函数

    3)某个对等线程调用exut函数,则函数终止进程和所有与该进程相关的线程;

    4)另一个对等线程调用以当前ID为参数的函数ptherad_cancel来终止当前线程。

    9.多线程程序中的共享变量
    每个线程都有它自己独自的线程上下文,包括线程ID、栈、栈指针、程序计数器、条件码和通用目的寄存器值。每个线程和其他线程一起共享进程上下文的剩余部分。寄存器是从不共享的,而虚拟存储器总是共享的。线程化的c程序中变量根据它们的存储器类型被映射到虚拟存储器:全局变量,本地自动变量(不共享),本地静态变量。

    10.用信号量同步线程
    共享变量引入了同步错误。
    一般而言,没有办法预测操作系统是否将为你的线程选择一个正确的顺序。

    11.其他并发问题

    1)线程安全
    一个函数被称为线程安全的,当且仅当被多个并发线程反复的调用时,它会一直产生正确的结果。

    2)可重入性
    可重入函数,其特点在于它们具有这样一种属性:当它们被多个线程调用时,不会引用任何共享数据。
    可重入函数通常要比不可重人的线程安全的函数高效一些,因为它们不需要同步操作。更进一步来说,将第 2 类线程不安全函数转化为线 程安全函数的唯一方法就是重写它,使之变为可重入的。

    3)在线程化的程序中使用已存在的库函数
    使用线程不安全函数的可重入版本,名字以“_r”为后缀结尾。

    教材学习中的问题和解决过程

    代码调试中的问题和解决过程

    代码托管

    (statistics.sh脚本的运行结果截图)

    上周考试错题总结

    • 错题1及原因,理解情况
    • 错题2及原因,理解情况
    • ...

    结对及互评

    点评模板:

    • 博客中值得学习的或问题:
      • xxx
      • xxx
      • ...
    • 代码中值得学习的或问题:
      • xxx
      • xxx
      • ...
    • 其他

    本周结对学习情况

    - [结对同学学号1](博客链接)
    - 结对照片
    - 结对学习内容
        - XXXX
        - XXXX
        - ...
    

    其他(感悟、思考等,可选)

    xxx
    xxx

    学习进度条

    代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
    目标 5000行 30篇 400小时
    第一周 200/200 2/2 20/20
    第二周 300/500 2/4 18/38
    第三周 500/1000 3/7 22/60
    第四周 300/1300 2/9 30/90

    尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
    耗时估计的公式
    :Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。

    参考:软件工程软件的估计为什么这么难软件工程 估计方法

    • 计划学习时间:XX小时

    • 实际学习时间:XX小时

    • 改进情况:

    (有空多看看现代软件工程 课件
    软件工程师能力自我评价表
    )

    参考资料

  • 相关阅读:
    理解MySQL——索引与优化(转)
    C# 实现3Des加密 解密
    des加密解密源码 C# key值问题
    深入浅出mysql优化--一篇博客让你精通mysql优化策略--中
    深入浅出mysql优化--一篇博客让你精通mysql优化策略--上
    深入浅出mysql优化--了解mysql常用索引结构
    从零开始了解多线程 之 深入浅出AQS -- 下(Tools&CountDownLatch&CyclicBarrier&Semaphore)
    从零开始了解多线程 之 深入浅出AQS -- 上
    从零开始了解多线程知识之开始篇目 -- jvm&volatile
    利用doxygen提高源代码阅读效率
  • 原文地址:https://www.cnblogs.com/fengxingck/p/7822197.html
Copyright © 2011-2022 走看看