转:认识cpu、核与线程

转自: https://www.cnblogs.com/-new/p/7234332.html

 

前言:作为一个后台开发人员,我想有必要了解这些基础知识。如果本文有不严谨或者疏忽的地方,请指正。

目录

  • 认识cpu、核心与线程
  • java多线程系列(一)之java多线程技能
  • java多线程系列(二)之对象变量的并发访问
  • java多线程系列(三)之等待通知机制
  • java多线程系列(四)之ReentrantLock的使用
  • java多线程系列(五)之synchronized ReentrantLock volatile Atomic 原理分析
  • java多线程系列(六)之线程池原理及其使用

cpu与核心

物理核

  • 物理核数量=cpu数(机子上装的cpu的数量)*每个cpu的核心数

虚拟核

  • 所谓的4核8线程,4核指的是物理核心。通过超线程技术,用一个物理核模拟两个虚拟核,每个核两个线程,总数为8线程。
  • 在操作系统看来是8个核,但是实际上是4个物理核。
  • 通过超线程技术可以实现单个物理核实现线程级别的并行计算,但是比不上性能两个物理核。

单核cpu和多核cpu

  • 都是一个cpu,不同的是每个cpu上的核心数
  • 多核cpu是多个单核cpu的替代方案,多核cpu减小了体积,同时也减少了功耗
  • 一个核心只能同时执行一个线程

进程和线程

理解

  • 进程是操作系统进行资源(包括cpu、内存、磁盘IO等)分配的最小单位
  • 线程是cpu调度和分配的基本单位
  • 我们打开的微信,浏览器都是一个进程
  • 进程可能有多个子任务,比如微信要接受消息,发送消息,这些子任务就是线程。
  • 资源分配给进程,线程共享进程资源。

对比

对比进程线程
定义进程是程序运行的一个实体的运行过程,是系统进行资源分配和调配的一个独立单位线程是进程运行和执行的最小调度单位
系统开销创建撤销切换开销大,资源要重新分配和收回仅保存少量寄存器的内容,开销小,在进程的地址空间执行代码
拥有资产资源拥有的基本单位基本上不占资源,仅有不可少的资源(程序计数器,一组寄存器和栈)
调度资源分配的基本单位独立调度分配的单位
安全性进程间相互独立,互不影响线程共享一个进程下面的资源,可以互相通信和影响
地址空间系统赋予的独立的内存地址空间由相关堆栈寄存器和和线程控制表TCB组成,寄存器可被用来存储线程内的局部变量

线程切换

  • cpu给线程分配时间片(也就是分配给线程的时间),执行完时间片后会切换都另一个线程。
  • 切换之前会保存线程的状态,下次时间片再给这个线程时才能知道当前状态。
  • 从保存线程A的状态再到切换到线程B时,重新加载线程B的状态的这个过程就叫上下文切换。
  • 而上下切换时会消耗大量的cpu时间。

线程开销

  • 上下文切换消耗
  • 线程创建和消亡的开销
  • 线程需要保存维持线程本地栈,会消耗内存

串行,并发与并行

串行

  • 多个任务,执行时一个执行完再执行另一个。
  • 比喻:吃完饭再看球赛。

并发

  • 多个线程在单个核心运行,同一时间一个线程运行,系统不停切换线程,看起来像同时运行,实际上是线程不停切换。
  • 比喻: 一会跑去食厅吃饭,一会跑去客厅看球赛。

并行

  • 每个线程分配给独立的核心,线程同时运行。
  • 比喻:一边吃饭一边看球赛。

多核下线程数量选择

计算密集型

  • 程序主要为复杂的逻辑判断和复杂的运算。
  • cpu的利用率高,不用开太多的线程,开太多线程反而会因为线程切换时切换上下文而浪费资源。

IO密集型

  • 程序主要为IO操作,比如磁盘IO(读取文件)和网络IO(网络请求)。
  • 因为IO操作会阻塞线程,cpu利用率不高,可以开多点线程,阻塞时可以切换到其他就绪线程,提高cpu利用率。

总结

  • 提高性能的一种方式:提高硬件水平,处理速度或核心数。
  • 另一种方式:根据场景,合理设置线程数,软件上提高cpu利用率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/330372.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java多线程中的死锁、活锁、饥饿、无锁都是什么鬼?

转载自 java多线程中的死锁、活锁、饥饿、无锁都是什么鬼? 死锁、活锁、饥饿是关于多线程是否活跃出现的运行阻塞障碍问题,如果线程出现了这三种情况,即线程不再活跃,不能再正常地执行下去了。 死锁 死锁是多线程中最差的一种情况…

HDU2159(完全背包)

Problem Descrption 最近xhd正在玩一款叫做FATE的游戏,为了得到极品装备,xhd在不停的杀怪做任务。久而久之xhd开始对杀怪产生的厌恶感,但又不得不通过杀怪来升完这最后一级。现在的问题是,xhd升掉最后一级还需n的经验值&#xff…

(转)接口幂等性

转自: https://blog.csdn.net/mingwulipo/article/details/91443355 1、接口调用存在的问题 现如今我们的系统大多拆分为分布式SOA,或者微服务,一套系统中包含了多个子系统服务,而一个子系统服务往往会去调用另一个服务&#x…

高级java必须清楚的概念:原子性、可见性、有序性

转载自 高级java必须清楚的概念:原子性、可见性、有序性 原子性、可见性、有序性是多线程编程中最重要的几个知识点,由于多线程情况复杂,如何让每个线程能看到正确的结果,这是非常重要的。 原子性 原子性是指一个线程的操作是不能…

背包问题总结

