输入/输出管理 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 盘。虚拟盘是一种易失性存储器。虚拟盘常用于存放临时文件。

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

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

相关文章

使用flink编写WordCount

1. env-准备环境 2. source-加载数据 3. transformation-数据处理转换 4. sink-数据输出 5. execute-执行 流程图&#xff1a; DataStream API开发 //nightlies.apache.org/flink/flink-docs-release-1.13/docs/dev/datastream/overview/ 添加依赖 <properties>&l…

# issue 4 进程控制函数

目录 一、进程控制函数一 二、进程控制函数二 启动进程&#xff1a;&#xff08;exec系列&#xff09; 创建新进程&#xff1a; 测试代码&#xff1a; 测试结果&#xff1a; 三、进程控制函数三 结束进程&#xff1a; 测试代码&#xff1a; 测试结果&#xff1a; 四、…

Java项目实战II基于SpringBoot的共享单车管理系统开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、核心代码 五、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 在共享经济蓬勃发展的今天…

Linux 网络编程之UDP套接字

前言 前面我们对网络的发展&#xff0c;网络的协议、网路传输的流程做了介绍&#xff0c;最后&#xff0c;我们还介绍了 IP 和 端口号&#xff0c;ip port 叫做 套接字 socket&#xff0c; 本期我们就来介绍UDP套接字编程&#xff01; 目录 1、预备知识 1.1 传输层协议: T…

---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;定制排序【具体使用时 调整正负…

Java 对象头、Mark Word、monitor与synchronized关联关系以及synchronized锁优化

1. 对象在内存中的布局分为三块区域&#xff1a; &#xff08;1&#xff09;对象头&#xff08;Mark Word、元数据指针和数组长度&#xff09; 对象头&#xff1a;在32位虚拟机中&#xff0c;1个机器码等于4字节&#xff0c;也就是32bit&#xff0c;在64位虚拟机中&#xff0…

6.7机器学习期末复习题

空间 样本空间 就是属性的所有可能情况&#xff0c;包括了一切可能出现或不可能出现的所有样本情况 版本空间&假设空间 假设空间就是在样本空间的基础上&#xff0c;给所有属性都加了一个通配符&#xff0c;表示任意即可&#xff1b;以及加上了一个空集&#xff0c;表示…

Qt界面设计时使各控件依据窗口缩放进行栅格布局的方法

图1 最终效果 想要达成上述图片的布局效果&#xff0c;具体操作如下&#xff1a; 新建一窗体&#xff1a; 所需控件如下&#xff1a; Table View控件一个&#xff1b; Group Box控件一个&#xff1b; Push Button控件2个&#xff1b; Horiziontal Spacer控件2个&#xf…

mac安装Pytest、Allure、brew

安装环境 安装pytest 命令 pip3 install pytest 安装allure 命令&#xff1a;brew install allure 好吧 那我们在安装allure之前 我们先安装brew 安装brew 去了官网复制了命令 还是无法下载 如果你们也和我一样可以用这个方法哦 使用国内的代码仓库来执行brew的安装脚本…

数据结构C语言描述5(图文结合)--队列,数组、链式、优先队列的实现

前言 这个专栏将会用纯C实现常用的数据结构和简单的算法&#xff1b;有C基础即可跟着学习&#xff0c;代码均可运行&#xff1b;准备考研的也可跟着写&#xff0c;个人感觉&#xff0c;如果时间充裕&#xff0c;手写一遍比看书、刷题管用很多&#xff0c;这也是本人采用纯C语言…

一篇文章了解机器学习

一篇文章了解机器学习&#xff08;上&#xff09; 一、软件版本安装二、数据集的加载三、数据集的切分四、数据特征提取及标准化1、字典数据的特征提取2、文本特征向量的提取3、数据标准化处理 四、特征降维注&#xff1a;训练器的区别&#xff1a;&#xff1a;五、模型的训练与…

day03(单片机高级)RTOS

