输入/输出管理 III(磁盘和固态硬盘)

一、磁盘

【总结】:

磁盘(Disk)是由表面涂有磁性物质的物理盘片,通过一个称为磁头的导体线圈从磁盘存取数据。在读/写操作期间,磁头固定,磁盘在下面高速旋转。如下图所示:

磁盘盘面上的数据存储在一组同心圆中,称为磁道,每个磁道与磁头一样宽,一个盘面有上千个磁道。磁道又划分为几百个扇区,每个扇区固定存储大小,一个扇区称为一个盘块。相邻磁道及相邻扇区间通过一定的间隙分隔开,以避免精度错误。

注意,由于扇区按固定圆心角度划分,所以密度从最外道向里道增加,磁盘的存储能力受限于最内道的最大记录密度。

为了提高磁盘的存储容量,充分利用磁盘外层磁道的存储能力,现代磁盘不再将内外磁道划分为相同数目的扇区,而将盘面划分为若干环带,同一环带内的所有磁道具有相同的扇区数显然,外层环带的磁道拥有较内层环带的磁道更多的扇区。

磁盘安装在一个磁盘驱动器中,它由磁头臂、用于旋转磁盘的主轴和用于数据输入/输出的电子设备组成。如下图所示:

多个盘片垂直堆叠,组成磁盘组,每个盘面对应一个磁头,所有磁头固定在一起,与磁盘中心的距离相同且一起移动。所有盘片上相对位置相同的磁道组成柱面。扇区是磁盘可寻址的最小单位,磁盘上能存储的物理块数目由扇区数、磁道数及磁盘面数决定,磁盘地址用 “柱面号·盘面号·扇区号” 表示。

磁盘按不同的方式可分为若干类型:

  • 磁头相对于盘片的径向方向固定的,称为固定头磁盘,每个磁道一个磁头;
    磁头可移动的,称为活动头磁盘,磁头臂可来回伸缩定位磁道。

  • 磁盘永久固定在磁盘驱动器内的,称为固定盘磁盘;
    磁盘可移动和替换的,称为可换盘磁盘。

用户访问文件,需要操作系统的服务,文件实际上存储在磁盘中,操作系统接收用户的命令后,经过一系列的检验访问权限和寻址过程后,最终都会到达磁盘,控制磁盘把相应的数据信息读出或修改。当有多个请求同时到达时,操作系统就要决定先为哪个请求服务,这就是磁盘调度算法要解决的问题。

二、磁盘调度算法

1. 磁盘的存取时间

一次磁盘读写操作的时间由寻找(寻道)时间、旋转延迟时间和传输时间决定。

(1)寻道时间 Ts

活动头磁盘在读 / 写信息前,将磁头移动到指定磁道所需要的时间。这个时间除跨越 n 条磁道的时间外,还包括启动磁臂的时间 s ,即 Ts = m × n + s 。

式中,m 是与磁盘驱动器速度有关的常数,约为 0.2ms ,磁臂的启动时间约为 2ms 。

(2)旋转延迟时间 Tr

磁头定位到某一磁道的扇区所需要的时间,设磁盘的旋转速度为 r ,则 Tr = 1/(2r)

对于硬盘,典型的旋转速度为 5400 转/分,相当于一周 11.1ms ,则 Tr 为 5.55ms ,对于软盘,其旋转速度为 300 ~ 600 转/分,则 Tr 为 50 ~ 100ms 。

(3)传输时间 Tt

从磁盘读出或向磁盘写入数据所经历的时间,这个时间取决于每次所读/写的字节数 b 和磁盘的旋转速度 r ,则 Tt = b/(rN)

式中,r 为磁盘每秒的转数,N 为一个磁道上的字节数。

在磁盘存取时间的计算中,寻道时间与磁盘调度算法相关;而延迟时间和传输时间都与磁盘旋转速度相关,且为线性相关,所以在硬件上,转速是磁盘性能的一个非常重要的硬件参数。总平均存取时间 Ta 可以表示为 Ta= Ts + 1/(2r) + b/(rN) 。

