第一章 计算机系统体系结构_体系结构和微架构-程序员宅基地

技术标签: c++  计算机组成原理  

1.1 什么是计算机体系结构

本章的第一个概念是计算机系统(computer system)。

计算机系统包括读取并执行程序的 中央处理单元(CPU,
保存程序和数据的存储器以及将芯片转换为实用系统的 其他子系统
这些子系统会使CPU与显示器、打印机、Internet等外部设备之间的通信变得更加容易。

  • cpu(处理器): 计算机实际执行程序的部分
  • 微处理器: 在单个硅片上实现的CPU
  • 微机: 围绕微处理器构建的计算机

计算机的性能既取决于CPU;也取决于其他子系统。如果不能高效进行数据传输,
仅仅提高CPU的性能是毫无意义的。

Figure :

  • 信息(程序和数据): 保存在存储器中;计算机会使用不同类型的存储器,达到不同的目的。
    • 如果不能叫信息保存在正确的存储器,那么CPU的速度再快也将毫无意义
    • Cache: 保存常用的数据是 高速专用 的存储器。
    • 主存: 存放大量的工作数据,断电消失
    • 辅存: 指磁盘等,用于存储海量的数据。永久存储

  • 组成计算机的各个子系统通过 总线 连接在一起,
    数据通过总线从计算机中的一个位置传递到另一个位置。

什么是计算机

Figure :

  • 输入: 指用户交给计算机的信息
  • 输出: 指计算机返回给用户的信息

可编程计算机接收两种类型的输入: 它将要处理的 数据
以及准确描述要如何处理输入数据的程序。
程序 不过是计算机所执行的完成给定任务的 操作序列

Figure :

  • CPU 读程序并完成程序指定的操作。内部使用寄存器来保存数据
  • 存储器系统保存两类信息:程序,程序处理或产生的数据

计算机从存储器中读出指令并执行这些指令(即完成或执行指令定义的动作)。
执行指令时,可能要从存储器中读出数据,对数据进行操作,将数据写回存储器。

寄存器是CPU内部用来存放数据的存储单元。时钟提供了脉冲流,
所有内部操作都在 时钟脉冲 的触发下进行。时钟频率是决定计算机速度的一个因素

程序执行过程

Figure :

CPU先读取一条指令;在CPU分析或解码指令;从存储器中读出这条指令所需的所有数据。

  1. LOAD X: 从存储器中读出变量X的值。并将它暂存到寄存器中
  2. LOAD Y: 从存储器中读出变量X的值。并将它暂存到寄存器中
  3. Z=X+Y: 将两个寄存器中的内容相加,并将结果写在第三个寄存器中
  4. STORE Z: 将结果写回到存储单元z中

###计算机指令

尽管计算机能够执行上百种不同指令,但下面的6条 基本指令 可以将所有计算机指令进行分类:

  • Mov A, B: 将B的值复制到A
  • LOAD A, B: 将存储单元B的值复制到寄存器A中
  • STORE A, B: 将寄存器B的值复制到存储单元A中
  • ADD A, B: A与B相加,结果保存到A中
  • TEST A: 测试A的值是否为o
  • BEQ Z: 若最后一次测试结果为TRUE,执行地址Z处的代码,否则继续执行

1.2 体系结构和组成

体系结构: 描述了一些与计算机组成方式有关的内容;因为不同的用户会从完全不同的角度看待计算机。

寄存器

  1. 用来存放 一个单位的数据 或 字数据 的存储单元。使用它保存数据的位数来描述
  • 典型的有8位、16位、32位和64位。

  1. 与存储器中的字存储单元没有本质区别。唯一区别在于寄存器里cpu近,
    访问速度远远大于存储器

计算机体系结构通常被认为是程序员视角中的计算机

  • 程序员看到的是计算机的抽象视图;计算机的实际硬件和实现都被隐藏起来了
  • 这个抽象视图现在通常被称作 指令集体系结构(ISA)

计算机 组成表示其体系结构的具体实现

机器码 汇编语言 高级语言

计算机上执行的代码表示为二进制1和0组成的串,被称作机器码(machine code)。
每种计算机都只能执行一种特定的机器码。

人类可读的机器码(例如 ADD R0 ,Time)叫作汇编语言。

能够在类型完全不同的计算机上运行,与底层计算机体系结构几乎没有关系的代码叫作高级语言
(比如C或Java)。在执行之前,高级语言程序必须首先被编译为计算机的本地机器码。

体系结构与组成是不能完全分离的。例如;微处理器内的32位寄存器可以按照
与16位计算机相同的方式实现,如使用16位数据总线,以16位为单位传输数据,
功能单元也是16位的。如果程序员指示计算机将寄存器A中的32位数据复制到寄存器B中,
他将要执行一个32位操作,但16位计算机将执行两个16位操作,
这对程序员来说是完全不可见的。

按照这个例子,我们可以说一台计算机的体系结构是32位的,但它的组成却是16位的。

指令集体系结构包括: 数据类型(每个字的位数以及各个位的含义),
用来保存临时结果的寄存器,指令的类型和格式,以及寻址方式
(表示数据在存储器中存放位置的方法)。

不同层次的程序员看到的计算机是不一样的。汇编语言程序员看到的计算机与C或Java
等高级语言程序员看到的有很大的区别。

即使都是高级语言程序员,C程序员所看到的也与Prolog或LISP程序员看到的有很大的不同。

微代码(Microcode)与微处理器无关。微代码定义了一组基本操作(微指令),
通过执行这些操作可以解释执行机器码。ADD P,Q,R是一条典型的机器指令,
而微指令可能像“将数据从寄存器X移到总线Y上”那么简单。
如何定义微指令是芯片设计者的职责。

  1. 术语“体系结构(architecture)”代表计算机的 抽象指令集体系结构(它的指令集)
  2. 术语“组成(organization)”代表计算机的 实际硬件实现
  • “组成”一词也会被用于描述完整的计算机,包括它的CPU、存储器、
    总线以及输入/输出机制。

  1. 术语“微体系结构(microarchitecture)”代表CPU的实现

1.2.1 计算机系统和技术

Figure :

  • 技术: 说明了计算机组件的工艺的重要性(例如,芯片制造技术决定了芯片的速度和功耗)。
    • 计算机速度是设计计算机首要考虑的问题。

  • 摩尔定律: 芯片的集成度每18个月翻一番。
  • 应用: 表示计算机的最终应用。一些计算机被用于汽车的嵌入式控制系统,一些被用于游戏机,还有一些用于家庭或办公室。
  • 工具: 一些计算机之外的因素也会影响计算机设计

最先进的计算机使用了最新的制造技术。

Figure :

  1. 设备技术: 决定了计算机的 速度 及其存储系统的 容量,
    包括那些用于制造处理器和主存的半导体技术; 制造硬盘的磁技术;
    用于CD-ROM、DVD和蓝光光碟的光技术; 以及网络连接技术。
  2. 总线技术: 结构、组成和控制均对计算机性能有很大影响。
  3. 外设(如调制解调器、键盘、打印机和显示系统)与应用(如桌上排版、图形和多媒体)等技术,
    都会影响计算机系统的设计。

1.2.2 计算机体系结构在计算机科学中的地位

  1. 计算机与计算机科学不能被分开
  2. 计算机体系结构课程会概述计算机是如何工作的,计算机能做什么,并告诉学生们一台典型的存储程序计算机是如何运转的。
  3. 计算机是计算机科学的心脏——没有计算机,计算机科学只能作为理论数学的一个分支。
  4. 理解计算机体系结构对从事计算机领域的工作具有重要帮助。
  5. 计算机体系结构不能完全与软件分离。
  6. 计算机体系结构支撑了计算机科学课程体系中其他领域的许多重要观点。

时钟

时钟是用于生成 连续 的 间隔固定 的电脉冲流。

之所以被称作时钟,是因为可用这些电脉冲来计时或确定计算机内所有事件的顺序

时钟可用它的 重复速率 或 频率 来定义。

时钟也可以用 时钟脉冲的宽度 或 持续时间 来定义,即频率的倒数

事件由时钟信号触发的数字电路被称作同步的,因为它们由时钟信号来同步。

1.3 计算机发展

计算机的发展历史丰富而复杂,远比许多人想象得久远。

1.3.1 机械计算机

人类是会计算的生物。

穴居人发明数学也许不是为了在湿冷的天气里玩数独游戏,而是为了丈量土地、建造房屋和报税。

罗马人将鹅卵石放在小托盘上表示数字。后来,他们沿着线滑动鹅卵石辅助进行加法或减法,从而完成计算。

中亚的一些商店,那里的人们用算盘快速地进行计算。

  • 1642年,法国数学家布莱士·帕斯卡(Blaise Pascal)设计了一个原始的机械加减法计算装置,
    能够借助发条完成加减法。
  • 1694年,德国数学家弗里德·威廉·莱布尼茨Gottfried wilhelm Leibnite)制作了一台
    复杂的机械计算器,能够完成加减乘除运算。

