深入理解计算机系统--计算机系统漫游

对于一段最基础代码的文件hello.c,解释程序的运行

#include <stdio.h>int main()
{printf ( "Hello, world\n") ;return 0;
}

1.1、信息就是位+上下文

        源程序是由值 0 和 1 组成的位(比特)序列,8 个位被组织成一组,称为字节(表示程序中的某些文本字符)。

        计算机系统采用 ASCII标准 来表示文本字符,实际上就是用一个唯一的单字节大小的整数值来表示每个字符,例如,下面给出 hello.c程序 的ASCII码表示。

注意:每个文本行都是以一个看不见的换行符 '\n' 结束的,对应的整数值为10

           像 hello.c 这样只由 ASCII字符 构成的文件称为文本文件,所有其他文件称为二进制文件

           系统中所有的信息(包括磁盘文件、内存中的程序、内存中存放的用户数据以及网络上传送的数据)都是由一串比特表示的。区分不同数据对象的唯一方法是读到这些数据对象时的上下文(在不同的上下文中,一个同样的字节序列可能表示一个整数,浮点数,字符串或者机器指令)

1.2、程序被其他程序翻译成不同的格式

        程序为了能够在系统上运行必须转化为一系列的低级机器语言指令,然后这些指令按照一种称为可执行目标程序的格式打包,并以二进制磁盘文件的形式存放,目标程序也称为可执行目标文件

        在Linux系统,从源文件到目标文件的转化是由编译器驱动程序

      linux> gcc -o hello hello.c

 GCC编译器驱动程序将 hello程序 翻译成一个可执行的目标文件hello。由以下四个阶段完成

 ① 预处理阶段:预处理器(cpp)根据以字符 # 开头的命令,修改原始的C程序。比如 hello.c 中第一行的 #include<stdio.h> 命令告诉预处理器读取系统头文件 stdio.h 的内容,并把它直接插入程序文本中。就得到了另一个C程序,通常是以 .i 作为文件扩展名。

 ② 编译阶段: 编译器(ccl)将文本文件 hello.i 翻译成文本文件 hello.s,它包含一个汇编语言程序。该程序包含函数 main 的定义,如下:

main:
    subq $8, %rsp
    movl $.LC0, %edi
    call puts
    movl $0, %eax
    addq $8, %rsp
    ret

 定义中 2~7 行的每条语句都以一种文本格式描述了一条低级机器语言指令,汇编语言为不同高级语言的不同编译器提供了通用的输出语言。例如,C编译器和 Fortran 编译器产生的输出文件用的都是一样的汇编语言。

 ③ 汇编阶段:汇编器(as)将 hello,s 翻译成机器语言指令,把这些指令打包成一种叫做可重定位目标程序的格式,并将结果保存在目标文件 hello.o 中hello.o 是二进制文件,它包含的17个字节是函数 main 的指令编码,如果用文本编辑器打开,将会出现一堆乱码。

 ④ 链接阶段:hello 程序调用了 printf 函数,它是每个C编译器都提供的标准C 库中的一个函数。printf 函数存在于一个名为 printf.o 的单独的预编译好了的目标文件中,而这个文件必须以某种方式合并到我们的 hello.o 程序中。链接器(ld)就负责处理这种合并。结果就得到 hello 文件,它是一个可执行目标文件(可执行文件),可以被加载到内存中,由系统执行。

1.3 了解编译系统如何工作是大有益处的 

        优化程序性能:了解一些机器代码以及编译器将不同的C语句转化为机器代码的方式,判断更高效的C语句。

        理解链接时出现的错误

        避免安全漏洞

1.4 处理器读并解释储存在内存中的指令

        此时,hello.c 源程序已经被编译系统翻译成了可执行目标文件hello,并被存放在磁盘上。要想在Linux系统上运行该可执行文件,将其文件名输入到称为 shell 的应用程序中:

linux> ./hello
hello, world
linux> 

         shell 是一个命令行解释器,它输出一个提示符,等待输入一个命令行,然后执行这个命令。如果该命令行的第一个单词不是一个内置的 shell 命令,那么 shell 就会假设这是一个可执行文件的名字,它将加载并运行这个文件。所以在此例中,shell 将加载并运行 hello 程序,然后等待程序终止。hello 程序在屏幕上输出它的消息,然后终止。shell 随后输出一个提示符,等待下一个输入的命令行。

