本地线程

python进程、线程、协程

∥☆過路亽.° 提交于 2019-12-24 11:50:42
python 线程与进程简介 进程与线程的历史 我们都知道计算机是由硬件和软件组成的。硬件中的CPU是计算机的核心,它承担计算机的所有任务。 操作系统是运行在硬件之上的软件,是计算机的管理者,它负责资源的管理和分配、任务的调度。 程序是运行在系统上的具有某种功能的软件,比如说浏览器,音乐播放器等。 每次执行程序的时候,都会完成一定的功能,比如说浏览器帮我们打开网页,为了保证其独立性,就需要一个专门的管理和控制执行程序的数据结构——进程控制块。 进程就是一个程序在一个数据集上的一次动态执行过程。 进程一般由程序、数据集、进程控制块三部分组成。我们编写的程序用来描述进程要完成哪些功能以及如何完成;数据集则是程序在执行过程中所需要使用的资源;进程控制块用来记录进程的外部特征,描述进程的执行变化过程,系统可以利用它来控制和管理进程,它是系统感知进程存在的唯一标志。 在早期的操作系统里,计算机只有一个核心,进程执行程序的最小单位,任务调度采用时间片轮转的抢占式方式进行进程调度。每个进程都有各自的一块独立的内存,保证进程彼此间的内存地址空间的隔离。 随着计算机技术的发展,进程出现了很多弊端,一是进程的创建、撤销和切换的开销比较大,二是由于对称多处理机(对称多处理机(SymmetricalMulti-Processing)又叫SMP,是指在一个计算机上汇集了一组处理器(多CPU)

java中volatile关键字的含义

拟墨画扇 提交于 2019-12-24 11:04:39
在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉。 Java语言是支持多线程的,为了解决线程并发的问题,在语言内部引入了 同步块 和 volatile 关键字机制。 synchronized 同步块大家都比较熟悉,通过 synchronized 关键字来实现,所有加上synchronized 和 块语句,在多线程访问的时候,同一时刻只能有一个线程能够用 synchronized 修饰的方法 或者 代码块。 volatile 用volatile修饰的变量,线程在每次使用变量的时候,都会读取变量修改后的最的值。volatile很容易被误用,用来进行原子性操作。 下面看一个例子,我们实现一个计数器,每次线程启动的时候,会调用计数器inc方法,对计数器进行加一 public class Counter { public static int count = 0; public static void inc() { //这里延迟1毫秒,使得结果明显 try { Thread.sleep(1); } catch (InterruptedException e) { } count++; } public static void main(String[] args) { //同时启动1000个线程

JVM的体系结构

只愿长相守 提交于 2019-12-24 03:12:44
JVM的体系结构图 简介 从图上可以看出JVM启动时按照其配置要求,申请一块内存,并根据JVM规范和实现将内存划分为几个区域。class二进制文件信息将会被放入“方法区”,对象实例将会被放入“java堆”等 类加载器的作用     通过一个类的全限定名来获取描述此类的二进制字节流,并将此类相关信息加载到JVM的方法区,并创建一个 java.lang.Class 对象作为此类的访问接口, class 对象的引用也保存在方法区内,每一个类加载器都有独立的类名称空间。比较两个类是否相等的前提是两个类是由同一个类加载器加载的,否则两个类比不相等。 类加载器分类    从JVM角度来讲,只有两种类加载器:启动类加载器、其他的类加载器。因为前者是JVM虚拟机的一部分,后者是独立于JVM实现的 ,跟细致的分类有以下几种 1.启动类加载器(Bootstrap ClassLoader)   作用:启动类加载器是使用C++语言实现的(HotSpot),负责加载JVM虚拟机运行时所需的基本系统级别的类,如java.lang.String, java.lang.Object等等。启动类加载器(Bootstrap Classloader)会读取 {JRE_HOME}/lib 下的jar包(如 rt.jar)和配置,然后将这些系统类加载到方法区内。 由于类加载器是使用平台相关的底层C/C++语言实现的,

java

廉价感情. 提交于 2019-12-24 00:45:54
第十六章 Java final类不能继承、重写,final方法不能重写,final属性不能变 16.1 JVM 组成 JVM内存大致分为五个区域:方法区、虚拟机栈、本地方法栈、堆、程序计数器 **程序计数器:**记录的是正在执行的虚拟机字节码指令的地址,通过改变程序计数器,java程序才能按顺序、循环、跳转等流程执行各个方法。该区域是所有区域中唯一没有定义内存溢出错误的区域。 **虚拟机栈:**java为每个方法保存状态信息的区域,这里存放的是每个方法中的局部变量、方法出口、动态链接等,著名的栈溢出错误就是在这里发生。 **本地方法栈:**java可以执行非java函数,这些函数的状态信息就保存在这个区域,因此这个区域也有可能发生栈溢出。 **堆:**一块线程共享的存放对象实例和数组的内存区域,线程安全问题的根本原因,也是整个内存区域中最大的一块。 **方法区:**存储已被加载的类信息、常量、静态变量等,著名的常量池就位于这里。 类加载机制 当程序主动使用某个类时,如果该类还未被加载到内存中,则JVM会通过 加载、连接、初始化 3个步骤来对该类进行初始化。如果没有意外,JVM将会连续完成3个步骤,所以有时也把这个3个步骤统称为类加载或类初始化。 **加载:**将类的class文件读入到内存,创建一个类对象的过程,加载的方法有三种: new的方式加载、调用类反射的方法加载

简单看线程死锁

ぐ巨炮叔叔 提交于 2019-12-23 17:13:35
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 如果是本地项目可以自己模拟出死锁,直接执行jvisualvm查看 如果是线上导出 然后本地打开看 点击线程dump 这里说的很清楚线程1等待线程2 ,线程2等待线程1。 补充: jps 列出java进程,类似于ps命令 参数-q可以指定jps只输出进程ID ,不输出类的短名称 参数-m可以用于输出传递给Java进程(主函数)的参数 参数-l可以用于输出主函数的完整路径 参数-v可以显示传递给JVM的参数 jps 6260 Jps 7988 Main 400 jps -q 7988 7152 jps -m jps -m -l jps -m -l -v jinfo 可以用来查看正在运行的Java应用程序的扩展参数,甚至支持在运行时,修改部分参数 -flag <name>:打印指定JVM的参数值 -flag [+|-]<name>:设置指定JVM参数的布尔值 -flag <name>=<value>:设置指定JVM参数的值 显示了新生代对象晋升到老年代对象的最大年龄 jinfo -flag MaxTenuringThreshold 2972 -XX:MaxTenuringThreshold=15 显示是否打印GC详细信息 jinfo -flag PrintGCDetails 2972 -XX:

boost库中thread多线程中的thread_specific_ptr

最后都变了- 提交于 2019-12-23 05:31:35
大多数函数都不是可重入的。这也就是说在某一个线程已经调用了一个函数时,如果你再调用同一个函数,那么这样是不安全的。举例来说,std::strtok就是不可重入的,因为它使用静态变量来保存要被分割成符号的字符串。 一个不可重入的函数通过连续的调用来保存静态变量或者是返回一个指向静态数据的指针,有两种方法可以让不可重用的函数变成可重用的函数。 方法1:就是改变接口,用指针或引用代替原先使用静态数据的地方。比方说,POSIX定义了strok_r,std::strtok中的一个可重入的变量,它用一个额外的char**参数来代替静态数据。这种方法很简单,而且提供了可能的最佳效果。但是这样必须改变公共接口,也就意味着必须改代码。 方法2:不用改变公有接口,而是用本地存储线程(Thread-Locally Storage)来代替静态数据(有时也被成为特殊线程存储,thread-specific storage)。 Boost线程库提供了智能指针boost::thread_specific_ptr来访问本地存储线程。thread_specific_ptr线程局部存储的包装,它可用于封装线程独立的全局变量。每一个线程第一次使用这个智能指针的实例时,它的初值是NULL(所以必须要先检查这个它的值是否为空),在每个线程使用它之前需要new一个对象交给全局的threah_specific_ptr进行管理

JAVA虚拟机JVM的简单认识

泪湿孤枕 提交于 2019-12-22 16:58:02
以前面试的时候经常会被问到Java虚拟机的问题,面试官会问到: ------------你知道虚拟机吗? ------------虚拟机内存机构是什么样的? ------------栈区和堆区的区别你知道吗? ------------虚拟机的类加载机制你知道吗? ------------虚拟机的双亲委派机制你知道吗? ------------java虚拟机的垃圾回收你知道吗? ------------JVM的优化你知道吗?内存优化你知道吗? 等等。。。。。。。。。。不知道!。。。。好,那就先这样吧,我们会过两天通知你面试结果,先回家等着吧。就这样等到了天荒地老,也没有等到面试的结果和通知。 如果你看完这篇文章还不了解虚拟机,面试的时候还被虚拟机的问题问住,我只能说,你没有认真看。 以上内容纯属废话,请看下面: -------------------------------------------------------------------------------------------- 一、java虚拟机的认知 1、JVM是Java Virtual Machine(Java虚拟机)的缩写。 虚拟机,字面理解就是虚拟的计算机。计算机可以安装操作系统吧,所以这个虚拟的计算机里面亦可以安装操作系统,比如Windows、Linux。就可理解成,虚拟机就是一款软件

jvm内存模型

為{幸葍}努か 提交于 2019-12-22 16:57:53
JVM的五大内存区域 1、程序计数器 2、方法区(也称为永久代,后续被Metaspace取代) 3、虚拟机栈 4、本地方法栈 5、堆 1、程序计数器 记录线程的执行位置,线程私有内存 在多线程的情况下,线程被切换回来的时候能够知道该线程上次运行到哪儿了 2、方法区 方法区是所有线程共享的内存区域,用于存储已被虚拟机加载的类信息、常量、静态变量 放在永久代中经常会出现内存溢出,即PermGen Space异常,所以用元空间取而代之 元空间直接使用本地内存,理论上电脑有多少内存它就可以使用多少内存,所以不会再出现PermGen Space异常 java虚拟机对方法区比较宽松,可以选择不实现垃圾收集 3、虚拟机栈(stack) 每个线程都有各自的Java虚拟机栈,而且随着线程的创建而创建,随着线程的死亡而死亡. Java虚拟机栈会为每一个即将运行的Java方法创建“栈帧”,用于存储局部变量表、操作栈、动态连接、方法返回地址等 每个方法从开始调用到执行完成的过程,就是栈帧从入栈到出栈的过程 如果方法A调用了方法B,那么A就会先入栈创建一个栈桢,接着B再入栈成为栈顶,B执行完先出栈,接着A执行完出栈。 Java虚拟机栈可能出现两种类型的异常: 1、线程请求的栈深度大于虚拟机允许的栈深度,将抛出StackOverflowError。 2、虚拟机栈空间可以动态扩展

HTML5中Js多线程编程

本秂侑毒 提交于 2019-12-22 00:53:33
Web Worker Web Worker 是 HTML5 提出的新标准,为 JavaScript 创造多线程环境,允许主线程创建 Worker 线程,将一些任务分配给后者运行。在主线程运行的同时,Worker 线程在后台运行,两者互不干扰。等到 Worker 线程完成计算任务,再把结果返回给主线程。这样的好处是,一些计算密集型或高延迟的任务,被 Worker 线程负担了,主线程(通常负责 UI 交互)就会很流畅,不会被阻塞或拖慢。 注意 1.性能上要注意 Worker 线程一旦新建成功,就会始终运行,不会被主线程上的活动(比如用户点击按钮、提交表单)打断。这样有利于随时响应主线程的通信。但是,这也造成了 Worker 比较耗费资源,不应该过度使用,而且一旦使用完毕,就应该关闭。 2.同源限制 分配给 Worker 线程运行的脚本文件,必须与主线程的脚本文件同源。 3.DOM限制 Worker 线程所在的全局对象,与主线程不一样,无法读取主线程所在网页的 DOM 对象,也无法使用 document 、 window 、 parent 这些对象。但是,Worker 线程可以 navigator 对象和 location 对象。 4.通信联系 Worker 线程和主线程不在同一个上下文环境,它们不能直接通信,必须通过消息完成。 5.脚本限制 Worker 线程不能执行 alert()

java 里面保留字volatile及其与synchronized的区别

て烟熏妆下的殇ゞ 提交于 2019-12-21 23:43:10
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 最近在读java并发编程相关的书籍,蚂蚁金服团队的杰作,可以好好把java并发相关的内容好好研究一下 要理解volatile和synchronized的区别,首先还是需要来理解下java的内存模型 java内存模型 java中,线程之间的通信是通过 共享内存 的方式,存储在堆中的实例域,静态域以及数组元素都可以在线程间通信。java内存模型控制一个线程对共享变量的改变何时对另一个线程可见。 线程间的共享变量存在主内存中,而对于每一个线程,都有一个私有的工作内存 。工作内存是个虚拟的概念,涵盖了缓存,写缓冲区,寄存器以及其他的硬件和编译器优化,总之就是指线程的本地内存。存在线程本地内存中的变量值对其他线程是不可见的。 如果线程A与线程B之间如要通信的话,必须要经历下面2个步骤,如图所示: 1. 首先,线程A把本地内存A中更新过的共享变量刷新到主内存中去。 2. 然后,线程B到主内存中去读取线程A之前已更新过的共享变量。 关于volatile变量 由于java的内存模型中有工作内存和主内存之分,所以可能会有两种问题: (1)线程可能在工作内存中更改变量的值,而没有及时写回到主内存,其他线程从主内存读取的数据仍然是老数据 (2)线程在工作内存中更改了变量的值,写回主内存了,但是其他线程之前也读取了这个变量的值