线程的执行

news2024/11/24 7:19:36

承接上文CPU原理简介

程序的执行是由控制器发信号推动整个程序一步一步向前走,将数据存储在寄存器,从程序计数器中获取指令,比如先把3放到寄存器,再把5放到寄存器,再做一个加法,加法就是一个指令,从二进制的角度它也是01构成。

QQ.exe从硬盘读到内存里,内存里面装的全是二进制01,一个程序放到内存里面完全是由二进制01构成。

如何区分二进制01是指令还是数据?

二进制01可以把它看成一个指令,比如add指令,也可以看作是数据,比如5,如何区分这个二进制是指令还是数据?这是由IO Bridge(总线)来控制的,总线是从内存到CPU之间的一条数据线路。

总线分3种类型:控制线、地址线、数据线;从地址线读过来的就是地址,从控制线读过来的就是指令,从数据线读过来的就是数据。

地址线是由cpu中专门的地址寄存器来控制的,通过地址线去寻找地址,比如读到的是0101地址就去读取0101地址区域内存储的数字, 这个数字只要通过控制线过来的,就是指令加法,如果是数据线过来的就是数据5。

各干各自的事情,就看从哪里读过来的。

地址线是一个寻址的线,QQ.exe这个程序放到内存之后,它一定会放到内存的某个地址上,比如这个地址是3号地址,在3号地址的起始位置是main方法,在起步的位置一定会放一条指令,操作系统会通知cpu,你去读3号地址,先把指令读过来,读过来指令如果是add,它就会通知地址线,再把后面的2个数字都读过来,读到寄存器,然后计算单元开始做add计算,计算完了之后,存到某个寄存器,然后再写回内存。

QQ.exe双击之后放到内存里,一定会放到内存的某个地址上,比如内存地址从1号到1万号这么多的地址,比如把QQ.exe放3号地址,整个程序占用从3号到2000号地址区间,最开始的号一定是main方法所占的,最开始读的时候从3号地址开始读,操作系统通知cpu,我现在要运行一个程序,这个程序从3号到2000号,你现在帮我运行它,从3号地址开始读一条指令过来,所以通过控制总线读过来一条指令,这条指令是add,add指令的执行是需要数据的,需要2个数字相加,接下来操作系统会告诉你去哪个位置,比如去4号位置、5号位置去把那2个数字读过来,放到寄存器。将数据放到寄存器之后,运算单元去运算,运算完了之后,把结果放到某个寄存器,再把它写回到内存中的某个位置去,每个程序都有自己的地址空间,从虚拟内存到真正放到物理内存的时候需要做一个地址的映射。

一个程序的执行,首先把可执行文件放到内存,找到起始位置即main开始的地址,进行读取指令和数据,进行计算并写回内存。

什么是线程?什么是进程?

最开始的进程只能执行一个程序 ,必须等我把这个程序执行完,其他程序才可以执行。最开始的计算机只有一个cpu、一个计算单元,让它做程序的计算。先把自己的程序写到闪存卡上,插上去,按下按钮,计算机开始执行,计算机执行这个程序的时候,决对不会执行另外一个闪存卡,这个时候是单任务的。

执行3+5这段代码叫一个任务,这个任务放到计算机执行,只要它放到内存里面就称之为一个进程,只要有一个程序进入内存就可以称为一个进程;进程的概念反映到内存里,一个程序进入内存被称之为进程。

一个程序可以跑多个进程吗?

一个QQ.exe是可以运行多份的,一个程序本身是可以有多个进程的。

内存中的2个进程对应的程序是一个,随着程序的越来越复杂,人们发现不可能同时只一个进程。

2张闪存卡,就会有2个进程,但只有一个计算单元怎么能同时计算2个程序?

分时间计算即时间分片,同一个进程里面也可能要求2个不同的任务同时执行,比如一个带图形的界面,输入数字,服务端做计算,也要响应用户的输入,也可能正在接受网络传输的数据,即有多个任务在同时进行。

同一个进程内部有多个任务并发执行的需求,比如一边计算、一边接受网络数据、一边刷新界面,需要设计一种机制同时并发的运行,能不能把原来的一个进程分成3个进程?其实没有必要引入线程的概念,完全用多进程就行了,但进程有个严重的问题:每个进程都有自己地址空间,进程之间有同步和共享数据的过程,很容易出现一件事情,写我自己进程的时候很容易把另外的进程搞死,到此终于发明了线程。

多线程执行多个任务只使用了计算单元,并没有自己具体的地址空间,如果这3个任务想去访问数据的话,访问的是进程里面的同一份空间的数据即共享进程的空间,但是并不共享计算。

进程是静态的概念,一个程序只要放到内存,分配对应的资源主要是内存空间;线程是动态概念,可执行计算任务。

第一个进程进入内存之后,都会对应一个主线程,进程是分配资源用的,分配的资源是和存储、文件、网络相关的,最主要的是空间资源,进程都有自己的空间,线程是共享进程的空间。

多个线程访问的进程中的同一份数据,就会产生并发的问题。

