cpu,核心数,线程抢占式分配理解,时间分片机制总结,进程和线程关系及区别,[通俗易懂]

cpu,核心数,线程抢占式分配理解,时间分片机制总结,进程和线程关系及区别,[通俗易懂]cpu,核心数,线程抢占式分配理解,时间分片机制总结,进程和线程关系及区别,

大家好,又见面了,我是你们的朋友全栈君。

知识点:

1,进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是分配资源的基本单位,线程是进程的一个实体,是CPU调度和分派的基本单位

2,线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

2,一个进程包含一个或多个线程;

3,同一个进程中的多个线程之间可以并发执行.

4,一个程序至少有一个进程,一个进程至少有一个线程.

5,线程是CPU分配时间的单位,通常一个CPU内核处理器可以处理一个线程,但是现代cpu通过超线程技术可以同时处理两个线程

cpu,核心数,线程抢占式分配理解,时间分片机制总结,进程和线程关系及区别,[通俗易懂]

6,核心数即cpu个数

7,同一时刻,单个cpu线程数只能处理一个java线程,或者其他任意线程

8,java所有线程都在JVM进程中

9,cpu调度的是进程中的线程

10,当计算机运行的进程中所有线程数大于cpu线程数的时候,操作系统会采用时间片机制:为每个线程分配时间额度,如果当前线程的时间额度用完了,就会被强制停止(不考虑优先级等机制),切换其他线程执行;这样会给人一个计算机能够同时处理很多线程的错觉。

11,cup核心数多当然就能够同时处理多个线程。不过机器就要贵很多了

12,windows NT是抢占先式多任务操作系统,这意味着操作系统不必等待一个线程,它可主动将处理器让给其它线程。在这种方式下,当一个线程已运行了配额的时间后,或出现抢先情况时,操作系统将中断该线程。如图所示:

cpu,核心数,线程抢占式分配理解,时间分片机制总结,进程和线程关系及区别,[通俗易懂]

线程转让CPU处理时间是被迫的。占先式多任务可以防止线程独占CPU,允许其它线程公平地分享CPU执行时间

13,抢占式多任务操作系统的好处是:

     1,对比在16位Windows环境下,如果一个程序进入无限循环,则其它应用程序可能永远没有机会执行;而在Windows NT环境下这种情况不会发生,相反,许多线程的执行部分都采用了循环扫描的结构。这也是实现了多线程的基础。

     2,线程要做很多的的操作,读写磁盘、数据逻辑处理、出于业务需求必要的休眠等等操作时间都能节省下来

14,java设置线程池大小,这里提供三个考量点:

      1,一般情况程序线程数等于cpu线程数的两到三倍就能很好的利用cpu了

      2,一个公式:线程池设定最佳线程数目 = ((线程池设定的线程等待时间+线程CPU时间)/线程CPU时间 )* CPU数目

        这个公式的线程cpu时间是预估的程序单个线程在cpu上运行的时间(通常使用loadrunner测试大量运行次数求出平均值)

     3,上面两个方案都是参考而已,给出个大概范围,最后最佳的线程池设定大小还是要根据实际情况,多次实验。

15,多线程时间片机制的代码体现实验案例:

package client.cfca;
/**
 * 下面有四个线程,公用一个方法体,做三次循环,没次每个线程停顿5s
 * @author liuxin
 * @date   2018年8月1日
 */
public class ad {

	public static void main(String[] args) {
		Dog t1=new Dog();
		Dog t2=new Dog();
		Dog t3=new Dog();
		Dog t4=new Dog();
		t1.setName("t1");
		t2.setName("t2");
		t3.setName("t3");
		t4.setName("t4");
		t1.start();
		t2.start();
		t3.start();
		t4.start();
	}
}

