cpu时间

深挖 GIL锁

旧时模样 提交于 2020-02-01 21:25:15
重述 GIL 锁机制 我们知道GIL锁,它是用来保证线程安全的。 比如说,有一条代码 是 x = 10 的赋值语句,当你产生了 10 这个数值还没有进行赋值给x的时候,cpu发生了调度切换了,有可能切换到了 垃圾回收线程上,这个时候的垃圾回收线程就会发现有一个引用计数为10 的内存空间,于是就把他给释放掉了,这就导致了这条赋值语句的失败。也就造成了线程不安全的情况。 所以为了解决这个问题,就有了GIL全局解释器锁。 大白话来讲GIL锁,就是一个进程开启了,这个进程一共有3个线程,这三个线程会去抢GIL锁,只有抢到了GIL锁,解释器进程才会去执行这个线程的代码,抢到了GIL锁以后,等待cpu调度切换到了这个进程,这个进程中的线程开始执行,cpu不停地在这三个线程切换,只有其中拿到了GIL锁的线程才能被执行,其他的两个线程,就算拿到了cpu的执行权,也没有被执行。 问题 现在就有个问题,那这个拿到了GIL锁的线程什么时候才会释放GIL锁? 答案 当遇到io等待的时候,就会释放这个GIL锁。 问题二 什么是io,其实不止是增删读写文件,赋值操作也是io,关于文件的操作是磁盘io,赋值操作是内存io,因为它涉及到内存的申请了。那么他不就是在赋值的时候就释放了GIL锁了吗? 答案 内存io不会造成io等待。所以不会释放GIL锁。 总述GIL锁 1.释放GIL锁的目标,是为了释放CPU

了解进程线程、同步异步、阻塞非阻塞、并发并行

守給你的承諾、 提交于 2020-02-01 17:49:59
基本概念 1 进程和线程 进程(Process): 是Windows系统中的一个基本概念,它包含着一个运行程序所需要的资源。一个正在运行的应用程序在操作系统中被视为一个进程,进程可以包括一个或多个线程。 线程是操作系统分配处理器时间的基本单元,在进程中可以有多个线程同时执行代码。进程之间是相对独立的,一个进程无法访问另一个进程的数据(除非利用分布式计算方式),一个进程运行的失败也不会影响其他进程的运行,Windows系统就是利用进程把工作划分为多个独立的区域的。进程可以理解为一个程序的基本边界。是应用程序的一个运行例程,是应用程序的一次动态执行过程。 线程(Thread): 是进程中的基本执行单元,是操作系统分配CPU时间的基本单位,一个进程可以包含若干个线程,在进程入口执行的第一个线程被视为这个进程的主线程。线程主要是由CPU寄存器、调用栈和线程本地存储器(Thread Local Storage,TLS)组成的。CPU寄存器主要记录当前所执行线程的状态,调用栈主要用于维护线程所调用到的内存与数据,TLS主要用于存放线程的状态信息。 进程和线程的区别 进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。 线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间

LINUX下查看CPU使用率的命令[Z]

怎甘沉沦 提交于 2020-02-01 17:11:07
1.top 使用权限:所有使用者 使用方式:top [-] [d delay] [q] [c] [S] [s] [i] [n] [b] 说明:即时显示process的动态 d :改变显示的更新速度,或是在交谈式指令列( interactive command)按s q :没有任何延迟的显示速度,如果使用者是有superuser的权限,则top将会以最高的优先序执行 c :切换显示模式,共有两种模式,一是只显示执行档的名称,另一种是显示完整的路径与名称S :累积模式,会将己完成或消失的子行程( dead child process )的CPU time累积起来 s :安全模式,将交谈式指令取消,避免潜在的危机 i :不显示任何闲置(idle)或无用(zombie)的行程 n :更新的次数,完成后将会退出top b :批次档模式,搭配"n"参数一起使用,可以用来将top的结果输出到档案内 范例: 显示更新十次后退出; top -n 10 使用者将不能利用交谈式指令来对行程下命令: top -s 将更新显示二次的结果输入到名称为top.log的档案里: top -n 2 -b < top.log 另附一个命令简介 linux traceroutewindows tracert两个命令相当,跟踪网络路由 2.vmstat 正如我们之前讨论的任何系统的性能比较都是基于基线的

LINUX下查看CPU使用率的命令