目录 RTOS(实时操作系统) 裸机开发模式 轮询方式 前后台&#xff08;中断方式&#xff09; 改进&#xff08;前后台&#xff08;中断&#xff09;&#xff09;定时器 裸机进一步优化 裸机的其他问题 RTOS的概念 什么是RTOS 为什么要使用 RTOS RTOS的应用场景 RTOS的…

Hello-Go

Hello-Go 环境变量 GOPATH 和 GOROOT &#xff1a;不同于其他语言&#xff0c;go中没有项目的说法&#xff0c;只有包&#xff0c;其中有两个重要的路径&#xff0c;GOROOT 和 GOPATH Go开发相关的环境变量如下&#xff1a; GOROOT&#xff1a;GOROOT就是Go的安装目录&…

pytorch官方FasterRCNN代码详解

本博文转自捋一捋pytorch官方FasterRCNN代码 - 知乎 (zhihu.com)&#xff0c;增加了其中代码的更详细的解读&#xff0c;以帮助自己理解该代码。 代码理解的参考Faster-RCNN全面解读(手把手带你分析代码实现)---前向传播部分_手把手faster rcnn-CSDN博客 1. 代码结构 作为 to…

全志T113双核异构处理器的使用基于Tina Linux5.0——RTOS系统定制开发

8、RTOS系统定制开发 此处以在rtos/components/aw目录下创建一个简单的软件包为例&#xff0c;帮助客户了解RTOS环境&#xff0c;为RTOS系统定制开发提供基础。 RTOS环境下的软件包主要由三部分组成&#xff0c;源文件&#xff0c;Makefile&#xff0c;Kconfig&#xff0c;如下…

springboot实战(13)(@PatchMapping、@RequestParam、@URL、ThreadLocal线程局部变量)

目录 一、PATCH请求方式。 二、实现用户更新头像功能。 三、注解RequestParam。 四、注解URL。&#xff08;对传来的参数是否是合法地址进行校验&#xff09; 一、PATCH请求方式。 patch中文翻译&#xff1a;局部、小块。PATCH 请求主要用于对已存在的资源进行局部修改&#xf…

nvm安装node遇到的若干问题(vscode找不到npm文件、环境变量配置混乱、npm安装包到D盘)

问题一&#xff1a;安装完nvm后需要做哪些环境变量的配置&#xff1f; 1.打开nvm文件夹下的setting文件&#xff0c;设置nvm路径和安装node路径&#xff0c;并添加镜像。 root: D:\software\nvm-node\nvm path: D:\software\nvm-node\nodejs node_mirror: https://npmmirror.c…

面向FWA市场!移远通信高性能5G-A模组RG650V-NA通过北美两大重要运营商认证

近日&#xff0c;全球领先的物联网整体解决方案供应商移远通信宣布&#xff0c;其旗下符合3GPP R17标准的新一代5G-A模组RG650V-NA成功通过了北美两家重要运营商认证。凭借高速度、大容量、低延迟、高可靠等优势&#xff0c;该模组可满足CPE、家庭/企业网关、移动热点、高清视频…

2024年11月21日Github流行趋势

项目名称&#xff1a;twenty 项目维护者&#xff1a;charlesBochet, lucasbordeau, Weiko, FelixMalfait, bosiraphael项目介绍&#xff1a;正在构建一个由社区支持的现代化Salesforce替代品。项目star数&#xff1a;21,798项目fork数&#xff1a;2,347 项目名称&#xff1a;p…

AWTK 最新动态:支持鸿蒙系统(HarmonyOS Next)

HarmonyOS是全球第三大移动操作系统&#xff0c;有巨大的市场潜力&#xff0c;在国产替代的背景下&#xff0c;机会多多&#xff0c;AWTK支持HarmonyOS&#xff0c;让AWTK开发者也能享受HarmonyOS生态的红利。 AWTK全称为Toolkit AnyWhere&#xff0c;是ZLG倾心打造的一套基于C…