这些设备都不能称作现代意义上的计算机,因为它们都是不可编程的。

可编程这个概念产生于 工业革命 时期,出于工业化控制的需要。

  • 1801年,人们发明了 提花织机,能够自动地将预先设计好的图案织在布上



    提花织机使用 穿孔木制卡片 控制织在纺织品上的图案


    卡片上的一个位置上有没有决定水平方向的线是在垂直方向的线之前还是之后。


    每个打了孔的卡片就是一个程序,因为每个孔的图案指定了一个唯一的操作序列。
  • 1882年,查尔斯·巴贝奇(Charles Babbage)在英格兰设计了一台叫作 差分机
    ( difference engine)的计算装置,能够自动地计算构造数学表所需的 多项式 的值。
    巴贝奇没有完成他的差分机,1855年 Per Georg Scheutz 在瑞典制造出差分机。

1.3.2 机电式计算机

机电( electromechanical)指那些有 活动件 但却 由电控制 的零件。

  • 1867年发明的 打字机 和 1879年发明的 穿孔制表机(穿孔卡片输入机)
    都促进了机电式计算机的发展。机电式计算机是连接机械时代与以真空管、晶体管和集成电路
    为代表的电子时代的纽带。
  • 20世纪40年代康拉德.楚泽在德国制造出自己设计的计算机,在第二次世界大战期间该计算机用来设计飞机。
  • 楚泽的计算机是第一台可编程计算机;而同时代的其他机器都不是软件可编程的,只能算作是自动计算器。
    楚泽还设计了世界上第一种程序设计语言,叫作 Plankalküil,

