I/O 设备与设备控制器

目录

I/O 设备

1. 键盘和鼠标

2. 显示器

3. 磁盘

4. 打印机

5. 网络适配器

设备控制器

1. 数据传输

2. 缓冲管理

3. 中断处理

4. 设备初始化

5. 错误检测与恢复

6. 设备控制器的组成部分

7. 示例图解

内存映像 I/O

原理

优点

实现方式

应用场景

I/O 通道

I/O 通道的基本功能

I/O 通道的工作原理

I/O 通道的应用场景

I/O 设备的控制方式

1. 程序控制

2. 中断驱动

3. 直接内存访问(DMA)

结语


        I/O 设备是计算机系统的重要组成部分,负责实现数据的输入和输出功能。设备控制器则是 I/O 设备与计算机系统之间的桥梁,负责管理数据传输和设备的控制。

I/O 设备

        I/O 设备(Input/Output Devices)是计算机系统中负责数据输入和输出的硬件组件。它们在计算机系统和外部环境之间传递信息,确保数据能够有效地输入到系统中并输出给用户使用。I/O 设备的种类繁多,主要包括以下几类常见设备:

1. 键盘和鼠标
  • 键盘:用于输入字符、数字和命令。键盘是最基本的输入设备之一,用户通过按键将信息传递给计算机。

    • 功能键:如F1-F12,用于特定功能的快捷操作。
    • 控制键:如Ctrl、Alt、Shift,用于组合键操作。
    • 导航键:如箭头键、Page Up、Page Down,用于光标移动。
  • 鼠标:用于控制屏幕上的光标,选择和操作界面元素。鼠标通过移动和按键点击向计算机发送位置和动作信息。

    • 左键:用于选择和确认操作。
    • 右键:用于打开上下文菜单。
    • 滚轮:用于滚动页面或列表。

示例

// 键盘输入示例
char key = getKeyPress();
processKeyPress(key);// 鼠标操作示例
Point position = getMousePosition();
ButtonState state = getMouseButtonState();
processMouseEvent(position, state);

 

2. 显示器
  • 显示器:用于输出信息和显示图形界面,是计算机系统的重要输出设备。显示器通过显卡接收计算机生成的图像信号,并将其显示在屏幕上。
    • 分辨率:显示器的分辨率决定了图像的清晰度和细腻度。
    • 刷新率:刷新率决定了显示器每秒钟更新图像的次数,影响动态画面的流畅度。
    • 屏幕尺寸:屏幕尺寸决定了显示器的物理大小,通常以对角线尺寸表示。

示例

// 在显示器上显示文本
clearScreen();
setCursorPosition(10, 5);
printText("Hello, World!");

 

3. 磁盘
  • 磁盘:用于存储和读取大量数据,是计算机系统的重要存储设备。磁盘分为硬盘驱动器(HDD)和固态驱动器(SSD)。
    • 硬盘驱动器(HDD):使用旋转的磁性盘片存储数据,具有大容量和低成本的优点。
    • 固态驱动器(SSD):使用闪存芯片存储数据,具有高速读写和低延迟的优点。

示例

// 磁盘文件操作示例
File file = openFile("example.txt", O_RDWR);
writeFile(file, "This is a test.");
readFile(file, buffer, bufferSize);
closeFile(file);

 

4. 打印机
  • 打印机:用于输出打印文档,将电子文件转换为纸质文档。打印机分为激光打印机和喷墨打印机。
    • 激光打印机:使用激光束将墨粉熔融到纸上,打印速度快、质量高。
    • 喷墨打印机:通过喷嘴将液体墨水喷射到纸上,适用于彩色打印。

示例

// 打印文档示例
Printer printer = connectPrinter("Printer_Name");
sendPrintJob(printer, "document.pdf");
checkPrintStatus(printer);
disconnectPrinter(printer);

 

5. 网络适配器
  • 网络适配器:用于连接网络和传输数据,是计算机系统进行网络通信的关键设备。网络适配器分为有线网络适配器和无线网络适配器。
    • 有线网络适配器:通过网线连接到局域网,提供稳定的网络连接。
    • 无线网络适配器:通过无线信号(如Wi-Fi)连接到网络,提供灵活的网络连接方式。

示例

