线程----概念引入---线程和进程的区别
线程 1.为什么会出现线程? 爸爸想给女儿做一个mp3,其他东西都准备好了,就差写程序控制了。 爸爸的代码逻辑是这样的, step1:读取压缩的音乐文件read step2:解压缩decompress step3:播放play 把这几个操作放在一起作为一个进程(一件事情) 但是这样做了以后,发现播放效果断断续续的,因为read过程可能需要花很多时间 和解压缩的时间匹配不上。 爸爸就想怎么改进他,改进方法是 进程1:把歌曲文件全部读出来 进程2:解压缩文件 进程3:播放文件 这样,就把原本的一个事情,分成了三个事情来做,由于先把文件读完了,所以播放器来会很顺畅 而不是断断续续的 虽然实现了顺畅播放,但是这个过程中,其实有不少可以优化的地方,比如 (1)这3个进程怎么共享数据,因为他们处理的都是同一个歌曲文件 (2)由于是3件事情,维护3件事情花的力气可以1件事情大多了 (对应创建进程时,分配资源,撤销进程时回收资源,撤销PCB,进程切换时,保存当前进程的状态信息) 那么怎么优化解决这些问题呢? 管家给出了一个好主意: 管家说,我们的需求是独立做很多不同的事情,并且这些事情可以共享相同的资源 那就开发一种新的机器人,满足 (1)实体之间可以并发执行 (2)实体之间共享相同的地址空间 这样就行啦,把工作交给机器人做,解放我们自己 那现在爸爸要做一个MP3的步骤应该是 1.管家提供需要的材料,空间,资源,各步骤说明书 2.爸爸开始做MP3(这是一个进程),拥有管家准备的完整的资源平台 3.爸爸让3个机器人来分别并发的完成 读取文件 解压缩文件 播放文件 (这是进程下面的3个线程) 每个机器人都可以自动记录自己当前的任务状态,比如做到哪里了(寄存器) (机器人只拥有必不可少的资源) ---------- 1.进程是资源分配单位,线程是CPU调度单位 白话:管家按要做的事情分配资源,爸爸(CPU)按要做的事情生产机器人来完成工作 2.进程拥有一个完整的资源平台,而线程只独享必不可少的资源,如寄存器和栈 白话:爸爸做MP3这件事情,拥有一切所需要的原材料,MP3说明书,工具房等所有资源 机器人1只负责读取文件,那他就只有读取文件必不可少的资源,比如寄存器和栈 寄存器的作用是随时记录当前机器人的工作状态,方便暂停以后,从之前的位置再开始 3.线程同样具有就绪,阻塞和执行三种基本状态,同样具有状态之间的转换关系 ---这个很好理解, 就绪状态:机器人也是需要资源的,组装一个机器人,组装好了以后就能马上开始运行 执行状态:机器人开始干自己的活儿,就是执行状态 阻塞状态:比如机器人1的工作是读取文件,但是他得知道读取哪个文件,所以需要得到指定 读取哪个文件,如果一直没有告诉他读取哪首歌,那他就处于阻塞状态了 4.线程能减少并发执行的时间和空间开销 ----从时间上来说,创建线程比创建进程快,因为所需的资源什么的都已经有现成的了 拿来组装成机器人就行。线程可是要等管家把所有的东西材料都运到厨房里来,这个是个大累活儿 ----从空间上来说,线程只需要在进程开辟的空间里工作就行了,不需要额外自己开辟空间 爸爸做MP3这件事,管家已经分配工具房来给爸爸用了,机器人只要在工具房里工作就行 不需要再申请新的工作空间 5.线程的终止时间比进程短 ----爸爸让机器人停止工作,机器人就能停止工作 ----但是进程的结束需要管家来收拾房间,回收资源,自然多需要一些时间了 6.同一进程内的线程切换时间比进程短 ---一样的逻辑,机器人123切换都在同一个空间里,切换肯定很快了 ----进程切换的话,比如爸爸再工具房做MP3变成爸爸在工具房做收音机 管家得先把当前的状态保存起来,再切换,很麻烦得,整个房间都要动 7.由于同一进程的各线程间共享内存和文件资源,可直接进行不通过内核的通信 ---这个也很好理解,因为机器人123都在工具房里, 工具房公共区域的东西,他们都可以随便拿来用的,不需要再叫管家帮忙

 
 
                    
                     
                    
                 
                    
                 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号