1.3.3 早期电子计算机

  • 1937年~1942年,约翰·文森特·阿塔那索夫(John V.Atanasoff)制造出第一台电子计算机
    (ABC),用于解线性方程。
  • 1944年制造的巨像计算机(Colossus)是另一台早期计算机,它安放于布莱切利园,
    二战期间用来破译德军的恩格玛密文。巨像计算机使用真空管,是一台真正的电子计算机,
    但它不能存储程序,因而只能完成专门的任务。
  • 1945年,J.莫奇利(J.Mauchly)和J.埃克特( J.Eckert)设计了ENIAC,
    一台能够处理10位10进制数的真空管计算机,但它不能像今天我们编写程序那样编程。
  • 埃克特和莫奇利还设计了一台更先进的计算机——EDVAC,具有存储程序的特征。
  • 在英格兰,曼彻斯特大学的研究人员于1948年设计出世界上第一台可操作的存储程序计算机
    ——曼彻斯特宝宝。
  • AT&T贝尔实验室在1948年发明了晶体管,之后发展出了半导体,
    它在功能上与真空管等效,但体积更小,功耗更低。晶体管的发明,
    使将多个晶体管放在一块硅片上构成一个完整的电路成为可能。
  • 到20世纪60年代中期,IBM设计出System/360体系结构,
    在从商用的小型机到科学计算的大型机的产品线上实现了兼容和互操作性。
    正是IBM System/360导致了计算机体系结构这一概念的出现(即指令集体系结构)。