2. 磁盘调度算法

虽然上述给出了总平均存取时间的公式,但是这个平均值是没有太大实际意义的,因为在实际的磁盘 I/O 操作中,存取时间与磁盘调度算法密切相关。

目前常用的磁盘调度算法有以下几种:

1)先来先服务(First Come First Served, FCFS)算法

FCFS 算法根据进程请求访问磁盘的先后顺序进行调度,这是一种最简单的调度算法,如下图所示。

该算法的优点是具有公平性。若只有少量进程需要访问,且大部分请求都是访问簇聚的文件扇区,则有望达到较好的性能;若有大量进程竞争使用磁盘,则这种算法在性能上往往接近于随机调度。所以,实际磁盘调度中会考虑一些更为复杂的调度算法。

2)最短寻找时间优先(Shortest Seek Time First, SSTF)算法

SSTF 算法选择调度处理的磁道是与当前磁头所在磁道距离最近的磁道,以便使每次的寻找时间最短。当然,总是选择最小寻找时间并不能保证平均寻找时间最小,但能提供比 FCFS 算法更好的性能。

SSTF 算法会产生饥饿的原因在于:磁头有可能在一个小区域内来回来去地移动。

3)扫描(SCAN)算法(又称电梯调度算法)

为了防止产生饥饿,可以规定,只有磁头移动到最外侧磁道的时候才能往内移动,移动到最内侧磁道的时候才能往外移动。这就是扫描算法(SCAN)的思想。

SCAN 算法在磁头当前移动方向上选择与当前磁头所在磁道距离最近的请求作为下一次服务的对象,实际上就是在最短寻找时间优先算法的基础上规定了磁头运动的方向,如下图所示。

由于磁头移动规律与电梯运行相似,因此又称电梯调度算法。SCAN 算法对最近扫描过的区域不公平,因此它在访问局部性方面不如 FCFS 算法和 SSTF 算法好。

【拓展】:LOOK 调度算法

扫描算法(SCAN)中,只有到达最边上的磁道时才能改变磁头移动方向,事实上,处理了 184 号磁道的访问请求之后就不需要再往右移动磁头了。LOOK 调度算法就是为了解决这个问题,如果在磁头移动方向上已经没有别的请求,就可以立即改变磁头移动方向。(边移动边观察,因此叫 LOOK)

4)循环扫描(Circular SCAN, C-SCAN)算法

SCAN 算法对于各个位置磁道的响应频率不平均,而 C-SCAN 算法就是为了解决这个问题。规定只有磁头朝某个特定方向移动时才处理磁道访问请求,而返回时直接快速移动至起始端而不处理任何请求。如下图所示:

【拓展】:C-LOOK 调度算法

C-SCAN 算法的主要缺点是:只有到达最边上的磁道时才能改变磁头移动方向,并且磁头返回时不一定需要返回到最边缘的磁道上。C-LOOK 算法就是为了解决这个问题。如果磁头移动的方向上已经没有磁道访问请求了,就可以立即让磁头返回,并且磁头只需要返回到有磁道访问请求的位置即可。

注意,若无特别说明,也可以默认 SCAN 算法和 C-SCAN 算法为 LOOK 和 C-LOOK 调度。

5)总结

对比以上几种磁盘调度算法,FCFS 算法太过简单,性能较差,仅在请求队列长度接近于 1 时才较为理想;SSTF 算法较为通用和自然;SCAN 算法和 C-SCAN 算法在磁盘负载较大时比较占优势。它们之间的比较见下表。

优点缺点
FCFS算法公平、简单平均寻道距离大,仅应用在磁盘I/O较少的场合
SSTF算法性能比“先来先服务”好不能保证平均寻道时间最短,可能出现“饥饿”现象
SCAN算法寻道性能较好,可避免“饥饿”现象不利于远离磁头一端的访问请求
C-SCAN算法消除了对两端磁道请求的不公平-

