cpu时间

高并发编程

浪子不回头ぞ 提交于 2020-01-13 03:35:43
(一)高并发编程基础知识 这里涉及到一些基础的概念,我重新捧起了一下《实战 Java 高并发程序设计》这一本书,感觉到心潮澎湃,这或许就是笔者叙述功底扎实的魅力吧,喜欢。对于并发的基础可以参照一下我之前写过的一篇博文: Java学习笔记(4)——并发基础 1)多线程和单线程的区别和联系? 答: 在单核 CPU 中,将 CPU 分为很小的时间片,在每一时刻只能有一个线程在执行,是一种微观上轮流占用 CPU 的机制。 多线程会存在线程上下文切换,会导致程序执行速度变慢,即采用一个拥有两个线程的进程执行所需要的时间比一个线程的进程执行两次所需要的时间要多一些。 结论:即采用多线程不会提高程序的执行速度,反而会降低速度,但是对于用户来说,可以减少用户的响应时间。 面试官:那使用多线程有什么优势? 解析:尽管面临很多挑战,多线程有一些优点仍然使得它一直被使用,而这些优点我们应该了解。 答: (1)资源利用率更好 想象一下,一个应用程序需要从本地文件系统中读取和处理文件的情景。比方说,从磁盘读取一个文件需要5秒,处理一个文件需要2秒。处理两个文件则需要: 1| 5秒读取文件A 2| 2秒处理文件A 3| 5秒读取文件B 4| 2秒处理文件B 5| --------------------- 6| 总共需要14秒 从磁盘中读取文件的时候,大部分的CPU时间用于等待磁盘去读取数据。在这段时间里

【多线程的优点和代价】

不问归期 提交于 2020-01-13 03:24:38
尽管面临很多挑战,多线程有一些优点使得它一直被使用。这些优点是:   ● 资源利用率更好   ● 程序设计在某些情况下更简单   ● 程序响应更快   资源利用率更好   想象一下,一个应用程序需要从本地文件系统中读取和处理文件的情景。比方说,从磁盘读取一个文件需要5秒,处理一个文件需要2秒。处理两个文件则需要: 5秒读取文件A 2秒处理文件A 5秒读取文件B 2秒处理文件B --------------------- 总共需要14秒   从磁盘中读取文件的时候,大部分的CPU时间用于等待磁盘去读取数据。在这段时间里,CPU非常的空闲。它可以做一些别的事情。通过改变操作的顺序,就能够更好的使用CPU资源。看下面的顺序: 5秒读取文件A 5秒读取文件B + 2秒处理文件A 2秒处理文件B --------------------- 总共需要12秒   CPU等待第一个文件被读取完。然后开始读取第二个文件。当第二文件在被读取的时候,CPU会去处理第一个文件。记住,在等待磁盘读取文件的时候,CPU大部分时间是空闲的。   总的说来,CPU能够在等待IO的时候做一些其他的事情。这个不一定就是磁盘IO。它也可以是网络的IO,或者用户输入。通常情况下,网络和磁盘的IO比CPU和内存的IO慢的多。   程序设计更简单   在单线程应用程序中,如果你想编写程序手动处理上面所提到的读取和处理的顺序

多线程的优点和代价

核能气质少年 提交于 2020-01-13 03:23:59
尽管面临很多挑战,多线程有一些优点使得它一直被使用。这些优点是: 资源利用率更好 程序设计在某些情况下更简单 程序响应更快 资源利用率更好 想象一下,一个应用程序需要从本地文件系统中读取和处理文件的情景。比方说,从磁盘读取一个文件需要5秒,处理一个文件需要2秒。处理两个文件则需要: 5秒读取文件A 2秒处理文件A 5秒读取文件B 2秒处理文件B --------------------- 总共需要14秒 从磁盘中读取文件的时候,大部分的CPU时间用于等待磁盘去读取数据。在这段时间里,CPU非常的空闲。它可以做一些别的事情。通过改变操作的顺序,就能够更好的使用CPU资源。看下面的顺序: 5秒读取文件A 5秒读取文件B + 2秒处理文件A 2秒处理文件B --------------------- 总共需要12秒 CPU等待第一个文件被读取完。然后开始读取第二个文件。当第二文件在被读取的时候,CPU会去处理第一个文件。记住,在等待磁盘读取文件的时候,CPU大部分时间是空闲的。 总的说来,CPU能够在等待IO的时候做一些其他的事情。这个不一定就是磁盘IO。它也可以是网络的IO,或者用户输入。通常情况下,网络和磁盘的IO比CPU和内存的IO慢的多。 程序设计更简单 在单线程应用程序中,如果你想编写程序手动处理上面所提到的读取和处理的顺序,你必须记录每个文件读取和处理的状态。相反

Linux系统之进程状态

