首页 > 系统相关 >线程、进程、并发和并行的概念

线程、进程、并发和并行的概念

时间:2024-06-13 20:30:42浏览次数:22  
标签:并行 并发 线程 处理器 超线程 执行 进程 cpu

线程、进程、并发和并行的概念

  1. 进程:是指一个在内存中正在运行的程序,是操作系统分配资源(文件、io、网络、内存等资源)的基本单位。
  • 一个程序文件(也就是我们编写、编译好的程序,是保存在磁盘中的,例如.exe程文件),当我们点击,程序文件就被加载到内存中,也就创建了一个进程。
  • 同一个程序文件在内存中可以有多个实例,例如我们可以启动多个qq实例,每个qq就是一个进程。
  • 类比java类和对象,类相当于程序文件,对象实例相当于一个进程,我们根据类这个模板,在内存中创建出了一个对象。
  1. 线程:线程是操作系统调度执行的基本单位,有独立的内存空间(指令、数据、程序计数器等)。
  • 一个cpu每次选一个线程来进行执行,取指令和数据到cpu中进行运算再写回内存,每个线程都有被cpu执行的机会,也就是存在上下文切换。
  • 上下文切换:cpu在切换到另一个线程B进行执行时,会保存上一个线程A的上下文信息(程序计数器会记录执行到了哪个指令),当切换回A线程,会从上次的地方继续执行。
  1. 进程和线程的关系
  • 一个进程至少有一个线程,这个线程就是主线程,可以包含多个线程。
  • 线程依赖于进程存在,一个线程必须属于一个进程。
  1. 并发:同一时间段内(可以认为很短),有多个任务(线程),需要cpu调度执行,存在上下文切换,同一时刻只能执行一个线程,因为cpu核数有限,忙不过来。图1
  2. 并行:同一个时刻可以执行两个或者多个线程,一个核心执行一个线程,取决于cpu核数。
    图2
  3. 可通过任务管理器->性能,查看计算机各项参数
    请添加图片描述
  • java获取cpu物理核心数和逻辑核心数
