标签:
第11章 网络编程
网络应用依赖于很多在系统研究中已经学习过的概念,例如,进程、信号、字节器映射以及动态存储分配,都扮演着重要的角色。还有一些新概念要掌握。我们需要理解基本的客户端-服务器编程模型,以及如何编写使用因特网提供的服务的客户端―服务器程序。最后,我们将把所有这些概念结合起来,开发一个小的但功能齐全的Web的服务器,能够为真实的Web,浏览器提供静态和动态的文本和图形内容。
11.1 客户端-服务器编程模型
每个人网络应用都是基于客户端-服务器模型的。才有陪你过这个模型,一个应用是由一个服务器进程和一个或者多个客户端进程组成。
服务器管理某种资源,并且通过操作这种资源来为它的客户端提供某种服务。
客户端-服务器模型中的基础操作是事务。一个客户端-服务器事务由四步组成:
1)当一个客户端需要服务时,它向服务器发送一个请求,发起一个事务。
2)服务器收到请求后,解释它,并以适当的方式操作它的资源。
3)服务器给客户端发送一个响应,并等待下一个请求。
4)客户端收到响应并处理它。
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函数结合起来,用以创建网络
第十二章 并发编程
一、基于进程的并发编程
构造并发进程最简单的方法是用进程,使用像fork,exec和waitpid等函数。
例:一个构造并发服务器的自然方法就是在父进程中接受客户端连接请求,然后创建一个新的子进程来为每个新客户端提供服务。
1、 通常服务器运行很长的时间,所以我们必须要包括一个SIGCHLD处理程序,来回收僵死子进程的资源。
2、 其次父进程必须关闭他们各自的connfd拷贝。
3、 最后,因为套接字的文件表选项中的引用计数,直到父子进程的connfd都关闭了,到客户端的连接才会终止。
二、基于I/O多路复用的并发进程
基本的思路就是使用select函数,要求内核挂起进程,只有在一个或多个I/O事件发生后,才将控制返回给应用程序。
Select函数处理类型为fd_set的集合,也叫做描述符集合。逻辑上,我们将描述符集合看成一个大小为n的位向量
I/O多路复用可以用作并发事件驱动程序的基础,在事件驱动程序中,流是因为某种事件而前进的。一般概念是将逻辑流模型转换为状态机。
状态机:就是一组状态、输入事件和转移。
三、基于线程的并发编程
线程就是运行在进程上下文中的逻辑流。
多线程的执行模型在某些方面和多进程的执行模型是相似的。
每个进程开始生命周期时都是单一线程,这个线程为主线程。在某一时刻,主线程创建一个对等线程,从这个时间点开始,两个线程就并发地与运行。
Posix线程是在C程序中处理线程的一个标准接口。
终止进程:
1、 当顶层的线程例程返回时,线程会隐式地终止
2、 通过调用pthread_exit函数,线程会显示地终止。
3、 某个对等线程调用Unix的exit函数,该函数终止进程以及所有与该进程相关的线程
4、 另一个对等线程通过以当前线程ID作为参数调用pthread_cancle函数来终止当前线程
四、多线程程序中的共享变量
一组并发线程运行在一个进程的上下文中。每个线程都有它自己独立的线程上下文,包括线程ID、栈、栈指针、程序计数器、条件码和通用目的寄存器值。每个进程和其他进程一起分享线程上下文的剩余部分。
将变量映射到存储器:
线程化的C程序中变量根据它们的存储类型被映射到虚拟存储器:全局变量、本地自动变量和本地静态变量。
----------------------------------------------------------------------------------
参考资料:
深入理解计算机系统
标签:
原文地址:http://www.cnblogs.com/wsq20135205/p/5027762.html