操作系统
关于操作系统的概念,我在北京大学出版社出版的《操作系统教程》中找到这么一段话:
操作系统是计算机系统中的一个系统软件,它能够有效的组织和管理计算机系统中的硬件及软件资源,合理地组织计算机工作流程,控制程序的执行,幷向用户提供各种服务功能,使的用户能够灵活、方便、有效的使用计算机,并使整个计算机系统能够高效的运行。
简而言之,操作系统就是一个管理计算机中所有资源(所有的硬件,比如CPU、内存、输入输出设备以及软件),并合理分配,使计算机能够高效的运行的一个程序。(操作系统本身也是一个程序,也是由一段段的指令+数据组成的!!)。
进程
进程是一个在内存中运行的应用程序,从操作系统的角度来看,进程就是操作系统分配资源的最小单位。
在空间角度上,主要是对内存进行分配:
在时间角度上,主要是对CPU的时间段进行分配(在单核的情况下,只有一个CPU,所有的进程只能使用CPU一段时间):
因为每个进程所需要使用CPU的时间不同,如果等上一个进程结束了,再让下一个进程使用CPU,那么执行进程的效率就会非常低下。
比如:进程A先来,需要使用CPU2个小时,进程B后来,需要使用CPU2分钟,那么如果按照先来先服务,进程B就需要等待A使用完毕后,才能使用CPU。
在此基础上,将CPU的时间分为一个个时间片,一个进程占用CPU一小会儿,就可以使进程的执行效率得到提高(现代操作系统所采用的方式)。
当分给A的时间片耗尽时,就会发生进程的调度(但是发生进程调度的情况不止这一种),此时B再来使用CPU,这样往复操作,进程的执行效率就会提高,而且,由于每段的时间片都是非常微小的,在宏观上看,哪怕是只有一个CPU,AB进程也是在同步执行的。
发生进程调度的几种情况:
1、拥有更高权限的进程可能把CPU从当前进程抢走(抢占式)。
2、当一个进程的所有指令都执行完毕时,进程就执行结束了。
3、当一个进程需要等待外部IO时(比如scanner.nextLine()等待用户输入)。
4、一个进程可以主动放弃CPU。
5、时间片耗尽。
进程状态
5点可能被发生进程调度的情况,从状态的视角来看
运行->就绪 1、被更高优先级的进程抢走了CPU。2、时间片耗尽。3、主动放弃。
运行->阻塞 4、等待IO(scanner.nextLine()等)。
运行->终止 5、进程中的指令执行完毕。
线程
进程是系统分配资源的最小单位,线程是系统调度的最小单位。一个进程至少有一个线程,允许有多个线程(多线程),一个进程内的线程之间是可以共享资源的。
多线程的优势:
1、增加运行速度:
通过添加线程,可以争抢到更多的CPU资源。
需要注意的是,线程个数变为原来的四倍,但分配的时间并不是原来分配的时间的四倍(比四倍小)。
这是因为:
1、在就绪队列中还存在其他线程。
2、线程本身的创建/销毁,也需要耗费CPU的时间。
一味的增加线程,可以一直提升运行速度吗?
不可以!
因为线程抢到CPU是有极限的,而且,线程数越多,用在线程的创建或销毁上的时间也会变得越来越大,同时也会增加操作系统的负担。
比如说:原本有一个人打扫一间教室,此时增加到五个人,打扫的效率就会提高,
如果增加到100个或者更多,打扫的效率就会非常低,同时也不方便管理这些人。
2、在阻塞场景下:
通过添加新的线程,使如果阻塞一个线程,不影响其他线程抢CPU的过程。
比如说:在处理一些时间复杂度过高的算法时,比如用递归计算斐波那契数列的第N项,
如果用户输入的数字过大,那么在执行这一过程时,程序可能会出现卡死的状况,此时采用
多线程,如果某一个次用户输入的数据过大导致主线程被阻塞了,也不耽误用户输入下一个
数据的计算。
本文仅对进程和线程做大概总结,后续会更新多线程的一些比较重要的知识点(线程安全及实现,多线程的应用,阻塞队列,线程池等)。