第11章 网络编程编程
网络应用依赖于不少在系统研究中已经学习过的概念,例如,进程、信号、字节器映射以及动态存储分配,都扮演着重要的角色。还有一些新概念要掌握。咱们须要理解基本的客户端-服务器编程模型,以及如何编写使用因特网提供的服务的客户端―服务器程序。最后,咱们将把全部这些概念结合起来,开发一个小的但功能齐全的Web的服务器,可以为真实的Web,浏览器提供静态和动态的文本和图形内容。浏览器
11.1 客户端-服务器编程模型服务器
每一个人网络应用都是基于客户端-服务器模型的。才有陪你过这个模型,一个应用是由一个服务器进程和一个或者多个客户端进程组成。网络
服务器管理某种资源,而且经过操做这种资源来为它的客户端提供某种服务。多线程
客户端-服务器模型中的基础操做是事务。一个客户端-服务器事务由四步组成:并发
1)当一个客户端须要服务时,它向服务器发送一个请求,发起一个事务。函数
2)服务器收到请求后,解释它,并以适当的方式操做它的资源。学习
3)服务器给客户端发送一个响应,并等待下一个请求。编码
4)客户端收到响应并处理它。spa
11.2 网络
客户端和服务器一般运行在不一样的主机上,而且经过计算机网络的硬件和软件资源来通讯。
对于一个主机而言,网络只是又一种I/O设备,做为数据源和数据接收方。
一个以太网段,包括电缆和集线器;每根电缆都有相同的最大位带宽;集线器不加分辩地将一个端口上收到的每一个位复制到其余全部的端口上。所以,每台主机都能看到每一个位。
每一个以太网适配器都有—个全球惟一的48位地址,它存储在这个适配器的非易失性存储器上。每一个主机适配器都能看到这个帧,可是只有目的主机实际读取它。
桥接以太网 由 电缆和网桥 将多个以太网段链接起来,造成的较大的局域网。链接网桥的电缆传输速率能够不一样(例:网桥与网桥之间1GB/S, 网桥与集线器之间100MB/S)。
网桥做用:链接不一样网段。同一网段内A向B传输数据时,帧到达网桥输入端口,网桥将其丢弃,不予转发。A向另外一网段内C传输数据时,网桥才将帧拷贝到与相应网段链接的端口上。从而节省了网段的带宽
在层次的更高级别中,多个不兼容的局域网能够经过叫作路由器的特殊计算机链接起来,组成一个internet。
每台路由器对于它所链接到的每一个网络都有一个适配器(端口)。
11.3 全球IP因特网
每台因特网主机都运行实现TCP/IP协议的软件,几乎每一个现代计算机系统都支持这个协议。因特网的客户端和服务器混合使用套接字函数典型地是做为会陷入内核的系统调用来实现的,并调用各类内核模式的TCP/IP函数。
一个IP地址就是一个32位无符号整数。
网络程序将IP地址存放在下图所示的IP地址结构中。
由于因特网主机能够有不一样的主机字节顺序,TCP/IP为任意整数数据项定义了统一的网络字节顺序(大端字节顺序)例如IP地址,它放在包头中跨过网络被携带。在IP地址结构中存放的地址老是以(大端法)网络字节顺序存放的,即便主机字节顺序是小端法。
因特网客户端和服务器互相通讯时使用的是IP地址。然而,对于人们而言,大整数是很难记住的,因此因特网也定义了一组更加人性化的域名,以及一种将域名映射到IP地址的机制。域名是一串用句点分隔的单词(字母、数字和破折号)。
域名集合造成了一个层次结构,每一个域名编码了它在这个层次中的位置。经过一个示例你将很容易理解这点。下展现了域名层次结构的一部分。层次结构能够表示为一棵树。树的节点表示城名,反向到根的路径造成了域名。子树称为子域。层次结构中的第一层是个未命名的根节点。下一层是一组一级域名由非赢利组织(因特网分酒名字数字协会)定义。常见的第一层域名包括com、edu、gov、org、net,这些域名是由ICANN的各个受权代理按照先到先服务的基础分配的的。一旦一个组织获得了一个二级域名,那么它就能够在这个子域中建立任何新的域名了。
11.4 套接字接口
套接字接口是一组函数,它们和Unix I/O函数结合起来,用以建立网络
第十二章 并发编程
1、基于进程的并发编程
构造并发进程最简单的方法是用进程,使用像fork,exec和waitpid等函数。
例:一个构造并发服务器的天然方法就是在父进程中接受客户端链接请求,而后建立一个新的子进程来为每一个新客户端提供服务。
一、 一般服务器运行很长的时间,因此咱们必需要包括一个SIGCHLD处理程序,来回收僵死子进程的资源。
二、 其次父进程必须关闭他们各自的connfd拷贝。
三、 最后,由于套接字的文件表选项中的引用计数,直到父子进程的connfd都关闭了,到客户端的链接才会终止。
2、基于I/O多路复用的并发进程
基本的思路就是使用select函数,要求内核挂起进程,只有在一个或多个I/O事件发生后,才将控制返回给应用程序。
Select函数处理类型为fd_set的集合,也叫作描述符集合。逻辑上,咱们将描述符集合当作一个大小为n的位向量
I/O多路复用能够用做并发事件驱动程序的基础,在事件驱动程序中,流是由于某种事件而前进的。通常概念是将逻辑流模型转换为状态机。
状态机:就是一组状态、输入事件和转移。
3、基于线程的并发编程
线程就是运行在进程上下文中的逻辑流。
多线程的执行模型在某些方面和多进程的执行模型是类似的。
每一个进程开始生命周期时都是单一线程,这个线程为主线程。在某一时刻,主线程建立一个对等线程,从这个时间点开始,两个线程就并发地与运行。
Posix线程是在C程序中处理线程的一个标准接口。
终止进程:
一、 当顶层的线程例程返回时,线程会隐式地终止
二、 经过调用pthread_exit函数,线程会显示地终止。
三、 某个对等线程调用Unix的exit函数,该函数终止进程以及全部与该进程相关的线程
四、 另外一个对等线程经过以当前线程ID做为参数调用pthread_cancle函数来终止当前线程
4、多线程程序中的共享变量
一组并发线程运行在一个进程的上下文中。每一个线程都有它本身独立的线程上下文,包括线程ID、栈、栈指针、程序计数器、条件码和通用目的寄存器值。每一个进程和其余进程一块儿分享线程上下文的剩余部分。
将变量映射到存储器:
线程化的C程序中变量根据它们的存储类型被映射到虚拟存储器:全局变量、本地自动变量和本地静态变量。
----------------------------------------------------------------------------------
参考资料:
深刻理解计算机系统