服务器开发之线程结构

线程结构相当于服务器程序的灵魂,一个好的服务器程序必须线程结构清析且线程利用率高。下面主要以伪代码的形式列举一些常用的线程结构。

1 单业务处理线程结构

int main()
{
	Init();

	while (queue.GetMessage(timeout, message)) // 这里的队列要支持多个线程写,一个线程读
	{
		DispatchMessage(message);
		DetectTimer(); // 如果需要定时器的话
	}

	DeInit();

	return 0;
}

windows窗口程序及我见过的大部分网游服务器都使用这种线程结构。因为只有一个业务处理主线程,在进行业务处理的时候,不需要考虑线程同步。当然这种服务器并不只是只有一个线程在工作,通常网络和DB(如果有的话)会使用独立的线程,例如当网络收到一个消息后,就Enqueue到队列中,这时queue.GetMessage返回,由DispatchMessage找到对应的处理函数去做具体的处理。

2 多业务处理线程

int main()
{
	Init();

	for (1 to 10)
	{
		StartThread(&ThreadFunction);
	}

	WaitForExit();
	DeInit();

	return 0;
}

int ThreadFunction()
{
	while (queue.GetMessage(timeout, message)) // 队列要支持多写多读
	{
		DispatchMessage(message);
	}
	return 0;
}

网络线程收到消息后,Enqueue到队列,其中一个线程的GetMessage会返回并处理。DB模块通常使用这种线程结构。

3 并发单线程

class WorkThread
{
public:
	void Start();

private:
	void AsnycRead(int clientId);
	void AsnycWrite(int clientId, Message* message);

	void OnRead(int clientId, Message* message);
	void OnWriteComplite(int clientId);
};

int main()
{
	for (1 to 10)
	{
		new WorkThread();
	}

	WaitForExit();

	return 0;
}

我其实没找到一个好的名称和伪代码去描述这种线程结构,多加点文字说明吧。这种线程结构通常在程序启动时开启多个线程(通常是CPU核芯数),每个线程完整的加载其需要的配置,每个线程都是独立的且功能都是一样的,线程与线程之间没有仍何交互,用户代码中没有队列。一个连接建立好后,始终在同一个线程空间中运行,因此也没有任何线程同步。这种线程序结构非常适合网关类、转发类等慢操作比较少的服务器,能充分利用多核的CPU资源,提高服务效率。使用iocp及boost.asio很容易实现这种线程结构。

4 线程池

int main()
{
	Init();

	for (1 to 100)
	{
		ThreadPool.Add(new WorkThread());
	}

	WaitTask();

	WaitForExit();
	DeInit();

	return 0;
}

void WaitTask()
{
	WorkThread t = ThreadPool.GetFree();
	t.Wakeup(); // 唤醒子线程后立即返回,子线程等待客户端连接,连接成功后先Wakeup下一个线程去等待客户端连接, 由本线程执行任务
}

曾经比较火的Leader/Follower模式,据说tomcat用的就是这个,但个人觉得这种结构效率并不高,因为这种模式网络IO通常用同步,大大降低了线程的利用率。

结束语

以上只上对线程结构的简化描述,实际用到的服务器并不会只这么简单,可能是多种结构的组合,也可能是上面没提到的线程结构。但高并发高效率的服务器要点其实很简单:提高每个线程的利用率,尽量避免忙等、睡眠及过多的线程切换,同时减少加锁及各种队列的入列出列。业务处理方面可将业务细化,由单服务器处理转成多服务器处理,能并发的就并发……不过这超出了本文的范围,有机会再详述。

附感言

在08年之前,boost还不是那么流行,我通常会使用自己实现的线程相关的基础库,如Mutex, Condition, Thread, SharedPtr, MessageQueue——当然基本上也是从boost中抄过来的。时间飞奔,2016年的现在,C11也包含了以上大部分库,还剩MessageQueue实现起来也是分分钟的事……时代更美好了!

时间: 2024-10-05 04:58:59

服务器开发之线程结构的相关文章

游戏服务器开发需要学习的技术

一,游戏服务器编程语言的选择 所谓的游戏服务器编程语言其实有很多,基本上任何一种语言都可以作为游戏服务器的编程语言.这需要根据自己游戏的类型和要求加以选择.比如C++,Java ,Erlang,go等等.目前我用过的只有C++和Java.但是以Java为主.所以接下来就以自己的经验,谈谈以Java为核心的游戏服务器开发技术体系. Java目前作为游戏服务器开发语言已经很是普遍.但是大多数是作为页游或手游的服务器,而端游戏一般选择C++,因为端游对服务器的性能要求相对比较高一些.两种语言各有利弊.