3. 减少延迟时间的方法

【总结】:

1)交替编号与错位命名

除减少寻找时间外,减少延迟时间也是提高磁盘传输效率的重要因素。可以对盘面扇区进行交替编号,对磁盘片组中的不同盘面错位命名。假设每个盘面有 8 个扇区,磁盘片组共 8 个盘面,则可以采用如下图所示的编号。

若采用交替编号的策略,即让逻辑上相邻的扇区在物理上有一定的间隔,可以使读取连续的逻辑扇区所需要的延迟时间更小。

磁盘是连续自转设备,磁头读/写一个物理块后,需要经过短暂的处理时间才能开始读/写下一块。假设逻辑记录数据连续存放在磁盘空间中,若在盘面上按扇区交替编号连续存放,则连续读/写多条记录时能减少磁头的延迟时间;同柱面不同盘面的扇区若能错位编号,连续读/写相邻两个盘面的逻辑记录时也能减少磁头延迟时间。

以上图为例,在随机扇区访问情况下,定位磁道中的一个扇区平均需要转过 4 个扇区,这时,延迟时间是传输时间的 4 倍,这是一种非常低效的方式。理想的情况是不需要定位而直接连续读取扇区,没有延迟时间,这样磁盘数据存取效率可以成倍提高。但由于读取扇区的顺序是不可预测的,所以延迟时间不可避免。上图中的编号方式是读取连续编号扇区时的一种方法。

磁盘寻块时间分为三个部分,即寻道时间、延迟时间和传输时间,寻道时间和延迟时间属于 “找” 的时间,凡是 “找” 的时间都可以通过一定的方法削减,但传输时间是磁盘本身性质所决定的,不能通过一定的措施减少。

2)磁盘地址结构的设计

假设某磁盘有 8个柱面 / 磁道(假设最内侧柱面 / 磁道号为 0),4 个盘面,8 个扇区。则可用 3 个二进制位表示柱面,2 个二进制位表示盘面,3 个二进制位表示扇区。

(a)若物理地址结构是(盘面号,柱面号,扇区号),且需要连续读取物理地址 (00, 000, 000)~(00, 001, 111)的扇区:(00, 000, 000) ~( 00, 000, 111 ) 转两圈可读完之后再读取物理地址相邻的区域,即(00, 001, 000) ~( 00, 001, 111 ),需要启动磁头臂,将磁头移动到下一个磁道。

(b)若物理地址结构是(柱面号,盘面号,扇区号),且需要连续读取物理地址 (000, 00, 000)~(000, 01, 111)的扇区:(000, 00, 000) ~( 000, 00, 111 ) 由盘面0的磁头读入数据之后再读取物理地址相邻的区域,即(000, 01, 000) ~( 000, 01, 111 ),由于柱面号/磁道号相同,只是盘面号不同,因此不需要移动磁头臂。只需要激活相邻盘面的磁头即可。

三、磁盘的管理

【总结】:

1. 磁盘初始化

一个新的磁盘只是一个磁性记录材料的空白盘。在磁盘可以存储数据之前,必须将它分成扇区,以便磁盘控制器能够进行读写操作,这个过程称为低级格式化(或称物理格式化)。低级格式化为每个扇区使用特殊的数据结构,填充磁盘。每个扇区的数据结构通常由头部、数据区域(通常为 512B 大小)和尾部组成。头部和尾部包含了一些磁盘控制器的使用信息。

大多数磁盘在工厂时作为制造过程的一部分就已低级格式化,这种格式化能够让制造商测试磁盘,并且初始化逻辑块号到无损磁盘扇区的映射。对于许多磁盘,当磁盘控制器低级格式化时,还能指定在头部和尾部之间留下多长的数据区,通常选择 256 或 512 字节等。

