[TOC]
第一章 引言和网络编程基础知识
1.1 分别简述OSI参考模型和TCP/IP模型,并阐述他们之间的对应关系
1.2 简述数据传输的三种方式及其优缺点
优点 | 缺点 | |
---|---|---|
电路交换 | 双方可以随时通信,实时性强. 双方通信时按发送顺序传送数据,不存在失序问题. | 电路交换的平均连接建立时间较长. 信道利用低. |
报文交换 | 不需要为通信双方预先建立一条专用的通信线路。 通信双方不是固定占有一条通信线路,提高了通信线路的利用率. | 经历存储、转发这一过程,从而引起转发时延. 要求网络中每个结点有较大的缓冲区 |
分组交换 | 加速了数据在网络中的传输 简化了存储管理 减少了出错机率和重发数据量 | 每个分组都要加上源、目的地址和分组编号等信息,使传送的信息量大 可能出现失序、丢失或重复分组 |
1.3 简述C/S,B/S模型并分析他们的优缺点
C/S架构
C/S 架构是一种典型的两层架构,其全称是Client/Server,即客户端、服务器端架构,其客户端包含一个或多个在用户的电脑上运行的程序,而服务器端有两种,一种是数据库服务器端,客户端通过数据库连接访问服务器端的数据;另一种是Socket服务器端,服务器端的程序通过Socket与客户端的程序通信。
C/S 架构也可以看做是胖客户端架构。因为客户端需要实现绝大多数的业务逻辑和界面展示。
C/S优点和缺点
优点:
- C/S架构的界面和操作可以很丰富。
- 安全性能可以很容易保证,实现多层认证也不难。
- 由于只有一层交互,因此响应速度较快。
缺点:
- 用户群固定。由于程序需要安装才可使用,因此不适合面向一些不可知的用户。
- 维护成本高,发生一次升级,则所有客户端的程序都需要改变。
B/S架构
B/S架构的全称为Browser/Server,即浏览器/服务器结构。主要事务逻辑在服务器端实现,B/S架构的系统无须特别安装,只有Web浏览器即可。因此也被成为瘦客户端。
必须强调的是C/S和B/S并没有本质的区别:B/S是基于特定通信协议(HTTP)的C/S架构,也就是说B/S包含在C/S中,是特殊的C/S架构。
B/S优点和缺点
优点:
- 客户端无需安装,有Web浏览器即可。
- B/S架构可以直接放在广域网上,通过一定的权限控制实现多客户访问的目的,交互性较强。
- B/S架构无需升级多个客户端,升级服务器即可。
缺点:
- 在跨浏览器上,B/S架构不尽如人意。
- 表现要达到C/S程序的程度需要花费不少精力。
- 在速度和安全性上需要花费巨大的设计成本,这是B/S架构的最大问题。
- 客户端服务器端的交互是请求-响应模式,通常需要刷新页面,这并不是客户乐意看到的。
1.4 应用程序在什么情况下建议使用UDP
UDP: 无连接交互
- 没有可靠保证
- 依赖下层系统保证
- 程序中应该有相应保障措施
TCP: 面向连接的交互
- 提供传输可靠性
- 程序要求简单
应用程序只在以下情况使用UDP:
- 应用程序指明必须使用UDP;
- 应用程序协议要依靠硬件进行广播或组播
- 应用协议在可靠的环境中运行,不需要额外的可靠性处理。
1.5 请阐述无状态服务器和有状态服务器概念及其特点,并介绍其优缺点。
服务器所维护的与客户交互的信息成为状态信息。不保存任何状态信息的服务器成为无状态服务器,反之成为有状态服务器。
有状态服务器
有状态服务器在服务器中保存少量信息,可减少客户端与服务器端交换报文的大小,保存了客户之前有过的请求,允许服务器快速的相应请求。
特点
- 保存客户请求的数据(状态)
- 服务端容易对客户状态进行管理
- 服务端并不要求每次客户请求都携带额外的状态数据
优点
- 由于服务器可以区分各个客户,并保留每个客户以前的请求信息,报文中不必包含所有字段信息。
缺点
- 通常情况下报文丢失、重复或交付失序,或者客户端程序崩溃都会使服务器的状态信息不正确,此时就可能产生不正确的响应。
无状态服务器
无状态服务器的动机是协议的不可靠性。客户请求报文必须指定操作类型、文件名、传输数据在文件中的位置和传输字节数、要写入的文件数据等。
特点:
- 并不保存客户请求的数据(状态)
- 客户在请求时需要携带额外的状态数据
- 无状态服务器更加健壮,重启服务器不会丢失状态信息,这使得维护和扩容更加简单
优点
无状态服务器则不会因为报文丢失,失序等问题导致状态信息出错,出现问题。
缺点
每次都要携带额外的状态信息,产生额外的数据。
第二章 客户服务器软件中的并发处理
2.1 并发、并行的概念及其区别
并发:
当有多个线程在操作时,如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,它只能把CPU运行时间划分成若干个时间段,再将时间
段分配给各个线程执行,在一个时间段的线程代码运行时,其它线程处于挂起状。这种方式我们称之为并发(Concurrent)。
并行:
当系统有一个以上CPU时,
当一个CPU执行一个线程时,另一个CPU可以执行另一个线程,两个线程互不抢占CPU资源,可以同时进行,这种方式我们称之为并行(Parallel)。
区别:
并行是指两个或者多个事件在同一时刻发生;
并发是指两个或多个事件在同一时间间隔内发生。是指在一段时间内宏观上有多个程序在同时运行,在单处理机系统中,每一时刻却仅能有一道程序执行,故微观上这些程序只能是分时地交替执行。
2.2 进程、线程的概念及其联系和区别
进程的概念
进程是表示资源分配的基本单位。它是一个执行某一个特定程序的实体,它拥有独立的地址空间、执行堆栈、文件描述符等。
线程的概念
有时被称为轻量级进程,线程是进程中执行运算的最小单位,亦即执行处理机调度的基本单位。
进程和线程的联系
一个进程至少拥有一个线程——主线程,也可以拥有多个线程;一个线程必须有一个父进程。
多个进程可以并发执行;一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行。
进程与线程的区别:
调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位
并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行
拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源.
系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。
2.3 阻塞、非阻塞、同步和异步的概念
同步/异步调用:
同步:
所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。也就是必须一件一件事做,等前一件做完了才能做下一件事。
异步:
异步的概念和同步相对。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。
阻塞/非阻塞:
阻塞:
是指调用结果返回之前,当前线程会被挂起(线程进入非可执行状态,在这个状态下,cpu不会给线程分配时间片,即线程暂停运行)。函数只有在得到结果之后才会返回。
阻塞调用和同步调用实际上是不同的。对于同步调用来说,很多时候当前线程还是激活的,只是从逻辑上当前函数没有返回而已。
非阻塞:
非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。
2.4 介绍linux fork实现的原理
fork相当于复制了一个进程的执行版本。以当前进程作为父进程创建出一个新的子进程,并且将父进程的所有资源拷贝给子进程,这样子进程作为父进程的一个副本存在。父子进程几乎时完全相同的,但也有不同的如父子进程pid不同。
fork后,父子进程具有相同的数据空间、代码空间、堆栈、所有的文件描述字;但相互之间互不影响。
fork函数有三个返回值
- 该进程为父进程时,返回子进程的pid
- 该进程为子进程时,返回0
- fork执行失败,返回-1
那么fork函数为什么是一次调用,却返回了两次呢?
当程序执行到下面的语句: pid=fork();
由于在复制时复制了父进程的堆栈段,所以两个进程都停留在fork函数中,等待返回。因此fork函数会返回两次,一次是在父进程中返回,另一次是在子进程中返回,这两次的返回值是不一样的。
2.5 exec函数的使用
系统调用execl执行另一个程序。调用execl并不创建新进程,所以前后的进程ID并未改变,execl只是用另一个新程序替换了当前进程的正文、数据、堆栈;
#include <unistd.h>
int execl(const char *path, const char *arg, ...);
path 是要执行的二进制文件或脚本的完整路径。
arg是要传给程序的完整参数列表,包括arg[0],一般是执行程序的名字。
最后一个参数可为NULL
exec函数一共有六个,其中execve为内核级系统调用,其他(execl,execle,execlp,execv,execvp)都是调用execve的库函数。fork是分身术,exec变身术。
2.6 Linux 下五种I/O模型
-
阻塞I/O
进程会一直阻塞,直到数据拷贝完成
-
非阻塞I/O
非阻塞IO通过进程反复调用IO函数(多次系统调用,并马上返回);在数据拷贝的过程中,进程是阻塞的;
-
I/O复用(select 和poll)
可以同时对多个读操作,多个写操作的I/O函数进行检测,直到有数据可读或可写时,才真正调用I/O操作函数。
-
信号驱动I/O<