// 网络通信示例
NetworkAdapter adapter = connectNetwork("SSID", "password");
sendData(adapter, "Hello, Network!");
receiveData(adapter, buffer, bufferSize);
disconnectNetwork(adapter);

 

设备控制器

        设备控制器是连接I/O设备和计算机系统之间的关键接口,负责管理数据传输、控制设备操作和处理各类中断。设备控制器通常位于I/O设备和计算机主板之间,包含处理器、内存和其他专用组件。以下是设备控制器的基本功能和相关细节。

1. 数据传输
  • 协调数据传输

    • 设备控制器负责在I/O设备和计算机系统之间进行数据传输。它可以通过多种方式实现数据传输,如程序控制(PIO)、直接内存访问(DMA)等。
    • 在数据传输过程中,设备控制器确保数据的完整性和准确性,避免数据丢失或损坏。
  • 传输模式

    • 同步传输:数据传输按照固定时间间隔进行,适用于传输速率稳定的设备。
    • 异步传输:数据传输不依赖固定时间间隔,适用于传输速率不稳定的设备。

2. 缓冲管理
  • 使用缓冲区

    • 设备控制器使用缓冲区来临时存储数据,提高数据传输的效率。缓冲区可以是硬件实现的,也可以是软件实现的。
    • 缓冲区的存在减少了CPU的参与,使CPU可以专注于其他任务,提高系统的整体效率。
  • 缓冲策略

    • 单缓冲:只有一个缓冲区,适用于简单的I/O操作。
    • 双缓冲:有两个缓冲区,当一个缓冲区正在传输数据时,另一个缓冲区可以接收新的数据,提高传输效率。
    • 环形缓冲:多个缓冲区组成一个循环结构,适用于需要连续传输大量数据的场景。

3. 中断处理
  • 中断请求

    • 当I/O设备需要处理器的服务时,设备控制器向处理器发送中断请求(IRQ)。中断请求通知处理器有新的I/O操作需要处理。
    • 处理器收到中断请求后,会暂停当前任务,调用中断处理程序来响应I/O设备的请求。
  • 中断类型

    • 硬件中断:由I/O设备触发的中断,例如键盘按键、磁盘完成读写操作等。
    • 软件中断:由软件触发的中断,例如系统调用、异常处理等。

4. 设备初始化
  • 初始化和配置

    • 设备控制器负责初始化和配置I/O设备。初始化包括设置设备的初始状态,如清空缓冲区、设置传输速率等。
    • 配置包括设置设备的工作参数,如数据格式、传输模式等。
  • 设备驱动程序

    • 设备控制器通过设备驱动程序与操作系统交互。设备驱动程序提供设备的初始化、配置和控制接口,使操作系统能够管理和控制I/O设备。

5. 错误检测与恢复
  • 错误检测

    • 设备控制器负责检测I/O设备的错误,如数据传输错误、设备故障等。常见的错误检测方法包括校验和、奇偶校验等。
    • 当检测到错误时,设备控制器会记录错误信息,并向处理器报告错误状态。
  • 错误恢复

    • 设备控制器在检测到错误后,尝试进行错误恢复。恢复措施包括重传数据、重置设备等。
    • 在严重错误情况下,设备控制器无法自行恢复时,会通知操作系统采取进一步的恢复措施,如重新初始化设备、替换故障设备等。

6. 设备控制器的组成部分
  • 处理器

    • 专用的控制处理器,用于执行设备控制任务。
    • 处理器负责处理数据传输、缓冲管理、中断处理、设备初始化和错误检测等任务。
  • 内存

    • 存储缓冲区、控制程序和设备状态信息的存储器。
    • 内存可以是专用的硬件存储器,也可以是设备控制器的一部分。
  • 接口组件

    • 连接I/O设备和计算机系统的接口,如串行接口、并行接口、USB接口等。
    • 接口组件负责数据的物理传输,确保设备与计算机系统的正确连接和通信。

7. 示例图解

可以通过一个示意图来展示设备控制器与I/O设备和计算机系统之间的关系:

