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小时

  • 改进情况:

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

参考资料

原文地址:https://www.cnblogs.com/fengxingck/p/7822197.html