1.4.1 系统的硬件组成

        1.总线

        贯穿整个系统的是一组电子管道,称作总线,携带信息字节并负责在各个部件间传递。通常总线被设计成传送定长的字节块,也就是字(word)。字中的字节数(即字长)是一个基本的系统参数,各个系统中都不尽相同。现在的大多数机器字长要么是 4 个字节(32 位),要么是 8 个字节(64 位)。

        2. I/O 设备

        I/O(输入/输出)设备是系统与外部世界的联系通道。我们的示例系统包括四个 I/O 设备∶作为用户输入的键盘和鼠标,作为用户输出的显示器,以及用于长期存储数据和程序的磁盘驱动器(简单地说就是磁盘)。最开始,可执行程序 hello 就存放在磁盘上

        每个 I/O 设备都通过一个控制器适配器与 I/O 总线相连。控制器和适配器之间的区别主要在于它们的封装方式控制器是 I/O 设备本身或者系统的主印制电路板(通常称作主板)上的芯片组。而适配器则是一块插在主板插槽上的卡。无论如何,它们的功能都是在 I/O 总线和 I/O 设备之间传递信息

(CPU:中央处理单元    ALU:算数/逻辑单元 PC:程序计数器 USB:通用串行总线)

        3.主存 

        主存是一个临时存储设备,在处理器执行程序时,用来存放程序和程序处理的数据。

        从物理上来说,主存是由一组动态随机存取存储器(DRAM)芯片组成的。

        从逻辑上来说,存储器是一个线性的字节数组,每个字节都有其唯一的地址(数组索引),这些地址是从零开始的。一般来说,组成程序的每条机器指令都由不同数量的字节构成。与 C 程序变量相对应的数据项的大小是根据类型变化的。(short : 2 ; int 和 float :4 ; long 和 double:8)

        4.处理器 

        中央处理单元(CPU),简称处理器,是解释(或执行)存储在主存中指令的引擎,处理器的核心是一个大小为一个字的存储设备(寄存器),称为程序计数器(PC) , 在任何时刻,PC 都指向主存中的某条机器语言指令(即含有该条指令的地址)。

        从系统通电开始,直到系统断电,处理器一直在不断地执行程序计数器指向的指令,再更新程序计数器,使其指向下一条指令。这个模型是由指令集架构决定的。在这个模型中,指令按照严格的顺序执行,而执行一条指令包含执行一系列的步骤。处理器从程序计数器指向的内存处读取指令,解释指令中的位,执行该指令指示的简单操作,然后更新 PC,使其指向下一条指令,而这条指令并不一定和在内存中刚刚执行的指令相邻。

        它们围绕着主存、寄存器文件(register file)和算术/逻辑单元(ALU)进行。寄存器文件是一个小的存储设备,由一些单个字长的寄存器组成,每个寄存器都有唯一的名字。ALU 计算新的数据和地址值.

CPU在指令的操作下可能会执行的操作

        加载: 从主存复制一个字节或者一个字到寄存器,以覆盖寄存器原来的内容

        存储: 从寄存器复制一个字节或者一个字到主存的某个位置,以覆盖这个位置上原来的内容

        操作: 把两个寄存器的内容复制到ALU,ALU对这两个字做算数运算,并将结果存放到一个寄存器中,以覆盖该寄存器原来的内容

        跳转: 从指令本身中抽取一个字,并将这个字复制到程序计数器(PC)中,以覆盖PC中原来的值

        处理器看上去是它的指令集架构的简单实现,但是实际上现代处理器使用了非常复杂的机制来加速程序的执行。因此,我们将处理器的指令集架构处理器的微体系结构区分开来:

        指令集架构描述的是每条机器代码指令的效果;

        而微体系结构描述的是处理器实际上是如何实现的

        1.4.2 运行 hello 程序

        初始时, shell 程序执行它的指令,输入指令后(这里以输入字符串 "./hello" 为例), shell 程序将字符逐一读入寄存器,再把它存放到内存中.

 然后 shell 执行一系列指令来加载可执行的 hello 文件,这些指令将 hello 目标文件中的代码和数据从磁盘复制到主存。数据包括最终会被输出的字符串 “hello, world\n”。

