20135201李辰希第十三周总结

学习计时:共xxx小时

读书:

代码:

作业:

博客:

一、学习目标

1. 掌握三种并发的方式:进程、线程、I/O多路复用
2. 掌握线程控制及相关系统调用
3. 掌握线程同步互斥及相关系统调用

二、学习资源

1. 教材:第十一章《网络编程》简单过一下。(刘老师讲过了)

2. 教材:第十二章《并发编程》

3. 课程资料:https://www.shiyanlou.com/courses/413   实验12,13,课程邀请码:W7FQKW4Y

4. 教材中代码和习题中代码运行、思考一下,读代码的学习方法见这。

三、学习方法

1.  进度很重要:必须跟上每周的进度,阅读,练习,问答,项目。我会认真对待每一位同学,请你不要因为困难半途而废。

2. 问答很重要:遇到知识难点请多多提问,这是你的权利更是您对自己负责的义务。问答到博客园讨论小组:http://group.cnblogs.com/103791/
3. 实践很重要:解决书中习题,实践书中实例,完成每周项目,才算真的消化了这本好书。通过实验楼环境或自己安装的虚拟机在实践中进行学习
4. 实验报告很重要:详细记录你完成项目任务的思路,获得老师点评和帮助自己复习。学习完成后在博客园中(http://www.cnblogs.com/)把学习过程通过博客发表,博客标题“信息安全系统设计基础第十二周学习总结”

四、学习任务

1. 阅读教材,完成课后练习(书中有参考答案)

2. 考核:练习题把数据变换一下

3. 加分题:课后作业最多两人一组,互相不能重复,1星题目每人最多加一分,2星题目每人最多加二分,3星题目每人最多加三分,4星题目每人最多加四分。

、后续学习预告(可选):

教材第九章

、学习过程

                                                                         十二章  并发编程

 

一.并发概述

1.逻辑控制流在时间上重叠,那么它们就是并发的

2.并发(concurrency ) ,出现在计算机系统的许多不同层面上。

3.应用级并发:

(1)访问慢速I/O设备。当一个应用正在等待来自慢速 I/O 设备(例如磁盘)的数据到达时, 内核会运行其他进程,使 CPU保持繁忙。每个应用都可以按照类似的方式,通过交替执行 I/O 请求和其他有用的工作来使用并发。

(2)与人交互。和计算机交互的人要求计算机有同时执行多个任务的能力。例如,他们在打印一个文档时,可能想要调整一个窗口的大小。现代视窗系统利用并发来提供这种能力。每次用户请求某种操作(比如通过单击鼠标)时,一个独立的并发逻辑流被创建来执行这个操作。

(3)通过推迟工作以降低延迟。有时,应用程序能够通过推迟其他操作和并发地执行它们,利用并发来降低某些操作的延迟。比如,一个动态存储分配器可以通过推迟合并,把它放到一个运行在较低优先级上的并发"合并"流中,在有空闲的 CPU 周期时充分利用这些空闲 周期,从而降低单个 free 操作的延迟。

(4)服务多个网络客户端。

(5)在多核机器上进行并行计算。许多现代系统都配备有多核处理器,多核处理器中包含多个 CPU。被划分成并发流的应用程序通常在多核机器上比在单处理器机器上运行得快,因为这些流会并行执行,而不是交错执行。

4.使用应用级并发的应用程序称为并发程序。现代操作系统提供了三种基本的构造并发程序的方法:

(1)进程。每个逻辑控制流都是一个进程,由内核来调度和维护。因为进程 有独立的虚拟地址空间,想要和其他流通信,控制流必须使用某种显式的进程间通信(IPC)机制。

(2)I/O 多路复用。在这种形式的并发编程中,应用程序在一个进程的上下文中显式地调度它们自己的逻辑流。逻辑流被模型化为状态机,数据到达文件描述符后,主程序显式地从一个状态转换到另一个状态。因为程序是一个单独的进程,所以所有的流都共享同一个地址空间。

(3)线程。线程是运行在一个单一进程上下文中的逻辑流,由内核进行调度。是其他两种方式的混合体,像进程流一样由内核进行调度,而像I/O 多路复用流一样共享同一个虚拟地址空间。

二.基于进程的并发编程

1.构造并发程序最简单的方法就是用进程。

一个构造并发服务器的自然方法就是,在父进程中接受客户端连接请求,然后创建一个新的子进程来为每个新客户端提供服务。

2.基于进程的并发服务器

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

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

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

第一步:服务器接受客户端的连接请求 第二步:服务器派生一个子进程为这个客户端服务 第三步:服务器接受另一个连接请求 第四步:服务器派生另一个子进程为新的客户端服务

3.进程的优劣

在父、子进程间共享状态信息,进程有一个非常清晰的模型:共享文件表,但是不共享用户地址空间。

进程有独立的地址空间既是优点也是缺点。
优点:一个进程不可能不小心覆盖另一个进程的虚拟存储器,这就消除了许多令人迷惑的错误。
缺点:独立的地址空间使得进程共享状态信息变得更加困难。为了共享信息,它们必须使用显式的IPC(进程间通信)机制。基于进程的设计的另一个缺点是,它们往往比较慢,因为进程控制和 IPC 的开销很高。

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

I/O 多路复用(I/O multiplexing) 技术。基本的思路就是使用 select 函数,要求内核挂起进程,只有在一个或多个I/O事件发生后,才将控制返回给应用程序。

1.基于 I/O 多路复用的并发事件驱动服务器

I/O 多路复用可以用做并发事件驱动 (event-driven) 程序的基础,在事件驱动程序中,流是因为某种事件而前进的。

将逻辑流模型化为状态机。不严格地说,一个状态机 (state machine) 就是一组状态 (state)、输入事件(input event) 和转移他(transition),其中转移就是将状态和输入事件映射到状态。每个转移都将一个(输入状态,输入事件)对映射到一个输出状态。自循环(self-loop) 是同一输入和输出状态之间的转移。节 点表示状态,有向弧表示转移,而弧上的标号表示输入事件。一个状态机从某种初始状态开始执行。每个输入事件都会引发一个从当前状态到下一状态的转移。

服务器使用I/O多路复用,借助 select 函数检测输入事件的发生。

服务器调用 select 函数来 检测两种不同类型的输人事件:

(1) 来自一个新客户端的连接请求到达

(2) 一个己存在的客户 端的己连接描述符准备好可以读了。

2.I/O 多路复用技术的优劣

(1)事件驱动设计的优点:

      它比基于进程的设计给了程序员更多的对程序行为的控制。

       一个基于 I/O 多路复用的事件驱动服务器是运行在单一进程上下文中的,因 此每个逻辑流都能访问该进程的全部地址空间。

(2)缺点就是编码复杂。我们的事件驱动的并发 echo 服务器需要的代码比基于进程的服务器多三倍。不幸的是,随着并发粒度的减小,复杂性还会上升。这里的粒度是指每个逻辑流每个时间片执行的指令数量。

 

四.基于线程的并发编程

1.线程运行在进程上下文中的逻辑流。线程由内核自动调度,每个线程都有它自己的线程上下文。

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

有以下四种方式终止线程:

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

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

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

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



五.多线程程序中的共享变量

1.每个线程都有它自己独自的线程上下文,包括:线程ID、栈、栈指针、程序计数器条件码、通用目的寄存器值。

2.每个线程和其他线程一起共享进程上下文的剩余部分;寄存器是从不共享的,而虚拟存储器总是共享的。

3.线程化的c程序中变量根据它们的存储器类型被映射到虚拟存储器。


六.用信号量同步线程

1. 将线程 i 的循环代码分解成五个部分:

(1)Hi:在循环头部的指令块

(2)Li:加载共享变量 cnt 到寄存器%eaxi 的指令,这里%eaxi 表示线程i 中的寄存器%eax的值。

(3)Ui:更新(增加) %eaxi 的指令。

(4)Si:将%eaxi 的更新值存回到共享变量 cnt 的指令。

(5)Ti:循环尾部的指令块。

2. 注意头和尾只操作本地栈变量,而Li、Ui和Si操作共享计数器变量的内容。

3. 一般而言, 你没有办法预测操作系统是否将为你的线程选择一个正确的顺序。

4.进度图的方法来阐明这些正确 的和不正确的指令顺序的概念

 

 

  七.其他并发问题

1.四种不安全函数;

2.可重入函数。可重入函数是线程安全函数的一个真子集,它不访问任何共享数据。可重入安全函数通常比不可重入函数更有效,因为它们不需要任何同步原语。

3.竞争。当程序员错误地假设逻辑流该如何调度时,就会发生竞争。为了消除竞争,通常我们会动态地分配内存空间。

4.死锁。当一个流等待一个永远不会发生的事件时,就会发生死锁。

 

 

 

 

 

 

 

 

 

 

 

 

 

七、遇到的问题及解决

信号量同步进程那块儿有点吃力。

 

 

 

八、其他

本次学习感觉知识点比较抽象,比较难掌握。

你可能感兴趣的:(20135201李辰希第十三周总结)