1.3.4 微机和PC革命

到20世纪70年代,Intel公司和摩托罗拉公司都发布了8位微处理器。
第一台可用的微机Altair 8800是由MITS公司于1975年推向市场的。

基于Intel的技术和微软的操作系统软件,IBM 在20世纪80年代推出了个人电脑(PC机)。
由于它的开放式体系结构,PC机在第三方软、硬件开发者中流行起来。
Intel将8080微处理器扩展为包括16位80286(1982年)和32位80386(1985年),
以及含有64位数据总线的Pentium(1990年)。

1.3.5 摩尔定律和进步的历程

“摩尔定律”一词是卡沃·米德(Carver Mead)于1975年根据戈登·摩尔(GordonMoore)
所 观察 到集成电路的集成度 每两年 翻一番的现象而创造的。

摩尔定律当然是一个 经验性 的观测结果,但在过去的40年里,
技术的进步的确导致芯片内晶体管数量呈指数式增长。这一增长还伴随着集成电路速度的相应提升。
集成电路内晶体管数量的增加还导致体系结构复杂度的急剧增加以及一些极其聪明的性能提升方法的出现。

RISC(精简指令集)与CISC(复杂指令集)

1.3.6 存储技术发展

  1. 覆盖着电容的旋转的磁鼓
  2. 阴极射线管
  3. 铁氧体磁心存储器
  4. 磁盘
  5. 光存储器

1.3.7 普适计算

计算是无所不在的。

1.3.8 多媒体计算机

多媒体处理能力是现代计算机(包括普适的和传统的个人计算机)的一个重要特征。

多媒体处理(处理和存储音频/视频数据)需要很大的存储容量以及完成大量简单
重复操作的实时处理声音样本和图像像素的能力。

1.4 存储程序计算机

1.4.1 问题

Figure :

最大游程,即 同一个数字连续出现的最大次数

1.4.2 解决问题

如果我们从数串的左边开始逐个检查数字,在任何一个位置,我们都会得到以下两个结果之一:

  • 要么这个数与前一个相同,序列还在增长;
  • 要么这个数与上一个不同,前一个序列结束,一个新的序列开始。

Figure :

1.4.3 构造一个算法

算法的一些符号

算法

1.4.4 计算机需要通过什么来解决问题

尽管这个问题相对简单,它却含有解决任一问题所需的全部元素

  • 有将信息从一个位置传递到另一个的赋值操作
  • 有加、减等算术运算
  • 还有根据计算结果(如比较)从两个候选动作中选择一个的操作。

Figure :

1.4.5 存储器

下图描述了程序怎样找出保存在一个 假想存储器 中的数串的最大序列长度。
必须强调的是,这个程序是概念上的而不是实际的,因为真正的计算机指令比其更加基础。

这幅图叫作 存储器映射,它展示了信息在存储器中的存放位置。
它是存储器的一幅快照,因为它表示存储器在某个特定时刻的状态。
存储器映射也包含程序使用的变量和数字串。

存储程序计算机会将指令、变量和常量全部保存在同一个存储器内。

Figure :

寄存器传输语言(RTL): 描述性的语言,不能被执行

  • 使用文字描述计算机的操作很不方便。使用RTL可以更加容易地定义计算机内发生的操作。
RTL符号 描述