為{幸葍}努か 提交于 2020-02-01 17:10:09
1.top 使用权限:所有使用者 使用方式:top [-] [d delay] [q] [c] [S] [s] [i] [n] [b] 说明:即时显示process的动态 d :改变显示的更新速度,或是在交谈式指令列( interactive command)按s q :没有任何延迟的显示速度,如果使用者是有superuser的权限,则top将会以最高的优先序执行 c :切换显示模式,共有两种模式,一是只显示执行档的名称,另一种是显示完整的路径与名称S :累积模式,会将己完成或消失的子行程( dead child process )的CPU time累积起来 s :安全模式,将交谈式指令取消,避免潜在的危机 i :不显示任何闲置(idle)或无用(zombie)的行程 n :更新的次数,完成后将会退出top b :批次档模式,搭配"n"参数一起使用,可以用来将top的结果输出到档案内 范例: 显示更新十次后退出; top -n 10 使用者将不能利用交谈式指令来对行程下命令: top -s 将更新显示二次的结果输入到名称为top.log的档案里: top -n 2 -b < top.log 另附一个命令简介 linux traceroutewindows tracert两个命令相当,跟踪网络路由 2.vmstat 正如我们之前讨论的任何系统的性能比较都是基于基线的

linux pidstat 命令详解

流过昼夜 提交于 2020-02-01 06:25:11
pidstat 概述 pidstat是sysstat工具的一个命令,用于监控全部或指定进程的cpu、内存、线程、设备IO等系统资源的占用情况。pidstat首次运行时显示自系统启动开始的各项统计信息,之后运行pidstat将显示自上次运行该命令以后的统计信息。用户可以通过指定统计的次数和时间来获得所需的统计信息。 pidstat 安装 pidstat 是sysstat软件套件的一部分,sysstat包含很多监控linux系统状态的工具,它能够从大多数linux发行版的软件源中获得。 在Debian/Ubuntu系统中可以使用下面的命令来安装: apt-get install sysstat CentOS/Fedora/RHEL版本的linux中则使用下面的命令: yum install sysstat pidstat 示例 pidstat 的用法: pidstat [ 选项 ] [ <时间间隔> ] [ <次数> ] 如下图: 常用的参数: -u:默认的参数,显示各个进程的cpu使用统计 -r:显示各个进程的内存使用统计 -d:显示各个进程的IO使用情况 -p:指定进程号 -w:显示每个进程的上下文切换情况 -t:显示选择任务的线程的统计信息外的额外信息 -T { TASK | CHILD | ALL } 这个选项指定了pidstat监控的。TASK表示报告独立的task

pidstat 命令详解(转载)

拈花ヽ惹草 提交于 2020-02-01 05:50:56
转自https://www.jianshu.com/p/3991c0dba094 pidstat 概述 pidstat是sysstat工具的一个命令,用于监控全部或指定进程的cpu、内存、线程、设备IO等系统资源的占用情况。pidstat首次运行时显示自系统启动开始的各项统计信息,之后运行pidstat将显示自上次运行该命令以后的统计信息。用户可以通过指定统计的次数和时间来获得所需的统计信息。 pidstat 安装 pidstat 是sysstat软件套件的一部分,sysstat包含很多监控linux系统状态的工具,它能够从大多数linux发行版的软件源中获得。 在Debian/Ubuntu系统中可以使用下面的命令来安装: apt-get install sysstat CentOS/Fedora/RHEL版本的linux中则使用下面的命令: yum install sysstat pidstat 示例 pidstat 的用法: pidstat [ 选项 ] [ <时间间隔> ] [ <次数> ] 如下图: 常用的参数: -u:默认的参数,显示各个进程的cpu使用统计 -r:显示各个进程的内存使用统计 -d:显示各个进程的IO使用情况 -p:指定进程号 -w:显示每个进程的上下文切换情况 -t:显示选择任务的线程的统计信息外的额外信息 -T { TASK | CHILD | ALL

MTK手机功耗之唤醒源详解

不羁岁月 提交于 2020-01-31 11:59:51
一、手机功耗问题浅析博文 二、Sleep 、suspend 三、SPM (System Power Manager) 四、Deep idle 五、SODI (screen on deep idle) 六、systrace/ftrace 七、wireshark 八、layerdump 九、如何确定阻止进入suspend的原因 十、如何分析wakelock(wakeup source)持锁问题 十一、如何看SPM的状态是否正确 十二、如何查找待机唤醒源 十三、如何找到阻止进入deep idle / SODI的元凶 一、手机功耗问题浅析博文 手机功耗问题直接影响到手机的待机时长,因此,解决功耗问题对于智能机十分必要。 之前有写过一个功耗浅析的文章,可以先参考下: 手机功耗问题浅析博文 二、Sleep 、suspend 这里的suspend确切的说是MCU(ARM )的 suspend,也就是cpu进入Wait for interrupt 状态(WFI);因为对整个系统来说,CPU进WFI是整个系统睡眠的先决条件,我们debug也是从CPU是否进入WFI开始,从Linux的角度来说,CPU进入suspend就是SW完全不跑了,停在suspend workqueue里面。 CPU进入WFI 步骤 : 1 用户空间锁全部释放,2 kernel 空间锁全部释放,3 CPU中所有任务进入挂起队列

