cpu时间

Python36 多线程、多进程的使用场景

对着背影说爱祢 提交于 2020-01-07 23:45:19
多线程与多进程的使用场景 io 操作不占用CPU(从硬盘、从网络、从内存读数据都算io) 计算占用CPU(如1+1计算) python中的线程是假线程,不同线程之间的切换是需要耗费资源的,因为需要存储线程的上下文,不断的切换就会耗费资源。。 python多线程适合io操作密集型的任务(如socket server 网络并发这一类的); python多线程不适合cpu密集操作型的任务,主要使用cpu来计算,如大量的数学计算。 那么如果有cpu密集型的任务怎么办,可以通过多进程来操作(不是多线程)。 假如CPU有8核,每核CPU都可以用1个进程,每个进程可以用1个线程来进行计算。 进程之间不需要使用gil锁,因为进程是独立的,不会共享数据。 进程可以起很多个,但是8核CPU同时只能对8个任务进行操作。 多进程 测试多进程 import multiprocessing import time def run(name): time.sleep(2) print ('heelo',name) if __name__ == '__main__': for i in range(10): #起了10个进程 p = multiprocessing.Process(target=run,args=('bob%s' %i,)) p.start() 执行结果: heelo bob1 heelo

[转] Linux系统之进程状态

放肆的年华 提交于 2020-01-07 21:07:10
转自: https://www.cnblogs.com/littlecharacter/p/12154588.html 一、进程状态 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 (not valid since the 2.6.xx kernel) X:dead (should never be seen) Z:defunct ("zombie") process, terminated but not - reaped by its parent 1、R (TASK_RUNNING),可执行状态 只有在该状态的进程才可能在CPU上运行。而同一时刻可能有多个进程处于可执行状态,这些进程的task_struct结构(进程控制块)被放入对应CPU的可执行队列中(一个进程最多只能出现在一个CPU的可执行队列中)。进而,进程调度器就从各个CPU的可执行队列中分别选择一个进程在该CPU上运行。

volatile底层原理

独自空忆成欢 提交于 2020-01-07 17:41:37
前言 我们知道volatile关键字的作用是保证变量在多线程之间的可见性,它是java.util.concurrent包的核心,没有volatile就没有这么多的并发类给我们使用。 本文详细解读一下volatile关键字如何保证变量在多线程之间的可见性,在此之前,有必要讲解一下CPU缓存的相关知识,掌握这部分知识一定会让我们更好地理解volatile的原理,从而更好、更正确地地使用volatile关键字。 CPU缓存 CPU缓存的出现主要是为了解决CPU运算速度与内存读写速度不匹配的矛盾 ,因为CPU运算速度要比内存读写速度快得多,举个例子: 一次主内存的访问通常在几十到几百个时钟周期 一次L1高速缓存的读写只需要1~2个时钟周期 一次L2高速缓存的读写也只需要数十个时钟周期 这种访问速度的显著差异,导致CPU可能会花费很长时间等待数据到来或把数据写入内存。 基于此,现在CPU大多数情况下读写都不会直接访问内存(CPU都没有连接到内存的管脚),取而代之的是CPU缓存,CPU缓存是位于CPU与内存之间的临时存储器,它的容量比内存小得多但是交换速度却比内存快得多。而缓存中的数据是内存中的一小部分数据,但这一小部分是短时间内CPU即将访问的,当CPU调用大量数据时,就可先从缓存中读取,从而加快读取速度。 按照读取顺序与CPU结合的紧密程度,CPU缓存可分为: 一级缓存:简称L1

进程/线程绑定到特定CPU核的linux实现(有代码有实例)