利用直接存储器存取,数据可以不通过处理器而直接从磁盘到达主存,如下图所示

 一旦目标文件 hello 中的代码和数据被加载到主存,处理器就开始执行 hello 程序的 main 程序中的机器语言指令。这些指令将 “hello, world\n” 字符串中的字节从主存复制到寄存器文件,再从寄存器文件中复制到显示设备,最终显示在屏幕上。

         1.5 高速缓存至关重要

        通常情况下,大容量的存储设备的存取速度要比小容量的慢,运行速度更快的设备的价格相对于低速设备要更贵。例如:在一个系统上,磁盘的容量一般为 TB 级,内存的容量一般为 GB 级,磁盘的容量大概是内存的 1000 倍

        对于处理器而言,从磁盘上读取一个字所花费的时间开销比从内存中读取的开销大1000万倍。寄存器文件的只能存储几百个字节的信息,而内存的可以存放几十亿的字节信息(GB级),从寄存器文件读取数据比从内存读取差不多要快 100 倍

        针对处理器和内存之间的差异,系统设计人员在寄存器文件和内存之间引入了高速缓存存储器(高速缓存)(cache),处理能力比较强的处理器,一般有三级高速缓存,分别为 L1 cache , L2 cache 以及L3 cache 

        L1 cache 的访问速度与访问寄存器文件几乎一样快,容量大小为数万字节(KB 级别)

        L2 cache 的访问速度是 L1 cache 的五分之一,容量大小为数十万到数百万字节之间;

        L3 cache 的容量更大,同样访问速度与 L2 cache 相比也更慢

1.6 存储设备形成层次结构

        在这个层次结构中,从上至下,设备的访问速度越来越慢、容量越来越大,并且每字节的造价也越来越便宜。

        存储器层次结构的主要思想是上一层的存储器作为低一层存储器的高速缓存。因此,寄存器文件就是 L1 的高速缓存,L1 是 L2 的高速缓存,L2 是 L3 的高速缓存,L3 是主存的高速缓存,而主存又是磁盘的高速缓存

1.7 操作系统管理硬件

        把操作系统看成是应用程序和硬件之间插入的一层软件,所有应用程序对硬件的操作尝试都必须通过操作系统。

        操作系统有两个基本功能:

        ① 防止硬件被失控的应用程序滥用

        ② 向应用程序提供简单一致的机制来控制复杂而又通常大不相同的低级硬件设备。

        操作系统通过几个基本的抽象概念(进程虚拟内存文件)来实现这两个功能。 

 

① 进程则是对处理器、主存和 I/O 设备的抽象表示。

② 虚拟内存是对主存和磁盘 I/O 设备的抽象表示,

③ 文件是对 I/O 设备的抽象表示,

1.7.1 进程

        进程是操作系统对一个正在运行的程序的一种抽象。在一个系统上可以同时运行多个进程,而每个进程都好像在独占地使用硬件。而并发运行,则是说一个进程的指令和另一个进程的指令是交错执行的。在大多数系统中,需要运行的进程数是多于可以运行它们的 CPU 个数的。

        无论是在单核还是多核系统,一个CPU看上去都像是在并发的执行多个进程,这是通过处理器在进程间来回切换的操作系统的这种机制叫做上下文切换.

        操作系统保持跟踪进程运行所需的所有状态信息。这种状态,就是上下文,包括许多信息,比如 PC 和寄存器文件的当前值,以及主存的内容。在任何一个时刻,单处理器系统都只能执行一个进程的代码。当操作系统决定要把控制权从当前进程转移到某个新进程时,就会进行上下文切换,即保存当前进程的上下文、恢复新进程的上下文,然后将控制权传递到新进程。新进程就会从它上次停止的地方开始。

        示例场景中有两个并发的进程∶shell 进程和 hello 进程。最开始,只有 shell 进程在运行,即等待命令行上的输入。当我们让它运行 hello 程序时,shell 通过调用一个专门的函数,即系统调用,来执行我们的请求,系统调用会将控制权传递给操作系统。操作系统保存 shell 进程的上下文,创建一个新的 hello 进程及其上下文,然后将控制权传给新的 hello 进程。hello 进程终止后,操作系统恢复 shell 进程的上下文,并将控制权传回给它,shell 进程会继续等待下一个命令行输入。

        从一个进程到另一个进程的转换是由操作系统内核(kernel)管理的。内核是操作系统代码常驻主存的部分。当应用程序需要操作系统的某些操作时,比如读写文件,它就执行一条特殊的系统调用(system call)指令,将控制权传递给内核。然后内核执行被请求的操作并返回应用程序。注意,内核不是一个独立的进程。相反,它是系统管理全部进程所用代码和数据结构的集合。

        实现进程这个抽象概念需要低级硬件和操作系统软件之间的紧密合作。

 1.7.2 线程

        现代系统中,一个进程实际上可以由多个称为线程的执行单元组成,每个线程都运行在进程的上下文中,并共享同样的代码和全局数据。

        因为多线程之间比多进程之间更容易共享数据,也因为线程一般来说都比进程更高效。