2. 分区

在可以使用磁盘存储文件之前,操作系统还要将自己的数据结构记录到磁盘上,分为两步:

  • 第一步是,将磁盘分为由一个或多个柱面组成的分区(即我们熟悉的 C 盘、D 盘等形式的分区),每个分区的起始扇区和大小都记录在磁盘主引导记录的分区表中;

  • 第二步是,对物理分区进行逻辑格式化(创建文件系统),操作系统将初始的文件系统数据结构存储到磁盘上,这些数据结构包括空闲空间和已分配的空间以及一个初始为空的目录。

因扇区的单位太小,为了提高效率,操作系统将多个相邻的扇区组合在一起,形成一簇(在 Linux 中称为块)。为了更高效地管理磁盘,一簇只能存放一个文件的内容,文件所占用的空间只能是簇的整数倍;如果文件大小小于一簇(甚至是 0 字节),也要占用一簇的空间。

3. 引导块

计算机启动时需要运行一个初始化程序(自举程序),它初始化 CPU、寄存器、设备控制器和内存等,接着启动操作系统。为此,自举程序找到磁盘上的操作系统内核,将它加载到内存,并转到起始地址,从而开始操作系统的运行。

注:ROM 一般是出厂时就集成在主板上的,并且以后不能再修改。

自举程序通常存放在 ROM(只读存储器)中,为了避免改变自举代码而需要改变 ROM 硬件的问题,通常只在 ROM 中保留很小的自举装入程序,而将完整功能的引导程序保存在磁盘的启动块上,启动块位于磁盘的固定位置。具有启动分区的磁盘称为启动磁盘或系统磁盘。

引导 ROM 中的代码指示磁盘控制器将引导块读入内存,然后开始执行,它可以从非固定的磁盘位置加载整个操作系统,并且开始运行操作系统。下面以 Windows 为例来分析引导过程:

Windows 允许将磁盘分为多个分区,有一个分区为引导分区,它包含操作系统和设备驱动程序。Windows 系统将引导代码存储在磁盘的第 0 号扇区,它称为主引导记录(MBR)。引导首先运行 ROM 中的代码,这个代码指示系统从 MBR 中读取引导代码。除了包含引导代码,MBR 还包含: 一个磁盘分区表和一个标志(以指示从哪个分区引导系统),如下图所示。当系统找到引导分区时,读取分区的第一个扇区,称为引导扇区,并继续余下的引导过程,包括加载各种系统服务。

4. 坏块

由于磁盘有移动部件且容错能力弱,因此容易导致一个或多个扇区损坏。部分磁盘甚至在出厂时就有坏块。根据所用的磁盘和控制器,对这些块有多种处理方式。

对于简单磁盘,如采用 IDE 控制器的磁盘,坏块可手动处理,如 MS-DOS 的 Format 命令执行逻辑格式化时会扫描磁盘以检查坏块。坏块在 FAT 表上会标明,因此程序不会使用它们。

对于复杂的磁盘,控制器维护磁盘内的坏块列表。这个列表在出厂低级格式化时就已初始化,并在磁盘的使用过程中不断更新。低级格式化将一些块保留作为备用,操作系统看不到这些块。控制器可以采用备用块来逻辑地替代坏块,这种方案称为扇区备用。

对坏块的处理实质上就是用某种机制使系统不去使用坏块。

四、固态硬盘

【总结】:

1. 固态硬盘的特性

固态硬盘(SSD)是一种基于闪存技术的存储器。它与 U 盘并无本质差别,只是容量更大,存取性能更好。一个 SSD 由一个或多个闪存芯片和闪存翻译层组成,如下图所示。闪存芯片替代传统旋转磁盘中的机械驱动器,而闪存翻译层将来自 CPU 的逻辑块读写请求翻译成对底层物理设备的读写控制信号,因此闪存翻译层相当于扮演了磁盘控制器的角色。

