2017-2018-1 20155234 《信息安全系统设计基础》第八周学习总结
网络编程
客户端-服务器编程模型
- 一个应用是由一个服务器进程和一个或多个客户端进程组成
- 服务器进程 -> 管理某种资源 -> 通过操作这种资源来为它的客户端提供某种服务
- 基本操作:事务
- 一个客户端-服务器事务由四步组成:
1.当一个客户端需要服务时,向服务器发送一个请求,发起一个事务。
2.服务器收到请求后,解释它,并以适当的方式操作它的资源。
3.服务器给客户端发送一个相应,并等待下一个请求。
4.客户端收到响应并处理它。
5.客户端和服务器都是进程 - 网络
对主机而言,网络是一种I/O设备:从网络上接收到的数据从适配器经过I/O和存储器总线拷贝到存储器,典型地是通过DMA(直接存储器存取方式)传送。
物理上,网络是一个按照地理远近组成的层次系统:最低层是LAN(局域网),最流行的局域网技术是以太网。
以太网段包括一些电缆和集线器。每根电缆都有相同的最大位带宽,集线器不加分辩地将一个端口上收到的每个位复制到其他所有的端口上,因此每台主机都能看到每个位。
每个以太网适配器都有一个全球唯一的48位地址,存储在适配器的非易失性存储器上。
一台主机可以发送一段位:帧,到这个网段内其它任何主机。每个帧包括一些固定数量的头部位(标识此帧的源和目的地址及帧长)和数据位(有效载荷)。每个主机都能看到这个帧,但是只有目的主机能读取。
使用电缆和网桥,多个以太网段可以连接成较大的局域网,称为桥接以太网。这些电缆的带宽可以是不同的。 - 全球IP因特网
TCP/IP协议族
因特网的客户端和服务器混合使用套接字接口函数和UnixI/O函数进行通信
把因特网看做一个世界范围的主机集合,满足以下特性:
主机集合被映射为一组32位的IP地址
这组IP地址被映射为一组称为因特网域名的标识符
因特网主机上的进程能够通过连接和任何其他主机上的进程
套接字接口
套接字接口是一组用来结合unit I/O函数创建网络应用的函数。
- 4.1套接字地址结构
从unit内核的角度来看,套接字就是通信的端点;从unix程序的角度来看,套接字就是一个有相应描述符的打开文件。 - 4.2 函数
sockte函数:创建一个套接字描述符。
connect函数:建立和服务器的连接。
open_clientfd函数:将socket和connect函数包装而成。客户端可以用它来和服务器建立连接。
bind函数、listen函数、accept函数:均被服务器用于和客户端建立连接。
open_listenfd函数:socket、bind和listen函数结合。用于服务器创建一个监听描述符
进程:
- 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。
- 进程的定义:
- 进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。
- 主要特征:
- 动态性:进程的实质是程序在多道程序系统中的一次执行过程,进程是动态产生,动态消亡的。
- 并发性:任何进程都可以同其他进程一起并发执行
- 独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位;
- 异步性:由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进
- 结构特征:进程由程序、数据和进程控制块三部分组成。
- 多个不同的进程可以包含相同的程序:一个程序在不同的数据集里就构成不同的进程,能得到不同的结果;但是执行过程中,程序不能发生改变。
线程
- 定义:
线程是程序中一个单一的顺序控制流程。进程内一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单位指运行中的程序的调度单位。在单个程序中同时运行多个线程完成不同的工作,称为多线程。 - 两个基本类型:
- 用户级线程:管理过程全部由用户程序完成,操作系统内核心只对进程进行管理。
- 系统级线程(核心级线程):由操作系统内核进行管理。操作系统内核给应用程序提供相应的系统调用和应用程序接口API,以使用户程序可以创建、执行、撤消线程。
- 线程与进程的区别:
- 地址空间和其它资源(如打开文件):进程间相互独立,同一进程的各线程间共享。某进程内的线程在其它进程不可见。
- 通信:进程间通信IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助,以保证数据的一致性。
- 调度和切换:线程上下文切换比进程上下文切换要快得多。
- 在多线程OS中,进程不是一个可执行的实体。
- I/O多路复用
通过I/O多路复用技术,系统内核缓冲I/O数据,当某个I/O准备好后,系统通知应用程序该I/O可读或可写,这样应用程序可以马上完成相应的I/O操作,而不需要等待系统完成相应I/O操作,从而应用程序不必因等待I/O操作而阻塞。
与多进程和多线程技术相比,I/O多路复用技术的最大优势是系统开销小,系统不必创建进程/线程,也不必维护这些进程/线程,从而大大减小了系统的开销。 - I/O复用典型的应用:
- 当客户处理多个描述字时(一般是交互式输入和网络套接口),必须使用I/O复用。
- 当一个客户同时处理多个套接口时,而这种情况是可能的,但很少出现。
- 如果一个TCP服务器既要处理监听套接口,又要处理已连接套接口,一般也要用到I/O复用。
- 如果一个服务器即要处理TCP,又要处理UDP,一般要使用I/O复用。
- 如果一个服务器要处理多个服务或多个协议,一般要使用I/O复用。
二、线程同步互斥相关系统调用
- 初始化:
在Linux下, 线程的互斥量数据类型是pthread_mutex_t. 在使用前, 要对它进行初始化:
对于静态分配的互斥量, 可以把它设置为PTHREAD_MUTEX_INITIALIZER, 或者调用pthread_mutex_init。
对于动态分配的互斥量, 在申请内存(malloc)之后, 通过pthread_mutex_init进行初始化, 并且在释放内存(free)前需要调用pthread_mutex_destroy。
返回值:成功则返回0, 出错则返回错误编号。
说明:如果使用默认的属性初始化互斥量, 只需把attr设为NULL。 - 死锁:
死锁主要发生在有多个依赖锁存在时,会在一个线程试图以与另一个线程相反顺序锁住互斥量时发生。如何避免死锁是使用互斥量应该格外注意的东西。
总体来讲, 有几个基本原则:
对共享资源操作前一定要获得锁。
完成操作以后一定要释放锁。
尽量短时间地占用锁。
如果有多锁,如获得顺序是ABC连环扣,释放顺序也应该是ABC。
线程错误返回时应该释放它所获得的锁。
课上未完成提交
课下测试作业一
- 4.47
- 4.47X86汇编
- 4.47机器码
- 4.47y86汇编
- 4.48机器码
- 4.48X86汇编
- 4.48y86
- 4.49X86汇编
- 4.49机器码
- 4.49y86汇编
课下测试作业二:
在编译中要加 -lpthread参数。