客户端 - 服务器架构:多进程与多线程策略解析
1. 预派生服务器与多线程概述
在服务器处理多个客户端连接时,预派生(Preforking)服务器是一种常见的策略。在预派生服务器中,进程按照调用 accept() 的顺序被使用。当客户端数量多于进程池中的进程数量时,空闲的早期进程会被重新用于处理新的客户端连接。
近年来,多线程(Multithreading)成为处理多个客户端的首选方法。线程是轻量级的进程,它们共享父进程的主内存空间。与多进程应用相比,多线程应用使用的资源更少,上下文切换时间更快。然而,多线程应用的稳定性不如多进程应用。由于共享内存,如果一个线程中发生缓冲区溢出等问题,可能会影响其他线程,甚至导致整个服务器程序崩溃。而在多进程应用中,操作系统会保护每个进程的内存不被其他进程修改,从而避免一个错误的进程破坏其他进程的内存。
2. 多线程服务器中的共享内存
在多线程服务器应用中,共享内存是一把双刃剑。所有线程都会共享全局变量,因此为了保存特定客户端的信息,必须利用线程库提供的线程本地存储机制,创建不在线程之间共享的“线程全局”值。
如果确实有需要在线程之间共享的全局变量,使用互斥锁(Mutexes)等同步对象来控制对它们的访问非常重要。没有同步对象,可能会出现奇怪的行为甚至程序崩溃,通常是因为一个线程在写入变量时,另一个线程正在读取或写入同一个变量,这可能导致内存损坏。多线程应用本身就很难调试,因此要对所有全局变量和结构的访问进行同步。
大多数 Linux 发行版中使用的 POSIX 线程版本是由 Xavier Leroy 开发的,他的网站
超级会员免费看
订阅专栏 解锁全文

被折叠的 条评论
为什么被折叠?



