关于进程和线程
Topic source举个例子:很多地方不准确,但可以帮助理解
CPU核心:工人
工程:进程
工程信息(包括进度):上下文
一个工人接了很多个工程,此间,有些工程在某个节点都需要等待上级批准(时长不确定),
这个时间安排先干别的工程,列了一个时间表,给每个工程划分了固定工作时长,依次轮流进行(不是干完一个再换一个,而是每次干一个工程的一部分)
每次重启工程都需要领导帮忙回忆工程信息,耗时三小时,完成工程只需要十分钟
(以上属于单核cpu)
工人组了一个工程队,每个分配了一些工程单干,仍按照以上顺序工作,加大了工作效率,但由于信息不共享,每个人都需要领导来讲工程信息
(以上属于多核多进程)
工程队改变一种工作模式,一同完成同一个工程,只需要一个人去听领导讲工程信息,大家各自去完成一个工程中的不同工作
(以上属于多核多线程)
噗,我想起来一个很常见的东西:请大家打开任务管理器
看一下菜单栏第一个:进程
进程界面有很多正在运行的程序(也就是进程) 这是队列
并且它们的顺序一直在切换,位于上列的是你现在正使用的东西,位于后面的是一些计算机系统,基本用不上的东西
你可以右键浏览器(假如你开多个浏览器界面的话),点击展开,显示的就是子进程
右击状态,可以添加PID属性
在右侧有cpu的利用率,以及内存占比
接着我们看一下性能选项的界面中,
在CPU栏中,显示了进程总数,后面紧跟着线程数量
还有内核,显示你用的计算机是几核的
- 1
一盒噪噪
计算机为什么要用进程的方式处理程序:https://blog.csdn.net/fu123123fu/article/details/86532188
JAVA常用到多线程,Python由于全局锁的存在,不能利用多核优势,所以在多线程上不太强势(同一时间只能有一个线程执行)
(详细内容请自行百度)知识点:1、cpu中央处理单元工作原理(①数据寄存器、②控制单元:指令寄存器IR,程序计数器PC) 2、程序 —> 作业 —> 进程(状态图)
3、(内存)分页调度和请求分页调度了, 4、队列and进程调度器 5、并行、并发处理
进程概述:进程是调度基本单元,是一个程序执行的时间段(请结合3理解)
磁盘上存储的代码称为程序,程序被选中变成作业,作业装入内存可被cpu执行称为进程(三个状态:就绪、运行、等待)
(单)进程:单核cpu执行进程的原理: 一句话:轮流着来 (串行执行) 只是由于cpu运行速度太快,让你觉得它们是同时的
(原理类似于一堆孩子排队吃饭,根据每个人情况不同,大人决定吃几口,队首的人每次吃一口,吃的时间也有限制(PC会记录每个孩子吃了几口),
吃过一口的就去队列末尾重新排队,或者吃完一口了,有别的需求比如想上厕所的,就去上厕所,解决完了再去排队)
(这也就解释了为什么计算机要让cpu用轮流着来这种方式,如果要坚持让一个孩子吃饱再喂下一个,那这个孩子如果想上厕所,还要等他回来,浪费大量时间)
比如电脑会卡顿,但是把这些卡顿分成无数个你根本感觉不到的时长,你就会感叹,woc好快
进程排的队称为队列
cpu可以同时执行多个进程,不是同一时间执行多个,也不是完整执行一个程序再执行下一个,而是给每个程序分配固定执行时长,称为时间片
大致流程:
进程被放入一个队列中,cpu处理最前面的进程A(每个进程都分配有调度时长),
①加载A的运行环境(此时其他进程处于就绪状态,或等待指令的状态)
②A进入运行状态,时间结束(或者需要得到用户指令或者别的什么,进入等待状态/IO队列,得到指令后)进入就绪状态
③A到队列末尾重新排队,等待被执行(此时cpu会记录下它进行到哪一步了,PC的值加1,保存运行环境/程序上下文)
以上是单核处理器,n核处理器相当于 一群程序排成n个队,n个进程可同时被执行,也就是多进程
当其中几个进程有关联的时候,比如进程B是由另一个进程A作为前提才能运行的时候,这个进程B就是A的子进程
上面提到了cpu的一个部件数据寄存器,子进程虽然和主进程有关联,但是由于它们不是由一个cpu执行的,每个cpu的数据寄存器都会复制一份进程所需的数据,所以数据并不共享
例如:子进程中更改了程序代码中的变量count,但是另一个子进程或主进程中的count仍然按部就班的运算
(一核有难,七核点赞。即一个cpu中的进程/线程出现问题,并不会影响其他cpu中的进程,但其他cpu也不能帮助它,顶多围观)
ps* 多核cpu的每一个核心拥有独立的运算单元、寄存器、一级缓存、但共用同一条内存总线、同一段内存,内存中的有些文件一次只能供一个cpu调用,有些可以供几个cpu调用,所以产生了死锁的概念,进程管理器的基本原则是进程同步:即让拥有不同资源的不同进程同时运行*
线程概述:多线程和多进程一样,都是由多核cpu的多个核心上同时运行的,并不是指一个核心能同时运行多个线程
进程=加载运行环境(上下文内容)+CPU执行+CPU保存上下文
可以看出:在处理运行环境,也就是加载上下文的内容上花费了大量时间,
其实CPU(运算单元)执行进程是很快的,但由于太快了,其他的设备(比如PC)跟不上它,比如花一个小时加载了运行环境,一秒钟就完成了运算
由于每个进程之间资源不共享(数据存储在不同的内存空间里),核心要想运算下一个进程的时候,还需要重新加载上下文环境
所以引入了线程,进程必须要有一个主线程,可有多个子线程,一个进程里的多个线程共享资源
比如:把进程A分成很多个小块a1,a2,a3,b1,b2,b3,c.... (每一个小块为一个线程)
此时加载出进程A需要的资源,供多个核心同时使用,通过进程调度器的工作,每个核心处理的程序块都不同,称为并行
如果使用多进程模式,则每个核心的时间片完成后,都需要等待处理器做一次加载上下文的工作
但是也因为资源共享,会出现调度问题,多个线程都需要用同一个资源,而一个资源同一时间只能供一个线程调度,就会出现bug
CPU在载入程序的时候,会放入存储器中,存储器一次只能放下一定量的程序,这里牵扯到了分区调度、分页调度和请求分页调度、请求分段调度
进程是资源分配的最小单位
线程是CPU调度的最小单位
以上为自己综合理解,有不对的地方望指正
推进《计算机科学导论》这本书 类似的还有《操作系统》等等