+-------------------+
|  计算机系统       |
|                   |
|  +-------------+  |
|  |  处理器     |  |
|  +-------------+  |
|    |       |      |
|    |       |      |
|    V       V      |
|  +-------------+  |
|  |  内存       |  |
|  +-------------+  |
|                   |
+---------+---------+||V
+-------------------+
|  设备控制器       |
|                   |
|  +-------------+  |
|  |  处理器     |  |
|  +-------------+  |
|    |       |      |
|    |       |      |
|    V       V      |
|  +-------------+  |
|  |  内存       |  |
|  +-------------+  |
|    |       |      |
|    |       |      |
|    V       V      |
|  +-------------+  |
|  |  接口组件   |  |
|  +-------------+  |
|                   |
+---------+---------+||V
+-------------------+
|  I/O 设备         |
+-------------------+

 

内存映像 I/O

        内存映像 I/O 是一种常用的数据传输方式,它将 I/O 设备的数据缓冲到主存中,以实现高效的传输。通过这种方法,应用程序可以直接从内存读取或写入数据,而无需直接与 I/O 设备交互,极大地提高了数据传输速度和简化了应用程序的实现。

原理

内存映像 I/O 的基本原理是通过内存映射机制,将I/O设备的寄存器或数据缓冲区映射到主存的地址空间中。这样,应用程序可以像访问普通内存一样访问I/O设备的数据,而不需要使用繁琐的设备驱动程序或特定的I/O指令。

优点
  1. 高效的数据传输

    • 内存映像 I/O 通过在主存中缓冲数据,减少了直接与I/O设备交互的频率,从而提高了数据传输速度。
    • 应用程序可以利用内存的高速访问特性,加快数据读写操作。
  2. 简化应用程序实现

    • 应用程序无需直接处理复杂的设备驱动程序或I/O指令,开发者可以通过访问内存地址来进行数据传输。
    • 这种方式使应用程序代码更简洁、更易于维护。
  3. 资源利用率高

    • 内存映像 I/O 可以有效利用系统内存和缓存,减少CPU等待I/O操作的时间,提高系统整体资源利用率。

实现方式

内存映像 I/O 的实现主要依赖于操作系统和硬件的支持。常见的实现方式包括:

  1. 内存映射文件
    • 通过系统调用(如 mmap())将文件或设备的内容映射到应用程序的地址空间中,使得文件或设备的数据可以通过内存访问。
    • 示例代码:
            int fd = open("file.txt", O_RDWR);char *data = mmap(NULL, file_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);if (data == MAP_FAILED) {perror("mmap");exit(1);}// 访问映射的内存printf("File content: %s\n", data);munmap(data, file_size);close(fd);

  2. 内存映射 I/O 设备
    • 硬件设备(如显卡、网卡等)通过内存映射将其寄存器或数据缓冲区映射到系统内存地址空间中,使得应用程序可以直接访问这些设备。
    • 示例代码(假设设备寄存器地址为 0xABCDEF00):
            volatile uint32_t *device_register = (uint32_t *)0xABCDEF00;*device_register = 0x12345678; // 写入设备寄存器uint32_t data = *device_register; // 读取设备寄存器

  3. DMA(直接内存访问)
    • DMA 控制器能够在不经过CPU的情况下,直接在I/O设备和内存之间传输数据,提高传输效率。
    • 应用程序设定DMA传输的源地址、目标地址和传输长度,启动DMA传输后即可继续执行其他任务,而无需等待I/O操作完成。

 

应用场景

内存映像 I/O 适用于多种高性能计算和实时系统场景,例如:

  1. 多媒体处理

    • 视频播放和编辑软件通过内存映射视频文件,提高数据读取和处理速度。
  2. 网络通信

    • 高性能网络服务器和防火墙通过内存映射网卡的缓冲区,实现快速的数据包处理。
  3. 嵌入式系统

    • 实时控制系统通过内存映射I/O设备的寄存器,实现快速的状态监测和控制指令发送。
  4. 数据库管理

    • 数据库系统通过内存映射文件实现高效的数据缓存和查询操作。

 

I/O 通道

        I/O 通道(I/O Channel)是连接 I/O 设备和内存之间的高速传输通道,独立于处理器,专门用于实现高速的数据传输。I/O 通道在需要高吞吐量和高可靠性的系统中尤为关键,例如大型服务器和存储系统。

