多线程服务器端实现
在《基于Linux的多进程服务器 》中介绍了Linux下多进程服务端实现的原理,在文章《Linux下epoll》中,介绍了epoll的实现原理。多进程服务端与基于select或者epoll实现的服务端相比具有一定的优势,但是也有一定的问题:创建(复制)进程会给操作系统带来沉重的负担,且每个进程具有独立的内存空间,进程间通讯的复杂度也会随之上升。可以总结为:
- 创建进程的过程会带来一定的开销
- 需要特殊的ICP技术,实现进程间数据交换
上述所说的操作系统开销主要是上下文切换(Context Switching),这是创建进程过程中主要的开销。
上下文切换(Context Switching):
- 即使是单核的CPU,也可以运行多进程程序,这是因为操作系统将CPU时间分成多个微小的块以后,分配给了多个进程,为了实现“同时运行”多个进程,CPU就需要在每个进程分配的时间运行结束后,及时切换到其他的进程继续运行,运行进程的时候需要将相应的进程信息读入内存,如果运行完进程A后需要运行进程B,则操作系统需要将进程A相关的信息移出内存放到硬盘,并读入进程B相关的信息,这就是上下文切换。因为需要将内存数据移出放到硬盘,因此此过程需要较长时间,即使通过优化,也会存在一定的局限性。基于时间片轮转的任务调度,是非实时操作系统的特点,与此相对应的有实时操作系统,其特点任务的调度基于任务优先级,优先级高的任务可以抢占优先级低的任务的CPU资源
为了保证多进程的优点,且克服其缺点,引入了线程(Thread)的概念,这是为了将进程的劣势降到最低限度而设计的一种轻量级进程(再Linux下称为LWP Light-weight process),具备如下的优点:
- 与进程相比,线程的创建合上下文切换速度更快
- 线程间数据交换无需特殊技术