cpu、程序、进程、线程

一、直奔主题

  从cpu的角度来说,没有所谓程序、进程、线程。cpu看上去,一个略方略正的物理器件,有质量。安装其它相关物理组件(主板、内存条、电源),通上电它即可工作。它没有生命,也不懂得思考。所以它既不认识0,也不认识1。如果非要说cpu认识什么,那勉强说它认识电流吧,因为流经cpu的只有电流。

二、我们常说,"运行一个程序"

  1. 谁运行程序?
    只有cpu能运行程序,内存并不能运行程序,内存的职责是保存程序指令和数据,让程序运行(动起来)只有cpu能办到。
  2. 它能运行多个程序吗?
    cpu可以运行多个程序,酷狗程序运行1秒,QQ程序运行1秒,微信程序运行1秒,按这个模式往复交替的运行多个程序。这样子,每个程序就都可以得到运行了。
  3. cpu识别程序吗?
    cpu不识别程序,它没有生命,不会思考。对于cpu而言,它不需要识别程序,要它做计算(或判断)时,只要给它从指定针脚输入指定电流(猜测5伏,实际不知道),电流流过其内部指定电路(各种门:与门电路、或门电路、非门电路...),然后再从某个针脚流出来(不然计算结果不就丢失啦!),出来的电流经过电路处理已经和输入电流不一样了,这些输出的电流,就是[计算/判断]的结果。"结果电流"会通过总线流到内存条中,最后再流到硬盘中-->转换成物理介质存储起来,从而实现长时间的数据保存。数字的计算、if的判断、"结果电流"-->物理介质存储数据等等功能都可以通过不同的特定电路实现,而cpu内部包含了这些特定功能的电路实现。所以,我觉得cpu不识别程序。
  4. 不识别的话,cpu怎么运行多个程序?
      如果cpu不识别程序,它怎么知道从哪个程序开始运行,然后接着运行哪个程序?对于cpu来说,指令就是电流,给它输入啥指令(输入怎样的电流),它就处理啥指令(让电流通过相应的电路),然后输出结果(电路处理以后输出的电流)。它不关心指令打哪来,是谁家的->不管是酷狗音乐、还是腾讯QQ的指令,你给我什么--我就执行什么,最后把执行结果给你。虽然cpu不需要知道、也不用关心它执行的指令是哪个程序的,但人得知道(为啥人得知道我也不清楚,反正就是得知道),所以人就对指令进行分类。酷狗音乐这个程序的:指令和数据是一个进程,它独占一块物理内存。腾讯QQ这个程序的:指令和数据又是一个进程,它独占另外一块物理内存。
      cpu从内存中来回的读取指令执行->抽酷狗的指令(+数据)来执行一段时间,完了再抽腾讯QQ的指令(+数据)来执行一段时间,这样就实现了多个程序的运行。(cpu没有生命不会思考,那它是怎么懂得去内存中来回读取指令和数据的->猜测是: 操作系统 + 某种巧妙的物理电路实现的)。这里引用一张百度百科的截图:


    8.png

三、总结

  程序、进程、线程,是人类思维的产物,于物理器件cpu而言是不存在的。因为cpu执行指令的速度快,而人类又想在一段时间内运行多个程序->既想用酷狗听音乐、又想用QQ聊天。所以人类对指令做了分类,用来播放音乐的指令集叫酷狗程序,用来聊天的指令集叫做QQ程序。每个指令集+数据就是一个程序。程序的指令没有在cpu上执行起来,那么它就只是个程序,静态的。
酷狗程序没在cpu上运行音乐是不会播放的,QQ程序没有在cpu上运行,消息是不能发送的。酷狗程序在cpu上运行起来以后,它就叫酷狗进程(此时酷狗程序的指令和数据被加载到内存中保存着),QQ同理。每个程序在cpu上不能一直运行,不然就只能用酷狗听音乐、或者只能用QQ聊天。所以大家各自在cpu上运行一段时间,具体运行多少时间,这个时间要怎么计算就又是另外一门学问(操作系统调度算法)。
  另外一个问题:酷狗程序,它是很多(非常多)指令的集合,那cpu要运行酷狗程序时,要把酷狗程序的全部指令都拿去执行一遍吗?显然不是,应该是这样:只拿一部分需要执行的指令去运行(斗胆猜测)。酷狗程序那么多指令,拿哪些去执行?所以酷狗程序指令集还得再细化,假设分成:A、B、C、D四个部分。A部分指令负责处理音乐数据、并发送给声卡进行播放;B部分指令负责处理歌词数据、并发送给显卡去显示;C部分指令负责用户的歌曲搜索操作;D部分负责音乐下载工作。四个部分的指令组成半个酷狗程序(少了数据)。cpu具体执行哪部分指令取决于用户操作,例如用户要播放音乐,cpu就调度A部分指令去执行,而不是A、B、C、D四个部分的指令都拿去执行,每个部分俗称线程(cpu调度指令的最小单位)。但我个人不认为这就是线程,因为如果说这就是线程,那线程就等于指令->这种定义严谨吗,好像不是很严谨。因为我们可以创建不包含指令的线程,像这样:

public void apple(){
    new Thread(()->{
        
    },"01").start();
}

所以,我认为像讲清楚什么说线程,需要从多个维度出发:

1. 从cpu的角度看:线程就是指令
2. 从OS的角度看:线程是一个调度单位
3. 从内存的角度看:线程是一块有数据的内存。
4. 从jvm的角度看:线程是一个java对象,和其它java对象一样有自己的堆栈。
5. 从java代码来看:线程就是Thread类的实例对象

你可能感兴趣的:(cpu、程序、进程、线程)