Discuss / Python / 关于进程和线程

关于进程和线程

Topic source

一盒噪噪

#1 Created at ... [Delete] [Delete and Lock User]

计算机为什么要用进程的方式处理程序: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调度的最小单位

以上为自己综合理解,有不对的地方望指正

推进《计算机科学导论》这本书   类似的还有《操作系统》等等

一盒噪噪

#2 Created at ... [Delete] [Delete and Lock User]

举个例子:很多地方不准确,但可以帮助理解

CPU核心:工人

工程:进程

工程信息(包括进度):上下文

一个工人接了很多个工程,此间,有些工程在某个节点都需要等待上级批准(时长不确定),

这个时间安排先干别的工程,列了一个时间表,给每个工程划分了固定工作时长,依次轮流进行(不是干完一个再换一个,而是每次干一个工程的一部分)

每次重启工程都需要领导帮忙回忆工程信息,耗时三小时,完成工程只需要十分钟

(以上属于单核cpu)

工人组了一个工程队,每个分配了一些工程单干,仍按照以上顺序工作,加大了工作效率,但由于信息不共享,每个人都需要领导来讲工程信息

(以上属于多核多进程)

工程队改变一种工作模式,一同完成同一个工程,只需要一个人去听领导讲工程信息,大家各自去完成一个工程中的不同工作

(以上属于多核多线程)

一盒噪噪

#3 Created at ... [Delete] [Delete and Lock User]

噗,我想起来一个很常见的东西:请大家打开任务管理器

看一下菜单栏第一个:进程

进程界面有很多正在运行的程序(也就是进程)  这是队列

并且它们的顺序一直在切换,位于上列的是你现在正使用的东西,位于后面的是一些计算机系统,基本用不上的东西

你可以右键浏览器(假如你开多个浏览器界面的话),点击展开,显示的就是子进程

右击状态,可以添加PID属性

在右侧有cpu的利用率,以及内存占比

接着我们看一下性能选项的界面中,

在CPU栏中,显示了进程总数,后面紧跟着线程数量

还有内核,显示你用的计算机是几核的


  • 1

Reply