cpu时间

Java synchronized 关键字的实现原理

╄→尐↘猪︶ㄣ 提交于 2020-03-29 11:14:29
数据同步需要依赖锁,那锁的同步又依赖谁?synchronized给出的答案是在软件层面依赖JVM,而Lock给出的方案是在硬件层面依赖特殊的CPU指令,大家可能会进一步追问:JVM底层又是如何实现synchronized的? 本文所指说的JVM是指Hotspot的6u23版本,下面首先介绍synchronized的实现: synrhronized关键字简洁、清晰、语义明确,因此即使有了Lock接口,使用的还是非常广泛。其应用层的语义是可以把任何一个非null 对象 作为"锁",当synchronized作用在方法上时,锁住的便是对象实例(this);当作用在静态方法时锁住的便是对象对应的Class实例,因为 Class数据存在于永久带,因此静态方法锁相当于该类的一个全局锁;当synchronized作用于某一个对象实例时,锁住的便是对应的代码块。在 HotSpot JVM实现中,锁有个专门的名字:对象监视器。 1. 线程状态及状态转换 当多个线程同时请求某个对象监视器时,对象监视器会设置几种状态用来区分请求的线程: Contention List:所有请求锁的线程将被首先放置到该竞争队列 Entry List:Contention List中那些有资格成为候选人的线程被移到Entry List Wait Set:那些调用wait方法被阻塞的线程被放置到Wait Set OnDeck

时钟中断周期对操作系统整体实时性的影响分析

怎甘沉沦 提交于 2020-03-29 03:58:14
时钟中断是操作系统最重要的中断,操作系统内核依靠时钟中断完成时间片计算和分配、定时等管理工作,是分时机制实现的基础。可以说如果没有时钟中断,操作系统将无法正常运行。时钟中断由专门的时钟芯片产生,比如PC机上的8253芯片。大多数的操作系统实现,时钟中断周期会维持在10ms到100ms之间,比如Windows操作系统,其时钟中断周期一般为10ms或者20ms。表面上看,似乎时钟中断周期越短,系统的实时性越好,因为进程或线程的运行时间片会被控制的越精确,优先级高的进程或线程会优先得到运行。但仔细分析起来,会发现实际并不是这么回事,时钟中断周期的大小与系统整体实时性关系并不十分紧密。 可用两个指标来衡量操作系统的实时性:一个是中断响应时间,即从外部中断发生,到得到操作系统处理之间的时间;另外一个是任务切入时间,即一个高优先级的线程运行所需的资源就绪,到得到调度所需的时间。时钟中断周期的大小,与这两个指标并无直接关联。 首先看中断响应时间,这个时间与硬件系统关联紧密。中断一般由外部设备引发,外部设备的控制电路连接到计算机的中断控制器上(比如PC的8259A芯片)。一旦外部设备发生中断,设备会通过一条中断引脚通知中断控制器,中断控制器根据输入引脚的状态(比如是否禁止引发中断)、输入引脚的优先级、连接到片上的其它中断引脚的情况,综合判断是否需要对该中断进行处理。如果判断结果为进一步处理

操作系统简史

南楼画角 提交于 2020-03-28 23:10:39
目录 操作系统简史 多进程的实现原理 -- 多道技术 操作系统简介 操作系统的两个核心作用 操作系统与应用程序的区别 操作系统法发展简史 第一代计算机(1940~1955):真空管和穿孔卡片 第二代计算机(1955~1965):晶体管和批处理系统 第三代计算机(1965~1980):集成电路芯片和多道程序设计 第四代计算机(1980~至今):个人计算机 操作系统简史 多进程的实现原理 -- 多道技术 操作系统简介 操作系统是位于应用软件和硬件设备之间,本质上也是一个软件,由系统内核(管理所有硬件资源)与系统接口(提供给程序员使用的接口)组成操作系统是为方便用户操作计算机而提供的一个运行在硬件之上的软件 操作系统的两个核心作用 为用户屏蔽了复杂繁琐的硬件接口,为应用程序提供了,清晰易用的系统接口 有了这些接口以后程序员不用再直接与硬件打交道了 例子:有了操作系统后我们就可以使用资源管理器来操作硬盘上的数据,而不用操心,磁头的移动啊,数据的读写等等 操作系统将应用程序对硬件资源的竞争变成有序的使用 例子:所有软件 qq啊 微信啊 吃鸡啊都共用一套硬件设备 假设现有三个程序都在使用打印机,如果不能妥善管理竞争问题,可能一个程序打印了一半图片后,另一个程序抢到了打印机执行权于是打印了一半文本,导致两个程序的任务都没能完成,操作系统的任务就是将这些无序的操作变得有序 操作系统与应用程序的区别