▼魔方 西西 提交于 2020-01-07 17:01:05
前言 现在计算机上的CPU大多都是多核的,有4核甚至是8核的。但是一个计算机启动之后其进程数是远远多于CPU核数的,因为操作系统会给自动调度这些进程在CPU核上轮流运行。但是对于应用程序或者进程,其性能要求较高时,可能有必要绑定该进程到指定的CPU核来运行,避免调度带来的额外开销。我自己也是因为最近的项目上有需要进程运行在指定的CPU核上的要求,所以了解了一下这项技术,并且将过程和总结记录于此。 CPU亲和性 在学习这项新技术之前,我们先来了解一下什么是CPU亲和性?所谓亲和性,就是把进程在指定的 CPU 上尽量长时间地运行而不被迁移到其他处理器,也称为CPU关联性;再简单的点的描述就将制定的进程或线程绑定到相应的cpu上;在多核运行的机器上,每个CPU本身自己会有缓存,缓存着进程使用的信息,而进程可能会被OS调度到其他CPU上,如此,CPU cache命中率就低了,当绑定CPU后,程序就会一直在指定的cpu跑,不会由操作系统调度到其他CPU上,性能有一定的提高。 预备知识 在编写测试程序之前,我们先来了解一下CPU相关的宏和函数。 1.首先要想使用CPU系列函数及相关的宏,需要声明下面的宏,以告诉编译器启用这些函数 # define _GNU_SOURCE 2.声明一个cpu_set_t,然后用 CPU_ZERO()宏来初始化数据: cpu_set_t mask ; CPU

JVM探秘:垃圾收集器

不想你离开。 提交于 2020-01-07 16:42:16
本系列笔记主要基于《深入理解Java虚拟机:JVM高级特性与最佳实践 第2版》,是这本书的读书笔记。 垃圾收集器 垃圾收集算法是是内存回收的方法论,垃圾收集器是内存回收的具体实现。不同的虚拟机会有不同的垃圾收集器的实现,我们主要讨论的是默认的HotSpot虚拟机,这个虚拟机包含的垃圾收集器如下图; 如上图所示,一共有7种垃圾收集器,如果两个垃圾收集器之间有双箭头连线,则两个垃圾收集器可搭配使用。上面是新生代的收集器,下面是老年代的收集器。每个垃圾收集器都有各自适合的使用场景。 Serial 收集器 Serial 是一个“单线程”的 新生代 收集器,使用 复制 算法,它只会使用一个CPU或者一条收集器线程去完成垃圾收集工作,并且它在垃圾收集时,必须 暂停所有其他的工作线程 ,直到它收集结束。“Stop The World”会在用户不可见的情况下,把用户的工作线程全部停掉,这往往是令人难以接受的。 下图是 Serial/Serial Old 收集器运行示意图: 上图中,新生代是 Serial 收集器采用 复制 算法,老年代是 Serial Old 收集器采用 标记-整理 算法。Serial虽然是一个缺点鲜明的收集器,但它依然是虚拟机在Client模式下的默认收集器,它也有优点,比如简单高效(与其他收集器单线程相比),对于单个CPU来说,Serial由于没有线程交互的开销,效率比较高

Linux系统之进程状态

最后都变了- 提交于 2020-01-07 15:52:11
一、进程状态 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 (not valid since the 2.6.xx kernel) X:dead (should never be seen) Z:defunct ("zombie") process, terminated but not - reaped by its parent 1、R (TASK_RUNNING),可执行状态 只有在该状态的进程才可能在CPU上运行。而同一时刻可能有多个进程处于可执行状态,这些进程的task_struct结构(进程控制块)被放入对应CPU的可执行队列中(一个进程最多只能出现在一个CPU的可执行队列中)。进而,进程调度器就从各个CPU的可执行队列中分别选择一个进程在该CPU上运行。 很多操作系统教科书将正在CPU上执行的进程定义为RUNNING状态、而将可执行但是尚未被调度执行的进程定义为READY状态

关于线程

旧城冷巷雨未停 提交于 2020-01-07 13:22:06
CPU时间片轮转机制 多线程代码注意上下文的切换,切换时间多长,效率并不见得加快。 CPU核心数和线程数有关系 进程和线程 进程是程序运行资源分配的最小单位 一个进程有多个线程,多个线程共享该进程的资源 多个进程是相互独立的 线程是CPU分配的最小单位 并行和并发 食堂有八个窗口提供购餐,那么这个食堂并行为8,对比8核CPU 并发指的是某个时间段内同时可以处理多少任务 8核的CPU把1秒钟,切割成100毫秒,那么可以处理的并发量为8*10=80 高并发编程利与弊 充分利用好CPU的资源 共享资源,存在冲突,死锁,太多的线程有可能搞垮机器,有可能造成内存溢出 来源: CSDN 作者: Kid_TH 链接: https://blog.csdn.net/ACM_TH/article/details/103869556