1.7.3 虚拟内存

        虚拟内存是一个抽象概念,它为每个进程提供了一个假象,即每个进程都在独占地使用主存。每个进程看到的内存都是一致的,称为虚拟地址空间。

         在 Linux 中,地址空间最上面的区域是保留给操作系统中的代码和数据的,这对所有进程来说都是一样。地址空间的底部区域存放用户进程定义的代码和数据。请注意,图中的地址是从下往上增大的

         程序代码和数据。对所有的进程来说,代码是从同一固定地址开始,紧接着的是和 C 全局变量相对应的数据位置。代码和数据区是直接按照可执行目标文件的内容初始化的,在示例中就是可执行文件 hello。

        堆。代码和数据区后紧随着的是运行时堆。代码和数据区在进程一开始运行时就被指定了大小,与此不同,当调用像 malloc 和 free 这样的 C 标准库函数时,堆可以在运行时动态地扩展和收缩

        共享库。大约在地址空间的中间部分是一块用来存放像 C 标准库和数学库这样的共享库的代码和数据的区域。

        栈。位于用户虚拟地址空间顶部的是用户栈编译器用它来实现函数调用。和堆一样,用户栈在程序执行期间可以动态地扩展和收缩。特别地,每次我们调用一个函数时,栈就会增长;从一个函数返回时,栈就会收缩

        内核虚拟内存。地址空间顶部的区域是为内核保留的不允许应用程序读写这个区域的内容或者直接调用内核代码定义的函数。

        虚拟内存的运作需要硬件和操作系统软件之间精密复杂的交互,包括对处理器生成的每个地址的硬件翻译。基本思想是把一个进程虚拟内存的内容存储在磁盘上,然后用主存作为磁盘的高速缓存。

1.7.4 文件

        文件就是字节序列,仅此而已。每个I/O设备,包括磁盘、键盘、显示器,甚至网络,都可以看成是文件。系统中的所有输入输出都是通过使用一小组称为 Unix I/O 的系统函数调用读写文件来实现的。

1.8 系统之间利用网络通信

        我们一直把系统视为一个孤立的硬件和软件的集合体,实际上,现代系统经常通过网络和其他系统连接到一起。从一个单独的系统来看,网络可视为一个 I/O 设备。当系统从主存复制一串字节到网络适配器时,数据流经过网络到达另一台机器,而不是比如说到达本地磁盘驱动器。相似地,系统可以读取从其他机器发送来的数据,并把数据复制到自己的主存。

        假设用本地主机上的 telnet 客户端连接远程主机上的 telnet 服务器。在我们登录到远程主机并运行 shell 后,远端的 shell 就在等待接收输入命令。此后在远端运行 hello 程序包括如图 1-15 所示的五个基本步骤。 

         当我们在 telnet 客户端键入 “hello” 字符串并敲下回车键后,客户端软件就会将这个字符串发送到 telnet 的服务器。telnet 服务器从网络上接收到这个字符串后,会把它传递给远端 shell 程序。接下来,远端 shell 运行 hello 程序,并将输出行返回给 telnet 服务器。最后,telnet 服务器通过网络把输出串转发给 telnet 客户端,客户端就将输出串输出到我们的本地终端上。

1.9 重要主题

1.9.1 Amdahl 定律

        主要思想:当我们对系统的某个部分加速时,其对系统整体性能的影响取决于该部分的重要性和加速程度。 

        若系统执行某应用程序需要的时间为Told。分所假设系统某部需执行时间与该时间的比例为α,而该部分性能提升为k。即该部分初始所需时间为αTold,现在所需时间为(αTold)/k。因此,总的执行时间应为:

1.9.2 并发和并行

         并发:指一个同时具有多个活动的系统

        并行:用并发来使得一个系统运行得更快。

        1. 线程级并发  

        使用线程可以在一个进程中执行多个控制流。

        当构建一个由单操作系统内核控制的多处理器组成的系统时,我们就得到了一个多处理器系统

 

        多核处理器是将多个 CPU(称为“核”)集成到一个集成电路芯片上。 

        超线程也称为同时多线程,是一项允许一个CPU执行多个控制流的技术。

