一、进程
- 什么是进程
在在早期的操作系统中并没有线程的概念,进程是能拥有资源和独立运行的最小单位,也是程序执行的最小单位。任务调度采用的是时间片轮转的抢占式调度方式,而进程是任务调度的最小单位,每个进程有各自独立的一块内存,使得各个进程之间内存地址相互隔离。后来,随着计算机的发展,对CPU的要求越来越高,进程之间的切换开销较大,已经无法满足越来越复杂的程序的要求了。于是就发明了线程。
- 为什么可以同时运行通过进程(程序)
答案是使用了空间复用技术和时间复用技术
**空间复用:**cpu把一整个空间分成多个小空间(小房间),但当我们运行一个程序的时候,cpu会给这个程序分配一个小空间让这个程序使用,从而保证在同一个cpu下可以运行多个程序。
**时间复用:**这里有一个资源抢占机制,如:在同一时间打开程序A,程序B,程序C,程序A先告诉CPU我已经准备好了,随时可以运行,那么CPU就会给程序A分配运行资源给他运行,在这运行的过程中遇到两种情况:1,程序A运行是遇到IO堵塞,会立即释放占用的CPU资源,然后让别的程序对这资源进行抢占。程序A在IO堵塞完成后会进入到就绪状态进行运行资源的抢占。2,正常运行,没有堵塞的情况发生,那么CPU会让程序A运行1-10ms,然后会是释放程序A的运行资源,程序A就会进程到就绪状态,程序B和程序C对就会在就绪状态对运行资源进行抢占,抢占到的程序也执行1-10ms,然后在给别的程序。以此类推。由于每个程序运行的时间不人感觉不出来,感觉到同一时间多个程序都在运行
二、线程
1,线程的出现
当进程开启到一定数量后,消耗的资源占据太大,频繁切换进程的时间太久(如听歌会一卡一卡的)因此CPU就不让进程为最小执行单元了–在进程之上出现了线程管理(一个线程可以看作一个代码块)
2,多线程
现在线程作为最小的执行单元,进程就是最小资源管理单元,这个的优势相比较进程而言资源占用更少,切换更快更流畅。而且访问百度和搜狗只用开启两个线程即可不用开启两个进程。例子:goole浏览器,打开google浏览器,但是不访问网址,那么这个时候就是告诉CPU开辟进程空间,但是没有执行,现在想访问百度,搜狗,这个时候google浏览器就会告诉CPU,开启两个线程分别访问百度和搜狗。
当线程的数量小于处理器的数量时,线程的并发是真正的并发,不同的线程运行在不同的处理器上。但当线程的数量大于处理器的数量时,线程的并发会受到一些阻碍,此时并不是真正的并发,因为此时至少有一个处理器会运行多个线程。
在单个处理器运行多个线程时,并发是一种模拟出来的状态。操作系统采用时间片轮转的方式轮流执行每一个线程。现在,几乎所有的现代操作系统采用的都是时间片轮转的抢占式调度方式,如我们熟悉的Unix、Linux、Windows及macOS等流行的操作系统。
三、进程和线程的区别
- 线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位;
- 一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线;
- 进程之间相互独立,但同一进程下的各个线程之间共享程序的内存空间(包括代码段、数据集、堆等)及一些进程级的资源(如打开文件和信号),某进程内的线程在其它进程不可见;
- 调度和切换:线程上下文切换比进程上下文切换要快得多。
四,协程
线程由内核态(操作系统)管理,在同一个线程中,把代码分成多个任务,让一个协程模块调度,从而在用户态对任务的执行进程管理。从操作系统和cpu来看,只识别了为一个线程。官方语言:协程可称为微线程,或非抢占式的多任务子例程,一种用户态的上下文切换技术(通过一个线程实现代码块间的相互切换执行)。这种由程序员自己写程序来管理的轻量级线程叫做『用户空间线程』,具有对内核来说不可见的特性。正如一个进程可以拥有多个线程一样,一个线程也可以拥有多个协程。
执行过程:在用户态上有任务1和任务2两个任务–用户态调用了调度代码----向操作系统创建一个线程,在线程中创建了任务1,任务2和调度任务三个模块–cpu只执行线程—因此调度任务就模拟出同时执行任务1和任务2的情况—而且这个调度任务是认为选择的。