首页 > 系统相关 >并发编程之进程与线程和并行与并发的详细解析

并发编程之进程与线程和并行与并发的详细解析

时间:2024-03-12 21:01:24浏览次数:30  
标签:编程 cpu 并发 线程 内存 进程 CPU

2.1 进程与线程

进程

  • 程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至 CPU,数据加载至内存。在 指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理 IO 的 。

  • 当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一个进程。

  • 进程就可以视为程序的一个实例。大部分程序可以同时运行多个实例进程(例如记事本、画图、浏览器 等),也有的程序只能启动一个实例进程(例如网易云音乐、360 安全卫士等)

线程

  • 一个进程之内可以分为一到多个线程。

  • 一个线程就是一个指令流,将指令流中的一条条指令以一定的顺序交给 CPU 执行

  • Java 中,线程作为最小调度单位,进程作为资源分配的最小单位。 在 windows 中进程是不活动的,只是作为线程的容器

二者对比

  1. 根本区别:进程是操作系统进行资源分配的最小单元,线程是操作系统进行运算调度的最小单元.

  2. 从属关系不同:进程基本上相互独立的,进程中包含了线程,线程属于进程.

  3. 开销不同:进程的创建,销毁和切换的开销都远大于线程.

  4. 拥有的资源不同:每个进程有自己的内存和资源,一个进程中的线程会共享这些内存和资源.

  5. 控制和影响能力不同:子进程无法影响父进程,而子线程可以影响父线程,如果主线程发生异常会影响其所在进程和子线程。

  6. CPU利用率不同:进程的CPU利用率较低,因为上下文切换开销较大,而线程的CPU的利用率较高,上下文的切换速度快。

  7. 通信的复杂度不一样:

    • 进程间通信较为复杂

      • 同一台计算机的进程通信称为 IPC(Inter-process communication)

      • 不同计算机之间的进程通信,需要通过网络,并遵守共同的协议,例如 HTTP

    • 线程通信相对简单,因为它们共享进程内的内存,一个例子是多个线程可以访问同一个共享变量

  8. 操纵者不同:进程的操纵者一般是操作系统,线程的操纵者一般是编程人员。

2.2 并行与并发

单核cpu下,线程实际还是串行执行的。操作系统中有一个组件叫做任务调度器,将 cpu 的时间片(windows 下时间片最小约为 15 毫秒)分给不同的程序使用,只是由于 cpu 在线程间(时间片很短)的切换非常快,人类感觉是同时运行的 。总结为一句话就是: 微观串行,宏观并行

一般会将这种线程轮流使用 CPU 的做法称为并发, concurrent

CPU时间片 1时间片 2时间片 3时间片 4
core线程 1线程 2线程 3线程 4

多核 cpu下,每个 核(core) 都可以调度运行线程,这时候线程可以是并行的。

CPU时间片 1时间片 2时间片 3时间片 4
core1线程 1线程 2线程 3线程 4
core2线程 4线程 4线程 2线程 2

引用 Rob Pike 的一段描述:

并发(concurrent)是同一时间应对(dealing with)多件事情的能力 。

并行(parallel)是同一时间动手做(doing)多件事情的能力。

标签:编程,cpu,并发,线程,内存,进程,CPU
From: https://blog.csdn.net/qq_69748833/article/details/136663074

相关文章

  • PySide6之子线程
    QThread方法1:子类化创建多线程创建子线程,继承自QThread类在子线程中自定义信号在子线程中重写run()方法,进行信号的触发在主线程中实例化子线程在主线程中对子线程的信号进行绑定在主线程中开启子线程importtimefromPySide6.QtCoreimport*fromPySide6.QtWidgets......
  • JUC源码讲解:线程状态转换
    JUC源码讲解:线程状态转换抛出问题一个线程,有七种(也可以说是六种)状态,究竟是哪七种呢?在什么条件下,线程会进入一个状态,又在什么条件下,线程转而进入另一种状态呢?下面我们从源码角度看一下线程的状态转换观察源码我们进去Thread.State.class中,可以看到,线程状态由一个enum定义......
  • 细品spring设计,可扩展性编程Aware接口,Adapter类
    Spring中的扩展点介绍Aware接口在Spring中,Aware接口是一组特定的接口,用于向Bean提供特定的资源或信息。通过实现Aware接口,Bean可以感知到容器的特定状态或资源。常见的Aware接口包括:BeanNameAware:获取当前Bean在容器中的名字。ApplicationContextAware:获取当前Bean所在......
  • Python的特性——跟老吕学Python编程
    Python的特性——跟老吕学Python编程Python的特性1.Python易学易用2.Python是解释型语言3.Python是交互式的4.Python是一种多范式语言5.Python的标准库6.Python是开源的7.Python是跨平台的8.用于GUI应用程序的Python9.Python的数据库连接10.Python是可扩展的11.Python拥......
  • 【转】QPS和并发数的关系
     原文: https://www.cnblogs.com/ooo0/p/15963700.html-------------------- QPS:  请求进入的速度并发数:系统中同时存在的请求数 根据Little'sLaw,我们能得到如下的关系式:并发数 = QPS*耗时 以大学招生为例:大一新生的招收速度是5000人/年,每个学生在大学......
  • c#对分布式编程得支持
                       ......
  • 多线程系列(十七) -线程组介绍
    一、简介在之前的多线程系列文章中,我们陆陆续续的介绍了Thread线程类相关的知识和用法,其实在Thread类上还有一层ThreadGroup类,也就是线程组。今天我们就一起来简单的聊聊线程组相关的知识和用法。二、什么是线程组线程组,简单来说就是多个线程的集合,它的出现主要是为了更方便的......
  • 深入浅出Java多线程(十一):AQS
    引言大家好,我是你们的老伙计秀才!今天带来的是[深入浅出Java多线程]系列的第十一篇内容:AQS(AbstractQueuedSynchronizer)。大家觉得有用请点赞,喜欢请关注!秀才在此谢过大家了!!!在现代多核CPU环境中,多线程编程已成为提升系统性能和并发处理能力的关键手段。然而,当多个线程共享同一资源......
  • 自己简单实现一个线程池
    线程池Java中的线程池是运用最多的并发框架,几乎所有需要异步或并发执行任务的程序都可以使用线程池。线程池的好处/作用:1.不需要频繁的创建和销毁线程,提高相应速度2.管理线程,避免无休止的创建线程导致资源枯竭。(不会每来一个任务就创建一个线程,线程不断的取任务执行)线程池......
  • C#3种常见的定时器(多线程)
    总结以下三种方法,实现c#每隔一段时间执行代码:方法一:调用线程执行方法,在方法中实现死循环,每个循环Sleep设定时间;调用线程执行方法,在方法中实现死循环,每个循环Sleep设定时间Threadthread=newThread(newThreadStart(obj.Method1));thread.Start();方法二:使用System.Timers......