线程是一条一条指令执行的,数据在进程里。协程是用户级别的线程。

为什么同一个代码可以被多个线程所执行?

线程是可执行的计算单元,做任务计算;

这颗cpu或这个计算单元正在执行这段代码,另外一个cpu正在执行的也是这段代码,2个线程,同一份代码即同一份指令,同一份指令怎么可以有多个线程在执行?

虽然是同一份指令,但有可能里面的数据是不一样的,每次执行参数都是不一样的,比如递归,第一次入参是n,第二次入参是n-1,即便参数是一样的,也可以同时执行2次,这里就会牵扯到线程切换的问题,

cpu正在执行t1,t1有它自己的指令和数据,这些数据是需要放到寄存器的,在t1没有执行完的时候,比如10多毫秒的时间片到了,切换到t2,t2执行完回来又轮到t1,t1不需要从头开始执行,要把t1执行到哪里了给记录下来,保存好上下文;t1执行到了哪条指令以及t1在寄存器是什么状态,全部放到一个缓存里,这个缓存是位于整个进程空间的,这叫保存现场,这就是线程切换的过程,但缓存宕掉了就会丢失,简单的理解为存储到了内存里,严格来讲是存到了锁存器中。

线程的切换,需要保存上下文(保存现场),是不是线程数量越多,执行效率越高?

一个线程正在等待网络的输入,但网络还没有输入,只有一个线程一个cpu的情况下就等着?这个时候显然需要把你的计算资源切换给其他人使用,所以中间有个切换的过程,10个线程可以切换,若有1万个活着的线程,操作系统必须保证每个线程都有时间来执行,不然就不叫活线程了 ,那就会把整个线程资源全部耗在线程切换上了。

对于一个程序或一个线程池设置多少个线程合适?线程池设定多少核心线程?

比如有1颗cpu,如果一个线程有50%的时间做计算,剩下的50%的时间等待着网络的输入和输出,在一颗cpu的情况下,多少个线程可以充分利用好这个cpu,答案是2个线程,在这个线程50%的时间计算完等待网络输入和输出的时候切换给另外一个线程使用。

根据线程等待的时间和计算时间的比值来计算所需的线程数,这里有一个理论上的计算公式,

Ucpu是期望cpu的利用率,比如期望cpu利用率是100%;

100% * (1+50% / 50%)=2个线程,1颗cpu 2个线程,2颗cpu就是4个线程。

当然这是理论,但实际中不能精确的计算出来多少时间做计算多少时间做wait ,最终还是要压测做决定。

这里面有个理想的情况 ,整个机器都被我这个进程所使用,其他进程不用,但是操作系统自己也有线程,其他正在跑着的程序自己也会有线程,那肯定会影响我这个进程,所以理论计算的结果会有一些偏差,实际中肯定是要做压测,可以通过理论计算出来一个初始值,比如10,将线程数设置为10个来做压测,看看是否达到期望值,再根据实际做调整。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/365733.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis官方可视化工具使用体验

前言 我们在使用redis不可避免的使用一些可视化工具,本文来介绍一下官方的可视化工具RedisInsight的使用体验 官方网址:https://docs.redis.com/latest/ri/ 傻瓜式下载安装,此处不作赘述 使用 安装完成后我们当然要先创建一个连接体验一…

九龙证券|全面注册制落地后IPO新增注册准备程序

历经科创板、北交所以及存量商场创业板试点注册制改革,资本商场总算迎来了全面注册制时代。 为确保全面注册制改革技能预备作业的顺利推进,近日,证监会拟定、发布了《监管规矩适用指引——发行类第8号:股票发行上市注册作业规程》…

KMP算法详细理解

一、目的1.KMP应用场景:可以解决字符串匹配问题; 在一个串中查找是否出现过另一个串。2.KMP的经典思想就是:当出现字符串不匹配时,可以记录一部分之前已经匹配的文本内容,利用这些信息避免从头再去做匹配。3.KMP算法关键在于&…

NTP同步时钟为医院提供标准的时间信号

NTP同步时钟应用于城市重要公共领域,如车站、学校、医院、等。NTP同步时钟可提供准确的公众时间,为人们的日常生活提供便利,避免了因时钟不准确而带来的不便。NTP同步时钟采用智能模块化设计,与同类产品相比,更突出了安…

LoRaWAN的网络协议是怎样的?有哪些应用?

LoRaWAN是一种低功耗广域物联网协议,其网络结构包括三个主要组件:终端设备(End Device)、网关(Gateway)和网络服务器(Network Server)。终端设备通常是一些低功耗设备,例…

LeetCode 206. 反转链表

LeetCode 206. 反转链表 难度:easy\color{Green}{easy}easy 题目描述 给你单链表的头节点 headheadhead ,请你反转链表,并返回反转后的链表。 示例 1: 输入:head [1,2,3,4,5] 输出:[5,4,3,2,1]示例 2&a…

51. N 皇后 (Swift 版本)

题目 按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上,并且使皇后彼此之间不能相互攻击。 给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。 …

2023年Java进阶架构师的必备思维导图,让你少走弯路!

