Java并发编程的魅力之进程,线程,并发,并行
1.1 什么是进程?
我们知道,在Windows 操作系统中,运行着各种各样的程序。
比较直观点的我们可以可以打开windows 的任务管理器。
打开的方式有很多种,
- 第一种:可以装逼的一种是通过在cmd 命令行下输入
taskmgr
- 第二种:同时按住电脑键盘上的“Shift+Ctrl+Esc”组合键
- 第三种:同时按住电脑键盘上的“Alt+Ctrl+Del”组合键,然后选择“任务管理器”
打开后我们可以看到如下的内容:
Windows 操作系统管理电脑上运行的各个应用程序,其实是通过管理各个不同的进程来实现的。
接下来我们详细讲解Windows 上一个操作系统上程序的执行过程。
我们想要打开一个Chrome 谷歌浏览器,需要经过什么步骤呢?
- 首先,我们桌面上的 Chrome.link 快捷方式,操作系统会为我们找到Chome.exe
- Chrome.exe 一旦被执行,就会向WIndows操作系统发出申请。
- 在操作系统管理中,进程是分配内存资源的基本单位,因此操作系统会为我们程序请求分配进程。
- 我们可以看到根据Chrome.exe 程序的需要,操作系统为它分配了好几个进程,每个进程中拥有一定的内存空间。
- 程序将数据加载到分配好的进程内存里
- 然后CPU从内存中取出要计算的数据,放到程序计数寄存器进行数据计算
- 对比并将更新操作的结果数据放回到进程内存中。
总结就是:
- 进程是系统进行资源分配和调度的基本单位。
1.2 什么是线程?
上面我们已经了解到什么是进程,那么什么是线程呢?
在Windows 操作系统管理中,操作系统可以为不同的进程分配不同大小的内存空间
然后不同的进程可以同时管理使用很多个线程来干活,这些线程共享这个进程分配到的内存空间。
值得注意的是,理论上来说,内存空间越大,可以使用的线程数越多。
为什么呢?
假设一个进程分配到100MB内存,一个线程需要10MB 内存,那么你最多只能用十个线程吧?
操作系统会将线程和线程之间内存区域互相隔离开,因此Java并发要处理就是使用线程如何正确处理同步这些共享内存空间中的数据。
总结就是:
线程是CPU调度和分派的基本单位
1.3 进程和线程之间是什么关系?
关于进程和线程之间的关系,其实用一句话就可以解释清楚
一个操作性系统有多个进程,每个进程拥有和管理多个线程。
1.4 什么是并发?
并发其实并不是一并,一起发生的意思,而是在一段时间内,不断切换任务,在外界其他人看起来好像在一起发生一样。
举个例子,我一边用网易云播放器播放着音乐,一边在Typora Markdown 编辑器中写着博文。
网易云播放器播放着音乐和Typora Markdown 编辑器写内容是两个不同的进程,两个进程之间在一定时间内,不断切换任务,由于切换的速度很快,看起来,这两个任务好像在一起发生一样。
总结如下:
并发其实只是看起来好像在一起发生。
1.5 什么是单线程?
举个例子, 比如我经常在家做饭,一般需要煮面和炒菜,用时大约十五分钟。
把我整个人比作是一个进程,可以干很多活,但是我只有一个线程,也就是说我同一时刻我只能做一件事。
我可以这么做
先烧开水,等待,煮面,等待,再洗菜,切菜,炒菜
按照上面顺序编程的做法,由于烧水和煮面都是比较耗时的工作,效率都比较低下,可能需要耗时十五分钟
1.6 什么是多线程?
举个例子, 比如我经常在家做饭,一般需要煮面和炒菜,用时大约十五分钟。
把我整个人比作是一个进程,可以干很多活,但是我有多个线程,也就是说我同一时刻我能做两件事。
先烧开水,洗菜,切菜,炒菜,煮面。
按照上面多线程编程的做法,在烧水阻塞的时候,开始洗菜,切菜,可以显著提升做饭速度。
总结如下:
- 并发编程的一个好处就是在同一段时间内可以比顺序编程做更多的事
- 但是并发编程是有前提的,那就是必须有阻塞
1.7 什么是并行?
可能我们还听说过并行,那么什么是并行呢?
还是拿我在家做饭为例,假如我有了一个对象,我们一起做饭。
- 我是一个进程,有一个线程,毕竟同一时刻只能做一件事。
- 对象也是一个进程,也有一个线程,她也是同一时刻也是只能做一件事。
同一时刻,我炒菜,对象煮面。
我们两个进程中的两个线程同时操作内容如下:
- 我洗菜,切菜,炒菜。
- 对象烧水,煮面。
这样做饭的速度很明显,会比之前更快,所以有个对象很重要。。。
本篇完~