当前位置: 首页 > news >正文

操作系统 4.3-生磁盘的使用

磁盘的物理组成

  1. 盘面

    • 磁盘由多个盘面组成,每个盘面上都有数据存储的区域。

  2. 磁道

    • 每个盘面上都有若干个同心圆,这些同心圆称为磁道。磁道是数据存储的路径。

  3. 扇区

    • 磁道被进一步划分为若干个扇区,扇区是磁盘的最小访问单位。

    • 扇区大小通常为512字节。

磁盘的io流程

该幻灯片描述了磁盘的输入/输出(I/O)过程,具体步骤如下:

  1. 开始使用磁盘

    • 首先,系统需要通过IDE控制器与磁盘建立连接,开始磁盘的I/O操作。

  2. 磁盘I/O过程

    • 磁盘的I/O过程包括以下几个步骤:控制器、寻道、旋转、传输。

  3. 寻道

    • 控制器发送指令,使磁头移动到正确的磁道上。这是为了定位到数据所在的物理位置。

  4. 旋转

    • 磁盘旋转,使得目标扇区移动到磁头下方。这个过程需要等待磁盘旋转到正确的位置,可能会有一定的延迟。

  5. 传输

    • 一旦目标扇区位于磁头下方,数据就可以从磁盘读取到内存中,或者从内存写入到磁盘中。

  6. 内存缓存

    • 读取或写入的数据首先会进入内存缓存。对于读取操作,数据从磁盘读出后存储在内存缓存中;对于写操作,数据首先写入内存缓存,然后再从缓存写入磁盘。

使用磁盘

柱面(Cylinder)

柱面是磁盘上所有盘面中具有相同径向位置的磁道的集合。

当计算机需要读取或写入数据时,它会根据柱面号、磁头号和扇区号来确定目标数据的位置。

通过控制磁头的移动和盘片的旋转,计算机可以准确地定位到特定柱面上的特定扇区,进行数据的读写操作。

磁头(Head)

每个盘面对应一个磁头

所有的磁头都是连在同一个磁臂上的,因此所有磁头只能“共进退”。

每个磁头上都有读和写的操作装置,用于读取和写入数据。

磁头臂是支持磁头的可移动臂,通过电动机或电磁力控制,可以使磁头在盘片上移动到不同的磁道位置。

扇区(Sector)

每个盘片被划分为一个个磁道,每个磁道又划分为一个个扇区。

扇区是磁盘的最小访问单位,通常为512字节。

在读取或写入数据时,磁头需要准确地定位到相应的扇区。磁盘驱动器在向磁盘读取和写入数据时,要以扇区为单位。

代码分析

从提供的幻灯片内容中,我们可以提取出两个函数的代码,它们是 do_hd_request hd_out。以下是提取的代码和总结:

提取的代码

void do_hd_request(void) {...hd_out(dev, nsect, sec, head, cyl, WIN_WRITE, ...); // 调用hd_out函数port_write(HD_DATA, CURRENT->buffer, 256); // 将数据写入硬盘
}
​
void hd_out(drive, nsect, sec, head, cyl, cmd...) {port = HD_DATA; // 数据寄存器端口(0x1f0)outb_p(nsect, ++port); // 输出扇区数outb_p(sec, ++port);   // 输出起始扇区号outb_p(cyl, ++port);   // 输出柱面号outb_p(cyl >> 8, ++port); // 输出柱面号的高字节outb_p(0xA0 | (drive << 4) | head, ++port); // 输出驱动器和磁头信息outb_p(cmd, ++port); // 输出命令
}

代码总结

  1. do_hd_request 函数

    • 这个函数处理硬盘的I/O请求。

    • 它调用 hd_out 函数来设置硬盘控制器的参数,包括设备号(dev)、扇区数(nsect)、扇区号(sec)、磁头号(head)、柱面号(cyl)等。

    • 然后,它使用 port_write 函数将数据从内存缓冲区(CURRENT->buffer)写入硬盘,这里写入的数据量为256字节。

  2. hd_out 函数

    • 这个函数负责将控制命令和参数输出到硬盘控制器。

    • 它首先设置数据寄存器端口(HD_DATA)。

    • 然后,它使用 outb_p 函数依次输出扇区数、扇区号、柱面号、柱面号的高字节、驱动器和磁头信息以及命令。

    • 这些参数用于控制硬盘的读写操作,例如移动磁头到指定的柱面和磁头位置,然后读取或写入指定的扇区。

这些代码是磁盘驱动程序的核心部分,它们实现了操作系统与硬盘硬件之间的直接交互,是文件系统和数据存储管理的基础。

如何通过盘块号读写磁盘

盘块

