信息安全系统设计基础第十二周学习总结-吕松鸿

第十一章 网络编程

11.1客户端—服务器编程模型

1.一个服务器进程 -> 管理某种资源 -> 经过操做这种资源来为它的客户端提供某种服务。 

2.一个或多个客户端进程。

3.基本操做:事务

  • 当一个客户端须要服务时,向服务器发送一个请求,发起一个事务。 -
  • 服务器收到请求后,解释它,并以适当的方式操做它的资源。
  • 服务器给客户端发送一个相应,并等待下一个请求。
  • 客户端收到响应并处理它。

注意:客户端和服务器都是进程。html

11.2网络

1.对主机而言

网络是一种I/O设备程序员

从网络上接收到的数据从适配器通过I/O和存储器总线拷贝到存储器,典型地是经过DMA(直接存储器存取方式)传送。编程

2.物理上

网络是一个按照地理远近组成的层次系统数组

最底层:LAN(局域网),最流行的是以太网,浏览器

以太网段安全

  • 包括一些电缆和集线器。每根电缆都有相同的最大位带宽,集线器不加分辩地将一个端口上收到的每一个位复制到其余全部的端口上,所以每台主机都能看到每一个位。
  • 每一个以太网适配器都有一个全球惟一的48位地址,存储在适配器的非易失性存储器上。
  • 一台主机能够发送一段位:帧,到这个网段内其它任何主机。每一个帧包括一些固定数量的头部位(标识此帧的源和目的地址及帧长)和数据位(有效载荷)。每一个主机都能看到这个帧,可是只有目的主机能读取。
  • 使用电缆和网桥,多个以太网段能够链接成较大的局域网,称为桥接以太网。这些电缆的带宽能够是不一样的。
  • 多个不兼容的局域网能够经过叫作路由器的特殊计算机链接起来,组成一个internet互联网络。

3.协议

 

互联网重要特性:由采用不一样技术,互不兼容的局域网和广域网组成,并能使其相互通讯。其中不一样网络相互通讯的解决办法是一层运行在每台主机和路由器上的协议软件,消除不一样网络的差别。ruby

 

 

协议提供的两种基本能力服务器

 

  • 命名机制:惟一的标示一台主机
  • 传送机制:定义一种把数据位捆扎成不连续的片的同一方式

11.3全球IP因特网

  • TCP/IP协议族
  • 混合使用套接字接口函数和UnixI/O函数进行通讯
  • 世界范围的主机集合网络

特性:多线程

  • - 主机集合被映射为一组32位的IP地址
  • - 这组IP地址被映射为一组称为因特网域名的标识符
  • - 因特网主机上的进程可以经过链接和任何其余主机上的进程

11.4套接字借口

1.函数

  • socket函数
  • connect函数
  • open_clientfd函数
  • bind函数
  • listen函数
  • open_listenfd函数
  • accept函数

2.echo客户端和服务器示例

11.5Web服务器

1.协议

Web 客户端和服务器之间的交互用的是一个基于文本的应用级协议,叫作 HTTP (Hypertext Transfer Protocol,超文本传输协议). HTTP 是一个简单的协议。一个 Web 客户端(即浏览器) 打开一个到服务器的因特网链接,而且请求某些内容。服务器响应所请求的内容,而后关闭链接。浏览器读取这些内容,并把它显示在屏幕上。

2.内容

Web内容能够用一种叫作 HTML(Hypertext Markup Language,超文本标记语言)的语言来编写。一个 HTML 程序(页)包含指令(标记),它们告诉浏览器如何显示这页中的各类文本和图形对象。

Web 服务器以两种不一样的方式向客户端提供内容:

取一个磁盘文件,并将它的内容返回给客户端。磁盘文件称为静态内容 (static content), 而返回文件给客户端的过程称为服务静态内容 (serving static content)。
运行一个可执行文件,并将它的输出返回给客户端。运行时可执行文件产生的输出称为态内容 (dynamic content),而运行程序并返回它的输出到客户端的过程称为服务动态内容 (serving dynamic content)。

 

 

第十二章 并发编程

12.1并发概述

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

 

  并发(concurrency ) ,出如今计算机系统的许多不一样层面上。

2.应用级并发

 

  • 访问慢速I/O设备。

  • 与人交互。

  • 经过推迟工做以下降延迟。

  • 服务多个网络客户端。

  • 在多核机器上进行并行计算

 

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

 

  • 进程。
  • I/O 多路复用。
  • 线程。

12.2基于进程的并发编程

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

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

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

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

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

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

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

3.进程的优劣

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

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

12.3基于 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) 一个己存在的客户 端的己链接描述符准备好能够读了。

 

  • init_pool 函数初始化客户端池。 clientfd 数组表示已链接描述符的集合, 其中整数 -1 表示一个可用的槽位。初始时,已链接描述符集合是空的,并且监听描述符是 select 读集合中惟一的描述符。
  • add_clieht函数添加一个新的客户端到活动客户端池中。在 clientfd 数组中找到一个空槽位后,服务器将这个已链接描述符添加到数组中,并初始化相应的RIO读缓冲区,这样一来咱们就可以对这个描述符调用rio_readlineb。将这个已链接描述符添加到 select 读集合,并更新该池的一些全局属性。 maxfd 变量记录了 select 的最大文件描述符。 maxi 变量记录的 是到 clientfd数组的最大索引,这样 check_clients 函数就无需搜索整个数组了。
  • check_clients 函数回送来自每一个准备好的已链接描述符的一个文本行。 若是成功地从描述符读取了一个文本行,那么咱们就将该文本行回送到客户。
  • select 函数检测到输入事件,而 add_client 函数建立 一个新的逻辑流(状态机)。
  • check_clients 函数经过回送输入行来执行状态转移,并且当客 户端完成文本行发送时,它还要删除这个状态机。

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