存储系统

  • 描述了存储系统的组成。处理器将一个放在地址总线上的地址以及一个用于选择读操作或写操作
    (它们有时也被称作读或写周期)的控制信号发送给存储器。
  • 在读周期中,存储器将数据放在数据总线上供CPU读取。
  • 在写周期中,放在数据总线上的数据被写入存储器。
  • 信息进入或离开存储器的位置(或计算机系统的其他功能部分)叫作端口。
  • 尽管上图存储器是简化后的版本,它却准确地描述了将数据和指令连续存放的计算机存储器。
    一台真正的计算机会使用存储系统层次(每个层次都有可能采用不同的技术来实现)。
    这些层次包括保存频繁被访问数据的速度非常快的Cache、主存,以及速度非常慢的辅存



    在这一层次中大量数据会一直保存在磁盘、光盘或DVD中,直到使用时才会被调入主存。

1.5 存储程序概念

存储程序计算机的基本操作

执行指令

在这台机器上执行一条指令需要至少两次访存。

  • 第一次访存是 读取指令
  • 第二次访存 要么从存储器中读出指令需要的数据,
    要么将它之前的指令产生的或修改过的数据写回存储器。

三地址指令

存储程序计算机的一种直观合理的指令格式可以用下面的形式表示

operation Address1 ,Address2 ,Address3

  • operation表示要执行的指令的动作
  • Address_i分别是操作数在存储器中的位置。在这条一般性的指令中,操作数为数据的地址,而不是数据本身。
  • RTL: [Address1] <-- [Address2] Operation [Address3]

Figure :

指令的4个字段、cpu、存储器和指令执行方式之间关系: 解释执行指令

Figure :

两地址指令

指令格式如下

Operation Address1, Address2

  • Address2为源操作数,Address1既是源操作数也是目的操作数。
  • RTL语言: [P]<--[P] Operation [Q]

实际的计算机中,一般都 不允许同一条指令中使用两个存储地址;
大多数计算机规定一个地址是存储器地址,另一个地址是寄存器。

单地址指令

指令格式如下

operation address

  1. 指令中只提供了一个操作数地址
  2. 指令却需要至少两个地址,处理器不得不使用一个不需要显式地址的第二操作数。
    也就是说,第二个操作数来自CPU内一个叫作 累加器(accumulator)的寄存器。

操作结果将一直保存在寄存器中,直到另一条指令将它送入存储器。

Figure :

计算机分类

  1. 存储器–存储器型: 一条指令能够从存储器中读出源操作数,对数据完成某个操作,
    并将结果保存在存储器中
  2. 寄存器–存储器型: 它们能够处理两个数据,
    其中一个位于存储器中,另一个位于寄存器中(结果要么被写回存储器,要么被写回寄存器)。
  3. 寄存器―寄存器型: 计算机只能对寄存器中的内容进行操作;
  • 使用LOAD指令将数据读入寄存器
  • 使用STORE指令将数据从寄存器送回存储器。

1.6 计算机系统概览

CPU变成计算机系统的存储系统和总线系统。存储器被视作一个巨大的通过 地址访问的数组

例如,如果用数组M表示存储器,那么它的第i个元素可以表示为M[i];

存储器非常重要,因为它的大小(即存储容量)决定了程序能够存储的数据量,
它的速度(访问时间)决定了程序的数据处理速率。

程序体积不断增加,程序所使用的数据总量增加得更快。

计算机技术正在飞速进步,而存储技术从某些方面来说却严重地滞后了。

处理器速度的增加速率远远超过了存储器的。

1.6.1 存储层次

由于CPU与存储器的性能之间的差距不断加大,设计者们试图通过在使用数据之前将它们
从存储器中取出来消除相对慢速的存储器的影响,以 隐藏等待时间(也叫作 延迟)