public static void main(String[] args) {
        try {
            // 获取逻辑处理器数
            int logicalProcessors = Runtime.getRuntime().availableProcessors();
            System.out.println("逻辑处理器数: " + logicalProcessors);

            // 执行 WMIC 命令并读取输出
            Process process = Runtime.getRuntime().exec("wmic cpu get NumberOfCores,NumberOfLogicalProcessors");
            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
            String line;
            int physicalCores = 0;
            while ((line = reader.readLine()) != null) {
                if (line.contains("NumberOfCores") && line.contains("NumberOfLogicalProcessors")) {
                    continue;
                }
                String[] parts = line.trim().split("\\s+");
                if (parts.length == 2) {
                    physicalCores += Integer.parseInt(parts[0]);
                }
            }
            reader.close();
            System.out.println("物理核心数: " + physicalCores);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
逻辑处理器数: 8
物理核心数: 4
  • 物理核心数为4,逻辑处理器数为8,这是一种超线程技术。这意味着你的系统有4个物理核心,每个核心有2个逻辑处理器。系统能够并行处理的线程数等于逻辑处理器数,也就是8个线程。
  • 查看你的操作系统是否支持超线程技术
linux命令: 
lscpu | grep "Thread(s) per core"
如果输出显示每个核心有2个线程("Thread(s) per core: 2"),则表示启用了超线程技术
windows命令:
wmic cpu get NumberOfCores,NumberOfLogicalProcessors
比较 NumberOfCores 和 NumberOfLogicalProcessors,如果后者是前者的两倍,则启用了超线程技术
  • 超线程技术的优点:在传统的单核心处理器中,如果一个线程因为等待I/O操作或其他原因而阻塞,CPU资源可能会被浪费。超线程技术允许另一个线程在同一个核心上执行,从而提高CPU的利用率。在多任务处理或多线程应用中,超线程技术可以显著提高性能,因为多个线程可以并行执行,减少了上下文切换的开销。
  • 逻辑处理器数的意义:在设计线程池时,根据处理器数创建指定数量的线程,充分利用cpu资源。

标签:并行,并发,线程,处理器,超线程,执行,进程,cpu
From: https://blog.csdn.net/qq_51305563/article/details/139657744

相关文章

  • 文件IO,创建编号为ABC三个线程,三个线程循环打印自己的编号,要求打印出来的结果必须是ABC
    第二个,拷贝图片#include<myhead.h>typedefstruct{ constchar*srcfile; constchar*destfile; intlen;}info;void*task1(void*arg){ infobuf=*((info*)(arg)); //打开这两个文件,只读的形式 intfd=-1; if((fd=open(buf.srcfile,O_RDONLY))==-1) {......
  • 多线程与多进程
    1.进程和线程的定义进程线程的定义:进程可以理解为在操作系统中一个运行起来的程序(程序是指令、数据及其组织形式,进程是程序的实体),是操作系统进行资源分配的最小单位。线程是进程中的一个执行流,是操作系统进行系统调度的最小单位,一个进程由一个或多个线程组成。2.多进程和多线程......
  • JUC并发编程第十二章——AQS
    1前置知识公平锁和非公平锁公平锁:锁被释放以后,先申请的线程先得到锁。性能较差一些,因为公平锁为了保证时间上的绝对顺序,上下文切换更频繁非公平锁:锁被释放以后,后申请的线程可能会先获取到锁,是随机或者按照其他优先级排序的。性能更好,但可能会导致某些线程永远无法获取到锁......
  • 爬虫 | 多线程、多进程、协程
    进程和线程"""进程中至少有一条线程,线程和进程的开启非常类似,这里就展示线程"""fromthreadingimportThreadfrommultiprocessingimportProcess#第一种开启的方法就是直接defdeffunc(name):foriinrange(100):print(name,i)if__name__=='__ma......
  • 【Android面试八股文】为什么Android中要设计为只能在UI线程中去更新UI?Android中子线
    文章目录一、Android为什么不能在子线程更新UI?二、为什么Android中要设计为只能在UI线程中去更新UI?三、如果不在UI线程中更新UI,可能会出现什么问题呢?四、ViewRootImp是在onActivityCreated方法后面创建的吗?五、为什么一开始在Activity的onCreate方法中创建一个子线程访问......
  • Future集合会等线程池执行完才开始遍历吗?
    先说结论:Future集合并不是等线程池执行完才开始遍历,而是线程池内的线程执行完一条Future集合就立即遍历一条在使用线程池的业务场景下,我们经常需要获取线程执行的返回值,此时我们需要Callable对象当做线程池参数并用List<Future>接收,然后遍历List<Future>获取我们想要的值。但是......
  • C#中使用AutoResetEvent或者ManualResetEvent做线程管理
    1.Task/thread/sync/async..await/WhenAll相关基础知识参见此处链接2.什么是AutoResetEvent和ManualResetEvent事件他们都是C#中System.Threading下面的类。用于在多个线程之间进行事件通知和管理。他们的管理方法主要是三个:Reset():关闭WaitOne():阻挡Set():启动AutoR......
  • 一看就懂,小白也会配置线程池了;SpringBoot简单配置线程池,
    线程池是Java实现并发的第一步,以下在SpringBoot中配置线程池的步骤,简单易学,小白也可以配置。编写一个类,实例化线程池的数学参数:包括核心线程数、最大线程数、允许挂载时间、阻塞队列数: //线程池的几个整数的参数,用到配置文件application.yml和dev配合一起配置;//在applicat......
  • 实现并发新高度:23ai的无锁列值保留
    OracleDatabase23ai支持Lock-FreeReservation,中文通常译为“无锁列值保留”。本文将通过3个部分来阐述Lock-FreeReservation的这个特性:1.应用场景2.实现原理3.使用限制1.应用场景Lock-FreeReservation这项特性可用于实现更细粒度的并发控制。它的本质是相对于传统......
  • 探索鸿蒙系统中的OffscreenCanvas并发线程绘制问题
    引言作为一名热衷于鸿蒙系统开发的工程师,我近期遇到了一个关于OffscreenCanvas组件在并发线程中绘制时崩溃的问题。这个问题不仅挑战了我的技术理解,也促使我深入探索鸿蒙系统的内部机制。在这篇文章中,我将分享我的发现和解决问题的过程。问题描述在开发过程中,我尝试使用O......