Linux CPU实时监控mpstat命令详解

帅比萌擦擦* 提交于 2020-03-28 20:11:31
简介 mpstat是Multiprocessor Statistics的缩写,是实时系统监控工具。其报告与CPU的一些统计信息,这些信息存放在/proc/stat文件中。在多CPUs系统里,其不但能查看所有CPU的平均状况信息,而且能够查看特定CPU的信息。mpstat最大的特点是:可以查看多核心cpu中每个计算核心的统计数据;而类似工具vmstat只能查看系统整体cpu情况。 语法 mpstat [-P {|ALL}] [internal [count]] 参数 解释 -P {|ALL} 表示监控哪个CPU, cpu在[0,cpu个数-1]中取值 internal 相邻的两次采样的间隔时间、 count 采样的次数,count只能和delay一起使用 当没有参数时,mpstat则显示系统启动以后所有信息的平均值。有interval时,第一行的信息自系统启动以来的平均信息。从第二行开始,输出为前一个interval时间段的平均信息。 实例 查看多核CPU核心的当前运行状况信息, 每2秒更新一次 mpstat 219:45:12 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle 19:45:14 all 0.04 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.96 19:45:16

【VMware虚拟化解决方案】配置和部署VMware ESXi5.5

江枫思渺然 提交于 2020-03-28 16:42:25
【VMware虚拟化解决方案】配置和部署VMware ESXi5.5 时间 2014-04-08 10:31:52 让"云"无处不在的博客 原文 http://mabofeng.blog.51cto.com/2661587/1392018 马博峰 在安装ESXi5.5之前,需要对要对整个环境进行设计和规划,由于虚拟化涉及服务器技术、网络技术和存储技术等多项技术,所以虚拟化的架构设计涵盖了CPU的选型、网络的设计、共享存储的方式、虚拟化资源的需求和安装ESXI的模式等知识。一个好的VMware vSphere安装设计方案决定着最终虚拟化的效果。 1、CPU的选型 无论是采用X86服务器,还是采用机架式、塔式或者刀片式服务器,CPU的选择是至关重要的。现在市场上主流的CPU是Intel公司和AMD公司产品,这两家公司的CPU对虚拟化都有很好的支持,具体选择哪家的产品,我们需要根据实际情况而定。 一般安装ESXi需要一个 64 位的CPU,而具体选择哪一款CPU还需要考虑许多其他的因素,其中最重要的一点就是虚拟化技术选项,具体来说就是是选择Intel 虚拟化技术 (Intel VT) 的CPU还是选择 AMD 虚拟化 (AMD-V) 技术的CPU。这时有的读者可能会奇怪了,为什么只能选择这两种技术的CPU呢?其实原因很简单,因为只有具有这两种技术的CPU才提供虚拟化功能

线程与进程的区别以及对多线程并发的理解

↘锁芯ラ 提交于 2020-03-28 04:09:06
一、线程与进程的区别 先简单说说线程与进程的概念: (1)进程是指一个内存中运行的应用程序,比如在Windows系统中,一个运行的exe就是一个进程。 (2)线程是指进程中的一个执行流程。 区别: 一个程序至少有一个进程,而一个进程至少有一个线程。一个应用程序可以同时启动多个进程。例如对于IE浏览器程序,每打开一个IE浏览器窗口,就启动了一个新的进程。而线程则是指进程中的一个执行流程,一个进程可以有多个线程,每个线程分别执行不同的任务,当进程内的多个线程同时运行时,这种运行方式就被称为并发运行。 另外,线程与进程还有一个非常重要的区别:每个进程在执行过程中都拥有独立的内存单元,而同一个进程中的多个线程则共享内存,从而极大地提高了程序的运行效率。 二、对多线程并发的理解 多线程并发只是表面和感觉上的并发,并不是实质上的并发。一个线程要运行,它必须占有CPU,而我们目前用的计算机大多都是单CPU的,所以一次最多只能有一个线程获取CPU并运行。 多线程的实质是“最大限度地利用CPU资源”,当某一个线程的处理不需要占用CPU而只需要和I/O等资源打交道时,让其他线程有机会获得CPU资源。这有点类似于“统筹方法”,例如让你打扫房子和烧水,要在最短的时间内做好这两件事,你一定会想到先把水烧上,然后在等水烧开的空闲时间中去打扫房子,而不是先打扫好了再去烧水,也不是先烧好了再去打扫,这个例子里面