事件驱动设计的优势:

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

  • 一个基于 I/O 多路复用的事件驱动服务器是运行在单一进程上下文中的,因 此每一个逻辑流都能访问该进程的所有地址空间。
  • 缺点就是编码复杂。咱们的事件驱动的并发 echo 服务器须要的代码比基于进程的服务器多三倍。不幸的是,随着并发粒度的减少,复杂性还会上升。这里的粒度是指每一个逻辑流每一个时间片执行的指令数量。

12.4基于线程的并发编程

线程(thread) 就是运行在进程上下文中的逻辑流。

每一个线程都有它本身的线程上下文 (thread context),包括一个惟一的整数线程 (Thread ID, TID)、栈、栈指针、程序计数器、通用目的寄存器和条件码。全部的运行在一个进程里的线程共享该进程的整个虚拟地址空间。

基于线程的逻辑流结合了基于进程和基于 I/O 多路复用的流的特性。同进程同样,线程由内核自动调度,而且内核经过一个整数 ID 来识别线程。同基于 I/O 多路复用的流同样,多个线程 运行在单一进程的上下文中,所以共享这个进程虚拟地址空间的整个内容,包括它的代码、数据、堆、共享库和打开的文件。

1.线程执行模型

每一个进程开始生命周期时都是单一线程,这个线程称为主线程 (main thread)。在某一时刻,主线程建立一个对等线程 (peer thread),从这个时间点开始,两个线程就并发地运行。最后,由于主线程执行一个慢速系统调用。或者由于它被系统的间隔计时器中断, 控制就会经过上下文切换传递到对等线程。对等线程会执行一段时间,而后控制传递回主线程,依次类推。

- 线程的上下文切换要比进程的上下文切换快得多。 - 不是按照严格的父子层次来组织的。 - 和一个进程相关的线程组成一个对等(线程)池 (pool),独立于其余线程建立的线程。 - 主线程和其余线程的区别仅在于它老是进程中第一个运行的线程。 - 对等 (线程)池概念的主要影响是,一个线程能够杀死它的任何对等线程,或者等待它的任意对等线程终止。 - 每一个对等线程都能读写相同的共享数据。

2.Posix 线程

Posix 线程 (Pthreads) 是在 C 程序中处理线程的一个标准接口。Pthreads 定义了大约 60 个函数,容许程序建立、杀死和回收线程,与对等线程安全地共享数据,还能够通知对等线程系统状态的变化。

线程的代码和本地数据被封装在一个线程例程(thread routine) 中。若是想传递多个参数给钱程例程,那么你应该将参数放 到一个结构中,并传递一个指向该结构的指针。想要线程例程返回多个参数,你能够返回一个指向一个结构的指针。

3.建立线程

pthread_create 函数建立一个新的线程,并带着一个输入变量arg,在新线程的上下文中运行线程例程f。能用attr参数来改变新建立线程的默认属性。

当 pthread_create 返回时,参数 tid包含新建立线程的ID。新线程能够经过调用 pthread_self 函数来得到它本身的线程 ID.

4.终止线程

当顶层的线程例程返回时,线程会隐式地终止。
经过调用 pthread_exit 函数,线程会显式地终止。若是主线程调用 pthread_exit , 它会等待全部其余对等线程终止,而后再终止主线程和整个进程,返回值为 thread_return。

5.回收已终止线程的资源

线程经过调用 pthread_join 函数等待其余线程终止。

  • pthread_join 函数会阻塞,直到线程 tid 终止,将线程例程返回的 (void*) 指针赋值为 thread_return 指向的位置,而后回收己终止线程占用的全部存储器资源。
  • pthread join 函数只能等待一个指定的线程终止。

6.分离线程

在任何一个时间点上,线程是可结合的 (joinable) 或者是分离的 (detached)。一个可结合的线程可以被其余线程收回其资源和杀死。在被其余线程回收以前,它的存储器资源(例如栈)是没有被释放的。相反,一个分离的线程是不能被其余线程回收或杀死的。它的存储器资源在它终止时由系统自动释放。

默认状况下,线程被建立成可结合的。为了不存储器泄漏,每一个可结合线程都应该要么被其余线程显式地收回,要么经过调用 pthread_detach 函数被分离。

pthread_detach 函数分离可结合线程 tid. 线程可以经过以 pthread_self()为参数的 pthread_detach 调用来分离它们本身。

7.初始化线程

pthread_once 函数容许你初始化与线程例程相关的状态。

8.一个基于线程的并发服务器

调用 pthread_ create 时,如何将已链接描述符传递给对等线程。最明显的方法就是传递一个指向这个描述符的指针。
对等线程间接引用这个指针,并将它赋值给一个局部变量。

12.5多线程程序中的共享变量

1.线程存储器模型

2.将变量映射到存储器

3.共享变量

12.6用信号量同步线程

1.进度图

2.信号量

3.使用信号量来实现互斥

4.利用信号量来调度共享资源

12.7使用线程提升并行性

12.8其它并发问题

1.线程安全

2.可重入性

3.在线程化的程序中使用已存在的库函数

4.竞争

5.死锁

 

参考资料:1.20135317韩玉琪的博客:http://www.cnblogs.com/hyq20135317/p/5022152.html

     2.《深刻理解计算机系统》第十一章和十二章

相关文章
相关标签/搜索