计算机的核心是CPU,它承担着计算机的所有计算任务。CPU就像一个工厂,无时无刻不在运转,而操作系统则管理着计算机,负责任务的调度、资源的分配和管理。图片来自网络。进程和线程都是计算机操作系统中的基本概念。在进程和线程之上有程序。应用程序是在操作系统中运行的具有一定功能的程序。比如QQ、酷狗音乐、微信等,都安装在我们的桌面上。这些是程序。当我们点击QQ运行时,QQ正常运行,此时会启动一个进程。因此,“程序是静态的,而进程是动态的,程序是进程的载体,进程会随着时间的流逝在某个时刻消亡。”图片来自网上我们运行程序的过程。可以在任务管理器中查看。当我们再次点击QQ,登录另一个账号时,又会启动另一个进程。打个比方:前面我们把CPU比作一个工厂,那么程序就像是工厂里的车间。图片来自网络。然而,车间是静态的。车间有多条流水线。这个过程就像一条装配线。装配线是动态执行的。一个车间可以同时运行多条流水线,也可以只运行一条流水线,也可以不运行一条流水线。.总结一下:“一个程序可以包含多个进程,这些进程并发执行,相互独立。因此,进程也是系统资源分配和调度的基本单位。”当然,一个程序也可以没有启动进程,就像车间里没有流水线一样,因为程序是静态的,进程的存在就像层与层之间是否存在管道一样。图片来自网络。装配线上可能有很多工人。那些工人就像线程。一个员工代表一个线程。他们一起工作以完成流水线上的任务。图片来自网络。因此,“进程和线程之间是一种包含关系,一个进程至少有一个线程,或者多个线程,一个线程只能属于一个进程”。就像一个车间可以有多条流水线,一条流水线上可以启动多个功能,工人在组长的安排下只能在一条流水线上工作。图片来自网络当然,进程中的所有线程共享进程的所有资源,比如:内存空间,每个线程都可以使用这块内存空间。就好像车间里的空间是所有流水线共享的一样。如果不同的空间可以容纳不同的工人,就好像厕所一次只能一个人使用。当后面的人发现厕所门关着的时候,就知道里面有人了,只能等前面的人用完了,他可以使用它。上厕所的人,为了防止别人再次进入厕所,都会把厕所上锁。这就是“互斥(简称Mutex)”,就是说进程中的某些空间在同一时刻只能被一把锁访问。线程使用。图片来自网络有些空间比较大,可以多人同时使用,比如:休息室,休息室的座位有限,一次只能休息20个座位,其余的人们无法坐下。识别这个空间只供20人使用的方法是给每个座位一个编号1-20,每个进入的人都会给一个编号作为编号。当数字用完时,表示空间已满。图片来自网络。有人出来的时候,号码会返还给门卫,也就是有空间可以再次使用。这个方法就是“信号量”,保证每个人都有自己的座位,也就是尽可能多。线程彼此不冲突。“那有进程为什么还要多线程呢?”每个进程都有自己的代码和数据空间,称为“程序上下文”。一个进程包含多个线程,进程间切换的代价比线程大。图片来自网络线程可以看作是一个轻量级的进程,每个线程也有自己的“运行栈”和“程序计数器(PC)”,以及“线程本地存储”,所以对于大量的processes,频繁的进程切换会带来很大的开销,但是线程切换开销很小。图片来自网络进程是一个“动态”的概念,进程包括以下五个状态:“初始状态、执行状态、等待状态、就绪状态、终止状态”。图片来自于网络线程中的状态,也包括以下五种:“新建(NEW)、可运行(Runnable)、运行(Running)、阻塞(BLOCKED)、死亡(DEAD)”。图片来自网络,那么进程是如何交互的呢?进程间的通信包括“管道、系统IPC(包括消息队列、信号量、共享存储)、SOCKET”。pipeline的方式包括以下三种方式:“普通pipeline”PIPE:通常有限制,可能是Half-duplex模式,也可能只能在child-parent进程中使用。“流管道”s_pipe:可以使用双向传输。“命名管道”name_pipe:允许在不相关的进程中使用。JMM模型中线程间的通信是通过共享内存实现的。比如线程1要和线程2通信,线程1先把自己的变量copy写入主存,然后线程2从主存中读取。拿这个变量,拷贝到自己的线程空间进行操作,线程不能直接操作主存。为了保证多个线程之间的数据一致性,可以使用锁机制来实现线程之间操作的同步和顺序。例如:“同步锁,Lock锁,Atomic原子类”。在单线程时代,一次只能执行一个任务,后续任务只能排队。实现方法全部序列化。随着后续的发展,为了提高效率,实现了多线程。单CPU多线程的方式实现了并发,也就是真正意义上的并行,因为CPU一次只能执行一个任务,但是CPU的执行速度要比线程的执行速度快很多。为了充分利用CPU,实现了Concurrent多线程的方式。图片来自于网络多CPU时代,实现了真正意义上的并行多线程,可以同时被多个线程执行。图片来自网络,最后总结:“操作系统以多进程、多线程的形式执行,可以让单个任务由多个部分执行,可以提供多任务之间的协调机制threads,让进程在时间和线程之间有共享的部分,可以保证进程和线程不会互相影响。”