上图给出了经典的存储层次图,展示了计算机中存储部件的类型、速度(访问时间)
以及它们在PC机中的典型容量。

  1. 寄存器: 存放处理器的工作数据
  2. Cache: 缓存常用数据的快速存储器
  • 与计算机的地址总线和数据总线相连,监听着CPU与存储器之间的事务
    只要Cache注意到CPU发出的地址与它保存的某个数据元素的地址相同,
    它就会把这个数据发送给CPU,而不会去主存访问数据
    • 一级缓存: 它是CPU的一部分,并希望92%的信息都会在这里找到
    • 二级缓存: 容量更大但速度更慢;找到数据的概率为98%
    • 三级缓存:
  1. DRAM(动态随机访问存储器): 存放工作数据块
  • 易失性半导体存储器构成的立即存取存储器;断电数据丢失
  1. 硬盘则保存程序和数据。

1.6.2 总线

总线 将计算机的 两个或多个 功能单元连接在一起并允许它们相互交换数据;
总线还将计算机与外设连接在一起

没有总线的情况

  • 结点之间的互连复杂并且凌乱。
  • 新增结点麻烦,需要与所有结点建立联系

有公共总线情况

  • 每次只有唯一一个设备能够与其他设备通信(只有一条数据通路)
  • 当有多个设备同时请求使用总线,需要一个仲裁器来决定那个设备占用总线

总线相关术语

  1. 宽度: 一般用 并行数据通路 的数量
  2. 带宽: 衡量信息在总线上的 传输速率 的一项指标
  3. 延迟: 从 发出 数据传输请求到 实际 数据传输的 时间间隔

多总线系统: 包括片内总线、功能单元间(如CPU和存储器间)的总线以及总线间的总线。

Figure :

  1. 多总线可以实现并发运行
  2. 总线可能具有完全不同的特点和操作速度。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39345003/article/details/128012644

智能推荐

基于51单片机冰箱温度控制器设计_基于51单片机的智能冰箱控制系统设计-程序员宅基地

文章浏览阅读871次,点赞11次,收藏3次。*单片机设计介绍, 基于51单片机冰箱温度控制器设计。_基于51单片机的智能冰箱控制系统设计

ubuntu创建sftp和ftp服务器及相应的用户管理_ubuntu sftp服务器查看用户和密码-程序员宅基地

文章浏览阅读4.8k次。一、sftp服务器进入root模式(下面的操作默认都是在root用户下)#安装openssh-serverapt-get install -y openssh-server创建sftp的组和用户#创建sftp-users组groupadd sftp-users#创建sftp用户目录alicemkdir /home/alice#创建sftp用户alice,并且绑定其主目..._ubuntu sftp服务器查看用户和密码

关于在simulink中使用s-function后出现State derivatives returned by S-function during flag=1 call must be a rea_state derivatives returned by s-function 'pmsm' in-程序员宅基地

文章浏览阅读5.9k次,点赞9次,收藏16次。解决了在simulink中使用s-function遇到的报错:State derivatives returned by S-function 'demo' in 'test/S-Function' during flag=1 call must be a real vector of length 2 _state derivatives returned by s-function 'pmsm' in 'ipmsm/ipmsm/s-function1

Sublime Text 关闭自动更新 | Mac_mac sublime text 取消更新提示-程序员宅基地

文章浏览阅读3.1k次。1. 打开配置文件Mac 如下图2. 在文件内部添加这段文字,就可以了:"update_check":false _mac sublime text 取消更新提示

Linux系统下DNS配置指南_linux 服务器修改网络dns-程序员宅基地

文章浏览阅读548次,点赞10次,收藏6次。Linux系统下DNS配置指南_linux 服务器修改网络dns

Springboot/java/node/python/php基于springboot+vue手机售后管理系统【2024年毕设】-程序员宅基地

