Go语言中的多核调度
浙江大学 14级软件工程 李自乐
近年来,随着工业技术的发展,服务器的CPU数量越来越多,动辄几十核心。为了发挥多核的优势,大多数程序都会采用多线程的方式来利用多核。另外,服务器编程一般都涉及较多的IO,包括网络或者外存,同步阻塞的IO对于大多数应用环境是一种很糟糕的方法:
Fd.Read();
这种语句一般在文件读准备完成之后会返回,但是文件的读取(这里的文件包括外存,或者是一个网络设备等)一般受制于硬件原因(硬盘旋转,网络传输),会比较慢。那么如果你的服务是下面这样一条线:
那么用户2必须等待用户1的IO读取结束。但是这段时间CPU完全是闲置的。为了利用起来这部分时间,往往会采用开多线程的方法,让这个阻塞的线程继续等待IO,而其他线程又可以使用CPU。操作系统会调度多个线程在多个核心,但是这种调度也是有一些问题的,比如成千上万个线程都要使用CPU,而真实的CPU数量远没有这么多,这样操作系统就不得不在很多个线程之间切换。虽然成千上万的并发任务是无论如何也不可能不需要切换就能完美使用多个CPU了,但是