2、指令级并行

        可以同时执行多条指令

        如果处理器可以达到比一个周期一条指令更快的执行效率,就称之为超标量(super-scalar)处理器。大多数现代处理器都支持超标量操作。

        3、单指令、多数据并行

        允许一条指令产生多个可以并行执行的操作,这种方式称为单指令、多数据,即是SIMD并行

1.9.3 计算机系统中抽象的重要性

        在处理器里,指令集架构提供了对实际处理器硬件的抽象。使用这个抽象,机器代码程序表现得就好像运行在一个一次只执行一条指令的处理器上。

        文件是对I/O设备的抽象表示,虚拟内存是对主存和磁盘I/O设备的抽象表示,进程则是对一个正在运行的程序的抽象表示。虚拟机提供对整个计算机的抽象。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

梯度下降算法优化—随机梯度下降、小批次、动量、Adagrad等方法pytorch实现

现有不足 现有调整网络的方法是借助成本函数的梯度下降方法&#xff0c;也就是给函数作切线&#xff0c;不断逼近最优点&#xff0c;即成本函数为零的点。 梯度下降的一般公式为&#xff1a; 即根据每个节点成本函数的梯度进行更新&#xff0c;使用该方法有一些问题&#xff…

探索OpenCV的人脸检测:用Haar特征分类器识别图片中的人脸

目录 简介 OpenCV和Haar特征分类器 实现人脸检测 1. 导入所需库 2. 加载图片和Haar特征分类器 3. 检测人脸 4. 标注人脸 5. 显示 6、结果展示 结论 简介 在计算机视觉和图像处理领域&#xff0c;人脸识别是一项重要的技术。它不仅应用于安全监控、人机交互&#xff0…

10秒钟用Midjourney画出国风味的变形金刚

上魔咒 Optimus Prime comes from the movie Transformers, Chinese style, Wu ShanMing, Ink Painting Halo Dyeing, Conceptual of the Digita Art, MasterComposition, Romantic Ancient Style, Inspired by traditional patterns and symbols, Minimalism, do not con…

day01 -- MybatisPlus

1. MybatisPlus简介 有基础的同学可结合资源中的代码一起看 MyBatis 的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生 特性 通用的 CRUD 操作&#xff1a;内置通用 Mapper、通用 Service&#xff0c;仅仅通过少量配置即可实…

私有化部署大模型最佳解决方案 Ollama (8B)模型

私有化部署大模型Ollama 为什么需要私有化部署大模型一、Ollama本地部署Llama3大模型二、Langchain4j调用Ollama本地部署模型API三、Ollama本地部署nomic向量模型四、Spring AI调用Ollama本地部署模型API 为什么需要私有化部署大模型 企业考虑成本和数据隐私问题&#xff0c;会…

021_Thermal_Transient_in_Matlab统一偏微分框架之热传导问题

Matlab求解有限元专题系列 固体热传导方程 固体热传导的方程为&#xff1a; ρ C p ( ∂ T ∂ t u t r a n s ⋅ ∇ T ) ∇ ⋅ ( q q r ) − α T d S d t Q \rho C_p \left( \frac{\partial T}{\partial t} \mathbf{u}_{\mathtt{trans}} \cdot \nabla T \right) \nab…

BM算法(手算版)

BM 算法 BM 算法是一种字符串匹配的算法。 与 KMP 相比&#xff0c;BM 算法不扫描全部输入字符&#xff0c;平均匹配时间 c・n, 常量 c <1 (随机或真实文本), 但最坏情况是 O (n・m). 可以将 BM 算法的最坏情况改进到 O (n)&#xff1a;通过记录文本后缀中最…

计算机系统简介

一、计算机的软硬件概念 1.硬件&#xff1a;计算机的实体&#xff0c;如主机、外设、硬盘、显卡等。 2.软件&#xff1a;由具有各类特殊功能的信息&#xff08;程序&#xff09;组成。 系统软件&#xff1a;用来管理整个计算机系统&#xff0c;如语言处理程序、操作系统、服…

群晖前面加了雷池社区版,安装失败,然后无法识别出用户真实访问IP

有nas的相信对公网都不模式&#xff0c;在现在基础上传带宽能有100兆的时代&#xff0c;有公网代表着家里有一个小服务器&#xff0c;像百度网盘&#xff0c;优酷这种在线服务都能部署为私有化服务。但现在运营商几乎不可能提供公网ip&#xff0c;要么自己买个云服务器做内网穿…

通过github创建自己网页链接的方法