class Dog extends Thread{
	private int count=3;
	public  void run(){
			try {
				synchronized (this) {
					for(int i=0;i<3;i++){
						System.out.println(Thread.currentThread().getName()+"    count="+count--);
						sleep(5000);
					}
					System.out.println(Thread.currentThread().getName());
				}
				
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
	}
}

结果:

t1    count=3
t3    count=3
t4    count=3
t2    count=3
t1    count=2
t3    count=2
t4    count=2
t2    count=2
t1    count=1
t3    count=1
t4    count=1
t2    count=1
t1
t3
t4
t2

从结果中可以看出(读者可亲自试验),会发现每次都是差不多5s后四个线程同时打印,三次循环打印差不多都是。可粗略看做是时间分片机制和cpu多核线程可同时处理机制的作用结果。

16,从java角度理解进程与线程:启动一个main方法就启动了一个jvm虚拟机进程,如果我在main程序中又new Thread()了十个线程,那么这个进程中就有一个主线程(main)和十个附加线程。如果我再运行了一个main程序,那么机器中就有两个JVM进程。

17,进程和线程的重要区别:从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配

18,进程多还是线程多的选择:线程执行开销小,但不利于资源的管理和保护,如果频繁启动关闭则最好使用线程;而进程正相反。同时,线程适合于在SMP机器上运行,而进程则可以跨机器迁移。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/106204.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 约瑟夫环 OJ

    约瑟夫环 OJ循环链表的应用,并且应为不带头节点的循环链表,首先创建一个循环链表,在函数JOHEPHUS中进行操作,主要就是用for找到要删除的元素(注意p==1单独考虑,for中p至少为2),删除元素并输出直至链表为空。for(j=1;j&lt;=p-1;j++)把寻找报数的位置和寻找要删除的节点的前驱结合在一个循环中,减少时间复杂度,因为第一次写我是在主函数中用r指向找到的要删除的节点,然后传入de…

    2022年5月29日
  • 高效沟通的秘诀_请你说说对沟通视窗的理解

    高效沟通的秘诀_请你说说对沟通视窗的理解最近听了樊登老师在混沌讲领导力,其中印象最深刻的就是沟通视窗。后来我发现把它用在沟通方面会更有效。我们常常困惑于如何与他人沟通,也会因彼此不能深入了解而大伤脑筋。今天我就介绍一个好用的思维模型,它涵盖

    2022年8月3日
  • fastjson教程 List转JSONArray以及JSONArray转List[通俗易懂]

    fastjson教程 List转JSONArray以及JSONArray转List[通俗易懂]1.fastjsonList转JSONArrayList<T>list=newArrayList<T>();JSONArrayarray=JSONArray.parseArray(JSON.toJSONString(list));2.fastjsonJSONArray转ListJSONArrayarray=newJSONArray();List<T>list=JSONObject.parseArray(array.toJSONSt..

    2022年6月17日
  • Pycharm代码docker容器运行调试 | 机器学习系列

    Pycharm代码docker容器运行调试 | 机器学习系列介绍常规的本地化运行机器学习代码,安装Anaconda+cuda显卡驱动支持,许多文章都有介绍,不在此多做赘述了。本文主要是为了解决在工作环境中,本机电脑没有显卡,需要将程序运行在带显卡的远程服务器上。本文会介绍如何部署使用显卡的docker容器、如何使用pycharm连接docker容器运行机器学习代码。版本Pycharm:2020.1.3docker:19.03.12python:3.6.13demo算法:BackgroundMattingV2部署下面我会按照.

    2022年8月28日
  • 机器学习之有监督学习,无监督学习,半监督学习

    机器学习之有监督学习,无监督学习,半监督学习文章目录前言有监督学习无监督学习半监督学习前言机器学习是数据分析和数据挖掘的一种比较常用,比较好的手段从有无监督的角度,可以分为三类:有监督学习无监督学习半监督学习有监督学习用已知某种或某些特性的样本作为训练集,以建立一个数学模型,再用已建立的模型来预测未知样本,此种方法被称为有监督学习,是最常用的一种机器学习方法。是从标签化训练数据集中推断出模型的机器学习任务问:有监督学习的…

    2022年5月28日
  • qt无法解析的外部符号lnk2019_2019最新驾考宝典

    qt无法解析的外部符号lnk2019_2019最新驾考宝典在编译工程的时候经常会碰到”LNK2019:无法解析的外部符号… “的报错。一般来说,碰到这个错误有一下几种情况:1、头文件中声明了函数或者类型,但是没有相关的实现源文件解决:在编译结果中找到并定位该函数,删去多余的定义并对未实现的定义进行实现;注意删去Debug和Release文件夹,并重新构建。2、调用了第三方库,但是未链接成功解决:重新添加库的.lib和.dll及相关.h文

    2022年10月5日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号