线程----概念引入---线程和进程的区别

线程
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都在工具房里,
工具房公共区域的东西,他们都可以随便拿来用的,不需要再叫管家帮忙

 

 

 

posted @ 2022-05-10 16:31  今天也是开心的一天呀  阅读(40)  评论(0)    收藏  举报