在上图中,一个闪存芯片由 m 块组成,每块由 n 页组成。通常,页的大小是 512B ~ 4KB ,每块由 32 ~ 128 页组成,块的大小为 16KB ~ 512KB 。数据是以页为单位读写的。只有在一页所属
的块整个被擦除后,才能写这一页。不过, 一旦擦除一块, 块中的每页就都可以直接再写一次。
某块进行若干次重复写后,就会磨损坏,不能再使用。

随机写很慢,有两个原因:首先,擦除块比较慢,通常比访问页高一个数量级。其次,如果写操作试图修改包含已有数据的页 ni ,那么这个块中所有含有用数据的页都必须被复制到一个新(擦除过的)块中,然后才能进行对页 ni 的写操作。

比起传统磁盘,SSD 有很多优点,它由半导体存储器构成,没有移动的部件,因而随机访问速度比机械磁盘要快很多,也没有任何机械噪声和震动,能耗更低、抗震性好、安全性高等。

随着技术的不断发展,价格也不断下降,SSD 会有望逐步取代传统机械硬盘。

2. 磨损均衡(Wear Leveling)

固态硬盘也有缺点,闪存的擦写寿命是有限的,一般是几百次到几千次。如果直接用普通闪存组装 SSD ,那么实际的寿命表现可能非常令人失望——读写数据时会集中在 SSD 的一部分闪存,这部分闪存的寿命会损耗得特别快。一旦这部分闪存损坏,整块 SSD 也就损坏了。这种磨损不均衡的情况,可能会导致一块 256GB 的 SSD ,只因数兆空间的闪存损坏而整块损坏。

为了弥补 SSD 的寿命缺陷,引入了磨损均衡。SSD 磨损均衡技术大致分为两种:

  • 动态磨损均衡。写入数据时,自动选择较新的闪存块。老的闪存块先歇一歇。

  • 静态磨损均衡。这种技术更为先进,就算没有数据写入,SSD 也会监测并自动进行数据分配,让老的闪存块承担无须写数据的存储任务,同时让较新的闪存块腾出空间,平常的读写操作在较新的闪存块中进行。如此一来,各闪存块的寿命损耗就都差不多。

有了这种算法加持,SSD 的寿命就比较可观了。例如,对于一个 256GB 的 SSD ,如果闪存的擦写寿命是 500 次,那么就需要写入 125TB 数据,才寿终正寝。就算每天写入 10GB 数据,也要三十多年才能将闪存磨损坏,更何况很少有人每天往 SSD 中写入 10GB 数据。

五、小结

1、在磁盘上进行一次读写操作需要哪几部分时间?其中哪部分时间最长?

在磁盘上进行一次读写操作花费的时间由寻道时间、延迟时间和传输时间决定。其中寻道时间是将磁头移动到指定磁道所需要的时间,延迟时间是磁头定位到某一磁道的扇区(块号)所需要的时间,传输时间是从磁盘读出或向磁盘写入数据所经历的时间。一般来说,寻道时间因为要移动磁臂,所以占用时间最长。

2、存储一个文件时,当一个磁道存储不下时,剩下部分是存在同一个盘面的不同磁道好,还是存在同一个柱面上的不同盘面好?

寻道时间对于一次磁盘访问的影响是最大的,若存在同一个盘面的不同磁道,则磁臂势必要移动,这样会大大增加文件的访问时间,而存在同一个柱面上的不同盘面就不需要移动磁道,所以一般情况下存在同一个柱面上的不同盘面更好。

3、提高磁盘 I/O 速度的方法

  • 提前读。在读磁盘当前块时,把下一磁盘块也读入内存缓冲区。

  • 延迟写。仅在缓冲区首部设置延迟写标志,然后释放此缓冲区并将其链入空闲缓冲区链表的尾部,当其他进程申请到此缓冲区时,才真正把缓冲区信息写入磁盘块。

  • 虚拟盘。是指用内存空间去仿真磁盘,又叫 RAM 盘。虚拟盘是一种易失性存储器。虚拟盘常用于存放临时文件。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

