先来说说进程,早期的进程既是资源分配的最小单位,也是程序执行的最小单位,而现在的进程就是资源分配的最小单位。
进程由程序,数据集合还有PCB构成,程序就是一个指令集和,告诉进程他需要完成什么任务,数据集合包括工作区和进程完成任务所需要的数据,PCB包含了进程所独有的一些信息,他是进程存在的唯一标志。
进程都有自己独立的地址空间,那为什么不能共享地址空间呢?
举个简单的例子,如果拥有共享的内存空间,那么你用手机银行就能看见其他人的银行卡密码等相关信息,这是非常不安全的,所以他们都用有自己独立的地址空间。
任何一个进程都可以和其他进程并发,实现了操作系统上多个应用程序的并发。
由于进程切换时空开销很大,所以并发粒度粗,不能满足现在的需求,所以我们现在都使用多线程。
到这里那我们就来说说线程
本来是没有线程这个概念的,前面也说到进程切换开销大,进程间通信也很麻烦,所以就产生了线程这个概念。
有了线程之后,进程就是资源分配的最小单位,不需要频繁的去切换他了,执行的工作就交给了线程。
所以说线程就是程序执行的最小单位。
线程共享进程的地址空间以及进程级的资源(全局变量、堆空间等),线程所独有的资源有四个:状态字,寄存器,栈,PC。
由于线程共享内存,所以线程间通信很容易,线程切换开销也小。
那么多线程的意义是什么呢?
多线程的意义就在于可以让程序并发的执行多个任务,举个简单的例子:
当我们打开一个word,就产生了一个进程,同时会产生多个线程,一个线程管理输入,一个线程管理输出,一个线程管理定时保存等,所以当我们键盘输入的时候会立马看见屏幕上出现了我们输入的字符,而不会是等一会才出现,这就是多线程完成的事。
那我们为什么不使用多进程完成而使用多线程?
前面也说到了多进程切换开销大,通信麻烦,其次是进程都是由系统内核产生的,每个进程都会占用一部分系统资源,所以产生的进程数不会很多,而线程不同线程的数量理论上可以无穷无尽,产生进程的代价要比线程大得多,所以使用多线程实现任务并发比多进程要效率高的多。