精华内容
下载资源
问答
  • 用当前时钟时间减去被切换线程的starttime即为被切换线程cpu占用时间。该几个计算时间保存在thread的统计结构中,用户程序需要建立一个alarm时钟告警,当特定的时间间隔到了进行函数回调,在回调函数中获取...
    

    内核中,调用switchto切换线程时,新运行的线程取当前时钟时间为线程的starttime时间。用当前时钟时间减去被切换线程的starttime即为被切换线程的cpu占用时间。该几个计算的时间保存在thread的统计结构中,用户程序需要建立一个alarm时钟告警,当特定的时间间隔到了进行函数回调,在回调函数中获取thread的统计结构中的相关数据。

    如图:



    展开全文
  • 每个线程占用CPU时间是由系统分配的,因此可以把线程看成操作系统分配CPU时间的基本单位。每个线程只有在系统分配给它的时间片内才能取得CPU控制权,执行线程中的代码。 Linux操作系统在一个进程内生成多个线程。...

    1.进程和线程诞生记

    我们的电脑主要由CPU+RAM+各种资源(比如显卡,光驱,键盘,GPS等外设)构成,但是电脑的运行实际就是CPU和相关寄存器以及RAM之间的事情。
    CPU运行太快,难以想象的快,寄存器仅仅能够追的上他的脚步,RAM和别的挂在各总线上的设备则难以望其项背。那当多个任务要执行的时候怎么办呢?轮流着来?或者谁优先级高谁来?不管怎么样的策略,一句话就是在CPU看来就是轮流着来。而且因为速度差异,CPU实际的执行时间和等待执行的时间是数量级的差异。比如工作1秒钟,休息一个月。所以多个任务,轮流着来,让CPU不那么无聊,给流逝的时间增加再多一点点的意义。这些任务,在外在表现上就仿佛是同时在执行。
    执行一段程序代码,实现一个功能的过程之前 ,当得到CPU的时候,相关的资源必须也已经就位,就是万事俱备只欠CPU这个东风。所有这些任务都处于就绪队列,然后由操作系统的调度算法,选出某个任务,让CPU来执行。然后就是PC指针指向该任务的代码开始,由CPU开始取指令,然后执行。
    在这里插入图片描述
    除了CPU以外所有的执行环境,主要是寄存器的一些内容,就构成了的进程的上下文环境。进程的上下文是进程执行的环境。当这个程序执行完了,或者分配给他的CPU时间片用完了,那它就要被切换出去,等待下一次CPU的临幸。在被切换出去做的主要工作就是保存程序上下文,因为这个是下次他被CPU临幸的运行环境,必须保存。
    串联起来的事实:前面讲过在CPU看来所有的任务都是一个一个的轮流执行的,具体的轮流方法就是:先加载进程A的上下文,然后开始执行A,保存进程A的上下文,调入下一个要执行的进程B的进程上下文,然后开始执行B,保存进程B的上下文。
    进程就是上下文切换之间的程序执行的部分。是运行中的程序的描述,也是对应于该段CPU执行时间的描述。在软件编码方面,我们说的进程,其实是稍不同的,编程语言中创建的进程是一个无限loop,对应的是tcb块。这个是操作系统进行调度的单位。所以和上面的cpu执行时间段还是不同的。进程,与之相关的东东有寻址空间,寄存器组,堆栈空间等。即不同的进程,这些东东都不同,从而能相互区别。
    进程的颗粒度太大,每次的执行都要进行进程上下文的切换。如果我们把进程比喻为一个运行在电脑上的软件,那么一个软件的执行不可能是一条逻辑执行的,必定有多个分支和多个程序段,就好比要实现程序A,实际分成 a,b,c等多个块组合而成。那么这里具体的执行就可能变成:程序A得到CPU =》CPU加载上下文,开始执行程序A的a小段,然后执行A的b小段,然后再执行A的c小段,最后CPU保存A的上下文。这里a,b,c的执行是共享了A进程的上下文,CPU在执行的时候仅仅切换线程的上下文,而没有进行进程上下文切换的。进程的上下文切换的时间开销是远远大于线程上下文时间的开销。这样就让CPU的有效使用率得到提高。这里的a,b,c就是线程,也就是说线程是共享了进程的上下文环境,更为细小的CPU时间段。线程主要共享的是进程的地址空间。
    进程和线程都是一个时间段的描述,是CPU工作时间段的描述,不过是颗粒大小不同。注意这里描述的进程线程概念和实际代码中所说的进程线程是有区别的。编程语言中的定义方式仅仅是语言的实现方式,是对进程线程概念的物化。
    做个简单的比喻:进程=火车,线程=车厢

        线程在进程下行进(单纯的车厢无法运行)
        一个进程可以包含多个线程(一辆火车可以有多个车厢)
        不同进程间数据很难共享(一辆火车上的乘客很难换到另外一辆火车,比如站点换乘)
        同一进程下不同线程间数据很易共享(A车厢换到B车厢很容易)
        进程要比线程消耗更多的计算机资源(采用多列火车相比多个车厢更耗资源)
        进程间不会相互影响,一个线程挂掉将导致整个进程挂掉(一列火车不会影响到另外一列火车,但是如果一列火车上中间的一节车厢着火了,将影响到所有车厢)
        进程可以拓展到多机,进程最多适合多核(不同火车可以开在多个轨道上,同一火车的车厢不能在行进的不同的轨道上)
        进程使用的内存地址可以上锁,即一个线程使用某些共享内存时,其他线程必须等它结束,才能使用这一块内存。(比如火车上的洗手间)-"互斥锁"
        进程使用的内存地址可以限定使用量(比如火车上的餐厅,最多只允许多少人进入,如果满了需要在门口等,等有人出来了才能进去)-“信号量”
    

    2.线程简介

    线程是计算机中独立运行的最小单位。每个线程占用的CPU时间是由系统分配的,因此可以把线程看成操作系统分配CPU时间的基本单位。每个线程只有在系统分配给它的时间片内才能取得CPU控制权,执行线程中的代码。
    Linux操作系统在一个进程内生成多个线程。多线程和多进程相比,拥有以下优点:
    (1)进程都有独立的地址空间,创建新进程要耗费时间为期分配系统资源,而线程共享进程的地址空间,所以创建线程花费的时间要少得多。
    (2)系统调度方面,由于进程地址空间独立而线程共享地址空间,所以线程间的切换速度要远远快过进程间的切换速度。
    (3)通信机制方面,进程间的数据空间相互独立,彼此通信要以专门的通信方式进行,且必须经过操作系统。而多线程共享共享数据空间,一个线程的数据可以直接提供给其他线程使用,而不必经过操作系统。因此,线程间的通信更加方便省时。
    虽然线程在进程内部共享地址空间、打开的文件描述符等资源。但是线程也有其私有的数据信息,包括:
    (1)线程ID:每个线程都由一个唯一的线程号。
    (2)寄存器(包括程序计数器和堆栈指针)。
    (3)堆栈
    (4)信号掩码
    (5)优先级
    (6)线程私有的存储空间
    在主线程里创建线程,程序就会在创建线程的地方产生分支,变成两个程序执行。这似乎和多进程一样,其实不然。子进程时通过拷贝父进程的地址空间来实现的;而线程与进程内的其他线程共享程序代码,一段代码可以同时被多个线程执行。
    在这里插入图片描述

    如何理解多线程

    这么理解吧,假设你正在追一个女生。 某天晚上,你给她发了一个消息,过了一分钟之后她回了你一个表情包【微笑脸】。
    你很开心,你觉得她正在跟你聊天。
    你又给她发了一个消息,过了一会她又回复你消息了,你觉得自己追到她很有希望。
    而事实是,在回复你消息之前,她分别给她正在追的男生发了三条消息,让后又给备胎1,备胎2,备胎3…
    分别回复了一个表情包或一个“哦”,“嗯呢”,然后才轮到你。
    而这些,你都是不知道的,其他人都是不知道的,所有的人都以为她只在和自己聊天,因为她回复消息很“及时”。只要她速度足够快,她能骗过每一个人。
    这就是恋爱过程中的多线程,理解了吗?
    至于计算机中的多线程,道理也是一样。因为计算机运算速度很快,而且采用的时间片技术和各种调度算法,可以保证每个程序都能得到执行,时延非常短,我们是感觉不出来的。比如几个程序在一秒钟之内就轮换执行了200多次,
    我们只会以为每一个程序都是没有被中断过的,是单独一直在执行的。

    3.pthread_create

    线程的创建通过函数pthread_create来完成,声明如下:

      #include <pthread.h>
      
      int pthread_create(pthread_t *thread, pthread_attr_t * attr, void* (*start_routine)(void *),void *arg);
    
    • hread: 是一个指针,线程创建成功时,用以返回创建的线程ID
    • attr:指定线程属性,NULL表示使用默认属性
    • start_routine:函数指针,指向线程创建后要调用的函数。这个被线程调用的函数也称为线程函数。
    • arg:该参数指向传递给线程函数的参数。
      线程创建成功时,pthread_create函数返回0,新创建的线程开始运行第3个参数所指向的函数,原来的线程继续运行。

    4.代码

    #include<stdio.h>
    #include<stdlib.h>
    #include<pthread.h>
    #include <unistd.h>
    
    /* 声明结构体 */
    struct member
    {
        int num;
        char *name;
    };
    
    /* 定义线程pthread */
    static void * pthread(void *arg)
    {
        struct member *temp;
    
        /* 线程pthread开始运行 */
        printf("thread starts,ID is %ld\n",pthread_self());
    
        /* 令主线程继续执行 */
        sleep(5);
    
        /* 打印传入参数 */
        temp = (struct member *)arg;
        printf("*************printinfo in thread************\n");
        printf("member->num:%d\n",temp->num);
        printf("member->name:%s\n",temp->name);
    
        return NULL;
    }
    
    int main(int agrc,char* argv[])
    {
        pthread_t tidp;
        struct member *pMember;
    
        /* 为结构体变量pMember赋值 */
        pMember = (struct member *)malloc(sizeof(struct member));
        pMember->num=1;
        pMember->name="Proctol Forest";
    
         printf("main starts,ID is %ld\n",pthread_self());
        /* 创建线程pthread */
        if ((pthread_create(&tidp, NULL, pthread, (void*)pMember)) == -1)
        {
            printf("create error!\n");
            return 1;
        }
    
        /* 令线程pthread先运行 */
        sleep(1);
    
        /* 线程pthread睡眠5s,此时main可以先执行 */
        printf("mian continue!\n");
    
        /* 等待线程pthread释放 */
        if (pthread_join(tidp, NULL))
        {
            printf("thread is not exit...\n");
            return -2;
        }
    
        return 0;
    }
    

    5.编译

    Linux下的多线程程序,需要使用头文件pthread.h,链接时需要使用库libpthread.a。

    gcc pthread.c  -o pthread -lpthread
    

    6.结果

    在这里插入图片描述

    加入讨论

    在这里插入图片描述

    展开全文
  • 线程池中如何确定线程的数目

    千次阅读 2019-09-03 21:59:54
    针对不同的任务性质而言:CPU密集型任务应配置尽可能小的线程,如配置CPU个数+1的线程数,IO密集型任务应配置尽可能多的线程,因为IO操作不占用CPU,不要让CPU闲下来,应加大线程数量,如配置两倍CPU个数+1 ...

    简单点计算:

    cpu密集型:cpu+1

    io密集型:2*cpu+1

    混合型:(io执行时间/cpu执行时间+1)*cpu

    任务依赖性同混合型

    针对不同的任务性质而言:CPU密集型任务应配置尽可能小的线程,如配置CPU个数+1的线程数,IO密集型任务应配置尽可能多的线程,因为IO操作不占用CPU,不要让CPU闲下来,应加大线程数量,如配置两倍CPU个数+1

    任务对其他系统资源有依赖:如某个任务依赖数据库的连接返回的结果,这时候等待的时间越长,则CPU空闲的时间越长,那么线程数量应设置得越大,才能更好的利用CPU。 

    线程等待时间所占比例越高,这样的话CPU空闲时间比较多,为了能够更好的利用CPU,需要较多线程。

    如果线程CPU时间所占比例越高,说明CPU比较繁忙,此时需要越少线程。 

    另外,如果线程数量过多,线程之间的切换也会带来开销。

    是否使用线程池就一定比使用单线程高效呢?

    答案是否定的,比如Redis就是单线程的,但它却非常高效,基本操作都能达到十万量级/s。虽然redis是基于操作内存,主要是cpu密集型,单线程可以避免线程切换,多线程适合io操作多的场景

    展开全文
  • 利用线程机制设计自己创意一个多道程序,计算 Y=f1(x)+f2(x)+f3(x) (1)自己设计有计算量的f1(x)、f2(x)、f3(x);...(5)分别计算和比较使用顺序计算程序和多道程序计算CPU占用率情况和内存占用情况。
  • 假如我们的计算机只有一个 CPU,那么 CPU 在某一个时刻只能执行一条指令,线程只有得到 CPU时间片,也就是使用权,才可以执行指令。 那么Java是如何线程进行调用的呢? 线程有两种调度模型: 分时调度模型 ...

    线程调度 

    假如我们的计算机只有一个 CPU,那么 CPU 在某一个时刻只能执行一条指令,线程只有得到 CPU时间片,也就是使用权,才可以执行指令。

    那么Java是如何对线程进行调用的呢?

    线程有两种调度模型

    分时调度模型 所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间片

    抢占式调度模型 优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个,优先级高的线程获取的 CPU 时间片相对多一些。

    Java使用的是抢占式调度模型。

    既然线程设有设置优先级,那么肯定有默认优先级。
    那么,默认优先级是多少呢? 如何获取线程对象的优先级?
      public final int getPriority():返回线程对象的优先级
    如何设置线程对象的优先级呢?
      public final void setPriority(int newPriority):更改线程的优先级。

    注意:
      线程默认优先级是5。
      线程优先级的范围是:1-10。
      线程优先级高仅仅表示线程获取的 CPU时间片的几率高,但是要在次数比较多,或者多次运行的时候才能看到比较好的效果。

    IllegalArgumentException:非法参数异常。
      抛出的异常表明向方法传递了一个不合法或不正确的参数。就是设置的优先级超出了线程优先级的范围。

     

    获取线程的优先级,查看系统默认的线程优先级,以及设置线程优先级:

     1     public static void main(String[] args) {
     2 
     3         // 创建两个线程对象
     4         MyThread mt1 = new MyThread();
     5         MyThread mt2 = new MyThread();
     6         MyThread mt3 = new MyThread();
     7         
     8         //调用方法设置线程名称
     9         mt1.setName("哈士奇");
    10         mt2.setName("萨摩耶");
    11         mt3.setName("短尾猫");
    12         
    13         //获取默认优先级   结果都是5,证明系统默认的线程优先级是5
    14         System.out.println(mt1.getPriority());
    15         System.out.println(mt2.getPriority());
    16         System.out.println(mt3.getPriority());
    17         
    18         //设置线程优先级  
    19         //数字越大的优先级越高。但是,优先级高只是意味着该线程获取的 CPU 时间片相对多一些。并不是说是先让你走完。
    20         mt1.setPriority(1);
    21         mt2.setPriority(6);
    22         mt3.setPriority(10);
    23         
    24         
    25         mt1.start();
    26         mt2.start();
    27         mt3.start();
    28         
    29     }

     

    转载于:https://www.cnblogs.com/LZL-student/p/5932962.html

    展开全文
  • 线程优先级

    2019-03-10 22:45:42
    假如我们的计算机只有一个 CPU,那么 CPU 在某一个时刻只能执行一条指令,线程只有得到 CPU时间片,也就是使用权,才可以执行指令。那么Java是如何线程进行调用的呢? l线程有两种调度模型: •分时调度模型 ...
  • 合理的设置线程池的线程数...IO密集型是指在处理任务时,IO过程所占用时间较多,在这种情况下,线程数的计算方法可以分为两种: 第一种配置方式:由于IO密集型任务线程并不是一直在执行任务,则应配置尽可能多的线程
  • (1)假如我们的计算机只有一个 CPU,那么 CPU 在某一个时刻只能执行一条指令,线程只有得到 CPU时间片,也就是CPU使用权,才可以执行指令。那么Java是如何线程进行调用的呢? (2)线程有两种调度模型: 分时...
  • 一个正常的请求有cpu执行时间(比如代码中进行数据的封装和计算等)和等待时间(比如调用dubbo接口等待io的响应结果或者其他等待io的过程中是不占用cpu时间的);核心线程数=cpu核数*(执行时间/(执行时间+等待时间)) ...
  • java -3线程调度

    2018-12-28 20:50:07
    假如我们的计算机只有一个 CPU,那么 CPU 在某一个时刻只能执行一条指令,线程只有得到 CPU时间片,也就是使用权,才可以执行指令。那么Java是如何线程进行调用的呢? 线程有两种调度模型: 分时调度模型 所有...
  • 线程入门(二)

    2017-11-01 22:59:00
    假如我们的计算机只有一个CPU,那么CPU 在某一个时刻只能执行一条指令,线程只有得到CPU时间片,也就是使用权,才可以执行指令。那么Java是如何线程进行调用的呢? 线程有两种调度模型: •分时调度模型 所有...
  • 假如是业务时间长集中在I/O操作上,也就是I/O密集型的任务,因为I/O操作并不占用CPU,所以不要让所有的CPU闲下来,可以加大线程池中的线程数目,让CPU处理更多的业务。假如是业务时间长集中在计算操作上,也就是计算...
  • 1.分时调度:所有线程轮流使用CPU的使用权,平均分配每个线程占用CPU时间。 2.抢占式调度 优先让优先级高的线程使用CPU,如果一样高,则随机。JAVA使用的是抢占式调度。 0.4同步与异步 同步:线程排队执行,效率
  • 线程的构造与运行

    2020-12-26 20:57:49
    并发能提高资源的使用效率,如输入输出占用CPU少,可将相关CPU时间片分给其它计算任务 OS中,进程实现了任务间的并发,线程实现了任务内的并发(即程序员决定如何并发) 如:在线播放音视频,需要先下载到缓存,...
  • 如何在一段时间内,“同时”执行几个函数呢,让它们同时进行呢,这里的同时是带引号的,在一个cpu的情况下,任何计算都是需要时间的,只是他们分别占用了很少的时间段,让你感觉上是同时进行的。 简单的理解就是...
  • CPU密集型也叫计算密集型,指的是系统的硬盘、内存性能相对CPU要好很多,此时,系统运作大部分的状况是CPU Loading 100%,CPU要读/写I/O(硬盘/内存),I/O在很短的时间就可以完成,而CPU还有许多运算要处理,CPU ...
  • 再说如何进行多线程开发之前,我们先来看看什么是线程,什么又是进程,两者有怎样的关系呢? 程序(Program): 计算机指令的集合,以文件形式存储在磁盘上。即指一段静态代码,静态对象。 进程(Process): 程序...
  • 第三十二章:协程

    2019-06-06 17:25:00
    效率要高只有一个方法就是让这个当前线程尽可能多的占用CPU时间如何做到? 任务类型可以分为两种 IO密集型 和 计算密集型 对于计算密集型任务而言 ,无需任何操作就能一直占用CPU直到超时为止,没有任何办法...
  • 协程

    2019-06-07 15:33:00
    效率要高只有一个方法就是让这个当前线程尽可能多的占用CPU时间如何做到? 任务类型可以分为两种 IO密集型 和 计算密集型 对于计算密集型任务而言 ,无需任何操作就能一直占用CPU直到超时为止,没有任何办法...
  • 第三十二章 协程

    2019-06-06 16:54:00
    效率要高只有一个方法就是让这个当前线程尽可能多的占用CPU时间如何做到? 任务类型可以分为两种 IO密集型 和 计算密集型 对于计算密集型任务而言 ,无需任何操作就能一直占用CPU直到超时为止,没有任何办法...
  • Lab:user-level threads and alarm 1.实验目的 本实验目的在于熟悉如何在上下文切换和系统调用中保存和恢复状态。我们将在一个用户级线程包中实现线程之间的切换,并...对于那些希望限制占用CPU时间计算绑定进程,
  • FAQ(持续更新)

    2021-01-08 12:27:51
    计算线程无法实时调起每个任务的时候,那么同一队列名下的任务将按FIFO的顺序被调起,而队列与队列之间则是平等对待。例如,先连续启动n个队列名为A的任务,再连续启动n个队列名为B的任务...
  • 1.1.7 MySQL的数据如何恢复到任意时间点? 1.1.8 NFS 和 SMB 是最常见的两种 NAS(Network Attached Storage)协议,当把一个文件系统同时通过 NFS 和 SMB 协议共享给多个主机访问时,以下哪些说法是错误的 1.1.9...
  • 4.如何降低AMD CPU的温度 5.CPU为何有两个温度 6.通过BIOS来设置AMD CPU工作时的温度警戒线 7.由待机进入正常模式时死机 8.清洗散热器导致CPU温度过高 9.导热硅脂过多导致CPU散热不良 10.Intel原装风扇造成CPU温度过...

空空如也

空空如也

1 2 3
收藏数 42
精华内容 16
关键字:

如何计算线程占用cpu时间