链表算法速成计划

链表算法速成计划 1.准备工作 1.1创建链表节点结构体 struct ListNode {int val;ListNode* next;ListNode() : val(0), next(NULL) {}ListNode(int x) : val(x), next(NULL) {}ListNode(int x, ListNode* next) : val(x), next(next) {} };1.2 在IDE中创建链表代码 ListNod…

iPhone或iPad接收的文件怎么找?怎样删除?

因为iOS系统和iPadOS系统的特殊性,在使用AirDroid传输文件之后,往往存在“找文件”的难题。本篇文章一次性解释清楚。 文件传输到iPhone/iPad之后,怎样才能找到? iPhone/iPad接收到的全部文件都可以在AirDroid右上角的【时钟】按钮…

猎板 HDI 多阶工艺:高密度互连的核心技术

一、猎板HDI引言 随着电子设备不断向小型化、高性能化和多功能化发展,PCB(印刷电路板)的设计与制造面临着前所未有的挑战。HDI(高密度互连)技术应运而生,而其中的多阶工艺更是满足了对更高布线密度、更小尺…

VUE 的前置知识

一、JavaScript----导图导出 1. JS 提供的导入导出机制&#xff0c;可以实现按需导入 1.1 在html页面中可以把JS文件通过 <script src"showMessage.js"></script> 全部导入 1.2 通过在JS文件中写export关键字导出通过 <script src"showMessage…

---Arrays类

一 java 1.Arrays类 1.1 toString&#xff08;&#xff09; 1.2 arrays.sort( )-----sort排序 1&#xff09;直接调用sort&#xff08;&#xff09; Arrays.sort() 方法的默认排序顺序是 从小到大&#xff08;升序&#xff09;。 2&#xff09;定制排序【具体使用时 调整正负…

【H2O2|全栈】JS进阶知识(六)ES6(2)

目录 前言 开篇语 准备工作 Set和Map 基本概念 Set 相互转化 常见属性和API 数组去重 并集、交集和差集 Map 转化 常见的属性和API Set和Map的区别 This的指向 function函数 箭头函数 修改this 使用方式 三种方式的异同 案例 更改this指向为obj 求数组数…

Node基本使用

1. 创建自定义全局指令 1.1 新建一个空的文件夹, 创建一个cli.js文件 1.2 在cli.js写入内容 /usr/bin/env就是让系统使用node来执行你的脚本文件。 #! /usr/bin/env node1.3 执行终端指令 // 在文件夹 node-project 的终端下执行指令npm init执行完后package.json结构如下,…

Python编程技巧:多变量赋值的优雅艺术

在Python编程的世界里&#xff0c;有许多令人惊叹的语法特性&#xff0c;而多变量赋值就像是一颗闪耀的明珠&#xff0c;它不仅让代码更优雅&#xff0c;还能提升程序的执行效率。今天我们就深入探讨这个看似简单却蕴含深意的编程技巧。 基础认识 传统的变量赋值方式&#xff…

Transformer架构笔记

Attention is All You Need. 3.Model Architecture 3.1 整体架构如图 3.2 Encoder与Decoder Encoder&#xff1a;由 N 6 N6 N6个相同的Block/Layer堆叠而成。每个Block有两个子层sub-layer&#xff1a;多头注意力和MLP&#xff08;FFN&#xff0c;前馈神经网络&#xff09;&…

网络安全简单入门与扫描

网络安全简单入门 内容大纲 策略制定安全工具其他 1、安全策略 1.1、安全三要素 要全面地认识一个安全问题,我们有很多种办法,但首先要理解安全问题的组成属性。前人通过无数实践,最后将安全的属性总结为安全三要素,简称CIA。 安全三要素是安全的基本组成元素,分别是机密性…

