我们之前学习的程序在没有跳转语句的情况下,都是由上至下沿着一条路径依次执行。现在想要设计一个程序,可以同时有多条执行路径同时执行。比如,一边游戏,一边qq聊天,一边听歌
,怎么设计?
要解决上述问题,需要使用多进程
或者多线程
来解决。
程序(program):为完成特定任务,用某种语言编写的一组指令的集合
。即指一段静态的代码
,静态对象。
进程(process):程序的一次执行过程,或是正在内存中运行的应用程序。如:运行中的QQ,运行中的网易音乐播放器。
操作系统调度和分配资源的最小单位
(亦是系统运行程序的基本单位),系统在运行时会为每个进程分配不同的内存区域。线程(thread):进程可进一步细化为线程,是程序内部的一条执行路径
。一个进程中至少有一个线程。
一个进程同一时间若并行
执行多个线程,就是支持多线程的。
线程作为CPU调度和执行的最小单位
。
一个进程中的多个线程共享相同的内存单元,它们从同一个堆中分配对象,可以访问相同的变量和对象。这就使得线程间通信更简便、高效。但多个线程操作共享的系统资源可能就会带来安全的隐患
。
下图中,红框的蓝色区域为线程独享,黄色区域为线程共享。
红框内对应一个进程,即一个应用程序,可以理解为JVM的一个实例,相当于Java虚拟机现在在运行这样一个项目,这个项目就是应用程序,一运行就是一个进程。
一个进程里面可以有多个线程,即执行路径。
有一些内存结构是每个线程一份,有一些内存结构是多个线程共享的。
每一个线程都有一个虚拟机栈、本地方法栈、程序计数器,多个线程对应的进程只有一份方法区和堆。
栈可能有多个,每个线程对应一个虚拟机栈,对应的栈执行到哪里了,这里有一个记录,指定的地址就是程序计数器,所以程序计数器也是每个线程一份。本地方法栈就是调用内存方法的栈,每个线程一份。
大家共享方法区和堆,只有一个堆,优点是可以使多个线程处理一个进程共享数据问题比较方便(线程间的通信),缺点是不安全(线程的安全问题)。
注意:
不同的进程之间是不共享内存的。
进程之间的数据交换和通信的成本很高。
【面试题】
?程序、进程和线程的区分:
一组指令的集合
。即指一段静态的代码。我们可以在电脑底部任务栏,右键----->打开任务管理器,可以查看当前任务的进程
:
1、每个应用程序的运行都是一个进程
2、一个应用程序的多次运行,就是多个进程
3、一个进程中包含多个线程
轮流使用
CPU 的使用权,并且平均分配每个线程占用 CPU 的时间。优先级高
的线程以较大的概率
优先使用 CPU。如果线程的优先级相同,那么会随机选择一个(线程随机性),Java使用的为抢占式调度。背景:以单核CPU为例,只使用单个线程先后完成多个任务(调用多个方法),肯定比用多个线程来完成用的时间更短,为何仍需多线程呢?
多线程程序的优点:
单核CPU,在一个时间单元内,只能执行一个线程的任务。例如,可以把CPU看成是医院的医生诊室,在一定时间内只能给一个病人诊断治疗。所以单核CPU就是,代码经过前面一系列的前导操作(类似于医院挂号,比如有10个窗口挂号),然后到cpu处执行时发现,就只有一个CPU(对应一个医生),大家排队执行。
这时候想要提升系统性能,只有两个办法,要么提升CPU性能(让医生看病快点),要么多加几个CPU(多整几个医生),即为多核的CPU。
?问题:多核的效率是单核的倍数吗?譬如4核A53的cpu,性能是单核A53的4倍吗?理论上是,但是实际不可能,至少有两方面的损耗。
一个是多个核心的其他共用资源限制
。譬如,4核CPU对应的内存、cache、寄存器并没有同步扩充4倍。这就好像医院一样,1个医生换4个医生,但是做B超检查的还是一台机器,性能瓶颈就从医生转到B超检查了。另一个是多核CPU之间的协调管理损耗
。譬如多个核心同时运行两个相关的任务,需要考虑任务同步,这也需要消耗额外性能。好比公司工作,一个人的时候至少不用开会浪费时间,自己跟自己商量就行了。两个人就要开会同步工作,协调分配,所以工作效率绝对不可能达到2倍。并行(parallel):指两个或多个事件在同一时刻
发生(同时发生)。指在同一时刻,有多条指令
在多个CPU
上同时
执行。比如:多个人同时做不同的事。
并发(concurrency):指两个或多个事件在同一个时间段内
发生。即在一段时间内,有多条指令
在单个CPU
上快速轮换、交替
执行,使得在宏观上具有多个进程同时执行的效果。
在操作系统中,启动了多个程序,并发
指的是在一段时间内宏观上有多个程序同时运行,这在单核 CPU 系统
中,每一时刻只能有一个程序执行,即微观上这些程序是分时的交替运行,只不过是给人的感觉是同时运行,那是因为分时交替运行的时间是非常短的。
而在多核 CPU 系统
中,则这些可以并发
执行的程序便可以分配到多个CPU上,实现多任务并行执行,即利用每个处理器来处理一个可以并发执行的程序,这样多个程序便可以同时执行。
目前电脑市场上说的多核 CPU,便是多核处理器,核越多,并行
处理的程序越多,能大大的提高电脑运行的效率。