让人想犯罪 __ 提交于 2020-01-13 02:50:44
  一、进程状态      1、R (TASK_RUNNING),可执行状态      2、S (TASK_INTERRUPTIBLE),可中断的睡眠状态      3、D (TASK_UNINTERRUPTIBLE),不可中断的睡眠状态      4、T/t (TASK_STOPPED or TASK_TRACED),暂停状态或跟踪状态      5、Z (TASK_DEAD - EXIT_ZOMBIE),退出状态,进程成为僵尸进程      6、X (TASK_DEAD - EXIT_DEAD),退出状态,进程即将被销毁      7、查看进程状态      二、进程状态转换      1、进程初始状态      2、进程状态变迁      三、进程调度      四、参考      一、进程状态↑      D:uninterruptible sleep (usually IO)      R:running or runnable (on run queue)      S:interruptible sleep (waiting for an event to complete)      T:stopped by job control signal      t:stopped by debugger during the tracing      W:paging

CentOS查看CPU、内存、网络流量和磁盘 I/O【详细】

佐手、 提交于 2020-01-13 01:13:09
安装 yum install -y sysstat sar -d 1 1 rrqm/s: 每秒进行 merge 的读操作数目。即 delta(rmerge)/s wrqm/s: 每秒进行 merge 的写操作数目。即 delta(wmerge)/s r/s: 每秒完成的读 I/O 设备次数。即 delta(rio)/s w/s: 每秒完成的写 I/O 设备次数。即 delta(wio)/s rsec/s: 每秒读扇区数。即 delta(rsect)/s wsec/s: 每秒写扇区数。即 delta(wsect)/s rkB/s: 每秒读K字节数。是 rsect/s 的一半,因为每扇区大小为512字节。(需要计算) wkB/s: 每秒写K字节数。是 wsect/s 的一半。(需要计算) avgrq-sz: 平均每次设备I/O操作的数据大小 (扇区)。delta(rsect+wsect)/delta(rio+wio) avgqu-sz: 平均I/O队列长度。即 delta(aveq)/s/1000 (因为aveq的单位为毫秒)。 await: 平均每次设备I/O操作的等待时间 (毫秒)。即 delta(ruse+wuse)/delta(rio+wio) svctm: 平均每次设备I/O操作的服务时间 (毫秒)。即 delta(use)/delta(rio+wio) %util:

协程Coroutine

旧时模样 提交于 2020-01-12 23:47:36
协程是一种用户态的轻量级线程 。 server的发展如下: IO密集型应用: 多进程->多线程->事件驱动->协程 CPU密集型应用:多进程-->多线程 如果说多进程对于多CPU,多线程对应多核CPU,那么事件驱动和协程则是在充分挖掘不断提高性能的单核CPU的潜力。 异步事件驱动模型中,把会导致阻塞的操作转化为一个异步操作,主线程负责发起这个异步操作,并处理这个异步操作的结果。由于所有阻塞的操作都转化为异步操作,理论上主线程的大部分时间都是在处理实际的计算任务,少了多线程的调度时间,所以这种模型的性能通常会比较好。总的说来,当单核cpu性能提升,cpu不在成为性能瓶颈时,采用异步server能够简化编程模型,也能提高IO密集型应用的性能。 协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈。因此: 协程能保留上一次调用时的状态(即所有局部状态的一个特定组合),每次过程重入时,就相当于进入上一次调用的状态,换种说法:进入上一次离开时所处逻辑流的位置。 在并发编程中,协程与线程类似,每个协程表示一个执行单元,有自己的本地数据,与其它协程共享全局数据和其它资源。目前主流语言基本上都选择了多线程作为并发设施,与线程相关的概念是抢占式多任务(Preemptive multitasking),而与协程相关的是

当CPU没有任务的时候该搞点啥

巧了我就是萌 提交于 2020-01-12 15:44:18
CPU没有任务时,认为内核把什么都不做作为一件简单的任务是合理的,但事实却并非如此。在Kernel Recipes 2018,Rafael Wysocki讨论了当CPU没事儿的时候干啥,内核如何处理,在当前阶段存在的问题,以及他最近重做的内核idle loop对非工作中的系统的省电性的提升。 idle loop(在内核的空闲循环,也是空闲任务,空闲也是任务)是Wysocki维护的一个内核子系统,控制CPU在没有任务的时候做的事。为了方便讨论,Wysocki先提出了定义:对于一个CPU就是一个能够从内存取指令并在其他CPU执行指令的同时执行指令的实体。在一个简单的单核单指令流系统,此核即CPU;如果处理器有多个核,那么每个核都是一个CPU。如果每个核都为同步指令expose多个接口,也就是Inter所谓的超线程,那么每一个超线程都是一个CPU。 一个CPU没task运行的时候,就是idle。更精确的说,linux内核的内部调度类,包含特殊的idle类。如果在这些调度类中都没有任务,则CPU被认为是idle,如果硬件没有对此没啥考虑,则CPU就会执行无用的指令直到有任务需要它做。无论如何,这都是浪费电,所以大多数CPU都支持由内核操作进入一些低耗电状态,直到它们需要执行任务。 idle状态的进入或退出不是没有消耗的。进入或退出都需要一些时间,并且耗电较普通状态也会有短暂上升

