我们知道,对于Tor的服务器来说,有的时候因为其访问量巨大,不得不采取一些相应机制来保证服务的正常提供。在服务器编程里,我们经常可以用到的技术,例如线程池,多路复用等。Tor程序,在大多数情况下,都是单进程运行的,几乎没有哪里用到多线程的操作。正因为如此,Tor的主进程才绝对不允许出现阻塞式的操作。但是,唯独在一处,Tor为了提高自身效率,利用了线程池类似的机制。这个部分就是Cpuworker。本文就主要介绍该模块的作用和实现机制。
简单的说,Cpuworker存在的目的,是为了利用线程池的机制分担Tor主进程的压力,帮助其在接收到CREATE请求时计算对称密钥。下面进行具体的过程描述:
1. 系统启动时根据主机CPU数量,初始化cpuworker线程池;(linux中线程和进程基本无差别)
cpuworkers_rotate()
1.1 根据配置文件配置选项,自适应地检测CPU数量或固定设置CPU数量;
spawn_enough_cpuworkers()
1.2 根据CPU数量,开启cpuworker线程;(最大数目为16,最小数目为1)
spawn_cpuworker()
1.3 开启线程之前,创建sockpair,创建cpuworker连接,关联cpuworker连接与sockpair[0];
1.4 开启线程之时,设置线程执行函数cpuworker_main,关联线程与sockpair[1];