架构师是什么?要做什么? 架构师 :是一个既需要掌控整体又需要洞悉局部瓶颈并依据具体的业务场景给出解决方案的团队领导型人物。架构师不是一个人,他需要建立高效的体系,带领团队去攻城略地,在规定的时间内…

nodejs基于vue社区失物招领+房屋租赁+停车+宠物互助平台

1、一般用户的功能及权限 所谓一般用户就是指还没有注册的过客,他们可以浏览主页面上的信息。但如果有中意的社区互助信息时,要登录注册,只有注册成功才有的权限。 2、管理员的功能及权限 用户信息的添加和管理,社区互助详细信息添加和管理和…

【机器学习】生成式模型和判别式模型

在机器学习中,对于有监督学习可以将其分为两类模型:判别式模型和生成式模型。判别式模型是针对条件分布建模,而生成式模型则针对联合分布进行建模。 1.抛砖引玉 假设有训练数据(X,Y),X是属性集合,Y是类别标记。这时来了…

【十】深入理解redolog,undolog和binlog的底层原理

MySql系列整体栏目 内容链接地址【一】深入理解mysql索引本质https://blog.csdn.net/zhenghuishengq/article/details/121027025【二】深入理解mysql索引优化以及explain关键字https://blog.csdn.net/zhenghuishengq/article/details/124552080【三】深入理解mysql的索引分类&a…

Java进击框架:Spring(一)

Java进击框架:Spring(一)前言创建Spring项目Spring IoC容器和Beans介绍Bean的概述Spring IoC配置元数据实例化Bean依赖注入循环依赖详细配置生命周期回调Bean定义继承基于注解的容器配置Component和进一步的原型注解自动检测类和注册Bean定义…

Qt 第1课、Qt 的窗口组件和窗口类型

GUI 程序的开发原理: GUI 程序在运行的时候,操作系统会为它创造一个消息队列,消息队列用于存储操作系统发过来的系统消息。 用户使用操作系统的过程中,操作系统内核检测到用户的操作(鼠标,键盘&#xff09…

[数据结构]时间复杂度与空间复杂度

[数据结构]时间复杂度与空间复杂度 如何衡量一个算法的好坏 long long Fib(int N) {if(N < 3)return 1;return Fib(N-1) Fib(N-2); } 这是一个求斐波那契数列的函数&#xff0c;使用递归的方法求得&#xff0c;虽然代码看起来很简洁&#xff0c;但是简洁真的就好吗&#…

Apache Hadoop生态部署-zookeeper单机安装

目录 查看服务架构图-服务分布、版本信息 一&#xff1a;安装前准备 1&#xff1a;zookeeper安装包选择--官网下载 2&#xff1a;zookeeper3.5.7安装包--百度网盘 二&#xff1a;安装与常用配置 2.1&#xff1a;下载解压zk安装包 2.2&#xff1a;配置修改 2.3&#xff1…

Codeforces Round #848 (Div. 2)(A~D)

A. Flip Flop Sum给出一个只有1和-1的数组&#xff0c;修改一对相邻的数&#xff0c;将它们变为对应的相反数&#xff0c;修改完后数组的和最大是多少。思路&#xff1a;最优的情况是修改一对-1&#xff0c;其次是一个1一个-1&#xff0c;否则修改两个1。AC Code&#xff1a;#i…

订单超时自动取消的 3 种解决方案,yyds!

大家对电商购物应该都比较熟悉了&#xff0c;我们应该注意到&#xff0c;在下单之后&#xff0c;通常会有一个倒计时&#xff0c;如果超过支付时间&#xff0c;订单就会被自动取消。下单今天&#xff0c;我们来聊聊订单超时未支付自动取消的几种方案。1.定时任务这是最容易想到…

啥是原神?女友说想要全角色语音+表情包,顺手用python把高清图也整下来了

原神全角色中日语音表情包高清图人生苦短 我用python表情包部分&#xff1a;1. 素材来自&#xff1a;2. 准备模块3. 调用浏览器驱动4. 页面滚动5. 保存数据5. 效果全角色语音高清彩图部分1.准备工具2. 准备模块3. 请求链接4. 本次目标5. 分析数据来源6. 开始代码7. 执行结果8. …

云原生丨一文教你基于Debezium与Kafka构建数据同步迁移(建议收藏)

文章目录前言一、安装部署Debezium架构部署示意图安装部署二、数据迁移Postgres迁移到PostgresMySQL迁移到PostgresSQL前言 在项目中&#xff0c;我们遇到已有数据库现存有大量数据&#xff0c;但需要将全部现存数据同步迁移到新的数据库中&#xff0c;我们应该如何处理呢&…

基于追踪标记的WAF设计思路

一 相关背景 目前&#xff0c;市面上的WAF产品通常采用”发现即阻断“的策略&#xff0c;以防护针对业务系统的Web攻击行为。虽然该策略可及时阻断攻击&#xff0c;但形式上过于简单&#xff0c;并不能有效掌握攻击者进一步的攻击意图&#xff0c;也不能有效提高攻击者的成本投…