I/O 通道的基本功能
  1. 高速传输

    • 实现:I/O 通道使用专门的硬件(如通道控制器)来实现高速的数据传输,减轻处理器的负担。
    • 优化:通过并行处理和专用带宽,I/O 通道能够高效传输大量数据。
  2. 直接内存访问(DMA, Direct Memory Access)

    • 定义:I/O 通道可以直接访问内存,绕过操作系统和处理器,以提高传输效率。
    • 过程:通过 DMA 控制器,数据可以在设备和内存之间直接传输,而不需要处理器的干预。
  3. 错误检测与纠正

    • 检测:I/O 通道通常包含错误检测功能,如校验和、循环冗余校验(CRC)等,以确保数据传输的准确性。
    • 纠正:在检测到传输错误时,I/O 通道可以自动进行错误纠正,提供数据传输的可靠性。
  4. 设备独立性

    • 统一接口:I/O 通道为不同类型的 I/O 设备提供统一的接口,使得操作系统和应用程序不必关心底层设备的具体实现。
    • 抽象层:通过设备驱动程序和 I/O 通道的协作,隐藏了设备的物理细节,实现设备独立性。

I/O 通道的工作原理
  1. 数据传输过程

    • 设备请求数据传输。
    • I/O 通道接收请求,并通过 DMA 控制器直接传输数据到内存,或者从内存读取数据传输到设备。
    • 数据传输完成后,I/O 通道通知处理器或操作系统。
  2. DMA 控制器作用

    • DMA 控制器管理数据块的传输,确保数据高效、无错误地传输到目标地址。
    • 通过 DMA 控制器,处理器可以将部分数据传输任务离线给 I/O 通道处理,释放处理器资源。

示例伪代码

function ioChannelTransfer(device, memoryAddress, dataSize) {// 配置DMA控制器dmaController.setSource(device.buffer);dmaController.setDestination(memoryAddress);dmaController.setTransferSize(dataSize);// 启动数据传输dmaController.startTransfer();// 等待传输完成while (!dmaController.transferComplete()) {// 可以进行其他处理器任务}// 检查传输状态if (dmaController.hasError()) {handleTransferError();}
}

 

I/O 通道的应用场景
  • 大型服务器:需要高效处理大量的 I/O 请求,如数据库服务器、文件服务器等。
  • 存储系统:需要高吞吐量和高可靠性的存储传输,如网络附加存储(NAS)、存储区域网络(SAN)等。
  • 高性能计算(HPC):需要快速处理大量数据传输任务的计算环境。

 

I/O 设备的控制方式

        I/O 设备控制方式影响数据传输的效率和系统性能。常见的I/O设备控制方式包括程序控制、中断驱动和直接内存访问(DMA)。

1. 程序控制

程序控制(Programmed I/O)是最基本的I/O控制方式,由应用程序直接控制I/O设备,通过系统调用或库函数与设备交互。

  • 主要特点

    • 应用程序主动轮询设备状态,判断设备是否准备好进行数据传输。
    • 使用系统调用或库函数直接与设备交互,进行数据读写操作。
  • 优点

    • 实现简单,适用于简单的I/O操作。
    • 直接控制设备,响应时间快。
  • 缺点

    • 占用处理器资源,处理器在轮询设备状态时无法执行其他任务,效率低下。
    • 不适用于高并发和大数据量的I/O操作。
  • 示例

  // 伪代码示例while (!device_ready()) {// 等待设备准备好}write_to_device(data);

 

2. 中断驱动

        中断驱动(Interrupt-Driven I/O)通过设备控制器向处理器发送中断请求,由操作系统的中断处理程序完成I/O操作。

  • 主要特点

    • 设备在需要处理器服务时发送中断请求,处理器暂停当前任务,调用中断处理程序处理I/O操作。
    • 中断处理程序完成I/O操作后,处理器恢复原任务的执行。
  • 优点

    • 提高处理器的利用率,处理器在等待I/O设备操作完成期间可以执行其他任务。
    • 适用于需要实时响应的I/O操作,如键盘输入、鼠标移动等。
  • 缺点

    • 中断处理需要保存和恢复处理器状态,有一定的开销。
    • 处理器频繁处理中断请求可能导致性能下降。
  • 示例

 

  // 伪代码示例void interrupt_handler() {if (device_ready()) {read_from_device(buffer);}// 恢复处理器状态}

 

