关键词搜索

源码搜索 ×
×

进程、线程、协程对CPU的消耗

发布2021-08-14浏览3636次

详情内容

大家好,我是涛哥,又是周末,祝愿大家开心。 

今天,不分享复杂高深的东西了,仅来聊聊进程、线程、协程对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的消耗,顺便理解并发和并行的含义与区别。

相关技术文章

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载