在WPF程序中实现PropertyGrid功能

使用C#开发过Windows Forms的都知道&#xff0c;在Windows Forms程序中&#xff0c;有一个PropertyGrid控件&#xff0c;可以用于显示对象的属性&#xff0c;在WPF中并没有默认提供此功能的控件&#xff0c;今天以一个简单的小例子&#xff0c;简述在WPF中借助WinForm的Propert…

大模型时代的具身智能系列专题(十四)

冯晨团队 冯晨是纽约大学的副教授。他对通过多学科使用启发研究实现机器人主动和协作感知和学习感兴趣&#xff0c;这些研究源自建筑、制造和运输领域。在纽约大学之前&#xff0c;冯晨是马萨诸塞州剑桥市三菱电机研究实验室 (MERL) 计算机视觉小组的研究科学家&#xff0c;专…

力扣-Hot100-栈【算法学习day.40】

前言 ###我做这类文档一个重要的目的还是给正在学习的大家提供方向&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;&#xff09;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非常非常高滴&am…

RT_Thread内核源码分析(三)——线程

目录 1. 线程结构 2. 线程创建 2.1 静态线程创建 2.2 动态线程创建 2.3 源码分析 2.4 线程内存结构 3. 线程状态 3.1 线程状态分类 3.2 就绪状态和运行态 3.3 阻塞/挂起状态 3.3.1 阻塞工况 3.4 关闭状态 3.4.1 线程关闭接口 3.4.2 静态线程关闭 3.4.3 动态线程关…

043 商品详情

文章目录 详情页数据表结构voSkuItemVo.javaSkuItemSaleAttrVo.javaAttrValueAndSkuIdVo.javaSpuAttrGroupVo.javaGroupAttrParamVo.java pom.xmlSkuSaleAttrValueDao.xmlSkuSaleAttrValueDao.javaAttrGroupDao.xmlAttrGroupServiceImpl.javaSkuInfoServiceImpl.javaSkuSaleAtt…

硬件知识 cadence16.6 原理图输出为pdf 网络名下划线偏移 (ORCAD)

1. cadence原理图输出为PDF网络名下划线偏移 生这种情况的原因 1. 设计的原理图图纸大小比正常的 A4图纸大。 2. 打印为PDF 的时候&#xff0c;打印机的设置有问题。 2.cadence原理图输出为 PDF网络名下划线偏移的情况 可以看到上图&#xff0c;网络名往上漂移。 3. 解决办法 …

Spring-boot3.4最新版整合swagger和Mybatis-plus

好家伙,今天终于开始用spring-boot3开始写项目了&#xff0c;以后要彻底告别1.x和2.x了&#xff0c;同样的jdk也来到了最低17的要求了,废话不多说直接开始 这是官方文档的要求jdk最低是17 maven最低是3.6 一. 构建工程,这一步就不需要给大家解释了吧 二. 整合Knife4j 1.大于 …

从零开始:如何使用第三方视频美颜SDK开发实时直播美颜平台

开发一个具有实时美颜功能的直播平台&#xff0c;能够显著提高用户体验和内容质量。而利用第三方视频美颜SDK可以大大简化开发过程&#xff0c;加快产品上市速度。本篇文章&#xff0c;小编将从零开始&#xff0c;详细讲解如何使用第三方视频美颜SDK开发一个实时直播美颜平台。…

ROS入门学习ONE

ros入门玩法1&#xff1a;控制小龟龟 终端1输入 sudo apt install ros-noetic-rqt-steering 新建终端2&#xff08;快捷键CtrlAltT)&#xff0c;打开控制台 roscore //启动ros系统 回到原终端 rosrun rosrun rqt_robot_steering rqt_robot_steering 新建终端3&#xff0c;…

shell脚本(二)

声明&#xff01; 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&#…