Java 多线程基础

ⅰ亾dé卋堺 提交于 2020-01-07 13:18:39
Java 多线程基础 Java使用多线程进行并发编程。 一、进程、线程、协程、守护线程 进程 : 是指一个内存中运行的应用程序,每个进程都有一个独立的内存空间,一个应用程序可以同时运行多个进程;进程也是程序的一次执行过程,是系统运行程序的基本单位;系统运行一个程序即是一个进程从创建、运行到消亡的过程。 线程 : 线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程。一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序。 协程: 协同线程,某个线程为主线程,其他线程辅助它。主线程结束,辅助线程直接结束。主线程存活,其他线程才可以执行任务,类似于java中的守护线程。 守护线程: Java使用多线程并发,也有守护线程的辅助。 状态: 线程和进程一样分为五个阶段:创建、就绪、运行、阻塞、终止。 优先级: 线程之间也有优先级,优先级高的先执行(并非绝对)。 线程竞争资源,执行结果不确定,优先级也不一定靠谱,每次执行由cpu调度资源。 可以通过加锁进行人为控制。 二、Java创建线程 Java创建线程的方法有三种,一种是继承Thread类,另外一种是实现Runable接口,最后一种不谈。 1、继承Thread类创建线程 重写run()方法、使用start()方法开启线程。 //继承Thread类实现多线程 public class ThreadDemo

[转帖]最全列表: 80 多个 Linux 系统管理员必备的监控工具

早过忘川 提交于 2020-01-07 12:53:39
最全列表: 80 多个 Linux 系统管理员必备的监控工具 https://linux.cn/article-6987-1.html 作者: Jonathan Sundqvist 译者: LCTT struggling | 2016-02-07 23:43 评论: 5 收藏: 26 随着互联网行业的不断发展,各种监控工具多得不可胜数。这里列出网上最全的监控工具。让你可以拥有超过80种方式来管理你的机器。在本文中,我们主要包括以下方面: 命令行工具 网络相关内容 系统相关的监控工具 日志监控工具 基础设施监控工具 监控和调试性能问题是一个艰巨的任务,但用对了正确的工具有时也是很容易的。下面是一些你可能听说过的工具,也有可能没有听说过——何不赶快开始试试? 八大系统监控工具 1. top 这是一个被预装在许多 UNIX 系统中的小工具。当你想要查看在系统中运行的进程或线程时:top 是一个很好的工具。你可以对这些进程以不同的方式进行排序,默认是以 CPU 进行排序的。 2. htop htop 实质上是 top 的一个增强版本。它更容易对进程排序。它看起来上更容易理解,并且已经内建了许多通用操作。它也是完全交互式的。 3. atop atop 和 top,htop 非常相似,它也能监控所有进程,但不同于 top 和 htop 的是,它可以按日记录进程的日志供以后分析

socket选项 SO_REUSEPORT

自古美人都是妖i 提交于 2020-01-07 12:38:51
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 前言 本篇用于记录学习SO_REUSEPORT的笔记和心得,末尾还会提供一个bindp小工具也能为已有的程序享受这个新的特性。 当前Linux网络应用程序问题 运行在Linux系统上网络应用程序,为了利用多核的优势,一般使用以下比较典型的多进程/多线程服务器模型: 单线程listen/accept,多个工作线程接收任务分发,虽CPU的工作负载不再是问题,但会存在: 单线程listener,在处理高速率海量连接时,一样会成为瓶颈 CPU缓存行丢失套接字结构(socket structure)现象严重 所有工作线程都accept()在同一个服务器套接字上呢,一样存在问题: 多线程访问server socket锁竞争严重 高负载下,线程之间处理不均衡,有时高达3:1不均衡比例 导致CPU缓存行跳跃(cache line bouncing) 在繁忙CPU上存在较大延迟 上面模型虽然可以做到线程和CPU核绑定,但都会存在: 单一listener工作线程在高速的连接接入处理时会成为瓶颈 缓存行跳跃 很难做到CPU之间的负载均衡 随着核数的扩展,性能并没有随着提升 比如HTTP CPS(Connection Per Second)吞吐量并没有随着CPU核数增加呈现线性增长: Linux kernel 3.9带来了SO