由于linux是使用进程来模拟线程,系统开销比较大,不太经济划算。所以在网络连接中,需要用一个结构来储存,其中需要包含一个向客户端写消息的缓冲,还需要一个从客户端读消息的缓冲,具体的大小根据具体的消息结构来定了。另外对于同步,需要一些时间校对的值,还需要一些各种不同的值来记录当前状态,下面给出一个初步的连接的结构: typedef connection_s { user_t *ob; /* 指向处理服务器端逻辑的结构 */ int fd; /* socket连接 */ struct sockaddr_in addr; /* 连接的地址信息 */ char text[MAX_TEXT]; /* 接收的消息缓冲 */ int text_end; /* 接收消息缓冲的尾指针 */ int text_start; /* 接收消息缓冲的头指针 */ int last_time; /* 上一条消息是什么时候接收到的 */ struct timeval latency; /* 客户端本地时间和服务器本地时间的差值 */ struct timeval last_confirm_time; /* 上一次验证的时间 */ short is_confirmed; /* 该连接是否通过验证过 */ int ping_num; /* 该客户端到服务器端的ping值 */ int ping_ticker; /* 多少个IO周期处理更新一次ping值 */ int message_length; /* 发送缓冲消息长度 */ char message_buf[MAX_TEXT]; /* 发送缓冲区 */ int iflags; /* 该连接的状态 */ } connection; 而Win32P平台就可以开合适的线程来分别满足通讯任务、系统认证和网络日常检测任务如Ping和心跳包机制的方便实现,又可以在一个进程中方便高效地进行数据传输和协调,工作效率明显高于单进程与单进程之间的机制。 对于像实现棋牌类的通讯量相对小的网络游戏还可以忍受,对于通讯较频繁的MMORPG来说,诸多微小因数的高效率的长时间积累,最终会对服务器端产生明显的影响。 另外在Linux下,线程也称作“轻量级进程”,同时有两种实现方式:核心线程、用户态线程。 2.2/2.4版本下的线程性能不是很高,对POSIX标准支持的也不是很好。 在2.6版本的内核下,有自己的线程库: (转) 在INRIA(位于法国巴黎)的Xavier Leroy,以及Pavel Krauz,Richard Henderson 和另外一些人,已经开发出了LINUX下的一种线程库,该线程库实现了一个叫“一对 一 ”模型(One-to-One), 它可以利用多处理器。该库基于LINUX的一个新的系统 调用--clone()(也就是说它只能用在LINUX上了)。该调用实现于LINUX2.0或以 上版本,并可以运行于Intel,Alpha SPARC?*68k以及MIPS等处理器的机器上。其 一个缺点在于它对信号的非标准处理上。 LinuxThreads采用称为1-1模型:每个线程实际上在核心是一个个单独的进程,核心 的调度程序负责线程的调度,就象调度普通进程。线程是用系统调用clone()创建的 ,clone()系统调用是fork()的推广形式,它允许新进程共享父进程的存储空间、文 件描述符和信号处理程序。 “一对一”模型的优点在于: A 最小限度消耗的CPU级多处理技术(每个CPU一个线程); B 最小限度消耗的I/O操作; C 一种简单和强壮的实现(核心调度程序为我们做了大部分艰难的工作)。 该模型主要的缺点在于在互斥和条件操作时的环境切换的系统消耗更大,而该切换 是通过内核来进行的。但是由于LINUX内核对环境切换的处理相当有效,因此在一定 程度上弥补了这个缺点。 除了“一对一”模型之外还有两种基本模型。 “多对一”模型基于用户级的调度,线程切换完全由用户程序完成;从核心角度看, 只有一个进程正在运行。这种模型不是我们所关心的,因为它无法利用多处理器的 优点,而且要用不合理的方法处理I/O操作阻塞。目前LINUX上存在有数个用户态的 线程库,但我发现它们在功能、性能以及强壮性上都存在缺陷。 “多对多”模型结合了核心态和用户态的调度:数个核心态线程并发的执行,每个 都作为一个用户态线程的调度者对用户态线程进行调度。大多数商业版本的UNIX( SOLARIS,DIGITAL UNIX和IRIX)都采用此模型实现POSIX线程标准。该模型结合了 “多对一”和“一对一”模型的优点,而且由于它能够避免另外两种模型缺陷,尤 其是当内核在处理环境切换时效率较低时,比如DIGITAL UNIX,因而相当具有吸引 力。但不幸的是,这种模型的实现相当复杂,而且需要LINUX内核所不能提供的内核 功能。Linus Torvalds和其它Linux内核开发者一直以来都在全面简单化的原则下推 动“一对一”模型,并且他们大大的提高了Linux内核线程切换的效率。Linux线程遵 从了他们一直以来的原则。
|