JVM之GC算法的实现(垃圾回收器)

こ雲淡風輕ζ 提交于 2020-01-12 14:33:21
上一节: 《JVM之GC算法》 知道GC算法的理论基础,我们来看看具体的实现。只有落地的理论,才是真理。 一、JVM垃圾回收器的结构 JVM虚拟机规范对垃圾收集器应该如何实现没有规定,因为没有最好的垃圾收集器,只有最适合的场景。 图中展示了7种作用于不同分代的收集器,如果两个收集器之间存在连线,则说明它们可以搭配使用。虚拟机所处的区域则表示它是属于新生代还是老年代收集器。 7种:serial收集器、parnew收集器、parallel scavenge收集器、serial old 收集器、parallel old收集器、cms收集器、g1收集器(整堆收集器)、 串行收集:单垃圾收集线程,进行收集工作,用户进程需要等待 并行收集:工作原理与串行一样,只是在收集垃圾时是多条线程同时进行,收集的效率在一般情况下自然高于单线程。 并发收集:指用户线程与垃圾收集线程同时工作(并发:同一时间间隔)。用户程序在继续运行,而垃圾收集程序运行在另一个CPU上。 吞吐量:吞吐量就是CPU中用于运行用户代码的时间与CPU总消耗时间的比值(吞吐量 = 运行用户代码时间 / (运行用户代码时间 + 垃圾收集时间)) 1、Serial收集器 Serial(串行)收集器:最基本,最古老的收集器,只有一个线程进行垃圾收集器的工作,并且在进行垃圾收集工作时需要暂停其他工作线程(stop the word)

CentOS查看CPU、内存、网络流量和磁盘 I/O

我是研究僧i 提交于 2020-01-12 12:22:35
安装 yum install -y sysstat sar -d 1 1 rrqm/s: 每秒进行 merge 的读操作数目。即 delta(rmerge)/s wrqm/s: 每秒进行 merge 的写操作数目。即 delta(wmerge)/s r/s: 每秒完成的读 I/O 设备次数。即 delta(rio)/s w/s: 每秒完成的写 I/O 设备次数。即 delta(wio)/s rsec/s: 每秒读扇区数。即 delta(rsect)/s wsec/s: 每秒写扇区数。即 delta(wsect)/s rkB/s: 每秒读K字节数。是 rsect/s 的一半,因为每扇区大小为512字节。(需要计算) wkB/s: 每秒写K字节数。是 wsect/s 的一半。(需要计算) avgrq-sz: 平均每次设备I/O操作的数据大小 (扇区)。delta(rsect+wsect)/delta(rio+wio) avgqu-sz: 平均I/O队列长度。即 delta(aveq)/s/1000 (因为aveq的单位为毫秒)。 await: 平均每次设备I/O操作的等待时间 (毫秒)。即 delta(ruse+wuse)/delta(rio+wio) svctm: 平均每次设备I/O操作的服务时间 (毫秒)。即 delta(use)/delta(rio+wio) %util:

理解进程

白昼怎懂夜的黑 提交于 2020-01-12 10:24:43
计算机系统中最著名的冯诺依曼体系包括输入输出设备、cpu、存储器。 1.cpu:cpu作为计算机的运算中心主要工作就是完成一些运算,在我们现在的生活中一台设备中会包含不止一个cpu,与此同时cpu也具有一定的存储功能,但是存储量很小,cpu中的寄存器就发挥着这样的作用,他们的特点是空间小、访问快。 2.存储器 ①内存: 存储大小相对外存小,cpu可以直接访问、速度快、断电后数据不会被保存 ②外存: 存储空间相对于内存大、cpu不能直接访问,必须要先加载到内存中才能访问、访问速度慢、断电后数据会被保存 比如说有一个可执行程序,那么实际上它是在外存中存放的,只有在执行它的时候才会被加载到内存,这个时候如果我们删除它是不会影响它的执行的。 那么什么又是操作系统呢? 我们讨论的Linux就是一个操作系统,简单来说就是一个管理硬件和软件资源的东西。我们可以用一张图来理解一下: 通过这张图我们可以将这些部分简单的分成三个部分:用户接口即用户部分、系统调用操作系统以及驱动程序代表的是系统软件部分、底层硬件即硬件部分,从这个图我们就可以看到操作系统是怎么将软硬件和用户部分管理起来的,它其实就是起着一个桥梁的作用。 同样我们也要理解系统调用和库函数的概念: 在开发角度,操作系统对外会表现为一个整体,但是会暴露自己的部分接口,供上层开发使用,这部分由操作系统提供的接口,叫做系统调用。 系统调用在使用上