提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
一、线程概念和多线程模型
什么是线程?为什么要引入线程?
QQ可以视频聊天,文字聊天,还可以传送文件,这些事情是怎么在进程当中完成的呢。很显然,这些事情不可能由一个程序顺序处理就能实现的,如果只能顺序处理,我们不可能同时做这些事情。
每个进程当中可能包含多个线程,然后CPU用一定的算法轮流的为一些线程进行服务。这样同一个进程被分为了不同的线程,这样就可以把QQ的不同任务放到不同的线程下进行执行,这两个线程可以并发的执行,自然不同的事情就可以并发的完成。
引入线程之后,线程就成为了程序执行流的最小单位。没有引入线程之前,一个进程就对应一份代码,这些代码只能顺序的依次往下面执行,但是再引入了线程之后,每一个进程可以有多个线程,并且这些线程可以有各自不同的代码,也可以是不同的线程运行的同样一份代码,但是这些代码都可以并发的被CPU处理,然后并发的依次执行下去。
线程其实可以理解为“轻量级的进程”,以前CPU的调度是以进程为单位,而现在CPU的调度是以线程为单位。
引入线程后,进程只作为除CPU之外的系统资源的分配单元,加入计算机系统当中有各种各样的系统资源,那么这些资源是会分配给进程的,而不是分配给线程的。
理解切换进程的运行环境?类比图书馆看书,加入自己正在使用图书馆的一张桌子,突然有一个不认识的人也要用这个桌子,这个时候你要把自己的书收走,他要把他的书放到桌子上。所以这就是进程切换所带来的运行环境的切换。这个切换是需要付出一定的代价的,你需要把书搬走,他需要把书放下。
但是假如是你的舍友使用这张桌子,你们两个认识,属于同一个进程,这种情况就可以不把桌子上的书收走,把书依然放在桌子上,这就类似于同一进程内的线程的切换。
线程的属性:
线程控制块也是用于管理线程所创建的一个数据结构,和进程类似,线程也有就绪、阻塞、运行三种基本状态。
线程是调度的基本单位,而系统资源分配是分配给进程的,所以线程几乎不拥有系统资源,系统资源都是在进程那里。但是线程肯定也需要使用一系列的系统资源,这些系统资源从哪里来呢?其实同一个进程之间的不同线程可以共享使用进程的资源,这些系统资源包括IO设备,内存地址空间这样的资源。
线程的实现方式:
一种叫做用户级线程,一种叫做内核级线程。
用户级线程,操作系统只能看到进程,调度依然是以进程为单位的。
内核级线程才是处理机分配的单位。
多线程的模型:
多线程模型总共有三种。
多对一模型:
用户级线程的管理是由应用程序来负责的,所以用户级线程的切换只需要在用户空间(用户态)下就可以完成了,不需要切换到核心态。
当一个用户级线程被阻塞以后,也会导致相应的内核级线程被阻塞,从而导致进程被阻塞,其他的用户级线程就不可以继续执行下去了。
一对一模型:
内核级线程是处理机调度的基本单位,所以这些线程可以在多核处理机上并行执行。
多对多模型:
总结:
总结
这一部分主要介绍线程的概念和多线程模型。