{"id":918,"date":"2020-11-04T20:25:31","date_gmt":"2020-11-04T12:25:31","guid":{"rendered":"http:\/\/www.wangkaixuan.tech\/?p=918"},"modified":"2020-11-05T08:30:57","modified_gmt":"2020-11-05T00:30:57","slug":"%e5%87%a0%e7%a7%8d%e5%94%a4%e9%86%92%e6%96%b9%e5%bc%8f%e7%9a%84%e6%97%b6%e5%bb%b6","status":"publish","type":"post","link":"http:\/\/www.wangkaixuan.tech\/?p=918","title":{"rendered":"\u51e0\u79cd\u5524\u9192\u65b9\u5f0f\u7684\u65f6\u5ef6"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">1.\u80cc\u666f<\/h2>\n\n\n\n<p>\u5728\u591a\u6838\u4e16\u754c\u91cc\u5f00\u53d1\u590d\u6742\u7cfb\u7edf\uff0c\u4e0d\u53ef\u907f\u514d\u5730\u8981\u6d89\u53ca\u591a\u8fdb\u7a0b(\u7ebf\u7a0b)\u534f\u4f5c\u7684\u573a\u666f\u3002\u6700\u5e38\u89c1\u7684\u534f\u4f5c\u6a21\u5f0f\u662f\u751f\u4ea7\u8005-\u6d88\u8d39\u8005\u6a21\u5f0f\u3002\u751f\u4ea7\u8005\u4ea7\u751f\u6d88\u606f\u7684\u65f6\u5019\uff0c\u5982\u4f55\u5feb\u901f\u5730\u5524\u9192\u6d88\u8d39\u8005\u53bb\u5904\u7406\uff0c\u662f\u4e00\u4e2a\u57fa\u672c\u95ee\u9898\u3002\u5524\u9192\u5f97\u8d8a\u5feb\uff0c\u8d8a\u6709\u5229\u4e8e\u6211\u4eec\u5c06\u7cfb\u7edf\u5185\u90e8\u65f6\u5ef6\u964d\u5230\u6700\u4f4e\u3002<\/p>\n\n\n\n<p>Linux\u63d0\u4f9b\u4e86\u4f17\u591a\u7684\u63a5\u53e3\u4f9b\u6211\u4eec\u5b9e\u73b0\u8fd9\u4e00\u529f\u80fd\uff0c\u8fd9\u91cc\u6211\u4eec\u9009\u53d6\u51e0\u4e2a\u5e38\u7528\u7684\u8fdb\u884c\u5206\u6790\u548c\u6d4b\u91cf\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2.\u5206\u6790<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">a) pthread_cond_wait\/signal<\/h3>\n\n\n\n<p>\u8fd9\u4e2a\u57fa\u672c\u4e0a\u662f\u6700\u5e38\u7528\u7684\u63a5\u53e3\u4e86\uff0c\u8bfb\u8005\u8c03\u7528wait\u7b49\u5f85\u88ab\u5524\u9192\uff0c\u5199\u8005\u8c03\u7528signal\u5524\u9192\u8bfb\u8005\u3002<\/p>\n\n\n\n<p>\u8be5\u63a5\u53e3\u8981\u70b9\u5982\u4e0b\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>\u5982\u679c\u5199\u8005signal\u7684\u65f6\u5019\uff0c\u8bfb\u8005\u5e76\u6ca1\u6709\u5728wait\uff0c\u90a3\u4e48\u8fd9\u6b21signal\u5c31\u4e22\u4e86<\/li><li>wait\u63a5\u53e3\u8fd8\u6709\u4e2atimeout\u7248\u672c\uff0c\u53ef\u4ee5\u6307\u5b9a\u8d85\u65f6\u65f6\u95f4\uff0c\u4ee5\u907f\u514d\u957f\u65f6\u95f4\u5904\u4e8ewait\u72b6\u6001<\/li><li>signal\u6709\u4e2abroadcast\u7248\u672c\uff0c\u53ef\u4ee5\u6279\u91cf\u5524\u9192\u4e00\u6279\u8fdb\u7a0b\/\u7ebf\u7a0b<\/li><li>\u8fd9\u4e2a\u63a5\u53e3\u8981\u914d\u5408mutex\u4f7f\u7528\uff0c\u7565\u663e\u5570\u55e6<\/li><\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">b) semaphore<\/h3>\n\n\n\n<p>\u4fe1\u53f7\u91cf\u57fa\u672c\u4e0a\u662f\u8fd9\u91cc\u9762\u5386\u53f2\u6700\u60a0\u4e45\u7684\u4e00\u4e2a\u4e86\uff0c\u8bfb\u8005\u8c03\u7528wait\u7b49\u5f85\u88ab\u5524\u9192\uff0c\u5199\u8005\u8c03\u7528post\u5524\u9192\u8bfb\u8005\u3002<\/p>\n\n\n\n<p>\u8be5\u63a5\u53e3\u8981\u70b9\u5982\u4e0b\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>\u8be5\u63a5\u53e3\u57fa\u672c\u53ef\u4ee5\u770b\u6210\u662f\u4f20\u9012\u4fe1\u53f7\u7684\u6d88\u606f\u961f\u5217<\/li><li>\u5199\u8005\u8c03\u7528post\u65f6\u53ef\u4ee5\u770b\u505a\u662f\u5f80\u961f\u5217\u4e2d\u653e\u4e86\u4e00\u4e2a\u4fe1\u53f7<\/li><li>\u8bfb\u8005\u8c03\u7528wait\u7684\u65f6\u5019\u4e5f\u53ef\u4ee5\u770b\u6210\u662f\u4ece\u961f\u5217\u4e2d\u53d6\u51fa\u4e86\u4e00\u4e2a\u4fe1\u53f7<\/li><li>post\u548cwait\u7684\u64cd\u4f5c\u662f\u5bf9\u7b49\u7684\uff0c\u5373\u6709\u51e0\u4e2apost\u5c31\u5f97\u6709\u51e0\u4e2await<\/li><\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">c) eventfd<\/h3>\n\n\n\n<p>eventfd\u662f\u8fd1\u671f\u7248\u672c\u7684linux\u5185\u6838\u624d\u52a0\u5165\u7684\u63a5\u53e3\uff0c\u8981\u70b9\u5982\u4e0b\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>\u53e5\u67c4\u88ab\u5b9e\u73b0\u4e3a\u6587\u4ef6\u63cf\u8ff0\u7b26\uff0c\u53ef\u4ee5\u4f7f\u7528\u7c7b\u4f3cread\/write\u7684\u63a5\u53e3\u8fdb\u884c\u8bfb\u5199\uff0c\u4e5f\u53ef\u4ee5\u88abpoll\u3001epoll\u7b49\u591a\u8def\u590d\u7528\u673a\u5236\u7ba1\u7406<\/li><li>write\u7684\u65f6\u5019\uff0c\u53ef\u4ee5\u5199\u8fdb\u53bb\u4e00\u4e2a\u6574\u6570\u503c\uff0c\u5728read\u7aef\u53ef\u4ee5\u81ea\u884c\u5408\u5e76\uff0c\u6bd4\u5982\u8fde\u7eed\u8c03\u7528\u4e24\u6b21write\uff0c\u5206\u522b\u5199\u51652\u30013\uff0cread\u7684\u65f6\u5019\uff0c\u8bfb\u51fa\u6765\u7684\u662f5<\/li><li>\u53ea\u80fd\u5728\u6709\u4eb2\u7f18\u5173\u7cfb\u7684\u8fdb\u7a0b\/\u7ebf\u7a0b\u4e4b\u95f4\u901a\u4fe1<\/li><li>\u4e0d\u80fd\u5b9e\u73b0\u7c7b\u4f3cbroadcast\u8fd9\u6837\u7684\u8bed\u4e49\uff0c\u4e00\u6b21\u53ea\u80fd\u5524\u9192\u4e00\u4e2a\u8bfb\u8005\u7ebf\u7a0b<\/li><\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">d) spin wait<\/h3>\n\n\n\n<p>\u629b\u5f03\u64cd\u4f5c\u7cfb\u7edf\u63d0\u4f9b\u7684\u673a\u5236\uff0c\u8bfb\u8005\u81ea\u5df1\u53bb\u8f6e\u8be2\u67e5\u8be2\u662f\u5426\u6709\u65b0\u6570\u636e\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">3.\u6d4b\u91cf<\/h2>\n\n\n\n<p>\u6211\u4eec\u8bbe\u8ba1\u4e86\u4e00\u4e2a\u6d4b\u8bd5\u7a0b\u5e8f\uff0c\u4e3b\u8981\u529f\u80fd\u5982\u4e0b\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>\u652f\u6301\u6d4b\u91cf\u4e0a\u8ff0\u56db\u79cd\u5524\u9192\u65b9\u5f0f\u7684\u65f6\u5ef6<\/li><li>\u8bfb\u8005\u548c\u5199\u8005\u9700\u8981\u7ed1\u5b9a\u5728\u540c\u4e00\u5904\u7406\u5668\u7684\u4e0d\u540c\u6838\u5fc3\u4e0a<\/li><li>\u5c06\u8bfb\u8005\u6216\u5199\u8005\u7ed1\u5b9a\u5728CPU-0\u4e0a\uff080\u53f7CPU\u8d1f\u8d23\u5904\u7406\u4e2d\u65ad\uff09<\/li><li>\u4f7f\u7528rdtsc\u6d4b\u91cf\u65f6\u5ef6<\/li><\/ul>\n\n\n\n<p>*\u6ce8\u610f\uff0c\u4e0a\u8ff0\u89c4\u5b9a\u5341\u5206\u91cd\u8981\uff0c\u4e0d\u7136\u6d4b\u8bd5\u7ed3\u679c\u4e0d\u53ef\u4fe1\u3002\u6211\u4e4b\u524d\u8fdb\u884c\u8fc7\u7c7b\u4f3c\u7684\u6d4b\u8bd5\uff0c\u7531\u4e8e\u64cd\u4f5c\u4e0d\u5f53\uff0c\u7ed3\u679c\u5b8c\u5168\u662f\u9519\u7684\u3002<\/p>\n\n\n\n<p>\u4ee3\u7801\u5934\u6587\u4ef6\u5982\u4e0b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#ifndef UTIL_H_\n#define UTIL_H_\n\n#include &lt;stdio.h>\n#include &lt;stdlib.h>\n#include &lt;stdint.h>\n#include &lt;unistd.h>\n#include &lt;pthread.h>\n\n\/\/------------CPU\u7ed1\u5b9a\u76f8\u5173------------\n\nvoid print_running_cpu()\n{\n    char qry_cmd&#91;1024] = { 0 };\n    sprintf(qry_cmd, \"ps -o pid,spid,psr -T -p %d | grep %d | tail -n 1 | awk {'print $3'}\", \n        getpid(), gettid());\n    FILE *fp=popen(qry_cmd,\"r\");\n    if(fp == NULL)\n        return ;\n\n    char cpu_id_str&#91;200] = { 0 };\n    fgets(cpu_id_str,80,fp);\n    fclose(fp);\n\n    printf(\"&#91;%d] : current thread(%d@%d) is running on cpu(%d)\\n\", \n        gettid(), gettid(), getpid(), atoi(cpu_id_str));\n}\n\nvoid print_thread_affinity()\n{\n    cpu_set_t cpu_mask;\n\n    CPU_ZERO(&amp;cpu_mask);\n    pthread_getaffinity_np(pthread_self(), sizeof(cpu_mask), &amp;cpu_mask);\n\n    printf(\"&#91;%d] : current thread(%d@%d) can be running at cpu(\",\n        gettid(), gettid(), getpid());\n\n    int cpu_num = sysconf(_SC_NPROCESSORS_CONF);\n    for(int i = 0; i &lt; cpu_num; ++i)\n    {\n        if (CPU_ISSET(i, &amp;cpu_mask))\/\/\u5224\u65ad\u7ebf\u7a0b\u4e0e\u54ea\u4e2aCPU\u6709\u4eb2\u548c\u529b\n        {\n            printf(\"%d, \", i);\n        }\n    }\n    printf(\")\\n\");\n}\n\nvoid bind_thread_to_cpu(int cpu_id)\n{\n    cpu_set_t cpu_mask;\n    CPU_ZERO(&amp;cpu_mask);\n\n    CPU_SET(cpu_id, &amp;cpu_mask);\n    \/\/print_thread_affinity();\n    printf(\"&#91;%d] : binding current thread(%d@%d) to cpu(%d)\\n\",\n        gettid(), gettid(), getpid(), cpu_id);\n    pthread_setaffinity_np(pthread_self(), sizeof(cpu_mask), &amp;cpu_mask);\n    \/\/print_thread_affinity();\n}\n\n\/\/------------\u8ba1\u65f6\u76f8\u5173------------\n\nuint64_t get_cpu_freq()\n{\n    FILE *fp=popen(\"lscpu | grep CPU | grep MHz | awk  {'print $3'}\",\"r\");\n    if(fp == NULL)\n        return 0;\n\n    char cpu_mhz_str&#91;200] = { 0 };\n    fgets(cpu_mhz_str,80,fp);\n    fclose(fp);\n\n    return atof(cpu_mhz_str) * 1000 * 1000;\n}\n\nuint64_t get_tsc()\n{\n    uint64_t a, d;\n    __asm__ volatile(\"rdtsc\" : \"=a\"(a), \"=d\"(d));\n    return (d &lt;&lt; 32) | a;\n}\n\ndouble get_time_diff_ns(uint64_t beg_tsc, uint64_t end_tsc)\n{   \n    return  (end_tsc - beg_tsc) * 1.0 * 1000 * 1000 * 1000 \/ get_cpu_freq();\n}\n\n#endif<\/code><\/pre>\n\n\n\n<p>\u4ee3\u7801\u4e3b\u903b\u8f91\u5982\u4e0b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#include \"util.h\"\n\n#include &lt;sys\/time.h>\n#include &lt;time.h>\n#include &lt;semaphore.h>\n#include &lt;sys\/eventfd.h>\n\n\/\/ g++ -o wake_test wake_test.c -lpthread\n\/\/     -m \u5524\u9192\u65b9\u6cd5\uff1a\n\/\/            0-pthread_cond_wait\/signal\n\/\/            1-sem\n\/\/            2-event_fd\n\/\/            3-\u5fd9\u7b49\u8f6e\u8be2\n\/\/     -l \u6d4b\u8bd5\u8f6e\u6b21\n\/\/     -s \u4f11\u606f\u95f4\u9694\uff08\u6beb\u79d2\uff09\n\n\/\/\u6d4b\u8bd5\u6b21\u6570\nlong g_test_loop_times;\n\/\/\u53d1\u9001\u95f4\u9694\nlong g_sleep_time_ms;\n\/\/\u6d4b\u8bd5\u65b9\u5f0f\nint g_method_id;\n\n\/\/\u8bb0\u5f55\u65f6\u95f4\u7684\u6570\u7ec4\n\/\/\u5199\u8005\nvolatile int g_write_pos = 0;\nuint64_t *g_write_time;\n\/\/\u8bfb\u8005\nvolatile int g_read_pos = 0;\nuint64_t *g_read_time;\n\n\n\/\/\u5404\u79cd\u4e0d\u540c\u65b9\u5f0f\u4f7f\u7528\u7684\u5168\u5c40\u53d8\u91cf\npthread_mutex_t g_mutex = PTHREAD_MUTEX_INITIALIZER;\npthread_cond_t g_cond = PTHREAD_COND_INITIALIZER;\nsem_t g_sem_queue;\nint g_ev_fd; \/\/ event_fd\n\n\/\/\u5229\u7528\u4e0d\u540c\u7684\u5524\u9192\u65b9\u5f0f\u5b9e\u73b0\u7684\u6d4b\u8bd5\u51fd\u6570\nvoid write_by_method(int method_id)\n{\n    \/\/\u5148\u5199\n    g_write_time&#91;g_write_pos] = get_tsc();\n    ++g_write_pos;\n\n    \/\/\u6839\u636e\u4e0d\u540c\u7684\u65b9\u6cd5\u5524\u9192\u8bfb\u7ebf\u7a0b\n    switch(method_id)\n    {\n        case 0: \/\/pthread_cond_wait\/signal\n            pthread_mutex_lock(&amp;g_mutex);\n            pthread_cond_signal(&amp;g_cond);\n            pthread_mutex_unlock(&amp;g_mutex);\n            break;\n        case 1: \/\/sem\n            sem_post(&amp;g_sem_queue);           \n            break;\n        case 2: \/\/eventfd\n            eventfd_write(g_ev_fd, 1);\n            break;\n        case 3: \/\/\u4e0d\u505a\u4efb\u4f55\u5524\u9192\u64cd\u4f5c\uff0c\u8bfb\u7ebf\u7a0b\u5fd9\u7b49\u8f6e\u8be2\n            break;\n        default:\n            break;\n    };\n}\n\nint read_by_method(int method_id)\n{\n    \/\/\u6839\u636e\u4e0d\u540c\u7684\u65b9\u6cd5\u7b49\u5f85\u88ab\u5524\u9192\n    switch(method_id)\n    {\n        case 0: \/\/pthread_cond_wait\/signal\n            pthread_mutex_lock(&amp;g_mutex);\n            pthread_cond_wait(&amp;g_cond, &amp;g_mutex); \n            pthread_mutex_unlock(&amp;g_mutex);\n            break;\n        case 1: \/\/sem\n            sem_wait(&amp;g_sem_queue);           \n            break;\n        case 2: \/\/eventfd\n            eventfd_t value;\n            eventfd_read(g_ev_fd, &amp;value);\n            break;\n        case 3: \/\/\u5fd9\u7b49\u8f6e\u8be2\n            while(g_write_pos == g_read_pos)\n                ;\n            break;\n        default:\n            break;\n    };\n\n    \/\/\u8bfb\u51fa\uff08\u8003\u8651\u5408\u5e76\u8bfb\u51fa\u7684\u60c5\u51b5\uff09\n    int read_cnt = 0;\n    while(g_write_pos != g_read_pos)\n    {\n        g_read_time&#91;g_read_pos] = get_tsc();\n        ++g_read_pos;\n        ++read_cnt;\n    }\n\n    return read_cnt;\n}\n\nvoid print_result() \/\/\u5fae\u79d2\n{\n    double sum_diff = 0.0;\n    double max_diff = 0.0;\n    double min_diff = 1.0*24*60*60*1000*1000;\n    for(int i=0; i&lt;g_test_loop_times; ++i)\n    {\n        double this_diff = get_time_diff_ns(g_write_time&#91;i], g_read_time&#91;i]) \/ 1000;\n        \/\/printf(\"%.02lf us\\n\", this_diff);\n        sum_diff += this_diff;\n        if(this_diff &lt; min_diff)\n            min_diff = this_diff;\n        if(this_diff > max_diff)\n            max_diff = this_diff;   \n    }\n    printf(\"MAX : %.02lf us\\n\", max_diff);\n    printf(\"MIN : %.02lf us\\n\", min_diff);\n    printf(\"AVG : %.02lf us\\n\", sum_diff \/ g_test_loop_times);\n}\n\nvoid* write_func(void* p_arg)\n{\n    int bind_cpu_id = *(int *)p_arg;\n    bind_thread_to_cpu(bind_cpu_id);\n    \n    long loop = g_test_loop_times;\n    while(loop--)\n    {\n        write_by_method(g_method_id);\n        usleep(g_sleep_time_ms * 1000);\n    }\n\n    return NULL;\n}\n\nvoid* read_func(void* p_arg)\n{\n    int bind_cpu_id = *(int *)p_arg;\n    bind_thread_to_cpu(bind_cpu_id);\n    \n    long loop = g_test_loop_times;\n    long read_cnt = 0;\n    while(1)\n    {\n        read_cnt += read_by_method(g_method_id);\n        if(read_cnt >= g_test_loop_times)\n            break;\n    }\n\n    print_result();\n    return NULL;\n}\n\nint main(int argc, char **argv)\n{\n    g_test_loop_times = 100; \/\/\u6d4b\u8bd5100\u6b21\n    g_sleep_time_ms = 1000; \/\/\u6bcf\u6b21\u4f11\u606f1\u79d2\n    g_method_id = 0; \/\/\u4f7f\u7528\u5fd9\u7b49\u8f6e\u8be2\u4f5c\u4e3a\u5524\u9192\u65b9\u6cd5\n\n    \/\/\u89e3\u6790\u547d\u4ee4\u884c\u53c2\u6570\n    int optval  = 0;\n    while ((optval = getopt(argc, argv, \"l:s:m:\")) != EOF)\n    {\n\t\tswitch (optval) \n        {\n\t\t\tcase 'l':\n                g_test_loop_times = atoi(optarg);\n                break;\n\t\t\tcase 's':\n                g_sleep_time_ms = atoi(optarg);\n                break;\n\t\t\tcase 'm':\n                g_method_id = atoi(optarg);\n                break;\n            default:\n                break;\n        }\n    }\n\n    \/\/\u521d\u59cb\u5316\n    g_write_time = (uint64_t *)malloc(sizeof(uint64_t) * g_test_loop_times);\n    g_read_time = (uint64_t *)malloc(sizeof(uint64_t) * g_test_loop_times);\n\n    sem_init(&amp;g_sem_queue, 0, g_test_loop_times);\n\n    g_ev_fd = eventfd(0, 0);\n    \n    \/\/\u5b9a\u4e49\u56db\u4e2aCPU\n    int cpu_id_0 = 0;\n    int cpu_id_1 = 1;\n    int cpu_id_2 = 2;\n    int cpu_id_3 = 3;\n\n    \/\/\u542f\u52a8\u8bfb\u5199\u7ebf\u7a0b\n    pthread_t thr_id_1, thr_id_2;\n\n    \/\/\u8bfb\u80052\n    pthread_create(&amp;thr_id_1, NULL, read_func, &amp;cpu_id_2);\n\n    sleep(1);\n\n    \/\/\u5199\u8005\n    pthread_create(&amp;thr_id_2, NULL, write_func, &amp;cpu_id_0);\n    \n    \/\/\u7a7a\u8f6c\uff0c\u7b49\u5f85\u6d4b\u8bd5\u5b8c\u6210\n    while(1)\n        sleep(1);\n\n    return 0;\n}<\/code><\/pre>\n\n\n\n<p>\u7a0b\u5e8f\u652f\u6301\u56db\u4e2a\u53c2\u6570\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>-m\u7528\u4e8e\u6307\u5b9a\u5524\u9192\u673a\u5236\uff1a0\u662fpthread\u63a5\u53e3\uff1b1\u662fsemaphore\u63a5\u53e3\uff1b2\u662feventfd\uff1b3\u662f\u5fd9\u7b49\u8f6e\u8be2<\/li><li>-l\u7528\u4e8e\u6307\u5b9a\u6d4b\u8bd5\u8f6e\u6b21\uff0c\u5373\u6d4b\u8bd5\u51e0\u6b21\u6c42\u5e73\u5747<\/li><li>0s\u7528\u4e8e\u6307\u5b9a\u6bcf\u6b21\u6d4b\u8bd5\u4e4b\u95f4\u7684\u4f11\u606f\u95f4\u9694\uff0c\u5355\u4f4d\u662f\u6beb\u79d2\uff0c\u5efa\u8bae\u5c3d\u91cf\u8bbe\u5927\u4e00\u70b9\uff0c\u6bd4\u5982\u6bcf\u6b21\u95f4\u9694\u4f11\u606f1\u79d2\uff0c\u8fd9\u6837\u53ef\u4ee5\u907f\u514d\u5199\u4fe1\u53f7\u88ab\u5408\u5e76\u8bfb\u51fa\uff0c\u4f7f\u6d4b\u8bd5\u6570\u636e\u504f\u5c0f<\/li><\/ul>\n\n\n\n<p>\u6211\u6d4b\u8bd5\u7684\u673a\u5668\u914d\u7f6e\u5982\u4e0b\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Intel Xeon E5-2637 v4 @3.5GHz<\/li><li>\u4e24\u4e2aNUMA\u8282\u70b9\uff0c\u517116\u6838<\/li><\/ul>\n\n\n\n<p>\u6d4b\u8bd5\u5faa\u73af100\u4e2a\u8f6e\u6b21\uff0c\u6bcf\u4e2a\u8f6e\u6b21\u4e4b\u95f4\u4f11\u606f1\u79d2\uff0c\u6d4b\u8bd5\u7ed3\u679c\u5982\u4e0b\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td><strong>\u5524\u9192\u65b9\u6cd5<\/strong><\/td><td><strong>\u6700\u5927(us)<\/strong><\/td><td><strong>\u6700\u5c0f(us)<\/strong><\/td><td><strong>\u5e73\u5747(us)<\/strong><\/td><\/tr><tr><td>pthread<\/td><td>5.83<\/td><td>2.48<\/td><td>3.06<\/td><\/tr><tr><td>semaphore<\/td><td>4.56<\/td><td>2.25<\/td><td>2.66<\/td><\/tr><tr><td>eventfd<\/td><td>5.37<\/td><td>2.30<\/td><td>2.71<\/td><\/tr><tr><td>spin wait<\/td><td><strong>0.31<\/strong><\/td><td><strong>0.1<\/strong><\/td><td><strong>0.14<\/strong><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">4.\u7ed3\u8bba<\/h2>\n\n\n\n<p>\u6839\u636e\u4e0a\u9762\u7684\u6d4b\u8bd5\u7ed3\u679c\uff0c\u9664\u4e86spin wait\u6548\u679c\u4f18\u79c0\u5916\uff0c\u5176\u4ed6\u4e09\u79cd\u5524\u9192\u65b9\u5f0f\u90fd\u6ca1\u6709\u672c\u8d28\u533a\u522b\u3002\u56e0\u4e3a\u524d\u9762\u4e09\u79cd\u90fd\u662f<strong>\u57fa\u4e8e\u64cd\u4f5c\u7cfb\u7edf\u4e2d\u65ad<\/strong>\u7684\uff0c\u6ce8\u5b9a\u5feb\u4e0d\u5230\u54ea\u53bb\uff0c\u800cspin wait\u53ea<strong>\u6709CPU\u7f13\u5b58\u540c\u6b65\u7684\u5f00\u9500<\/strong>\uff0c\u56e0\u6b64\u6781\u5feb\u3002<\/p>\n\n\n\n<p>\u4f46\u662fspin wait\u4f1a\u5e26\u6765\u53e6\u5916\u7684\u5f00\u9500\uff1aCPU\u9700\u8981\u4e00\u76f4\u6ee1\u8d1f\u8377\u8dd1\uff0c\u5bf9\u673a\u5668\u5bff\u547d\u3001\u6563\u70ed\u3001\u7535\u6e90\u3001\u673a\u623f\u5b89\u5168\u7b49\u90fd\u662f\u5de8\u5927\u7684\u6311\u6218\u3002\u5bf9\u4e8e\u673a\u5668\u8f83\u591a\u7684\u673a\u623f\u6765\u8bb2\uff0c\u7535\u8d39\u4e5f\u4f1a\u662f\u4e00\u7b14\u5de8\u5927\u7684\u5f00\u652f\uff0c<strong>\u4e3a\u4e86\u8fd9\u51e0\u5fae\u79d2\u7684\u65f6\u5ef6\uff0c\u4ed8\u51fa\u8fd9\u4e48\u5927\u7684\u6210\u672c<\/strong>\uff0c\u662f\u5426\u503c\u5f97\u5462\uff1f<\/p>\n\n\n\n<p>\u5176\u5b9e\u8fd8\u6709\u53e6\u5916\u4e00\u79cd\u601d\u8def\uff0c\u73b0\u5728\u7684CPU\u52a8\u8f84\u5341\u51e0\u6216\u51e0\u5341\u4e2a\u6838\uff0c\u6211\u4eec\u53ef\u4ee5\u628a\u5c3d\u91cf\u591a\u7684\u5e94\u7528\u96c6\u4e2d\u5230\u4e00\u53f0\u673a\u5668\u4e0a\uff0c\u628a\u8fd9\u53f0\u673a\u5668\u7684\u6027\u80fd\u538b\u69a8\u5230\u6781\u81f4\uff0c\u8fdb\u800c\u51cf\u5c11\u673a\u5668\u6570\u91cf\uff0c\u8fd9\u6837\u5355\u53f0\u673a\u5668\u7684\u8fd0\u884c\u6210\u672c\u867d\u7136\u5f88\u9ad8\uff0c\u4f46\u662f\u603b\u4f53\u6210\u672c\u4e5f\u80fd\u964d\u4e0b\u6765\u3002\u6cdb\u6b27\u4ea4\u6613\u6240\u91c7\u7528\u7684\u5c31\u662f\u8fd9\u79cd\u601d\u8def\u3002<\/p>\n\n\n\n<p>\u5efa\u8bae\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>\u5bf9\u65f6\u5ef6\u6781\u5ea6\u654f\u611f\uff0c\u96c6\u7fa4\u89c4\u6a21\u5c0f\uff0c\u7528spin wait<\/li><li>\u5176\u4ed6\u573a\u666f\uff0c\u6839\u636e\u559c\u597d\u9009\u62e9\u5176\u4ed6\u4e09\u79cd\u4efb\u9009\u4e4b\u4e00\u5373\u53ef\uff0c\u6027\u80fd\u4e0d\u5dee\uff0c\u8fd8\u7701\u7535<\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>1.\u80cc\u666f \u5728\u591a\u6838\u4e16\u754c\u91cc\u5f00\u53d1\u590d\u6742\u7cfb\u7edf\uff0c\u4e0d\u53ef\u907f\u514d\u5730\u8981\u6d89\u53ca\u591a\u8fdb\u7a0b(\u7ebf\u7a0b)\u534f\u4f5c\u7684\u573a\u666f\u3002\u6700\u5e38\u89c1\u7684\u534f\u4f5c\u6a21\u5f0f\u662f\u751f\u4ea7\u8005-\u6d88\u8d39\u8005\u6a21\u5f0f\u3002\u751f\u4ea7\u8005\u4ea7\u751f\u6d88\u606f\u7684\u65f6\u5019\uff0c\u5982\u4f55\u5feb\u901f\u5730\u5524\u9192\u6d88\u8d39\u8005\u53bb&#8230;<\/p>\n<p class=\"read-more\"><a class=\"btn btn-default\" href=\"http:\/\/www.wangkaixuan.tech\/?p=918\"> Read More<span class=\"screen-reader-text\">  Read More<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[14],"tags":[],"class_list":["post-918","post","type-post","status-publish","format-standard","hentry","category-05-01-"],"_links":{"self":[{"href":"http:\/\/www.wangkaixuan.tech\/index.php?rest_route=\/wp\/v2\/posts\/918","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.wangkaixuan.tech\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.wangkaixuan.tech\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.wangkaixuan.tech\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/www.wangkaixuan.tech\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=918"}],"version-history":[{"count":0,"href":"http:\/\/www.wangkaixuan.tech\/index.php?rest_route=\/wp\/v2\/posts\/918\/revisions"}],"wp:attachment":[{"href":"http:\/\/www.wangkaixuan.tech\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=918"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.wangkaixuan.tech\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=918"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.wangkaixuan.tech\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=918"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}