春节假期开始,今天是第一天,开始打扫房子了,顺便写一写。
搞后台开发,不仅需要关注服务的功能,还需要关注服务的性能。在本文中,我们简要地来看看多进程、多线程、多协程对单核、多核CPU的消耗。
对单核CPU的消耗
C语言死循环程序如下:
int main()
{
while(1);
return 0;
}
开启单进程,大约消耗100%的CPU核:
开启2个进程,总共大约消耗100%的CPU核:
C语言多线程程序如下:
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
void* threadFunc(void* p)
{
while (1);
return NULL;
}
int main ()
{
printf("main thread id is %u\n", pthread_self());
pthread_t id;
pthread_create (&id, NULL, threadFunc, NULL);
while (1);
return 0;
}
2个线程总共大约消耗100%的CPU核:
Go语言多协程程序如下:
package main
func f() {
for {}
}
func main (){
go f()
for {}
}
2个协程总共大约消耗100%的CPU核:
可见,在单核CPU情况下,无论怎么开启进程、线程和协程,最多消耗100%的CPU核。
对多核(32核)CPU的消耗
C语言死循环程序如下:
int main()
{
while(1);
return 0;
}
开启单进程,大约消耗100%的CPU核,即1个核:
开启2个进程,总共大约消耗200%的CPU核,即2个CPU核:
C语言多线程程序如下:
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
void* threadFunc(void* p)
{
while (1);
return NULL;
}
int main ()
{
printf("main thread id is %u\n", pthread_self());
pthread_t id;
pthread_create (&id, NULL, threadFunc, NULL);
while (1);
return 0;
}
2个线程总共大约消耗200%的CPU核,即2个CPU核:
Go语言多协程程序如下:
package main
func f() {
for {}
}
func main (){
go f()
for {}
}
2个协程总共大约消耗200%的CPU核,即2个CPU核:
可见,在多核情况下,采用多进程、多线程、多协程,能更好地利用CPU, 它们不仅能并发执行,而且能并行执行。
另外,值得一提的是,即使在单核情况下,多进程、多线程、多协程也是能更好利用CPU的。想一想,为什么?这是很基本的问题。
通过本文的验证,我们能更好地理解多进程、多线程、多协程对单核、多核CPU的消耗,顺便理解并发和并行的含义与区别。在开发后台服务时,也能更好地理解服务的性能和瓶颈,做出更好的服务。
长按或扫描二维码 可关注涛哥公众号