写给小白看的线程和进程,高手勿入

共 2565字,需浏览 6分钟

 ·

2020-08-05 21:48

计算机的核心是CPU,它承担了计算机的所有计算任务,CPU就像一个工厂,时刻在运行着,而操作系统管理着计算机,负责任务的调度、资源的分配和管理。

图片来源于网络

进程和线程都是计算机操作系统中的基本概念,在进程和线程之上有程序,应用程序是具有某种功能的程序,运行在操作系统中。

例如,我们的桌面上都会安装QQ、酷狗音乐、微信......等,这些就是程序。当我们点击QQ运行时,QQ正常运行,此时就会开启一个进程。

因此,「程序是静态的,而进程是动态的,程序是作为进程的运行的载体,进程会随时间,会在某一时刻消亡。」

图片来源于网络

我们运行程序开启的进程,我们可以在任务管理器中可以查看,当我们再次点击QQ,登陆另一个账号的时候又会开启一个进程。

打个比喻:前面我们把CPU比作一个工厂,那么程序就好像工厂里面的车间。

图片来源于网络

但是,车间是静态的,车间中有多条流水线,进程就好比流水线,流水线是动态执行的,一个车间可以同时运行多条流水线,也可以只执行一条流水线或者一条流水线都不执行。

总结来说:「程序可以包含多个进程,多个进程并发执行,相互独立,因此,进程也是系统进行资源分配和调度基本单位。」

当然,程序也可以没有启动进程,就好比车间中没有流水线,因为程序是静态的,而进程的有无就好比层间的流水线是否存在。

图片来源于网络

一条流水线上可以有很多工人,那些工人就好比是线程,一个员工就代表一个线程,他们在一起共同协作,完成一条流水线上的任务。

图片来源于网络

所以,「进程与线程的关系是包含关系,一个进程中至少有一个线程,或者多个线程,一个线程只能归属于一个进程中」。就好比一个车间中可以有多个流水线,一条流水线上有多个功能开工,在组长安排下工人只能在一条流水线上工作。

图片来源于网络

当然,进程中的所有线程共享这该进程的所有资源,比如:内存空间,每个线程都可以使用这个内存空间。就好比车间中的空间都是各条流水线共享的。

不同的空间若能容纳的工人也不一样,就好比厕所一次只能一个人进厕所,当后面来的人,注意到厕所门已经关闭,就知道里面有人,就只能等候前一个人用完,他才能用。

厕所里面的人,为了防止他人再次进入厕所,就会把厕所锁住,这就是「互斥锁(Mutual exclusion,缩写 Mutex)」,这就意味着在进程中的某一些空间一次只能由一条线程使用。

图片来源于网络

有些空间就会比较大,一次可以供多个人使用,比如:休息室,休息室的座位都是有限的,一次只能供20的座位休息,其余的人就坐不下了。

用于标识这个空间仅给20个人使用的办法就是给每个座位打一个编号1-20,每进去一个人就给这个人发一个作为编号,当编号用完了,表示这个空间已经满了。

图片来源于网络

当有人出来了就会把编号还给看守的那个人,便是又有空间可以使用了,这个做法就是「信号量」,这样保证了每个人都有自己的座位,即保证多线程不会相互冲突。

「那为什么有进程还要多线程呢?」 每个进程都有自己独自的代码和数据空间,即为「程序的上下文」,进程包含多个线程,进程的切换消耗要大于线程的切换消耗。

图片来源于网络

线程可以看作是轻量级的进程,每个线程也有自己的「运行栈」「程序计数器(PC)」、以及「线程的本地存储」,所以对于进程数比较多的,频繁的切换进程将会带来一大笔的开销,反而线程的切换开销小。

图片来源于网络

进程是一个「动态」的概念,进程包含下面的五种状态:「初始态,执行态,等待状态,就绪状态,终止状态」

图片来源于网络

线程中的状态也是包含下面的五种:「新建(NEW)、可运行(Runnable)、运行(Running)、阻塞(BLOCKED)、死亡(DEAD)」

图片来源于网络

那么进程之间是怎么交互的呢?在进程之间的通信包括「管道、系统IPC(包括消息队列,信号量,共享存储), SOCKET。」

管道的方式由包括以下三种方式:

  1. 「普通管道」PIPE:通常会有限制,可能是半双工方式,或者是只能在子父进程中使用。
  2. 「流管道」s_pipe:可以使用双向传输。
  3. 「命名管道」name_pipe:它允许可以在不相关的进程之中使用。

线程之间的通信在JMM模型中是通过共享内存来实现的,例如:线程一要和线程二通信,线程一先把自己的变量副本写入主内存中,然后线程二再从主内存中读取该变量,复制到自己的线程空间中进行操作,线程都不能直接操作主内存。

为了保证多线程之间的数据一致性的问题,可以使用锁机制,实现线程之间的操作的同步、有序。例如:「synchronized锁、Lock锁、Atomic原子类」

单线程时代,一次只能执行一个任务,后面的任务只能排队等候,实现的方式都是串行化的,随着后续的发展为了提高效率,实现了多线程。

单CPU的多线程方式,实现的是并发方式,并发真正意义上的并行,因为CPU一次只能执行一次任务,但是,CPU的执行速度远快于线程的执行速度,为了充分利用CPU,因此实现并发的多线程方式。

图片来源于网络

多CPU时代的来领,实现真正意义上的并行多线程,同一时刻可以由多个线程的执行。

图片来源于网络

最后总结:「操作系统中是以多进程的形式执行,以多线程的方式执行,允许讲单个任务由多个部分执行,并且在多线程之间能够提供协调机制,允许进程之间、线程之间有共享的部分,又能够保证进程之间、线程之间不会相互影响」

1. 人人都能看懂的 6 种限流实现方案!

2. 一个空格引发的“惨案“

3大型网站架构演化发展历程

4Java语言“坑爹”排行榜TOP 10

5. 我是一个Java类(附带精彩吐槽)

6. 看完这篇Redis缓存三大问题,保你能和面试官互扯

7. 程序员必知的 89 个操作系统核心概念

8. 深入理解 MySQL:快速学会分析SQL执行效率

9. API 接口设计规范

10. Spring Boot 面试,一个问题就干趴下了!



扫码二维码关注我


·end·

—如果本文有帮助,请分享到朋友圈吧—

我们一起愉快的玩耍!



你点的每个赞,我都认真当成了喜欢

浏览 21
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报