操作系统 | 学习笔记 | | 王道 | 5.1 I/O管理概述
5.1 I/O管理概述
5.1.1 I/O设备
注:块设备可以寻址,但是字符设备是不可寻址的
I/O设备是将数据输入到计算机中,或者可以接收计算机输出数据的外部设备,属于计算机中的硬件部件;
- 设备的分类
- 按使用特性分类:
- 人机交互类外部设备:鼠标、键盘、打印机等,用于人机交互。数据传输速度慢。
- 存储设备:移动硬盘、光盘等,用于数据存储。数据传输速度快。
- 网络通信设备:调制解调器等,用于网络通信。数据传输速度介于上述二者之间。
- 按信息交换的单位分类:
- 块设备。信息交换以数据块为单位。它属于有结构设备,如磁盘等。磁盘设备的基本特征是传输速率较高、可寻址,即对它可随机地读/写任意一块。
- 字符设备。信息交换以字符为单位。它属于无结构类型,如交互式终端机、打印机等。
- 按传输速率分类:
- 低速设备。传输速率仅为每秒几字节到数百字节的一类设备,如键盘、鼠标等。
- 中速设备。传输速率为每秒数千字节至数万字节的一类设备,如激光打印机等。
- 高速设备。传输速率在数百千字节至千兆字节的一类设备,如磁盘机、光盘机等。
- 按使用特性分类:
- I/O接口
I/O接口
(又称为设备控制器
)位于CPU与设备之间,它既要与CPU通信,又要与设备通信,还要具有按CPU发来的命令去控制设备工作的功能,主要由三部分组成,如下图所示。
-
组成部分:
-
设备控制器与CPU的接口:实现控制器与CPU之间的通信
该接口有三类信号线:数据线、地址线和控制线。
数据线与两类寄存器相连:数据寄存器(存放从设备送来的输入数据或从CPU送来的输出数据)和控制/状态寄存器(存放从CPU送来的控制信息或设备的状态信息)。
-
设备控制器与设备的接口:实现控制器与设备之间的通信
一个设备控制器可以连接一个或多个设备,因此控制器中有一个或多个设备接口。
每个接口中都存在数据、控制和状态三种类型的信号。
-
I/O逻辑:负责识别CPU发出的命令,并向设备发出命令
用于实现对设备的控制。它通过一组控制线与CPU交互,对从CPU收到的I/O命令进行译码。
CPU启动设备时,将启动命令发送给控制器,同时通过地址线把地址发送给控制器,由控制器的I/O逻辑对地址进行译码,并相应地对所选设备进行控制。
-
-
主要功能:
- 接受和识别CPU发出的指令(控制寄存器)
- 向CPU报告设备的状态(状态寄存器)
- 数据交换(数据寄存器暂存数据)
- 地址识别(由I/O逻辑实现)
- 数据缓冲
- 差错控制
3.I/O端口
I/O端口是指设备控制器中可被CPU直接访问的寄存器,主要有以下三类寄存器。
-
寄存器类型:
- 数据寄存器:实现CPU和外设之间的数据缓冲。
- 状态寄存器:获取执行结果和设备的状态信息,以让CPU知道是否准备好。
- 控制寄存器:由CPU写入,以便启动命令或更改设备模式。
-
实现I/O端口通信,有两种编址方法:
- 独立编址。为每个端口分配一个I/O端口号,所有I/O端口形成I/O端口空间,普通用户程序不能对其进行访问,只有操作系统使用特殊的I/O指令才能访问端口。
- 统一编址。又称内存映射I/O,每个端口被分配唯一的内存地址,且不会有内存被分配这地址,通常分配给端口的地址靠近地址空间的顶端。
5.1.2 I/O控制方式
设备管理的主要任务之一是控制设备和内存或CPU之间的数据传送。外围设备与内存之间的输入/输出控制方式有以下4种。
-
程序直接控制方式
如下图所示,计算机从外部设备读取的每个字,CPU需要对外设状态进行循环检查,直到确定该字已经在I/O控制器的数据寄存器中。
-
工作流程:
-
CPU干预的频率:很频繁,I/O操作开始之前、完成之后需要CPU介入,并且在等待I/O完成的过程中CPU需要不断地轮询检查。
-
数据传送的单位:每次读/写一个字
-
数据的流向:
- 读操作(数据输入):I/O设备→CPU→内存
- 写操作(数据输出):内存→CPU→I/O设备
- 每个字的读/写都需要CPU的帮助
-
优点:实现简单。在读/写指令之后,加上实现循环检查的一系列指令即可
-
缺点:CPU和I/O设备只能串行工作,CPU需要一直轮询检查,长期处于“忙等”状态,CPU利用率低。
这种方式不会让进程阻塞
/*实际上,程序直接控制方式(也称为忙等待或轮询)在某些情况下确实会让进程阻塞,但这里的“阻塞”与传统意义上的操作系统中的阻塞(如等待I/O操作完成而挂起进程)有所不同。在程序直接控制方式中,进程不会因等待I/O操作完成而被操作系统挂起或切换到其他进程,但它会停留在当前的循环中,不断检查I/O操作的完成情况,这同样会导致进程无法执行其他任务,从而形成一种“阻塞”的效果,尽管这种阻塞是在用户态内发生的,并未涉及操作系统层面的进程调度。详细解释如下:忙等待(Busy Waiting):在程序直接控制方式中,当进程需要执行I/O操作时,它不会通过系统调用来请求操作系统完成I/O,而是会直接在用户态中循环检查I/O设备的状态。如果I/O操作尚未完成,进程会继续循环检查,而不是被操作系统挂起或切换到其他进程。这种持续的检查操作占用了CPU资源,但进程并没有进行实质性的工作(如处理数据、计算等),因此被视为一种“忙等待”或“轮询”。 CPU资源浪费:由于进程在忙等待期间持续占用CPU资源,而并没有进行有效的计算或处理,这会导致CPU资源的浪费。特别是当I/O操作需要较长时间才能完成时,这种浪费尤为明显。 响应性差:由于进程被“阻塞”在忙等待循环中,它无法及时响应其他事件或请求,如用户输入、定时器中断等。这会导致程序的响应性变差,用户体验下降。 并非真正的阻塞:然而,需要注意的是,程序直接控制方式中的“阻塞”与传统意义上的阻塞(如等待I/O操作完成而挂起进程)是不同的。在程序直接控制方式中,进程并没有被操作系统挂起或切换到其他进程,它仍然在运行中,只是由于持续进行无效的忙等待而无法执行其他任务。 综上所述,程序直接控制方式虽然不会让进程在操作系统层面被挂起或阻塞,但它通过忙等待的方式同样会导致进程无法执行其他任务,从而形成一种在用户态内的“阻塞”效果。因此,在实际应用中,我们通常会采用更高效的I/O控制方式(如中断驱动方式、DMA方式等)来避免这种不必要的资源浪费和性能下降。*/
-
-
中断驱动方式
中断驱动方式的思想是,允许I/O设备主动打断CPU的运行并请求服务,从而"解放” CPU,使得其向I/O控制器发送读命令后可以继续做其他有用的工作。
- 工作流程:
- 引入中断机制。由于I/O设备速度很慢,因此在CPU发出读/写命令后,可将等待I/O的进程阻塞,先切换到别的进程执行。
- 当I/O完成后,控制器会向CPU发出一个中断信号,CPU检测到中断信号后,会保存当前进程的运行环境信息,转去执行中断处理程序处理该中断。
- 处理中断的过程中,CPU从I/O控制器读一个字的数据传送到CPU寄存器,再写入主存。接着,CPU恢复等待I/O的进程(或其他进程)的运行环境,然后继续执行。
①CPU会在每个指令周期的末尾检查中断:
②中断处理过程中需要保存、恢复进程的运行环境,这个过程是需要一定时间开销的。可见,如果中断发生的须率太高,也会降低系统性能。- CPU干预的频率:每次I/O操作开始之前、完成之后需要CPU介入。等待I/O完成的过程中CPU可以切换到别的进程执行。
- 数据传送单位:每次读/写一个字
- 数据流向:
- 读操作(数据输入):I/O设备→CPU→内存
- 写操作(数据输出):内存→CPU→I/O设备
- 优点:与“程序直接控制方式”相比,在“中断驱动方式”中,I/O控制器会通过中断信号主动报告I/O已完成,CPU不再需要不停地轮询。CPU和I/O设备可并行工作,CPU利用率得到明显提升。
- 缺点:每个字在I/O设备与内存之间的传输,都需要经过CPU。而频繁的中断处理会消耗较多的CPU时间。
这种方式会让进程阻塞
- 工作流程:
-
DMA方式
DMA(直接存储器存取)方式的基本思想是在I/O设备和内存之间开辟直接的数据交换通路,彻底“解放”CPU。下图为DMA工作流程。
-
与“中断驱动方式”相比,DMA方式有这样几个改进:
- ①数据的传送单位是“块”。不再是一个字、一个字的传送:
- ②数据的流向是从设备直接放入内存,或者从内存直接到设备。不再需要CPU作为“快递小哥”。
- ③仅在传送一个或多个数据块的开始和结束时,才需要CPU干预,数据传送通过DMA控制器完成。
-
DMA控制器组成:
下图为DMA控制器的组成。
DMA控制器中设置如下4类寄存器:
- 数据寄存器(DR)。暂存从设备到内存或从内存到设备的数据。
- 内存地址寄存器(MAR)。在输入时,它存放把数据从设备传送到内存的起始目标地址;在输出时,它存放由内存到设备的内存源地址。
- 数据计数器(DC)。存放本次要传送的字(节)数,剩余要读/写的字节数。
- 命令/状态寄存器(CR)。接收从CPU发来的I/O命令、有关控制信息,或设备的状态。
-
CPU干预的频率:仅在传送一个或多个数据块的开始和结束时,才需要CPU干预。
-
数据传送单位:每次读/写一个或多个块(注意:每次读写的只能是连续的多个块,且这些块读入内存后在内存中也必须是连续的)
-
数据流向:
- 读操作(数据输入):I/O设备→内存
- 写操作(数据输出):内存→I/O设备
-
优点:数据传输以“块”为单位,CPU介入频率进一步降低。数据的传输不再需要先经过CPU再写入内存,数据传输效率进一步增加。CPU和I/O设备的并行性得到提升。
-
缺点:CPU每发出一条I/O指令,只能读/写一个或多个连续的数据块。如果要读/写多个离散存储的数据块,或者要将数据分别写到不同的内存区域时,CPU要发出多条I/O指令,进行多次中断处理才能完成。
-
-
通道控制方式
通道:I/O通道是指专门负责输入输出的处理机。是一种硬件,可以理解为是“弱鸡版的CPU”。通道可以识别并执行一系列通道指令。
与CPU相比,通道可以执行的指令很单一,并且通道程序是放在主机内存中的,也就是说通道与CPU共享内存
-
完成一次读写流程:
-
CPU干预的频率:极低,通道会根据CPU的指示执行相应的通道程序,只有完成一组数据块的读/写后才需要发出中断信号,请求CPU干预。
-
数据传送的单位:每次读/写一组数据块
-
数据的流向(在通道的控制下进行)
- 读操作(数据输入):I/O设备→内存
- 写操作(数据输出):内存→I/O设备
-
缺点:实现复杂,需要专门的通道硬件支持
-
优点:CPU、通道、I/O设备可并行工作,资源利用率很高。
-
5.1.4 I/O软件层次结构
为了更好地设计 I/O 软件,采用 层次式结构 的 I/O 软件;
一个比较合理的层次划分如上图所示。整个I/O软件可以视为具有4个层次的系统结构,各层次功能如下:
-
用户层软件(产生I/O请求,格式化I/O,SPOOLing)
实现了与用户交互的接口,用户可直接使用该层提供的、与I/O操作相关的库函数对设备进行操作。
用户层软件将用户请求翻译成格式化的I/O请求,并通过“系统调用”请求操作系统内核的服务
-
设备独立性软件(映射;保护;分块;缓冲;分配)
设备独立性软件,又称设备无关性软件。与设备的硬件特性无关的功能几乎都在这一层实现。
-
功能:
- ① 向上层提供统一的调用接口(如read/write系统调用)
- ② 设备的保护
- ③ 差错处理
- ④ 设备的分配与可收
-
-
⑤ 数据缓冲区管理
- ⑥ 建立逻辑设备名到物理设备名的映射关系;根据设备类型选择调用相应的驱动程序
-
逻辑设备
为实现设备独立性而引入了逻辑设备和物理设备这两个概念。在应用程序中,使用逻辑设备名来请求使用某类设备;而在系统实际执行时,必须将逻辑设备名映射成物理设备名使用。
使用逻辑设备名好处:
-
①增加设备分配的灵活性
- ②易于实现I/O重定向,指用于I/O操作的设备可以更换(即重定向),而不必改变应用程序。
设备独立性软件需要通过“逻辑设备表(LUT,Logical Unit Table)”来确定逻辑设备对应的物理设备,并找到该设备对应的设备驱动程序。
I/O设备被当做一种特殊的文件;不同类型的I/O设备需要有不同的驱动程序处理
操作系统系统可以采用两种方式管理逻辑设备表(LUT):
- 第一种方式,整个系统只设置一张LUT,这就意味着所有用户不能使用相同的逻辑设备名,因此这种方式只适用于单用户操作系统。
-
第二种方式,为每个用户设置一张LUT,各个用户使用的逻辑设备名可以重复,适用于多用户操作系统。系统会在用户登录时为其建立一个用户管理进程,而LUT就存放在用户管理进程的PCB中。
-
设备驱动程序(设置设备寄存器,检查设备状态)
与硬件直接相关,负责具体实现系统对设备发出的操作指令,驱动I/O设备工作的驱动程序。 将上层发出的一系列命令(如read/write)转化成特定设备“能听得懂”的一系列操作。
不同设备的内部硬件特性也不同,这些特性只有厂家才知道,因此厂家须提供与设备相对应的驱动程序,CPU执行驱动程序的指令序列,来完成设置设备寄存器,检查设备状态等工作。
为I/O内核子系统隐藏设备控制器之间的差异。
4.中断处理程序
当I/O任务完成时,I/O控制器会发送一个中断信号,系统会根据中断信号类型找到相应的中断处理程序并执行。
-
中断处理程序的处理流程如下:
-
中断处理层的任务:
- 进行进程上下文的切换,
- 对处理中断信号源进行测试,
- 读取设备状态和修改进程状态等。
由于中断处理与硬件紧密相关,对用户而言,应尽量加以屏蔽,因此应放在操作系统的底层,系统的其余部分尽可能少地与之发生联系。
5.硬件
执行IO操作,机械部件、电子部件组成
总结
说明用户对设备的一次命令过程如下所示:
- ①当用户要读取某设备的内容时,通过操作系统提供的read命令接口,这就经过了用户层。
- ②操作系统提供给用户使用的接口,一般是统一的通用接口,也就是几乎每个设备都可以响应的统一命令,如read命令,用户发出的read命令,首先经过设备独立层进行解析,然后交往下层。
- ③接下来,不同类型的设备对read命令的行为会有所不同,如磁盘接收read命令后的行为与打印机接收read命令后的行为是不同的。因此,需要针对不同的设备,把read命令解析成不同的指令,这就经过了设备驱动层。
- ④命令解析完毕后,需要中断正在运行的进程,转而执行read命令,这就需要中断处理程序。
- ⑤最后,命令真正抵达硬件设备,硬件设备的控制器按照上层传达的命令操控硬件设备,完成相应的功能。
理解:
直接涉及到硬件其体细节、且与中断无关的操作肯定是在设备驱动程序层完成的;
没有涉及硬件的、对各种设备都需要进行的管理工作都是在设备独立性软件层完成的。
5.1.4 应用程序I/O接口
在I/O系统与高层之间的接口中,根据设备类型的不同,又进一步分为若干接口。
-
字符设备接口
字符设备是指数据的存取和传输是以字符为单位的设备,如键盘、打印机等。基本特征是传输速率较低、不可寻址,并且在输入输出时通常采用中断驱动方式。
-
字符设备的操作
- get和put操作。由于字符设备不可寻址,只能采取顺序存取方式,通常为字符设备建立一个字符缓冲区,用户程序通过get操作从缓冲区获取字符,通过put操作将字符输出到缓冲区。
- in-control指令。字符设备类型繁多,差异甚大,因此在接口中提供一种通用的in-control指令来处理它们(包含了许多参数,每个参数表示一个与具体设备相关的特定功能)。
字符设备都属于独占设备,为此接口中还需要提供打开和关闭操作,以实现互斥共享。
-
-
块设备接口
块设备是指数据的存取和传输是以数据块为单位的设备,典型的块设备是磁盘。基本特征是传输速率较高、可寻址。磁盘设备的I/O常采用DMA方式。
- 隐藏了磁盘的二维结构:在二维结构中,每个扇区的地址需要用磁道号和扇区号来表示。块设备接口将磁盘的所有扇区从0到n-1依次编号,这样,就将二维结构变为一种线性序列。
- 将抽象命令映射为低层操作:块设备接口支持上层发来的对文件或设备的打开、读、写和关闭等抽象命令,该接口将上述命令映射为设备能识别的较低层的具体操作。
- 内存映射接口:内存映射接口通过内存的字节数组来访问磁盘,而不提供读/写磁盘操作。映射文件到内存的系统调用返回包含文件副本的一个虚拟内存地址。只在需要访问内存映像时,才由虚拟存储器实际调页。内存映射文件的访问如同内存读写一样简单,极大地方便了程序员。
-
网络设备接口
许多操作系统提供的网络I/O接口为网络套接字接口,套接字接口的系统调用使应用程序创建的本地套接字连接到远程应用程序创建的套接字,通过此连接发送和接收数据。
-
阻塞/非阻塞I/O
-
**阻塞I/O:**当用户进程调用I/O操作时,进程就被阻塞,需要等待I/O操作完成,进程才被唤醒继续执行。
eg:字符设备接口一一从键盘读一个字符get
-
非阻塞I/O:用户进程调用I/O操作时,不阻塞该进程,该I/O调用返回一个错误返回值,通常,进程需要通过轮询的方式来查询I/O操作是否完成。
eg:块设备接口一一往磁盘写数据write
-
5.1.5 本节小结
I/O管理要完成哪些功能?
I/O管理需要完成以下4部分内容:
- 状态跟踪。要能实时掌握外部设备的状态。
- 设备存取。要实现对设备的存取操作。
- 设备分配。在多用户环境下,负责设备的分配与回收。
- 设备控制。包括设备的驱动、完成和故障的中断处理。
错题总结或者需要注意的点
1.共享设备必须是可寻址和可随机访问的设备
2.共享设备是指在一段时间内允许多个进程同时访问的设备,而不是同一时刻
3.虚拟设备是指,把一个物理设备变换成多个对应的逻辑设备
4.设备控制器通常需要提供:控制寄存器,状态寄存器和控制命令
5.在OS中,通道技术是一种硬件机制
6.通道控制设备控制器,设备控制器控制设备工作
7.向设备寄存器的写命令是在I/O软件中的设备驱动程序完成的
8.中断驱动方式:
处理中断请求:一旦确定了中断源,中断处理程序就会执行与该中断源相关联的特定代码。这可能包括读取设备的状态寄存器、从设备读取数据或向设备写入数据、更新系统的状态或执行其他必要的操作。
相关文章:

操作系统 | 学习笔记 | | 王道 | 5.1 I/O管理概述
5.1 I/O管理概述 5.1.1 I/O设备 注:块设备可以寻址,但是字符设备是不可寻址的 I/O设备是将数据输入到计算机中,或者可以接收计算机输出数据的外部设备,属于计算机中的硬件部件; 设备的分类 按使用特性分类ÿ…...
关于es的一个多集群、多索引切换的实现
首先是封装了一个类里定义了关于集群名称和集群节点;以及关于索引的名称和集群的名称做一个关联;将多个集群封装存储得到类中 /*** es集群类*/ Data public class EsClusterConfig implements Serializable {/*** 集群名称*/private String name;/*** 集…...

Linux系统编程(基础指令)上
1.Linux常见目录介绍 Linux目录为树形结构 /:根目录,一般根目录下只存放目录,在Linux下有且只有一个根目录。所有的东西都是从这里开始。当你在终端里输入“/home”,你其实是在告诉电脑,先从/(根目录&…...
【STM32 Blue Pill编程】-定时器PWM模式
定时器PWM模式 文章目录 定时器PWM模式1、定时器PWM模式介绍2、硬件准备及接线3、模块配置4、代码实现在文中,我们将介绍如何使用 STM32 Blue Pill 定时器的PWM模式以及如何配置它们以生成具有不同占空比和频率的信号。 我们将使用 LED调光器示例来演示如何使用 STM32Cube IDE…...

数字英文验证码识别 API 对接说明
数字英文验证码识别 API 对接说明 本文将介绍一种 数字英文验证码识别 API 对接说明,它是基于深度学习技术,可用于识别变长英文数字验证码。输入验证码图像的内容,输出验证码结果。 接下来介绍下 数字英文验证码识别 API 的对接说明。 注册…...

稳了,搭建Docker国内源图文教程
大家好,之前分享了我的开源作品 Cloudflare Workers Proxy,它的作用是代理被屏蔽的地址,理论上支持代理任何被屏蔽的域名,使用方式也很简单,只需要设置环境变量 PROXY_HOSTNAME 为被屏蔽的域名,最后通过你的…...

零工市场小程序:推动零工市场建设
人力资源和社会保障部在2024年4月发布了标题为《地方推进零工市场建设经验做法》的文章。 零工市场小程序的功能 信息登记与发布 精准匹配、推送 在线沟通 权益保障 零工市场小程序作为一个找零工的渠道,在往后随着技术的发展和政策的支持下,功能必然…...

回归预测 | Matlab实现SSA-HKELM麻雀算法优化混合核极限学习机多变量回归预测
回归预测 | Matlab实现SSA-HKELM麻雀算法优化混合核极限学习机多变量回归预测 目录 回归预测 | Matlab实现SSA-HKELM麻雀算法优化混合核极限学习机多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现SSA-HKELM麻雀算法优化混合核极限学习机多变量…...

VCNet论文阅读笔记
VCNet论文阅读笔记 0、基本信息 信息细节英文题目VCNet and Functional Targeted Regularization For Learning Causal Effects of Continuous Treatments翻译VCNet和功能目标正则化用于学习连续处理的因果效应单位芝加哥大学年份2021论文链接[2103.07861] VCNet和功能定向正…...
Python 装饰器使用详解
文章目录 0. 引言1. 什么是装饰器?2. 装饰器的基本语法3. 装饰器的工作原理4. 常见装饰器应用场景4.1. 日志记录4.2. 权限校验4.3. 缓存 5. 多重装饰器的执行顺序6. 装饰器的高级用法6.1. 带参数的装饰器6.2. 使用 functools.wraps6.3. 类装饰器 7. 图示说明7.1. 单…...

Vue使用qrcodejs2-fix生成网页二维码
安装qrcodejs2-fix npm install qrcodejs2-fix核心代码 在指定父view中生成一个二维码通过id找到父布局 //通过id找到父布局let codeView document.getElementById("qrcode")new QRCode(codeView, {text: "测试",width: 128,height: 128,colorDark: #00…...

兼容多个AI应用接口,支持用户自定义切换AI接口
项目背景 2023年ChatGPT横空出世,给IT行业造成了巨大的反响。我第一次发现这个ChatGPT有着如此神奇的功能(智能对话,知识问答,代码生成,逻辑推理等),我感到非常吃惊!经过一番学习和…...

[docker]入门
本文章主要讲述的是,docker基本实现原理,docker概念的解释,docker的使用场景以及docker打包与部署的应用。 文章中docker所运行的系统:CentOS Linux release 7.9.2009 (Core) 目录 docker是什么,什么时候需要去使用 …...

《让手机秒变超级电脑!ToDesk云电脑、易腾云、青椒云移动端评测》
前言 科技发展到如今2024年,可以说每一年都在发生翻天覆地的变化。而云上这个词时常都被大家提起,从个人设备连接到云端在如今在也不是梦了。而云电脑这个市场近年来迅速发展,无需购买和维护额外的硬件就可以体验到电脑端顶配的性能和体验&am…...
Nginx处理带有分号“;“的路径
一、背景 安全渗透测试发现springboot 未授权访问的actuator和Swagger-ui 信息泄露的漏洞,需要规避。解决方案中较简单的就是通过Nginx将相关的接口转发到403页面。 在配置的过程当中,遇到了带有…;的路径:http://{ip:port}/{path}/…;/actu…...
Spring Boot框架下的心理教育辅导系统开发
1绪 论 1.1研究背景 随着计算机和网络技术的不断发展,计算机网络已经逐渐深入人们的生活,网络已经能够覆盖我们生活的每一个角落,给用户的网上交流和学习提供了巨大的方便。 当今社会处在一个高速发展的信息时代,计算机网络的发展…...
PyTorch 图像分割模型教程
PyTorch 图像分割模型教程 在图像分割任务中,目标是将图像的每个像素归类为某一类,以分割出特定的物体。PyTorch 提供了非常灵活的工具,可以用于构建和训练图像分割模型。我们将使用 PyTorch 的经典网络架构,如 UNet 和 DeepLabV…...

物联网——USART协议
接口 串口通信 硬件电路 电平标准 串口参数、时序 USART USART主要框图 TXE: 判断发送寄存器是否为空 RXNE: 判断接收寄存器是否非空 RTS为输出信号,用于表示MCU串口是否准备好接收数据,若输出信号为低电平,则说明MCU串口可以接收数据&#…...
前端框架对比与选择:如何在现代Web开发中做出最佳决策
随着互联网技术的迅速发展,前端开发在现代Web应用开发中扮演了至关重要的角色。对于开发者来说,选择合适的前端框架不仅能够提高开发效率,还能确保项目的可维护性和可扩展性。目前市面上有多种主流的前端框架和库,每一种都有其独特…...

【浅水模型MATLAB】尝试复刻SCI论文中的溃坝流算例
【浅水模型MATLAB】尝试复刻SCI论文中的溃坝流算例 前言问题描述控制方程及数值方法浅水方程及其数值计算方法边界条件的实现 代码框架与关键代码模拟结果 更新于2024年9月17日 前言 这篇博客算是学习浅水方程,并利用MATLAB复刻Liang (2004)1中溃坝流算例的一个记录…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...

练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...

剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...

力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...

uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill
视觉语言模型(Vision-Language Models, VLMs),为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展,机器人仍难以胜任复杂的长时程任务(如家具装配),主要受限于人…...

基于Java+VUE+MariaDB实现(Web)仿小米商城
仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意:运行前…...
人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent
安全大模型训练计划:基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标:为安全大模型创建高质量、去偏、符合伦理的训练数据集,涵盖安全相关任务(如有害内容检测、隐私保护、道德推理等)。 1.1 数据收集 描…...
go 里面的指针
指针 在 Go 中,指针(pointer)是一个变量的内存地址,就像 C 语言那样: a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10,通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...