多线程面试60题超详解

久未见 提交于 2020-01-31 09:24:54
多线程面试60题 1.多线程有什么用? 2.线程和进程的区别是什么? 3.Java 实现线程有哪几种方式? 4.启动线程方法 start()和 run()有什么区别? 5.怎么终止一个线程? 6.一个线程的生命周期有哪几种状态?它们之间如何流转的? 7.线程中的 wait()和 sleep()方法有什么区别? 8.多线程同步有哪几种方法? 9.什么是死锁?如何避免死锁? 10.多线程之间如何进行通信? 11、线程怎样拿到返回结果? 12、violatile 关键字的作用? 13、新建 T1、T2、T3 三个线程,如何保证它们按顺序执行? 14、怎么控制同一时间只有 3 个线程运行? 15、为什么要使用线程池? 16、常用的几种线程池并讲讲其中的工作原理。 什么是线程池? 线程池的好处 如何提交线程 submit 和 execute 分别有什么区别呢? 如何关闭线程池es.shutdown()? 17、线程池启动线程 submit()和 execute()方法有什么不同? 18、CyclicBarrier 和 CountDownLatch 的区别? 19、什么是活锁、饥饿、无锁、死锁? 20、什么是原子性、可见性、有序性? 21、什么是守护线程?有什么用? 什么是守护线程? 22、一个线程运行时发生异常会怎样? 23、线程 yield()方法有什么用? 24、什么是重入锁? 25

linux stress 压测命令的使用

╄→尐↘猪︶ㄣ 提交于 2020-01-31 08:37:33
一、stress工具安装: 1、获取stress源码安装包(stress-1.0.4.tar.gz) 3、解压并安装 [root@localhost /]#cd /tmp/ [root@localhost tmp]#tar –zxvf stress-1.0.4.tar.gz 4、进入stress-1.0.4文件夹下,编译并安装stress [root@localhost tmp]#cd /tmp/stress-1.0.4/ [root@localhost stress-1.0.4]#./configure [root@localhost stress-1.0.4]# make [root@localhost stress-1.0.4]#make install 默认安装在:/usr/local/bin/stress 二、stress工具使用: 命令:taskset –c 逻辑CPU索引号 stress --timeout 持续时间 --cpu 1 参数说明: -c 服务器逻辑CPU的索引号 --timeout 对CPU施加压力的持续时间 --cpu stress进程数,若值为2,每个stress进程所有消耗的逻辑CPU资源平分 如:对索引为0的逻辑cpu施加压力, 持续30秒 taskset -c 0 stress --timeout 30 --cpu 1 通过top

Java并发67问

守給你的承諾、 提交于 2020-01-31 04:00:54
1. 并发和并行 2. 进程和线程 对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程,打开一个记事本就启动了一个记事本进程,打开两个记事本就启动了两个记事本进程,打开一个Word就启动了一个Word进程。 而在多个进程之间切换的时候,需要进行上下文切换。但是上下文切换势必会耗费一些资源。于是人们考虑,能不能在一个进程中增加一些“子任务”,这样减少上下文切换的成本。比如我们使用Word的时候,它可以同时进行打字、拼写检查、字数统计等,这些子任务之间共用同一个进程资源,但是他们之间的切换不需要进行上下文切换。 在一个进程内部,要同时干多件事,就需要同时运行多个“子任务”,我们把进程内的这些“子任务”称为线程。 随着时间的慢慢发展,人们进一步的切分了进程和线程之间的职责。 把进程当做资源分配的基本单元,把线程当做执行的基本单元,同一个进程的多个线程之间共享资源 3. 类变量,成员变量和局部变量 Java中共有三种变量,分别是类变量、成员变量和局部变量。他们分别存放在JVM的方法区、堆内存和栈内存中 public class Variables { /** * 类变量 */ private static int a ; /** * 成员变量 */ private int b ; /** * 局部变量 * @param c */ public