SchedTune

岁酱吖の 提交于 2020-03-27 13:23:28
本文仅是对kernel中的document进行翻译,便于理解。后续再添加代码分析。 1. 为何引入schedtune? schedutil是一个基于利用率驱动的cpu频率governor。它允许调度器为了cpu上运行的task选出最优的工作频率点(DVFS operating point: OPP)。 但是,有时候我们需要故意进行boost,来满足特定场景下的性能要求,尽管这样会产生更大的功耗。比如,为了缩短task的响应时间,我们希望task运行在一个比实际cpu带宽要求更高的OPP。 还有一个重要原因是我们想用schedutil governor来替代当前所有的CPUFreq pollicy。schedutil是基于event的,而当前governor是基于采样的,所以schedutil对task选择最优OPP的更加迅速。但是仅仅跟踪实际的task使用率可能不足以表达当前的性能。比如,它不能做到类似“performance”、“interactive” CPUFreq governor的相关行为。 于是,就引入了schedtune。它是一套处于governor架构上层的、可调节的工具,扩展了对task performance boosting的支持。 performance boosting的意思:缩短task启动的时间。例如,一个task从唤醒到其再次休眠或者退出的时间

数据库连接池到底应该设多大?

↘锁芯ラ 提交于 2020-03-26 18:51:40
本文内容95%译自这篇文章: https://github.com/brettwooldridge/HikariCP/wiki/About-Pool-Sizing ) 我在研究HikariCP(一个数据库连接池)时无意间在HikariCP的Github wiki上看到了一篇文章(即前面给出的链接),这篇文章有力地消除了我一直以来的疑虑,看完之后感觉神清气爽。故在此做译文分享。 接下来是正文 数据库连接池的配置是开发者们常常搞出坑的地方,在配置数据库连接池时,有几个可以说是和直觉背道而驰的原则需要明确。 1万并发用户访问 想象你有一个网站,压力虽然还没到Facebook那个级别,但也有个1万上下的并发访问——也就是说差不多2万左右的TPS。那么这个网站的数据库连接池应该设置成多大呢?结果可能会让你惊讶,因为这个问题的正确问法是: “这个网站的数据库连接池应该设置成多 小 呢?” 下面这个视频是Oracle Real World Performance Group发布的,请先看完: http://www.dailymotion.com/video/x2s8uec (因为这视频是英文解说且没有字幕,我替大家做一下简单的概括:) 视频中对Oracle数据库进行压力测试,9600并发线程进行数据库操作,每两次访问数据库的操作之间sleep 550ms,一开始设置的中间件线程池大小为2048:

SpringBoot2 线程池的定义和使用

£可爱£侵袭症+ 提交于 2020-03-25 21:02:16
SpringBoot2 线程池的定义和使用 定义线程池 @Slf4j @EnableAsync @Configuration public class AsyncExecutorConfig implements AsyncConfigurer { @Bean public ThreadPoolTaskExecutor asyncServiceExecutor() { //返回可用处理器的虚拟机的最大数量不小于1 int cpu = Runtime.getRuntime().availableProcessors(); log.info("start asyncServiceExecutor cpu : {}", cpu); ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); //配置核心线程数 executor.setCorePoolSize(cpu); //配置最大线程数 executor.setMaxPoolSize(cpu); //配置队列大小 executor.setQueueCapacity(50); //用来设置线程池关闭的时候等待所有任务都完成再继续销毁其他的Bean executor.setWaitForTasksToCompleteOnShutdown(true); /

java中锁的概念

北慕城南 提交于 2020-03-25 16:40:28
可重入锁(递归锁) 本文里面讲的是广义上的可重入锁,而不是单指 JAVA 下的 ReentrantLock。可重入锁,也叫做递归锁,指的是 同一线程 外层函数获得锁之后 ,内层递归函数仍然有获取该锁的代码,但不受影响 。在 JAVA 环境下 ReentrantLock 和 synchronized 都是 可重入锁。当然有可重入锁就有不可重入锁,不可重入锁就是 同一线程 外层函数获得锁之后 ,只能当前函数使用 package com.yjc.juc; import java.util.concurrent.locks.ReentrantLock; class ZiYuan { ReentrantLock reentrantLock = new ReentrantLock(); public void method1() { reentrantLock.lock(); try { System.out.println("进入方法1"); System.out.println("准备调用方法2"); method2(); } catch (Exception e) { e.printStackTrace(); } finally { reentrantLock.unlock(); } } public void method2() { reentrantLock.lock(); try