当前位置:   article > 正文

Java 线程、进程_java进程和线程

java进程和线程

1、什么是进程:process

进程是操作系统中运行的一个任务(一个应用程序运行在一个进程中)。

进程是一块包含了某些资源的内存区域,操作系统利用进程把它的工作划分为一些功能单元。

进程中包含的一个或多个执行单元称为线程,进程还拥有一个私有的虚拟地址空间,该空间仅能被它所包含的线程访问。

线程只能归属于一个进程,并且它只能访问该进程所拥有的资源,当操作系统创建一个进程后,该进程会自动申请一个名为主线程或者首要线程的线程。

2、什么是线程:thread

一个线程是进程的一个顺序执行流。

同类的多个线程共享一块内存空间和一组系统资源,线程本身有一个供程序执行时的堆栈。线程在切换时负荷小,因此线程也被称为轻负荷线程。一个进程可以包含多个线程。

3、进程和线程的区别:进程与线程的一个简单的解释(例子)

一个进程至少有一个线程,线程的划分尺度小于一个进程,使得多线程程序的并发性高,另外进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。

线程在执行过程中与进程的区别在于每个独立的进程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能独立执行,必须已存在应用程序中,由应用程序提供多个线程执行控制。

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

  • 进程:进程是程序资源的基本单位
  • 线程:线程是CPU执行的基本单位

volatile:参考链接

volatile 在多处理器开发中,保证变量的可见性,但不保证原子性。"可见性"的意思当一个线程修改变量的值时,另一个线程能看到这个被修改的值。如果一个变量被声明为volatile时,java内存模型保证所有线程看到这个变量的值都是一致的。与synchronized不同,volatile不会引起线程上下文切换和调度,在适当的场景下,拥有更低的执行成本和更高的效率。

CPU缓存:

CPU缓存的出现主要是为了解决CPU运算速度与内存读写速度之间的矛盾。因为CPU的运算速度要比内存的读写速度快得多。

  • 一次主存的访问,可能需要几十个到几百个时钟周期。
  • 一次一级缓存的访问,可能只需要几个时钟周期。
  • 一次二级缓存的访问,可能需要几十个时钟周期。

针对速度上的差异,CPU可能需要花费很长时间去等待数据到来或者把数据写入内存。基于此,现代CPU多数读取数据不会直接访问内存,而是从缓存中去读取,CPU缓存是位于CPU与内存之间临时存储器,它的容量较小但读取速度却比内存快得多,CPU优先从缓存中读取,读取不到再从内存中读取。缓存同样有优先级,优先从一级缓存中读取,再到二级缓存中读取,再到三级缓存中读取。一级缓存、二级缓存、三级缓存它们的读写速度依次递减,价格也依次递减,因此存储容量依次递增。注意缓存中存放的只是内存中的一小部分数据,这部分数据是短时间内CPU即将访问的。

按照读写速度以及CPU紧密结合程度,CPU缓存可分为以下三种:

  • 一级缓存 简称L1 Cache,紧靠CPU内核,是与CPU联系最为紧密高速缓存。
  • 二级缓存 简称L2 Cache
  • 三级缓存 简称L3 Cache
    在这里插入图片描述

当系统运行时,CPU执行的流程简单地概括为以下几个步骤:

  • 加载程序以及数据到内存中
  • 加载程序指令以及数据到CPU缓存中
  • CPU执行指令将结果写到高速缓存中
  • 将高速缓存中数据写到内存中、

CPU -> CPU缓存 -> 内存读取数据 之间的关系如下图所示:
在这里插入图片描述
可以想象如下场景:

  • 核0读取一个字节到缓存中,那么它相邻字节必然也会被读入核0缓存中
  • 核3也读取同样的字节到自己所在缓存中,此时核0与核3缓存中有相同字节的数据
  • 核0修改了那个字节的数据,然后写回自己所在的缓存中,但并没有写回内存中
  • 核3此时去访问该字节的数据,由于核0并未将该字节的数据写回到内存中,故此时将导致核0与核3的数据不同步

为了解决上述问题,就有了如下缓存一致性协议:

缓存一致性协议:

每个CPU都有一级缓存,但是我们却没有办法保证每个CPU一级缓存的数据都是一样的,所以,同一个应用程序,CPU进行切换的时候,切换前与切换后的数据可能会不一样。那么怎么保证CPU缓存数据是一致,就是CPU缓存一致性问题。

总线锁:

一种处理一致性问题的办法是使用总线锁(Bus Locking),当CPU对其缓存的数据进行操作时,往总线中发送一个Lock信号,这个时候所有CPU收到这个信号之后,就不操作自己缓存中对应的数据了。当操作结束后,释放锁之后,所有的CPU就会去内存中获取数据。但是用总线锁的方式,会导致CPU性能下降。因此出现了如下维护缓存一致性的方式,MESI

MESI:

MESI是保持一致性协议,它的方法是在CPU缓存中保存一个标记位,这个标记位有四种方式。

  • M:Modify(修改缓存),当前CPU缓存已经被修改,即与内存中数据不一致了;
  • E:Exclusive(独立缓存),当前CPU缓存数据与内存中的一致,且其它CPU没有可用的缓存数据;
  • S:Share(共享缓存),和内存保持一致的一份拷贝,多组缓存可以同时拥有针对同一地址的共享缓存段;
  • I:Invalid(无效缓存),说明CPU中的缓存已经不能再使用了;

4、线程的使用:

线程通常用于在一个程序中需要同时完成多个任务的情况,我们可以将每个任务定义为一个线程,使它们得以一同工作。

也可以用于单一线程中可以完成,但是使用多线程可以更快的情况(下载)。

在这里插入图片描述
5、并发原理:

多个线程"同时"运行只是我们感官上的一种表现,事实上线程是并发运行的,OS将时间划分为很多很多的时间片段(时间片),尽可能的均匀分配给每一个线程,获取时间片的线程被CPU运行,而其它线程全部等待。

所以微观上的走走停停,宏观上都在运行,这种现象叫并发,但是不是绝对意义上的"同时发生"。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/800573
推荐阅读
相关标签
  

闽ICP备14008679号