标签:creat tps 放弃 方式 linu 利用 技术 方法 用户线程
现代操作系统中,实现线程库有两种方法:在用户空间中和在内核空间中。
整个线程包的实现都在用户空间的话,就意味着操作系统内核对它一无所知,只知道他是一个普通的需要调度的进程。协程就是一种用户线程的实现,可以满足在一个内核线程上并发执行多个任务,coroutine和goroutine都是其典型实现。
用户线程的优点很明显:
还得自己实现调度
不需要自己写调度
#include <pthread.h>
void* thread_func(void* ptr)
{
while(1);
}
int main()
{
pthread_t threads[MAX_THREAD_NUM];
for(int i = 0; i< MAX_THREAD_NUM; i++)
{
pthread_create(&threads[i], NULL, thread_func, NULL);
}
for(int i = 0; i< MAX_THREAD_NUM; i++)
{
pthread_join(threads[i], NULL);
}
return 0;
}
测试用机是6C6T,所以操作系统可见的核心数是6(有超线程的CPU的可见核心数是12),将MAX_THREAD_NUM设置为6时,top命令结果如下:
第二行CPU的us(CPU的用户时间占比)和sy(CPU的内核时间占比)之和加起来几乎等于100,说明CPU现在几乎满载,进程的%CPU也几乎达到600%,说明6核心基本都吃满了。
将MAX_THREAD_NUM设置为5时,top命令结果如下:
可以看到CPU大致占用了5/6。结合我们这里只开启了一个进程,所以pthread库的线程不可能是用户线程,只可能是内核线程。
因为Linux的调度单位是线程而不是进程,所以一个进程才能够做到同时在6个核心上运行。实际上,Linux将一个多线程的进程中的每个线程都当做单线程进程来调度,此结论参考:
Stackoverflow
标签:creat tps 放弃 方式 linu 利用 技术 方法 用户线程
原文地址:https://www.cnblogs.com/jo3yzhu/p/12368529.html