3. 直接内存访问(DMA)

        直接内存访问(Direct Memory Access, DMA)允许I/O设备直接与内存进行数据交换,绕过处理器,以实现高速传输。

  • 主要特点

    • DMA控制器管理数据传输,处理器只需启动DMA操作,然后可以继续执行其他任务。
    • DMA控制器在数据传输完成后向处理器发送中断请求,通知数据传输已完成。
  • 优点

    • 高效的数据传输方式,适用于大数据量的I/O操作,如磁盘I/O、网络I/O等。
    • 减少处理器的参与,提高系统的整体性能。
  • 缺点

    • 需要额外的硬件支持,增加系统的复杂性和成本。
    • DMA控制器和处理器之间的协调需要一定的机制。
  • 示例

 

  // 伪代码示例void start_dma_transfer(void *src, void *dst, size_t size) {// 配置DMA控制器,设置源地址、目的地址和数据大小dma_controller->src = src;dma_controller->dst = dst;dma_controller->size = size;// 启动DMA传输dma_controller->start();}void dma_interrupt_handler() {if (dma_controller->transfer_complete()) {// DMA传输完成,处理数据}// 恢复处理器状态}

结语

        I/O 设备和设备控制器是计算机系统中重要的组件,负责实现数据的输入输出功能。设备控制器作为 I/O 设备与计算机系统之间的桥梁,管理数据传输和设备的控制。内存映像 I/O 和 I/O 通道技术提高了数据传输的速度和效率。commonly used 的 I/O 设备控制方式包括程序控制、中断驱动和直接内存访问。了解 I/O 设备和设备控制器的基本概念,有助于我们设计高效、可靠的 I/O 系统。

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

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

相关文章

Nginx 精解:正则表达式、location 匹配与 rewrite 重写

一、常见的 Nginx 正则表达式 在 Nginx 配置中,正则表达式用于匹配和重写 URL 请求。以下是一些常见的 Nginx 正则表达式示例: 当涉及正则表达式时,理解各个特殊字符的含义是非常重要的。以下是每个特殊字符的例子: ^&#xff1…

langchainJS -结构化输出(StructuredOutputParser )