文章浏览阅读779次,点赞19次,收藏24次。springboot微信小程序的小疾病问诊服务系统的设计与实现。springboot基于spring的物业管理系统的设计与实现。springboot基于Java的高校学生请假系统。ssm基于Android的购物商场APP设计与实现。springboot基于微信小程序的智慧校园系统。ssm基于Android的英语词典的设计与开发。ssm基于SSM+Vue的学生实践管理平台开发。ssm基于android的企业员工考勤系统。ssm基于web的暗香小店系统的设计与实现。ssm基于Web的高等学校公费医疗管理系统。

随便推点

使用Android studio创建一个简单项目_android studio简单项目-程序员宅基地

文章浏览阅读6.6k次,点赞10次,收藏82次。在刚开始学Android开发时,下载好了Android studio,但是不知道如何下手,现在就通过一个简单的小项目熟悉如何使用这个软件进行Android开发。前提:下载好Android studio并配置好相关环境。首先介绍一下Android开发过程中需要修改的三类文件:位于java包下的各类activity文件:实现了用户与软件的交互,主要为java代码实现。位于res包下的.xml文件:在layout包里的为布局文件,即Android界面显示的视图,而drawable里则放置了某个控件的_android studio简单项目

Bootstrap 弹出框-程序员宅基地

文章浏览阅读3.5k次。一、Bootstrap 弹出框弹出框控件类似于提示框,它在鼠标点击到元素后显示,与提示框不同的是它可以显示更多的内容。注意: 弹出框要写在 jQuery 的初始化代码里: 然后在指定的元素上调用 popover() 方法。1.1 基本弹出框通过向元素添加 data-toggle=“popover” 来来创建弹出框。title 属性的内容为弹出框的标题,data-content 属性..._bootstrap 弹出框

基于Wemos D1 Mini Pro开发板的天气显示器_arduino wemos d1 mini-程序员宅基地

文章浏览阅读226次,点赞2次,收藏3次。本项目设计了一款可以触摸控制的天气显示器。主要由Wemos D1 Mini Pro和TFT显示屏组成,利用Wemos D1 Mini Pro作为设备的主控芯片,发出Wi-Fi信号并接收相应指令,通过调用API将接收到的信息传输到TFT显示屏,TFT显示屏将接收到的信息显示出来。该天气显示器实现对所在地区当前的时间与日期;当日的天气信息,如温度、压力、湿度、降雨量;七天的未来预测等功能的显示。设计采用Wemos D1 Mini Pro,利用API将实时获取的天气信息,通过TFT显示屏显示出来。_arduino wemos d1 mini

Android 双屏异显(兼容android8)_android service 检测是否双屏-程序员宅基地

文章浏览阅读653次。public void initDiffDisplay() { try { DisplayManager displayManager = (DisplayManager) getSystemService(Context.DISPLAY_SERVICE); Display[] presentationDisplays = displayManager.getDisplays(); if (presentationDi._android service 检测是否双屏

【全开源】JAVA婚恋相亲红娘牵线系统源码支持微信小程序+微信公众号+H5+APP-程序员宅基地

文章浏览阅读530次,点赞23次,收藏10次。springboot+mybatisplus+mysql 用户端 uniapp(vue语法)管理后台 vue+elementUi。后台服务 springboot+mybatisplus+mysql。一、我们技术使用JAVA后台服务 前后端分离。管理后台 vue+elementUi。用户端 uniapp(vue语法)适配小程序+H5+公众号。私信客服获取演示地址。私信客服获取演示地址。

6.python输入整数年份,判断对应整数年份是否为闰年并输出结果_判断闰年的python程序直接输入一个代表年份的正整数-程序员宅基地

文章浏览阅读3.3k次,点赞3次,收藏5次。# -*- coding: UTF-8 -*-year = int(input("输入一个年份:"))if year % 100 == 0: if year % 400 == 0: print('%d年是闰年' % year) else: print('%d年不是闰年' % year)else: if year % 4 == 0: print('%d年是闰年' % year) else: print('%d_判断闰年的python程序直接输入一个代表年份的正整数

推荐文章

热门文章

相关标签