参考链接: http://www.cnblogs.com/fengty90/p/3768845.html http://blog.csdn.net/mu399/article/details/7722810 http://blog.csdn.net/xiaowei_cqu/article/details/8191808 http://blog.csdn.net/insistgogo/article/details/11176693 原文:https:…

(转)数据库可靠性/可用性、稳定性RTO/RPO

转 https://blog.csdn.net/luke_wang/article/details/78145517; 在灾难恢复方面,目前业界公认有三个目标值得努力。一是恢复时间,企业能忍受多长时间没有 IT,处于停业状态;二是网络多长时间能够恢复;三是…

HDU2059(DP)

Problem Descrption 据说在很久很久以前,可怜的兔子经历了人生中最大的打击——赛跑输给乌龟后,心中郁闷,发誓要报仇雪恨,于是躲进了杭州下沙某农业园卧薪尝胆潜心修炼,终于练成了绝技,能够毫不休息得以恒…

Java多线程之守护线程实战

转载自 Java多线程之<<守护线程>>实战定义什么是守护线程&#xff1f;与守护线程相对应的就是用户线程&#xff0c;守护线程就是守护用户线程&#xff0c;当用户线程全部执行完结束之后&#xff0c;守护线程才会跟着结束。也就是守护线程必须伴随着用户线程&#x…

转:集群和分布式的区别

转自&#xff1a; https://blog.csdn.net/shuaipu813/article/details/52083289 集群 多台服务器组成的一组计算机&#xff0c;作为一个整体存在&#xff0c;向用户提供一组网络资源&#xff0c;这些单个的服务器就是集群的节点。 集群拥有以下两个特点&#xff1a; 1. 可…

如何quot;优雅quot;地终止一个线程?

转载自 如何"优雅"地终止一个线程&#xff1f;我们的系统肯定有些线程为了保证业务需要是要常驻后台的&#xff0c;一般它们不会自己终止&#xff0c;需要我们通过手动来终止它们。我们知道启动一个线程是start方法&#xff0c;自然有一个对应的终止线程的stop方法&a…

HDU1087

Problem Descrption Nowadays, a kind of chess game called “Super Jumping! Jumping! Jumping!” is very popular in HDU. Maybe you are a good boy, and know little about this game, so I introduce it to you now. The game can be played by two or more than two p…

转-BFF调研-1

转自&#xff1a; https://blog.csdn.net/duola8789/article/details/89332064 前端开发中存在的难问题 多端应用&#xff0c;不同类型客户端对数据、API有个性化的需求服务聚合&#xff0c;单一后端为多个前端团队提供接口&#xff0c;导致跨团队协作低效&#xff0c;资源协…

JDK8新特性之Stream流

转载自 JDK8新特性之Stream流 是什么是Stream流 java.util.stream.Stream Stream流和传统的IO流&#xff0c;它们都叫流&#xff0c;却是两个完全不一样的概念和东西。 流可以简单的说是处理数据集合的东西&#xff0c;可以申明式流式API来处理集合&#xff0c;而不是写一个…

(转)贫血和富血

转自&#xff1a; https://blog.csdn.net/t0404/article/details/51865174 贫血vs富血 我们来回顾一下。在企业架构模式中&#xff0c;业务层的实现一般有两种模式&#xff1a;一种是事务角本模式&#xff08;Transaction script&#xff09;&#xff0c;另一种是领域模型模式…

JDK8的排序大法!!

转载自 屌炸天&#xff0c;JDK8的排序大法&#xff01;&#xff01; 今天总结了下JDK中排序的方法&#xff0c;包括JDK8中强大的lambda表达式及函数式接口运用&#xff0c;不废话&#xff0c;请看下面示例。 public class Test {public static void main(String[] args) {Lis…

康复题11

定义一个二维数组&#xff1a; int maze[5][5] {0, 1, 0, 0, 0,0, 1, 0, 1, 0,0, 0, 0, 0, 0,0, 1, 1, 1, 0,0, 0, 0, 1, 0,}; 它表示一个迷宫&#xff0c;其中的1表示墙壁&#xff0c;0表示可以走的路&#xff0c;只能横着走或竖着走&#xff0c;不能斜着走&#xff0c;要求…

JDK8新特性之函数式接口

转载自 JDK8新特性之函数式接口 什么是函数式接口 先来看看传统的创建线程是怎么写的 Thread t1 new Thread(new Runnable() {Overridepublic void run() {System.out.println("t1");} }); t1.start(); 再来看看使用了函数式接口是怎么写的 Thread t2 new Thre…

hashCode和identityHashCode的区别你知道吗?

转载自 hashCode和identityHashCode的区别你知道吗&#xff1f;hashCode 关于hashCode参考之前的文章&#xff0c;点击参考之前文章。 identityHashCode identityHashCode是System里面提供的本地方法&#xff0c;java.lang.System#identityHashCode。 /*** Returns the same ha…

转:drop、truncate和delete的区别与选择

转自&#xff1a; https://blog.csdn.net/shadow_zed/article/details/78252494 &#xff08;1&#xff09;日志与事务 1.delete语句执行删除的过程是每次从表中删除一行&#xff0c;并且同时将该行的删除操作作为事务记录在日志中保存以便进行进行回滚操作。 2.truncate tab…

Java高级篇——深入浅出Java类加载机制

转载自 Java高级篇——深入浅出Java类加载机制类加载器简单讲&#xff0c;类加载器ClassLoader的功能就是负责将class文件加载到jvm内存。类加载器分类从虚拟机层面讲分为两大类型的类加载器&#xff0c;一是Bootstrap Classloader即启动类加载器&#xff08;C实现&#xff09;…