cpu为每个线程分配极少的时间处理数据,并且快速的在多个线程之间切换,看起来像是在同时处理,但是在线程不多的情况下cpu利用率一般,为了提高cpu利用率可以适当增加线程,在需要花较多时间的操作上采用多线程,防止线程阻塞并提高cpu利用率。如果是单线程的话一个上传或者下载任务没有完成的话无法执行其他操作。
线程理解小例子:
假如你去一家餐馆吃饭,那家餐馆只有一个服务员,所以这个唯一的服务员给你点菜的时候,别的去餐馆吃饭的人就得等着。但是如果这个餐馆有多个服务员的话,那么在同一时刻就可以给多个去餐馆吃饭的人点菜,这里举A、B两个服务员,分别接待甲、乙两个顾客,而每个顾客点了不同的三道菜。
上面例子中的餐馆可以理解成一个程序,而A、B两个服务员可以理解成两个线程,后厨做菜的厨师可以看做是CPU(假设只有一个CPU)。
从A、B两个服务员同时接待甲、乙两个顾客这个表象来看线程是“同步”、“并发”执行的,但是在厨师做菜的过程中还是有先后之分的,只是厨师会把甲乙两个顾客点的菜分开来做,做完甲的一道菜后立刻开始做乙的一道菜,这样不停地切换着做甲乙两个顾客点的菜。而在甲乙顾客看来他们桌上都有着菜吃,误以为他们的菜是同时做出来的。
而计算机里的多线程也是如此,cpu会分配给每一个线程只有极少的运行时间,时间一到就交出运行权,所有线程被快速的切换执行,因为cpu的执行速度非常的快,所以在执行的过程中我们可以简单的认为这些线程是“并发”执行的。
上面厨师做菜的原则是:不同的切换顾客们点的菜。假设厨师做菜的原则变了,是单顾客原则:给一位顾客做完所有的菜后再给别的顾客做菜,就是说先一下子把甲点的三道菜全做出来后再去做乙点的那三道菜,这样的话如果厨师在做甲的某一道菜时发现甲点的那道菜的原料没有了,那么乙的菜就得一直等着。
如果是在计算机中,单顾客原则执行线程的话,当一个恶性的线程运行不下去时,计算机就会出现死机的现象,这时候只能重启。
上面介绍的厨师做菜的两种原则分别代表着计算机中线程的两种调度形式:抢占式调度和非抢占式调度。应用中我们一般用抢占式调度(即厨师的第一种做菜原则)。
1、基本认识
1.1 定义
# 线程,是进程内部的一个执行单元
# 线程,是系统独立调度和分配的基本单位
# 每个进程至少有一个主线程,由系统自动创建
1.2 为什么使用多线程
例1
界面上点击某个按钮后,需要执行一个非常耗时的操作,如果不使用多线程,我们就只能傻等操作返回。
使用多线程,点击按钮之后,开辟1个新线程后台去执行这个耗时操作,前台界面继续执行其他菜单目录,录入数据等
例2
有个操作,1个线程需要20分钟完成,现在多核 cpu,可以真正同一时刻运行多个线程
假设是双核 cpu,同一时刻运行2个线程,操作就只需要10分钟可以完成
优点
(1)提高应用程序执行效率。
(2)提高CPU利用率。
缺点
(1)占用内存,耗费CPU时间进行跟踪。
(2)共享资源访问相互影响,程式代码控制难度大。
问自己,新开辟的线程,肯定需要内存吧?多个线程之间需要切换吧?
切换需要占用 cpu 来计算吧?多个线程的执行顺序,是无法确定的。
当他们都需要访问相同的变量、文件时,需要对这个变量、文件做同步处理吧?
1.3 线程数量
# 理想的线程数量等于 cpu 核心数量
(1)1个cpu 核心,一个时刻,只会让1个线程使用
如果有多个线程,那肯定需要切换,这个切换也是必要的,不然就会导致傻等的问题。
这里,我们只要明白,一个时刻,1个 cpu 核心,只会让1个线程使用。
(2)超线程
利用硬件指令,把1个物理 cpu 核心内部的2个逻辑内核,模拟成2个物理核心。
通俗点就是1个 cpu 变2个 cpu 了,这时候,同一时刻,就可以2个线程真正的同时运行。
(3)多核处理器
就是 cpu 本身,就有2或多个物理核心(比如:双核,四核),
硬件本身就是可以同一时刻跑2个或多个线程。
1.4 线程执行顺序
# 多个线程的执行顺序是无法确定
这个问题,主要是操作系统
Windows是抢占式管理,谁抢到 cpu,cpu 就帮你干活。
不过 cpu 计算非常的快,这次没抢到 cpu,那就等下次呗,
操作系统Windows也不会让线程饿死的。
1.5 理解同一时刻
# 多个线程同时运行并不一定是同一时刻
1个 cpu 核心,同一时刻,只会有一个线程运行
多核心 cpu,超线程,同一时刻,可以真正同时运行多个线程
备注
我们通常认为的电脑同时运行多个程序,同时执行多个任务
这个 “同时” 并不真正意义上的 “同一时刻”
多个程序,多个任务是否同一时刻运行,要看硬件 cpu 的处理能力
cpu 计算非常的快,多个线程轮询 cpu 执行各自的操作,线程切换频率很快,
我们的感觉是多个线程同时运行
要想多个线程同一时刻运行,那就需要多个CPU核心,
比如,采用超线程,多核心处理器,
同一时刻可以真正运行,2个线程,8个线程,16个线程等。
进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.
线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.
一个线程可以创建和撤销另一个线程;
同一个进程中的多个线程之间可以并发执行.
进程(process)是一块包含了某些资源的内存区域。操作系统利用进程把它的工作划分为一些功能单元。
进程中所包含的一个或多个执行单元称为线程(thread)。进程还拥有一个私有的虚拟地址空间,该空间仅能被它所包含的线程访问。