我们都知道linux中创建新进程是系统调用fork,但实际上fork是clone功能的一部分,clone和fork的主要差别是传递了几个參数。clone隶属于libc。它的意义就是实现线程。

看一下clone函数:

int clone(int (*fn)(void * arg), void *stack, int flags, void * arg);

fn就是即将创建的线程要运行的函数,stack是线程使用的堆栈。

再来看一下clone和pthread_create的差别:linux中的pthread_create终于调用clone。

我们的目的不是为了介绍clone,而是探究clone中的上下文切换问题。

(1)进程切换:把执行的进程的CPU寄存器中的数据取出存放到内核态堆栈中,同一时候把要加载的进程的数据放入到寄存器中(硬件上下文)。还会把全部一切的状态信息进行切换。

(2)时间片轮转的方式使多个任务在同一颗CPU上运行变成了可能,但同一时候也带来了保存现场和载入现场的直接消耗(上下文切换会带来直接和间接两种因素影响程序性能的消耗。直接消耗包含:CPU寄存器须要保存和载入。系统调度器的代码须要运行,TLB实例须要又一次载入,CPU 的pipeline须要刷掉;间接消耗指的是多核的cache之间得共享数据。间接消耗对于程序的影响要看线程工作区操作数据的大小)。

(3)clone任务[1]:

  • Allocate data structures for thread representation
  • Initialize structures according to clone parameters
  • Set up kernel and user stack as well as argument for the thread function
  • Put the thread on the corresponding CPU core’s run queue
  • Notify target core via an interrupt so that the new thread will be scheduled

(4)我们在clone出线程时指定高的优先级,也许会降低因抢占而造成的上下文切花开销。

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <assert.h> #define N 4
#define M 30000 #define THREAD_NUM 4
#define POLICY SCHED_RR int nwait = 0;
volatile long long sum;
long loops = 6e3;
pthread_mutex_t mutex; void set_affinity(int core_id) {
cpu_set_t cpuset;
CPU_ZERO(&cpuset);
CPU_SET(core_id, &cpuset);
assert(pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset) == 0);
} void* thread_func(void *arg) {
//set_affinity((int)(long)arg);
for (int j = 0; j < M; j++) {
pthread_mutex_lock(&mutex);
nwait++;
for (long i = 0; i < loops; i++) // This is the key of speedup for parrot: the mutex needs to be a little bit congested.
sum += i;
pthread_mutex_unlock(&mutex);
for (long i = 0; i < loops; i++)
sum += i*i*i*i*i*i;
//fprintf(stderr, "compute thread %u %d\n", (unsigned)pthread_self(), sched_getcpu());
}
} int main() {
//set_affinity(23); pthread_t threads[THREAD_NUM], id;
pthread_attr_t attrs[THREAD_NUM];
struct sched_param scheds[THREAD_NUM], sched;
int idxs[THREAD_NUM];
int policy, i, ret; id = pthread_self();
ret = pthread_getschedparam(id, &policy, &sched);
assert(!ret && "main pthread_getschedparam failed!");
sched.sched_priority = sched_get_priority_max(POLICY);
ret = pthread_setschedparam(id, POLICY, &sched); //set policy and corresponding priority
assert(!ret && "main pthread_setschedparam failed!"); for (i = 0; i < THREAD_NUM; i++) {
idxs[i] = i; ret = pthread_attr_init(&attrs[i]);
assert(!ret && "pthread_attr_init failed!"); ret = pthread_attr_getschedparam(&attrs[i], &scheds[i]);
assert(!ret && "pthread_attr_getschedparam failed!"); ret = pthread_attr_setschedpolicy(&attrs[i], POLICY);
assert(!ret && "pthread_attr_setschedpolicy failed!"); scheds[i].sched_priority = sched_get_priority_max(POLICY); ret = pthread_attr_setschedparam(&attrs[i], &scheds[i]);
assert(!ret && "pthread_attr_setschedparam failed!"); ret = pthread_attr_setinheritsched(&attrs[i], PTHREAD_EXPLICIT_SCHED);
assert(!ret && "pthread_attr_setinheritsched failed!");
} for (i = 0; i < THREAD_NUM; i++) {
ret = pthread_create(&threads[i], &attrs[i], thread_func, &idxs[i]);
assert(!ret && "pthread_create() failed!");
} for (i = 0; i < THREAD_NUM; i++)
ret = pthread_join(threads[i], NULL); return 0;
}

我们让四个子线程和主线程都採取RR调度,并设置最高优先级,我们用VTune观察Preemption Context Switches是否会因此降低。

VTune现象:

如今设置最低优先级:

原来设置最低优先级能够降低Preemption Context Switches,可是添加了Synchronization Context Switches。

显然最高优先级执行用时少(4.470s,而最低优先级用时7.280s)。

REFERENCES:

[1] Balazs Gerofi, etc, Clone n(): Parallel Thread Creation for Upcoming Many-Core Architectures, 2012, IEEE International Conference on Cluster Computing.

具体解释clone函数的更多相关文章

  1. 实现一个clone函数,对javascript中的5种数据类型进行值复制

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. 用三维的视角理解二维世界:完美解释meshgrid函数,三维曲面,等高线,看完你就懂了。...

    完美解释meshgrid函数,三维曲面,等高线 #用三维的视角理解二维世界 #完美解释meshgrid函数,三维曲面,等高线 import numpy as np import matplotlib. ...

  3. Linux Clone函数

    Linux Clone函数 之前某一次有过一次面试,问了内核中是怎么创建命名空间的? 下面就来扒一扒clone的精髓,以及如何通过它创建命名空间. 目录 Linux Clone函数 使用clone创建 ...

  4. js深入研究之扩展类,克隆对象,混合类(自定义的extend函数,clone函数,与augment函数)

    1.类扩展 /* EditInPlaceField类 */ /* 扩展函数 */ function extend(subClass, superClass) { var F = function() ...

  5. C++继承具体解释之二——派生类成员函数具体解释(函数隐藏、构造函数与兼容覆盖规则)

    在这一篇文章開始之前.我先解决一个问题. 在上一篇C++继承详解之中的一个--初探继承中,我提到了在派生类中能够定义一个与基类成员函数同名的函数,这样派生类中的函数就会覆盖掉基类的成员函数. 在谭浩强 ...

  6. 关于JS的clone()函数编写的一些问题

    问题讲述:用js 实现一个clone()克隆函数,该函数会把输入进去的不同类型值Number,String,Undefined,Boolean,Function,Null,Object,Array,R ...

  7. Swift具体解释之三----------函数(你想知道的都在这里)

    函数(你想知道的都在这里) 注:本文为作者自己总结.过于基础的就不再赘述 ,都是亲自測试的结果.如有错误或者遗漏的地方.欢迎指正.一起学习. 1. 函数的简单定义和调用 简单的无參函数就不再赘述 , ...

  8. clone函数

    http://blog.csdn.net/caianye/article/details/5947282 http://wenku.baidu.com/link?url=qnq7laYDYm1V8tl ...

  9. LoadRunner 函数大全之中文解释

    LoadRunner 函数大全之中文解释 // sapgui_table_set_column_selected 模拟用户 // 单击表中的列标题. int sapgui_table_set_colu ...

随机推荐

  1. 业余开发Android App的架构演变

    闲暇之余,开发了一款休闲类app,虽然用户量不多,但确实花了不少心血在这上面.然而,开发出来的结果,与之前想好的架构,还是有不少区别. 下面,记录下这款app架构的演变: 最初,只想写个app,能与机 ...

  2. Maven之pom.xml详释

    什么是pom? POM(Project Object Model):全称项目对象模型,它是Maven项目中的文件,使用XML表示,名称叫做pom.xml.在Maven项目中,必须包含pom.xml文件 ...

  3. NVIDIA各个领域芯片现阶段的性能和适应范围

    NVIDIA作为老牌显卡厂商,在AI领域深耕多年.功夫不负有心人,一朝AI火,NVIDIA大爆发,NVIDIA每年送给科研院所和高校的大量显卡,大力推广Physix和CUDA,终于钓了产业的大鱼. 由 ...

  4. 【OpenCV】像素操作的数字图像处理

    之前几天捣鼓matlab,用来处理数字图像,矩阵操作什么的,如果忘记线性代数就真的GG了. 在用了matlab被深深地吐槽之后,决定改用opencv,C++貌似也是处理数字图像的很好的工具 1. 在u ...

  5. Docker方式安装QIIME 2

    # 下载最新版QIIME 2 docker pull qiime2/core:2017.7 # 测试是否安装成功 docker run -t -i -v $(pwd):/mnt/hgfs/2017 q ...

  6. CAD如何直接打印,不出现打印对话框?

    主要用到函数说明: MxDrawXCustomFunction::Mx_Print 直接打印,不出现打印对话框,详细说明如下: 参数 说明 double ptLBx 打印的范围左下角x double ...

  7. Oracle 把一个用户所有表的读权限授予另一个用户

    create user <USER_NAME> identified by <PASSWORD>; grant create session TO <USER_NAME& ...

  8. react native 从头开始

    1.react-native run-android 报错SDK location not found. Define location with sdk.dir in the local.prope ...

  9. bazel和TensorFlow安装

    bazel安装:https://docs.bazel.build/versions/master/install-ubuntu.html#install-with-installer-ubuntu 安 ...

  10. spark学习(1)---dataframe操作大全

    一.dataframe操作大全 https://blog.csdn.net/dabokele/article/details/52802150 https://www.jianshu.com/p/00 ...