盘块(Block)是文件系统中用于数据存储和管理的一个逻辑概念,它是文件系统中数据存储的基本单位。盘块是逻辑上的划分,不同于磁盘物理结构中的扇区(Sector)、柱面(Cylinder)和磁头(Head)等概念。以下是盘块的详细解释:

  1. 盘块号

    • 每个盘块都有一个唯一的标识符,称为盘块号(Block Number)。盘块号用于在文件系统中定位和访问特定的盘块。

  2. 盘块与扇区的关系

    • 盘块通常由一个或多个扇区组成。一个扇区是磁盘上最小的物理存储单位,通常大小为512字节。

    • 文件系统将一个或多个连续的扇区组合成一个盘块,以提高数据管理的效率。

  3. 盘块的分配

    • 文件系统使用盘块分配表(Block Allocation Table, BAT)或inode(索引节点)等数据结构来记录每个文件占用的盘块信息。

    • 当文件被创建或修改时,文件系统会分配新的盘块或更新现有文件的盘块信息。

  4. 盘块的优缺点

    • 优点:简化了文件数据的管理,提高了数据存储和检索的效率。

    • 缺点:如果文件大小不是盘块大小的整数倍,最后一个盘块可能会有未使用的空间,导致一定的空间浪费。就是用空间换时间

为什么使用盘块

  1. 磁盘访问时间的组成

    • 磁盘访问时间包括写入控制器时间、寻道时间、旋转时间和传输时间。

    • 寻道时间:磁头移动到目标磁道的时间,通常在12毫秒到8毫秒之间。

    • 旋转时间:磁盘旋转到目标扇区的时间,对于7200转/分钟的硬盘,半周大约需要4毫秒。

    • 传输时间:数据从磁盘传输到内存的时间,大约0.3毫秒(50MB/秒)。

  2. 盘块相邻的优势

    • 相邻的盘块在物理位置上接近,因此可以快速连续读出,减少了寻道时间和旋转时间,提高了磁盘访问效率

优点分析

  • 提高效率:通过减少寻道时间和旋转时间,提高了磁盘访问的速度,从而提高了整体的系统性能。

  • 抽象层次:操作系统通过提供这一层抽象,隐藏了磁盘的物理访问细节,使得上层应用程序可以更加方便地使用磁盘资源。

如何编址?为什么这样编址?

  • 如何编址:磁盘驱动通过算法将盘块号映射到CHS地址。这通常涉及到磁盘的几何结构和盘块的布局。

  • 为什么这样编址:这种编址方式是为了优化磁盘访问效率。通过将相邻的盘块放在磁盘上的相邻位置,可以减少寻道时间和旋转时间,从而提高数据访问速度。

扇区号的获得

从CHS到扇区号

  • CHS地址转换:磁盘的物理地址通常由柱面号(Cylinder)、磁头号(Head)和扇区号(Sector)组成。幻灯片中提到的公式 Cx(HeadsxSectors) + HxSectors + S 用于计算从CHS地址到扇区号的转换。

    • C:柱面号

    • Heads:磁盘上的磁头数

    • Sectors:每个磁道上的扇区数

    • H:磁头号

    • S:扇区号

磁盘请求的创建和处理过程

从提供的幻灯片内容中,我们可以提取出两个函数的代码,它们是 make_request do_hd_request。以下是提取的代码和分析:

提取的代码