在LangChain的帮助下,我们可以为输出定义模式。StructuredOutputParser 使用定义的名称和描述来分析和构建模型预测的输出。 const productParser StructuredOutputParser.fromNamesAndDescriptions({Name: "Name of The Product",Description: "De…

JS中split的用法

在JavaScript中,split() 方法用于将字符串分割成字符串数组,并返回这个数组。该方法接受一个参数,该参数定义了用于分割字符串的字符或正则表达式。 以下是一些使用 split() 方法的示例: 示例 1:使用字符串作为分隔符…

【笔记2】Python编程:从入门到实践(第2版) - 埃里克·马瑟斯

第二部分 1、外星人入侵 Pygame包 2、数据可视化 Matplotlib 、Plotly 3、Web应用程序 Django 项目1:外星人入侵 第12章~第14章 使用Pygame包来开发一款2D游戏。 它在玩家每消灭一群向下移动的外星人后,将玩家提高一个等级。等级越高&…

spring 事务隔离级别

一、理解 脏读、不可重复读和幻读 脏读、不可重复读和幻读是数据库事务处理中可能出现的三种并发问题,它们都与事务的隔离性有关。下面是这三种现象的简要说明: 1. 脏读(Dirty Read): 当一个事务读取了另一个事务尚未提交的更改…

【Python】pandas中的read_excel()和to_excel()函数解析与代码实现

😎 作者介绍:我是程序员洲洲,一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主。 🤓 同时欢迎大家关注其他专栏,我将分享Web前后端开发、人工智能、机器学习、深…

类和对象的学习总结(一)

面向对象和面向过程编程初步认识 C语言是面向过程的,关注过程(分析求解问题的步骤) 例如:外卖,关注点菜,接单,送单等 C是面向对象的,关注对象,把一件事拆分成不同的对象&…

java之面向对象2笔记

1 接口(interface) 1.1 概述 接口(Interface)在计算机科学中,特别是在面向对象编程(OOP)中,是一个重要的概念。它定义了一组方法的规范,但没有实现这些方法的具体代码。接口的主要目的是确保类…

[240610] 5 种 Non-Posix Shell 在 x-cmd 上的支持 | Perl 发布 5.40.0

目录 [TOC](目录)5 种非 Posix SHell - nushell,fish,xonsh,csh,pwshnushellfishxonshcshpwsh Perl 发布 5.40.0核心增强安全性不兼容的变化弃用性能提升模块和编译指示文档诊断配置和编译平台支持内部变化选定的错误修复已知问题先前版本的勘误表致谢报告错误致谢另请参阅 5 种…

SOA的设计模式_3.微服务模式

SOA的架构中,复杂的ESB企业服务总线依然处于非常重要的位置,整个系统的架构并没有实现完全的组件化以及面向服务,它的学习和使用门槛依然偏高。而微服务不再强调传统SOA架构里面比较重的ESB企业服务总线,同时SOA的思想进入到单个业…

Linux系统下 安装 Nginx

一、下载Nginx安装包 压缩包下载地址:nginx: download 服务器有外网,可直接使用命令下载 wget -c https://nginx.org/download/nginx-1.24.0.tar.gz 二、安装Nginx 1、解压 tar -zxvf nginx-1.24.0.tar.gz 2、安装Nginx所需依赖 yum install -y gc…

整数反转(leetcode)

题目: 给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。 如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。 假设环境不允许存储 64 位整数(有符号或无符号)。 示例 1&…

SLAM小题目

1、最小二乘题目&#xff1a; 假设有三个WIFI热点&#xff0c;位置分别在(x1,y1), (x2,y2), (x3,y3), 移动端测量到每一个热点的距离L1,L2和L3&#xff0c;要求解移动端的位置. #include <iostream> #include <vector> #include <cmath> class Point { pub…

监听DB配置变更之go-broadcast简单实现

文章目录 1. 前言2. 分析3. 实现4. 问题5. 小结6. 参考 1. 前言 之前遇到一个需求&#xff0c;因为配置的查找是基于db的&#xff0c;而db的更改却无法实时通知到具体利用到这条数据的使用方&#xff0c;为了实现db数据变动时&#xff0c;能够尽快让使用方知道这条数据发生了变…

设计模式七大原则-单一职责原则SingleResponsibility

七大原则是在设计“设计模式”的时候需要用到的原则&#xff0c;它们的存在是为了保证设计模式达到以下几种目的&#xff1a; 1.代码重用性 2.可读性 3.可拓展性 4.可靠性&#xff08;增加新的功能后&#xff0c;对原来的功能没有影响&#xff09; 5.使程序呈现高内聚、低耦合的…

3、线性代数

1、矩阵转置 A[i,j]A[j,i] 2、对称矩阵 &#xff1a;A转置A [0,2,3] [2 1 5] [3,5,1] 3、三维矩阵 求和 axis0 两个矩阵相加 axis1 两个向量相加 &#xff0c;axis2 向量内部相加 keepdimsTrue 求和后维度保持不变 4、cumsum累加求和 5、torch.mm() 或 torch.bmm() 【矩…

vivado HW_SERVER

HW_服务器 描述 硬件服务器管理到硬件目标的连接&#xff0c;例如硬件 板&#xff0c;包含一个或多个Xilinx FPGA设备的JTAG链&#xff0c;用于 编程和调试您的FPGA设计。 使用open_hw命令打开硬件管理器时&#xff0c;可以连接到 硬件服务器&#xff0c;本地或远程&#xff0c…

支持YUV和RGB格式两路视频同时播放

1.头文件&#xff1a; sdlqtrgb.h #pragma once #include <QtWidgets/QWidget> #include "ui_sdlqtrgb.h" #include <thread> class SdlQtRGB : public QWidget {Q_OBJECTpublic:SdlQtRGB(QWidget* parent Q_NULLPTR);~SdlQtRGB(){is_exit_ true;//等…

使用EFCore和Linq查询语句封装复杂的查询结果

这里举一个例子&#xff0c;用到了三个实体类&#xff0c;分别是 [Table("t_user")] public class User {[Key]public long Id { get; set; }public string UserName { get; set; }public string Password { get; set; }public string Email { get; set; }public Li…

Gradle和Maven都是广泛使用的项目自动化构建工具(二)

Gradle和Maven都是广泛使用的项目自动化构建工具&#xff0c;但它们在多个方面存在差异。以下是关于Gradle和Maven的详细对比&#xff1a; 一、构建脚本语言 Maven&#xff1a;使用XML作为构建脚本语言。XML的语法较为繁琐&#xff0c;不够灵活&#xff0c;对于复杂的构建逻辑…