NIO原理剖析与Netty初步----浅谈高性能服务器开发(一)

除特别注明外,本站所有文章均为原创,转载请注明地址 在博主不长的工作经历中,NIO用的并不多,由于使用原生的Java NIO编程的复杂性,大多数时候我们会选择Netty,mina等开源框架,但理解NIO的原理就不重要了吗?恰恰相反,理解NIO底层机制是理解这一切的基础,由此我总结一下当初学习NIO时的笔记,以便后续复习. 以下是我理解的Java原生NIO开发大致流程: 上图大致描述的是服务端的NIO操作. 第一步,绑定一个服务的端口 这与传统阻塞IO中的ServerSocket类似,没什么好说的

手游服务器开发技术详解

从事游戏服务器开发差不多两年时间,两年间参与了不少项目,学到了很多游戏服务器开发技术,参与过几个不同架构的服务器开发,就随便聊聊游戏服务器开发需要的技术.(以下所指游戏服务器更偏向于手游,因为我对端游和页游开发接触并不多) 一.聊聊服务器开发有哪些东西要考虑. 1.开发语言的选择: 工欲善其事,必先利其器,选择一门适合的开发语法对后期开发有着事半功倍的作用. 业界主要的是c/c++ + Python/lua模式做游戏服务器.c/c++做网络通讯数据传输,python/lua做业务逻辑.这样既保持

研究python服务器开发

研究python服务器开发http://www.example-code.com/python/ssh_exec.asp telnet 118.193.152.71 51234 import socket, threading HOST = '127.0.0.1' PORT = 51234 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind((HOST, PORT)) s.listen(4) clients = [] #lis

Python服务器开发一:python基础

Python服务器开发一:python基础 Python(蟒蛇)是一种动态解释型的编程语言.Python可以在Windows.UNIX.MAC等多种操作系统上使用,也可以在Java..NET开发平台上使用. [特点] 1 Python使用C语言开发,但是Python不再有C语言中的指针等复杂的数据类型. 2 Python具有很强的面向对象特性,而且简化了面向对象的实现.它消除了保护类型.抽象类.接口等面向对象的元素. 3 Python代码块使用空格或制表符缩进的方式分隔代码. 4 Python仅

Python服务器开发二:Python网络基础

Python服务器开发二:Python网络基础 网络由下往上分为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. HTTP是高层协议,而TCP/IP是个协议集,包过许多的子协议.包括:传输层的 FTP,UDP,TCP协议等,网络层的ip协议等,高层协议如HTTP,telnet协议等,HTTP是TCP/IP的一个子协议. socket是对TCP/IP协议的封装和应用(程序员层面上).也可以说,TPC/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如

Python服务器开发三:Socket

Python服务器开发三:Socket socket是操作系统中I/O的延续,它可以使进程和机器之间的通信成为可能.socket可以看成一个标准的文件描述符.不同的是文件需要用open()函数打开,而socket用socket() 函数建立.recv().send()函数和read().write()函数极为相似. TCP一般通过accept()来为每个连接的客户端建立一个新的scoket.UDP一般只是使用一个单一的socket,完全依靠recvfrom()返回的值来判断该往哪里发送响应. 客

linux服务器开发浅谈

[开发前准备] 在进行linux服务器开发之前,必须很清楚地了解所开发的对象需要考虑的相关问题比如:功能架构:提供服务的模块体系结构稳定性:服务器的出core率,内存泄露情况性能:请求与返回的速度与正确性负载能力:能同时访问的最大数量和频度 根据不同服务器对象的环境和应用,服务器开发的对应手段相差甚远.比如就客户端连接时间较短却又比较频繁的服务器(例如HTTP服务器)而言,在可选的服务器结构中,预先派生进/线程的结构就要比并发式结构高效 总之,在开发服务器之前,必须进行完整的服务器开发需求分析,

分享一个嵌入式httpd服务器开发库 - boahttpd library

http://sourceforge.net/projects/boahttpd/ 一个C接口的开发库,适用于 windows/linux/或其他嵌入式平台,支持CGI扩展,支持多线程.采用面向对象开发,一个应用里可以同时开多个http server,只要端口不同就互不影响. 目前只写了英文帮助,大家凑合看吧. boahttpd Library Development Manual Last Modified: 2014-07-08 1.     Introduction The library