// 创建一个磁盘请求
static void make_request()
{struct request *req;req = request + NR_REQUEST;req->sector = bh->b_blocknr << 1;add_request(major + blk_dev, req);
}
​
// 处理硬盘请求
void do_hd_request(void)
{unsigned int block = CURRENT->sector;asm volatile ("divl %4, %%eax;"    // block / sect (每个磁头的扇区数)"=a" (block),        // 输入:eax = 被除数"=d" (sec),          // 输出:edx = 余数(扇区号)"0" (block),         // 输入:eax = 被除数"1" (0),             // 输入:edx = 0(初始化为0)"r" (hd_info[dev].sect) // 输入:ecx = 除数(每个磁头的扇区数));asm volatile ("divl %4, %%eax;"    // (block / sect) / head (磁头数)"=a" (cyl),          // 输出:eax = 商(柱面号)"=d" (head),         // 输出:edx = 余数(磁头号)"0" (block),         // 输入:eax = 被除数"1" (0),             // 输入:edx = 0(初始化为0)"r" (hd_info[dev].head) // 输入:ecx = 除数(磁头数));hd_out(dev, nsect, sec, head, cyl, WIN_WRITE, ...);...
}

代码分析

  1. make_request 函数

    • 这个函数用于创建一个新的磁盘请求

    • 它分配一个新的请求结构体 req,并设置请求的扇区号 req->sector

    • bh->b_blocknr << 1:将块号左移一位,为了将块号转换为扇区号(假设每个块由两个扇区组成)。

    • add_request:将新创建的请求添加到请求队列中。

  2. do_hd_request 函数

    • 这个函数处理硬盘请求,将盘块号转换为CHS地址,并调用 hd_out 函数执行实际的磁盘操作。

    • CURRENT->sector:获取当前请求的扇区号。

    • 使用内联汇编(asm volatile)进行除法运算,将扇区号转换为柱面号(cyl)、磁头号(head)和扇区号(sec)。

      • 第一个除法运算计算扇区号(sec)。

      • 第二个除法运算计算柱面号(cyl)和磁头号(head)。

    • hd_out:执行实际的磁盘操作,包括寻道、旋转和数据传输。

总结

这段代码展示了Linux 0.11内核中磁盘请求的创建和处理过程。make_request 函数负责创建新的磁盘请求,而 do_hd_request 函数负责将盘块号转换为CHS地址,并执行实际的磁盘操作。

通过内联汇编进行除法运算,实现了从盘块号到CHS地址的转换,这是磁盘驱动程序中的关键步骤。

多个进程使用磁盘

多进程通过队列使用磁盘

  1. 请求队列

    • 当多个进程需要访问磁盘时,它们的请求被放入一个请求队列中。这个队列管理所有磁盘访问请求,确保它们有序地被处理。

  2. 磁盘驱动

    • 磁盘驱动负责从请求队列中取出请求,并将其转换为磁盘控制器可以理解的CHS(柱面、磁头、扇区)地址。

  3. 磁盘控制器

    • 磁盘控制器根据磁盘驱动提供的CHS地址执行实际的磁盘操作,如寻道、旋转和数据传输。

磁盘调度

  1. 调度目标

    • 磁盘调度的主要目标是最小化平均访问延迟。这意味着调度算法需要尽可能减少磁盘访问请求的等待时间。

  2. 调度时主要考察的因素

    • 寻道时间:磁头移动到目标磁道的时间,这是磁盘访问时间中的主要部分。

    • 旋转时间:磁盘旋转到目标扇区的时间。

    • 传输时间:数据从磁盘传输到内存的时间。

  3. 调度算法

    • FCFS(First-Come, First-Served):最简单的调度算法,按照请求到达的顺序处理。虽然公平,但可能不是最高效的,因为它不考虑磁头的当前位置或请求的物理位置。

    • 更复杂的算法:如SSTF(Shortest Seek Time First)、SCAN(Elevator Algorithm)等,这些算法试图通过优化磁头移动路径来减少寻道时间,从而提高整体性能。

FCFS

  1. 最直观、最公平的调度

    • FCFS算法按照请求到达的顺序处理,确保每个请求都能被公平地处理。

  2. 实例分析

    • 磁头开始位置为53。

    • 请求队列为:98, 183, 37, 122, 14, 124, 65, 67。

  3. 磁头移动

    • FCFS算法导致磁头共移动了640个磁道。

    • 磁头在移动过程中处理了经过的请求。

  4. 磁头在长途奔袭

    • 图中显示了磁头在处理请求时的移动路径,磁头需要在磁盘上进行大量的移动,这可能导致效率低下。

  5. 效率问题

    • FCFS算法虽然公平,但可能导致磁头在磁盘上进行大量的寻道操作,增加了寻道时间和旋转时间,从而降低了磁盘的整体性能。

SSTF

SSTF(Shortest Seek Time First,最短寻道时间优先)磁盘调度算法。SSTF算法是一种优化磁盘访问时间的算法,它选择距离当前磁头位置最近的请求进行处理,以减少磁头移动的距离。以下是对幻灯片内容的分析:

  1. 算法原理

    • SSTF算法选择距离当前磁头位置最近的请求进行处理,以减少寻道时间。

    • 这种方法可以显著减少磁头移动的总距离,从而提高磁盘访问效率。

  2. 实例分析

    • 磁头开始位置为53。

    • 请求队列为:98, 183, 37, 122, 14, 124, 65, 67。

  3. 磁头移动

    • 在这个实例中,SSTF算法导致磁头共移动了236个磁道(4+53+169)。

    • 相比FCFS算法的640个磁道,SSTF算法显著减少了磁头移动的距离。

  4. 效率提升

    • 通过优先处理距离当前磁头位置最近的请求,SSTF算法可以更快地响应请求,减少等待时间。

  5. 饥饿问题

    • SSTF算法存在饥饿问题,即远离当前磁头位置的请求可能会长时间得不到处理。

    • 如果在处理183号请求之前,又来了一些中间磁道的请求,那么183号请求可能会被推迟处理,导致延迟。

SCAN

SCAN磁盘调度算法,也称为电梯算法,它是一种常见的磁盘调度策略,旨在优化磁盘的寻道操作,减少寻道时间。

  1. 算法原理

    • SCAN算法模拟电梯的运行方式,磁头从一个方向开始移动,直到达到最后一个请求,然后改变方向,继续处理另一方向的请求。

    • 这种算法确保每个请求最终都会被处理,避免了SSTF算法中可能出现的饥饿问题。

  2. 实例分析

    • 磁头开始位置为53。

    • 请求队列为:98, 183, 37, 122, 14, 124, 65, 67。

  3. 磁头移动

    • 在这个实例中,SCAN算法导致磁头共移动了236个磁道(53+183)。

    • 与SSTF算法相比,SCAN算法在处理请求时更加公平,因为它确保了磁头会遍历所有请求。

  4. 公平性

    • SCAN算法通过确保每个方向上的请求都被处理,提高了算法的公平性。

  5. 效率

    • SCAN算法通过减少磁头的来回移动,提高了磁盘访问的效率。

    • 与SSTF相比,SCAN算法在处理大量随机分布的请求时,通常能提供更好的性能。

C-SCAN

这张幻灯片介绍了C-SCAN(Circular SCAN)磁盘调度算法,这是一种类似于电梯算法的磁盘调度策略,但在到达一端后直接移动到另一端,而不是改变方向。以下是对幻灯片内容的分析和总结:

  1. 算法原理

    • C-SCAN算法从磁头的当前位置开始,向一个方向移动,处理所有请求,到达磁盘的一端后,直接移动到另一端,然后继续处理请求。

    • 这种算法确保了两端的请求都能被快速处理。

  2. 实例分析

    • 磁头开始位置为53。

    • 请求队列为:98, 183, 37, 122, 14, 124, 65, 67。

  3. 磁头移动

    • 在这个实例中,C-SCAN算法导致磁头共移动了157+200个磁道。

    • 其中200个磁道是磁头从一端移动到另一端的距离,这个过程很快,因为它是连续的,没有寻道时间。

  4. 效率

    • C-SCAN算法通过直接从一端移动到另一端,减少了磁头的寻道时间,提高了磁盘访问的效率。

    • 这种算法特别适合于请求分布均匀的情况,因为它可以确保所有请求都能被快速处理。

  5. 公平性

    • C-SCAN算法在处理请求时,可能会对靠近磁头起始位置的请求提供更快的服务,而对远离起始位置的请求提供较慢的服务。

代码实现

从提供的幻灯片内容中,我们可以提取出两个函数的代码:make_request add_request,以及一个宏定义 IN_ORDER。以下是提取的代码和总结:

提取的代码

// 创建一个磁盘请求
static void make_request()
{struct request *req;req->sector = bh->b_blocknr << 1;add_request(major + blk_dev, req);
}
​
// 将请求添加到请求队列
static void add_request(struct blk_dev_struct *dev, struct request *req)
{struct request *tmp = dev->current_request;req->next = NULL;cli(); // 关中断(互斥)for (; tmp->next; tmp = tmp->next)if (IN_ORDER(tmp, req) || !IN_ORDER(tmp, tmp->next))&& IN_ORDER(req, tmp->next)) break;req->next = tmp->next; tmp->next = req; sti();
}
​
// 判断请求是否有序
#define IN_ORDER(s1, s2) \((s1)->dev < (s2)->dev || \((s1)->dev == (s2)->dev && (s1)->sector < (s2)->sector))

代码总结

  1. make_request 函数

    • 这个函数初始化一个新的磁盘请求,设置请求的扇区号 req->sector,并将请求添加到磁盘请求队列中。

    • bh->b_blocknr << 1:假设每个块由两个扇区组成,因此将块号左移一位来计算扇区号。

  2. add_request 函数

    • 这个函数将一个新的请求插入到磁盘请求队列中,保持队列的有序性。

    • 使用 cli() 关闭中断来确保在操作请求队列时的互斥访问。

    • 通过 IN_ORDER 宏判断请求是否有序,如果新请求应该插入到 tmptmp->next 之间,则进行插入。

    • 使用 sti() 重新开启中断。

  3. IN_ORDER

    • 这个宏用于判断两个请求是否有序,即是否按照设备号和扇区号的顺序排列。

    • 如果第一个请求的设备号小于第二个请求的设备号,或者设备号相同但扇区号小于第二个请求的扇区号,则认为有序。

总结如何使用生磁盘

这张幻灯片介绍了操作系统中生磁盘(raw disk)的使用流程,以及如何通过磁盘驱动程序来管理多个进程对磁盘的访问。

  1. 进程获取盘块号

    • 进程首先需要获取到要访问的盘块号(block number)。

  2. 计算扇区号

    • 根据盘块号计算出对应的扇区号(sector number)。这通常涉及到将盘块号映射到磁盘的物理地址。

  3. 创建请求并加入请求队列

    • 使用计算出的扇区号创建一个磁盘请求(make req)。

    • 将该请求加入到请求队列中(add_request),可能使用电梯算法(SCAN算法)来优化请求的处理顺序。

  4. 进程等待

    • 进程在发起磁盘请求后进入等待状态(sleep_on)。

  5. 磁盘中断处理

    • 当磁盘操作完成时,磁盘控制器会产生一个中断信号。

    • 中断处理程序(read_intr)被触发,唤醒等待的进程。

  6. 执行磁盘请求

    • 磁盘驱动程序处理请求(do_hd_request),计算出具体的柱面(cylinder)、磁头(head)和扇区号(sector)。

  7. 端口写入

    • 使用端口写入操作(hd_out),通过outp函数将数据写入磁盘控制器的端口,完成数据的实际读写操作。

相关文章:

操作系统 4.3-生磁盘的使用

磁盘的物理组成 盘面&#xff1a; 磁盘由多个盘面组成&#xff0c;每个盘面上都有数据存储的区域。 磁道&#xff1a; 每个盘面上都有若干个同心圆&#xff0c;这些同心圆称为磁道。磁道是数据存储的路径。 扇区&#xff1a; 磁道被进一步划分为若干个扇区&#xff0c;扇区…...

Uniapp Vue 实现当前日期到给定日期的倒计时组件开发

应用场景与需求分析 在移动端应用开发中&#xff0c;倒计时功能是常见的交互需求&#xff0c;例如限时促销活动、订单超时提醒、考试倒计时等场景。本文将基于 Uniapp 框架&#xff0c;实现一个从当前日期到给定日期的倒计时组件&#xff0c;支持显示 HH:mm:ss 格式的剩余时间…...

3dmax标准材质/vr/cr材质贴图转PBR材质贴图插件,支持多维子材质转换

3dmax标准材质/vr/cr材质贴图转PBR材质贴图插件,支持多维子材质转换 3dmax标准材质/vr/cr材质贴图转PBR材质贴图插件,支持多维子材质转换...

操作系统 3.3-多级页表和快表

分页的问题 这张幻灯片讨论了操作系统中内存管理的一个核心问题&#xff1a;页大小与页表大小之间的权衡。 页&#xff08;Page&#xff09;是内存管理中的一个基本概念&#xff0c;指的是将虚拟内存分割成固定大小的块&#xff0c;以便于管理和访问。页的大小直接影响内存空间…...

Java常用工具算法-7--秘钥托管云服务2(阿里云 KMS)

阿里云的KMS&#xff08;Key Management Service&#xff09;也是一种托管式密钥管理服务&#xff0c;帮助用户安全地创建、控制和使用密钥&#xff0c;保护敏感数据。通过使用KSM&#xff0c;您可以专注于构建和优化应用程序&#xff0c;而不必担心密钥管理的复杂性。 1、主要…...

游戏引擎学习第218天

构建并运行&#xff0c;注意一下在调试系统关闭前人物的移动速度 现在我准备开始构建项目。如果我没记错的话&#xff0c;我们之前关闭了调试系统&#xff0c;主要是为了避免大家在运行过程中遇到问题。现在调试系统没有开启&#xff0c;一切运行得很顺利&#xff0c;看到那个…...

城电科技 | 光伏太阳花:碳减排路上的璀璨新光光伏智慧花

当谈及 “碳减排” 与 “碳中和”&#xff0c;你脑海中率先浮现的是什么&#xff1f;想必很多人都会想到太阳能发电。太阳能光伏&#xff0c;作为人类取之不尽、用之不竭的绿色清洁能源&#xff0c;具备充分的清洁性、高度的安全性以及相对的广泛性。正因如此&#xff0c;在探讨…...

AI领域再突破,永洪科技荣获“2025人工智能+创新案例”奖

在2025年的今天&#xff0c;人工智能已从技术概念全面渗透至产业核心。中国作为全球AI技术应用的前沿阵地&#xff0c;正通过“人工智能”行动加速推进技术与实体经济深度融合。 这一背景下&#xff0c;永洪科技凭借其“国内某头部ICT人力资源板块GenAI项目”荣获“2025全国企业…...

大模型day1 - 什么是GPT

什么是GPT 全称 Generative Pre-trained Transformer 是一种基于 Transformer 架构的大规模 预训练 语言模型&#xff0c;由OpenAI研发&#xff0c;但GPT仅仅只是借鉴了Transformer 中 Decoder 的部分&#xff0c;并且做了升级 Transformer 架构 Transformer架构 是一种用于…...

飞凌嵌入式T527核心板正式发布OpenHarmony4.1系统,实现从芯片架构到操作系统的全链路国产化

飞凌嵌入式FET527N-C核心板正式发布OpenHarmony4.1系统&#xff0c;实现了从芯片架构到操作系统的全链路国产化。该产品具备灵活可编程、高效能运算、低成本控制等多重优势&#xff0c;通过多核异构设计同步支持边缘智能计算与精准实时控制&#xff0c;能够满足智能制造、能源管…...

机动车号牌管理系统设计与实现(代码+数据库+LW)

摘 要 在如今社会上&#xff0c;关于信息上面的处理&#xff0c;没有任何一个企业或者个人会忽视&#xff0c;如何让信息急速传递&#xff0c;并且归档储存查询&#xff0c;采用之前的纸张记录模式已经不符合当前使用要求了。所以&#xff0c;对机动车号牌信息管理的提升&…...

测试模板1

本篇技术博文摘要 &#x1f31f; 引言 &#x1f4d8; 在这个变幻莫测、快速发展的技术时代&#xff0c;与时俱进是每个IT工程师的必修课。我是盛透侧视攻城狮&#xff0c;一名什么都会一丢丢的网络安全工程师&#xff0c;也是众多技术社区的活跃成员以及多家大厂官方认可人员&a…...

小试牛刀-抽奖程序

编写抽奖程序 需求&#xff1a;设计一个抽奖程序&#xff0c;点击抽奖按钮随机抽取一个名字作为中奖者 目标&#xff1a;了解项目结构&#xff0c;简单UI布局&#xff0c;属性方法、事件方法&#xff0c;程序运行及调试 界面原型 ​ 待抽奖&#xff1a; 点击抽奖按钮&#x…...

Foundry框架在FISCO BCOS区块链中的高级应用与实战技巧

引言:从入门到精通的进阶之路 在看过我发布的《FISCO BCOS区块链智能合约测试利器:Foundry框架从入门到实战》基础上,我们可以进一步深入探索Foundry框架在FISCO BCOS生态中的高级应用场景。Foundry作为一款强大的区块链开发工具集,其功能远不止于基础测试,它还能为FISCO…...

反转链表系列

206. 反转链表 - 力扣&#xff08;LeetCode&#xff09; /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int …...

算力租赁:数字经济时代的 “电力革命”—— 从资源租赁到创新生态的范式重构

引言&#xff1a;当算力成为新 “石油”&#xff0c;租赁模式如何重塑商业未来&#xff1f; 在数字经济浪潮中&#xff0c;算力早已超越传统硬件范畴&#xff0c;成为驱动企业创新的核心生产要素。据 IDC 预测&#xff0c;全球数据总量将在 2025 年突破 175 ZB&#xff0c;而人…...

Go:基本数据

文章目录 整数浮点数复数布尔值字符串字符串字面量UnicodeUTF - 8字符串和字节 slice字符串和数字的相互转换 常量常量生成器 iota无类型常量 整数 分类 Go 的整数类型按大小分有 8 位、16 位、32 位、64 位 &#xff0c;同时有符号整数包括int8、int16、int32、int64 &#…...

金融行业软件介绍

金融&#xff0c;本质为货币资金的融通&#xff0c;是经济活动中至关重要的领域。它围绕货币、信用、利率等核心要素运转&#xff0c;借助银行、证券机构、保险机构等众多主体&#xff0c;在货币市场与资本市场中实现资金的调配与流转&#xff0c;具有优化资源配置、分散风险及…...

Python的那些事第四十九篇:基于Python的智能客服系统设计与实现

基于Python的智能客服系统设计与实现 摘要 随着人工智能技术的飞速发展,智能客服系统逐渐成为企业提升客户服务质量和效率的关键工具。本文详细介绍了基于Python的智能客服系统的设计与实现方案,涵盖了系统架构、核心功能、技术选型及优化建议,旨在为企业构建高效、智能的客…...

vscode报错:unins000.exe 尝试在目标目录创建文件时发生一个错误

打开vscode&#xff0c;报错 这个错误提示表明在卸载或安装 Visual Studio Code 时&#xff0c;系统拒绝访问目标目录中的文件 unins000.exe。以下是解决此问题的有效方法&#xff1a; 检查文件权限 找到文件所在目录&#xff08;如 D:\software\Microsoft VS Code&#xff…...

当气象水文遇见R语言——破解时空数据的“达芬奇密码“

在气象水文科学领域&#xff0c;数据从来不只是简单的数字阵列。台风路径的时空跳跃、流域径流的非线性涨落、气候要素的混沌演变&#xff0c;这些充满不确定性的自然现象转化为数据时&#xff0c;呈现出多维时空交织的复杂图景。研究人员常常要在TB级遥感数据中捕捉毫米级降水…...

LEARNING DYNAMICS OF LLM FINETUNING【论文阅读笔记】

LEARNING DYNAMICS OF LLM FINETUNING 一句话总结 作者将LLM的学习动力机制拆解成AKG三项&#xff0c;并分别观察了SFT和DPO训练过程中​​正梯度信号​​和​​负梯度信号​​的变化及其带来的影响&#xff0c;并得到以下结论&#xff1a; ​​SFT通过梯度相似性间接提升无关…...

【射频仿真学习笔记】变压器参数的Mathematica计算以及ADS仿真建模

变压器模型理论分析 对于任意的无源电路或者等效电路&#xff0c;当画完原理图后&#xff0c;能否认为已经知道其中的两个节点&#xff1f;vin和vout之间的明确解析解 是否存在一个通用的算法&#xff0c;将这里的所有元素都变成了符号&#xff0c;使得这个算法本身就是一个函…...

改善 Maven 的依赖性

大家好&#xff0c;这里是架构资源栈&#xff01;点击上方关注&#xff0c;添加“星标”&#xff0c;一起学习大厂前沿架构&#xff01; 建议使用mvn dependency:analyze命令来摆脱已声明但未使用的依赖项&#xff1a; 还有另一个用例&#xff0c; mvn dependency:analyze 它可…...

循环神经网络 - LSTM 网络的各种变体

前面的博文中&#xff0c;我们了解和学习了长短期记忆网络&#xff0c;本文我们来学习LSTM 网络的各种变体。 目前主流的 LSTM 网络用三个门来动态地控制内部状态应该遗忘多少历史信息&#xff0c;输入多少新信息&#xff0c;以及输出多少信息.我们可以对门控机制进行改进并获…...

LangGraph 概述

LangGraph 介绍 LangGraph 是 LangChain 框架的扩展&#xff0c;专为创建基于大型语言模型&#xff08;LLMs&#xff09;的有状态、多角色应用而设计。它提供了一个灵活的架构&#xff0c;用于构建复杂的多步骤 LLM 应用&#xff0c;其中状态管理和流程控制至关重要。 为什么…...

Linux系统06---信号

目录 信号 1.1 进程间通信方式 1.2 信号的概念 1.3 查看信号 1.4 信号的产生 1.5 信号的处理 信号的 API 函数 2.1 函数名&#xff1a;kill() 2.2 函数名&#xff1a;raise() 2.3 函数名&#xff1a;alarm() 2.4 函数名&#xff1a;pause() 2.5…...

Java 程序调试与生产问题排查工具Arthas

好的&#xff0c;以下是修改后的博客内容&#xff0c;将公司信息替换为通用的占位符&#xff1a; 深入探索 Arthas&#xff1a;Java 程序调试与生产问题排查的利器 在 Java 开发中&#xff0c;调试和诊断问题往往是一个复杂且耗时的过程。Arthas&#xff08;Alibaba Java Dia…...

PH热榜 | 2025-04-11

1. Voicenotes Pages 标语&#xff1a;如果出版的感觉像是在和朋友聊天呢&#xff1f; 介绍&#xff1a;Voicenotes Pages 是一个极其简单的发布创意和故事的方式。它就像是一个简易的博客或播客&#xff0c;但更容易上手。你只需录制内容&#xff0c;点击发布&#xff0c;就…...

从三围学校项目看:中建海龙智能建造的崛起与突破

在建筑行业迈向智能化、数字化的浪潮里&#xff0c;中建海龙科技有限公司&#xff08;以下简称“中建海龙”&#xff09;从中脱颖而出&#xff0c;成为推动智能建造发展的重要力量。凭借深厚的技术积累、创新的理念以及先进的实践&#xff0c;中建海龙正引领着建筑行业的变革&a…...

aviator 自定义表达式

引入依赖 如果你使用的是 Maven 项目&#xff0c;在 pom.xml 中添加以下依赖&#xff1a; <dependency><groupId>com.googlecode.aviator</groupId><artifactId>aviator</artifactId><version>5.3.2</version> </dependency>…...

电商中的购物车(redis的hash类型操作)

购物车样式 ①、创建service-cart模块 spring:profiles:active: devserver:port: 8513 spring:application:name: service-cartcloud:nacos:discovery:server-addr: localhost:8848data:redis:host: localhostport: 6379启动类 SpringBootApplication(excludeDataSourceAutoC…...

Ubuntu 系统错误日志常见问题

一、Ubuntu 系统日志文件位置 1. 核心系统日志 日志文件用途说明/var/log/syslog所有系统级别的日志(包括内核、服务等)/var/log/kern.log内核相关的详细日志(如硬件驱动问题)/var/log/auth.log用户认证日志(SSH登录、sudo权限等)/var/log/dpkg.log软件包安装/卸载日志/…...

《Uniapp-Vue 3-TS 实战开发》TypeScript 泛型详解

泛型(Generics)是 TypeScript 中非常重要的特性,它允许我们创建可重用的组件,这些组件可以支持多种类型,而不会丢失类型安全性。 一、泛型基础 1. 基本概念 泛型允许我们在定义函数、接口或类时不预先指定具体类型,而是在使用时再指定类型。 // 不使用泛型 function …...

mysql 删除表等待

今天有个表加字段&#xff0c;语句是先删除&#xff0c;后重新建&#xff0c;表没有数据 &#xff0c;但是删除一个表的时候&#xff0c;语句drop table 提示超时 show processlist 后&#xff0c;等待类型是 Waiting for table metadata lock 取消重试几次后仍然是如此…...

如何深入理解protobuf

Protocol Buffers&#xff08;protobuf&#xff09;是一种轻便高效的结构化数据存储格式&#xff0c;用于数据序列化和反序列化&#xff0c;具有语言无关、平台无关、可扩展性强等特点&#xff0c;能有效提高数据存储和传输的效率。 一.协议的设计 我们在介绍protobuf之前我们…...

《分布式软总线牵手云服务,拓展应用新维度》

分布式软总线与云服务的融合&#xff0c;正掀起一场前所未有的变革&#xff0c;重塑着我们工作、生活和交互的方式。二者的结合&#xff0c;犹如天作之合&#xff0c;不仅打破了设备与数据之间的壁垒&#xff0c;更开启了一系列令人瞩目的全新应用场景。 分布式软总线&#xf…...

ReentrantLock 实现公平锁和非公平锁的原理!

&#x1f31f;我的其他文章也讲解的比较有趣&#x1f601;&#xff0c;如果喜欢博主的讲解方式&#xff0c;可以多多支持一下&#xff0c;感谢&#x1f917;&#xff01; &#x1f31f;了解 ThreadLocal请看&#xff1a; ThreadLocal有趣讲解&#xff0c;小白也能听懂&#xff…...

算法训练之动态规划(四)——简单多状态问题

♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨ 个…...

【JavaScript】错误处理与调试

个人主页&#xff1a;Guiat 归属专栏&#xff1a;HTML CSS JavaScript 文章目录 1. JavaScript 错误处理基础1.1 错误类型1.2 try...catch 语句 2. 错误抛出与自定义错误2.1 throw 语句2.2 自定义错误类型 3. 异步错误处理3.1 Promise 错误处理3.2 async/await 错误处理 4. 调试…...

MySQL 管理与配置:查看端口、修改密码与数据存储位置

1.MySQL查看端口号 show global variables like port; 2.MySQL修改密码 grant all privileges on *.* to root% identified by 你的mysql密码 with grant option;flush privileges; 3.查询 MySQL 数据库的数据存储目录 MySQL 的所有数据库文件、表数据、索引、日志文件等都存…...

(四十二)Dart 中的接口与抽象类

Dart 中的接口与抽象类 Dart 的接口特性 在 Dart 中&#xff0c;接口的实现方式与 Java 有所不同。Dart 没有专门的 interface 关键字来定义接口&#xff0c;而是通过普通类或抽象类来实现接口的功能。以下是 Dart 接口的主要特点&#xff1a; 普通类或抽象类都可以作为接口 …...

Java习题:合并两个有序数组

文章目录 前言一、题目描述二、方法2.1 方法一2.2 方法二 前言 虽然这个题目很简单&#xff0c;但是在使用java语言实现的过程中&#xff0c;存在多种方法这是很有意思的一道题&#xff0c;所以小编在这里写下它的各种方法加深javase语法的学习。 提示&#xff1a;以下是本篇文…...

spm12_fMRI 2*4混合方差分析 Flexible factorial 对比矩阵

实验设计&#xff1a;2*4被试内设计 分析模型&#xff1a;spm 二阶分析中的 Flexible factorial 问题&#xff1a;Flexible factorial交互作用对比矩阵如何编写&#xff1f; 老师&#xff1a;deepseek老师【大神们看看这个矩阵是否可以如下编写&#xff1f;】 以下是来自de…...

力扣第272场周赛

周赛链接&#xff1a;竞赛 - 力扣&#xff08;LeetCode&#xff09;全球极客挚爱的技术成长平台 这场周赛是在课堂上模拟的, 总体来说比较简单, 但不幸被老师压力了。以下分享一下我的解题思路 如果你每天没有时间刷题的话, 可以看一下我写的东西, 我尽量讲解的通俗一些, 不会…...

【5】深入学习npm-Nodejs开发入门

深入学习npm npm详解npm的组成-registrynpm的组成-websitenpm的组成-clinpm-confignpm-initnpm-installnpm-startnpm-uninstallnpm-version其他命令 再谈registrypackage.json配置基本结构必填字段可选字段依赖管理其他配置完整配置 node_modules其他 npm详解 我们在前面安装N…...

2025.04.05 广东汕尾两日游记

2025.04.05 广东汕尾两日游记 文章目录 2025.04.05 广东汕尾两日游记一、前言二、我的两日游行程1、行程2、这两天吃喝玩乐的地方 三、其他1、汕尾两日游小结2、汕尾前十景点&#xff08;1&#xff09;玄武山旅游区&#xff08;2&#xff09;红海湾遮浪旅游区&#xff08;3&…...

【数学建模】(智能优化算法)鲸鱼优化算法(Whale Optimization Algorithm)详解与应用

鲸鱼优化算法(Whale Optimization Algorithm)详解与应用 文章目录 鲸鱼优化算法(Whale Optimization Algorithm)详解与应用1. 引言2. 算法原理2.1 生物学基础2.2 数学模型[^3]1. 包围猎物阶段2. 气泡网攻击&#xff08;螺旋更新&#xff09;3. 随机搜索猎物&#xff08;全局探索…...

11-Java并发编程终极指南:ThreadLocal与并发设计模式实战

Java并发编程终极指南&#xff1a;ThreadLocal与并发设计模式实战 一、ThreadLocal核心原理剖析 1. 线程本地存储实现机制 #mermaid-svg-EX865K5oO873R6OO {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-EX865K5o…...

数据库数据恢复——sql server数据库被加密怎么恢复数据?

SQL server数据库数据故障&#xff1a; SQL server数据库被加密&#xff0c;无法使用。 数据库MDF、LDF、log日志文件名字被篡改。 数据库备份被加密&#xff0c;文件名字被篡改。 SQL server数据库数据恢复过程&#xff1a; 1、将所有数据库做完整只读备份。后续所有数据恢…...