文章目录 要使用GitHub创建静态网页链接&#xff0c;可以按照以下详细步骤进行操作&#xff1a;一、准备阶段二、创建仓库并配置三、准备并上传静态网站文件四、配置GitHub Pages五、访问和更新你的静态网页 要使用GitHub创建静态网页链接&#xff0c;可以按照以下详细步骤进行…

uniapp微信小程序调用百度OCR

uniapp编写微信小程序调用百度OCR 公司有一个识别行驶证需求&#xff0c;调用百度ocr识别 使用了image-tools这个插件&#xff0c;因为百度ocr接口用图片的base64 这里只是简单演示&#xff0c;accesstoken获取接口还是要放在服务器端&#xff0c;不然就暴露了自己的百度项目k…

Xshell使用密钥远程登录Ubuntu 22.04报错:所选的用户密钥未在远程主机上注册。请再试一次

报错截图如下&#xff1a; 问题原因&#xff1a; Ubuntu 22.04 不支持 Xshell使用的私钥。 查看系统支持的私钥&#xff1a;sudo sshd -T | egrep "pubkey" ~$ sudo sshd -T | egrep "pubkey" pubkeyauthentication yes pubkeyacceptedalgorithms ssh-ed…

基于SpringBoot+Vue的旅游服务平台【提供源码+答辩PPT+参考文档+项目部署】

&#x1f4a5; ① 前言&#xff1a;这两年毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的JavaWeb项目缺少创新和亮点&#xff0c;往往达不到毕业答辩的要求&#xff01; ❗② 如何解决这类问题&#xff1f; 让我们能够顺利通过毕业&#xff0c;我也一直在不断思考、…

ROS 的 urdf 中 link 和 joint 的子标签中 origin 的含义

主要参考文章——主要文章&#xff0c;官方关于urdf的介绍和官方文档的翻译解析 link标签里面的origin含义 link标签里面有三个主要的子标签&#xff0c;分别是visual——连杆的外观和坐标系&#xff0c;collisoin——连杆的碰撞属性和inertial——连杆的惯性设置 首先&…

【AIGC】AI如何匹配RAG知识库: Embedding实践,语义搜索

引言 RAG作为减少模型幻觉和让模型分析、回答私域相关知识最简单高效的方式&#xff0c;我们除了使用之外可以尝试了解其是如何实现的。在实现RAG的过程中Embedding是非常重要的手段。本文将带你简单地了解AI工具都是如何通过Embedding去完成语义分析匹配的。 Embedding技术简…

低空经济发展迅猛,无人机设计制造技术详解

低空经济的迅猛发展&#xff0c;为无人机设计制造技术带来了新的机遇和挑战。无人机作为低空经济中的重要组成部分&#xff0c;其设计制造技术直接关系到无人机的性能、安全性和应用场景的拓展。以下是对无人机设计制造技术的详细解析&#xff1a; 一、无人机设计技术 1. 气动…

【HTML + CSS 魔法秀】打造惊艳 3D 旋转卡片

HTML结构 box 类是整个组件的容器。item-wrap 类是每个旋转卡片的包装器&#xff0c;每个都有一个内联样式–i&#xff0c;用于控制动画的延迟。item类是实际的卡片内容&#xff0c;包含一个图片。 <template><div class"box"><div class"item…

STM32L010F4 最小系统设计

画一个 STM32L010F4 的测试板子...... by 矜辰所致前言 最近需要用到一个新的 MCU&#xff1a; STM32L010F4 &#xff0c;上次测试的 VL53L0X 需要移植到这个芯片上&#xff0c;网上一搜 STM32L010F4&#xff0c;都是介绍资料&#xff0c;没有最小系统&#xff0c;使用说明等。…

计算生物学与生物信息学漫谈-1-测序一路走来

最近工作中&#xff0c;反思自己计算生物学基础非常薄弱&#xff0c;然而作为一门非常新兴的交叉学科&#xff0c;涉及计算机、物理、生物、数学等多多学科&#xff0c;国内并没有这样完善的教程&#xff0c;因此想要自己做一个教程&#xff0c;使用费曼学习法学习&#xff0c;…

探讨淘宝商品 API 接口:运用及收益

在当今电子商务蓬勃发展的时代&#xff0c;淘宝作为全球领先的电商平台&#xff0c;拥有海量的商品资源和庞大的用户群体。而淘宝商品 API 接口的出现&#xff0c;为开发者和企业提供了一种强大的工具&#xff0c;能够实现对淘宝商品数据的高效获取和利用。本文将深入探讨淘宝商…