From 425eb4bc36b697b68f15e152d2e8c1e94d3ea56b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=AE=B8=E5=A4=A7=E4=BB=99?= <1900919313@qq.com> Date: Mon, 21 Oct 2024 02:52:59 +0000 Subject: [PATCH] =?UTF-8?q?2024=E5=B9=B410=E6=9C=8821=E6=97=A5=2010:52?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/notes/01_c-basic/07_xdx/assets/10.svg | 4 -- docs/notes/01_c-basic/07_xdx/assets/7.svg | 4 -- docs/notes/01_c-basic/07_xdx/assets/8.svg | 4 -- docs/notes/01_c-basic/07_xdx/assets/9.svg | 4 -- docs/notes/01_c-basic/07_xdx/index.md | 52 ++++++++++++++-------- 5 files changed, 34 insertions(+), 34 deletions(-) delete mode 100644 docs/notes/01_c-basic/07_xdx/assets/10.svg delete mode 100644 docs/notes/01_c-basic/07_xdx/assets/7.svg delete mode 100644 docs/notes/01_c-basic/07_xdx/assets/8.svg delete mode 100644 docs/notes/01_c-basic/07_xdx/assets/9.svg diff --git a/docs/notes/01_c-basic/07_xdx/assets/10.svg b/docs/notes/01_c-basic/07_xdx/assets/10.svg deleted file mode 100644 index 1956dbb..0000000 --- a/docs/notes/01_c-basic/07_xdx/assets/10.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - -
传输数据 1
stdin(输入设备,键盘等)
内存
传输数据 2
stdin(输入设备,键盘等)
内存
传输数据 3
stdin(输入设备,键盘等)
内存
传输数据 4
stdin(输入设备,键盘等)
内存
传输数据 5
stdin(输入设备,键盘等)
批量处理
内存
CPU
输入缓冲区
\ No newline at end of file diff --git a/docs/notes/01_c-basic/07_xdx/assets/7.svg b/docs/notes/01_c-basic/07_xdx/assets/7.svg deleted file mode 100644 index ea6d443..0000000 --- a/docs/notes/01_c-basic/07_xdx/assets/7.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - -
内存
stdout(输出设备,屏幕等)
stdin(输入设备,键盘等)
数据
CPU
\ No newline at end of file diff --git a/docs/notes/01_c-basic/07_xdx/assets/8.svg b/docs/notes/01_c-basic/07_xdx/assets/8.svg deleted file mode 100644 index 3373e8c..0000000 --- a/docs/notes/01_c-basic/07_xdx/assets/8.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - -
内存
stdout(输出设备,屏幕等)
stdin(输入设备,键盘等)
数据
CPU
输入缓冲区
输出缓冲区
\ No newline at end of file diff --git a/docs/notes/01_c-basic/07_xdx/assets/9.svg b/docs/notes/01_c-basic/07_xdx/assets/9.svg deleted file mode 100644 index 22a80de..0000000 --- a/docs/notes/01_c-basic/07_xdx/assets/9.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - -
传输数据 1
stdin(输入设备,键盘等)
接收并处理数据 1
内存
等待处理数据 2
CPU
传输数据 2
stdin(输入设备,键盘等)
接收并处理数据 2
内存
等待处理数据 3
CPU
传输数据 3
stdin(输入设备,键盘等)
接收并处理数据 3
内存
等待处理数据 4
CPU
传输数据 4
stdin(输入设备,键盘等)
接收并处理数据 4
内存
等待处理数据 5
CPU
传输数据 5
stdin(输入设备,键盘等)
接收并处理数据 5
内存
CPU
\ No newline at end of file diff --git a/docs/notes/01_c-basic/07_xdx/index.md b/docs/notes/01_c-basic/07_xdx/index.md index e2430cb..5b78317 100644 --- a/docs/notes/01_c-basic/07_xdx/index.md +++ b/docs/notes/01_c-basic/07_xdx/index.md @@ -107,15 +107,42 @@ ## 1.3 缓冲区 -### 1.3.1 概述 +### 1.3.1 如果存在缓冲区,键盘输入的数据是怎么到达程序的? + +* 当我们在键盘上输入数据并传递给程序时,通常会经历如下的几个步骤: + * ① `键盘输入数据`:当我们在键盘上按下某个键的时候,键盘会将这个动作转换为对应的电信号,传递给计算机。 + * ② `硬盘中断`:计算机的`键盘控制器`会检测到键盘按键输入,并通过`中断请求`通知 CPU。这个中断信号会暂停当前的程序执行,CPU进入中断处理状态(中断处理程序会接收这个中断信号,CPU 根据键盘输入触发的中断,调用操作系统内核中的中断处理程序)。 + * ③ `操作系统处理输入`:中断处理程序从键盘控制器获取输入的数据,并降低存储到内存的`缓冲区`(标准输入缓冲区)中。 + * ④ `缓冲区管理`:键盘输入的数据被存入`内存缓冲区`,操作系统会将这些数据暂时存放在缓冲区中,等待程序从缓冲区中读取数据。 + * ⑤ `程序读取数据`:程序通过系统调用或库函数,如:C 语言中的 scanf 函数从缓冲区中读取键盘输入的数据。并且,当程序调用读取输入的函数时,操作系统将缓冲区中的数据传递给程序。程序通过读取操作,将键盘输入的数据处理或输出到其他地方。 + + +* 其对应的图示,如下所示: + +```mermaid +sequenceDiagram + participant User as 用户 + participant Keyboard as 键盘 + participant Controller as 键盘控制器 + participant CPU as CPU + participant OS as 操作系统 + participant Program as 程序 + + User->>Keyboard: 按下按键 + Keyboard->>Controller: 生成输入信号 + Controller->>CPU: 发送中断请求 (IRQ) + CPU->>OS: 执行中断处理程序 (ISR) + OS->>OS: 处理输入并存储到缓冲区 (stdin) + Program->>OS: 通过系统调用读取缓冲区数据 + OS->>Program: 返回键盘输入数据 + +``` + + -* 我们所编写的程序,都是运行在内存中的,如果我们不使用缓冲区,那么其在内存中就是这样的,如下所示: -![](./assets/7.svg) -* 而缓冲区的本质就是在`内存`中开辟一块用来`临时存储数据`的`区域`,它在速度较慢的内存和 IO 设备起到了桥梁的作用,那么其在内存中就是这样的,如下所示: -![](./assets/8.svg) > [!NOTE] > @@ -124,22 +151,11 @@ > * ① 当我们使用 `printf` 函数输出数据的时候,数据并不会立即就写出到输出设备(如:屏幕等)。而是先将其放置到 `stdout 缓冲区`中,然后在满足条件的时候,再从缓冲区中刷新到输出设备。 > * ② 当我们使用 `scanf` 函数输入数据的时候,数据并不会立即就从输入设备中读取(如:键盘等)。而是先将其放置到 `stdin 缓冲区`中,然后在满足条件的时候,再从缓冲区中加载数据。 -### 1.3.2 缓冲区到底如何实现系统效率的提升? -* 如果没有缓冲区,假设有 5 个数据,输入设备每次传递 1 个数据,CPU 必须立即接收并处理,因此有 5 次 IO 操作,每次都是逐个处理,如下所示: -![](./assets/9.svg) +### 1.3.2 如果没有缓冲区,键盘输入的数据是怎么到达程序的? + -* 如果没有缓冲区,假设有 5 个数据,输入设备每次传递 1 个数据,但它们先存储到缓冲区中。CPU 在缓冲区满时一次性处理多个数据,减少了频繁的等待,如下所示: -![](./assets/10.svg) -> [!IMPORTANT] -> -> 假设每次 IO 操作的时间是 1 秒,CPU 处理数据的时间也是 1 秒,那么: -> -> * ① 没有缓冲区的情况下,总耗时是:5 次 I/O 操作 + 5 次处理 = 10 秒,即:没有缓冲区的情况下,每次 I/O 操作和处理器的处理是交替进行的,因此总共需要 10 秒(5 次 I/O + 5 次处理) -> * ② 使用缓冲区的情况下,总耗时是:5 次 I/O 操作 + 1 次批量处理 = 6 秒,即:使用缓冲区的情况下,I/O 操作和处理器处理是分开的,I/O 操作先全部完成,处理器一次性批量处理所有数据。因此,总耗时减少为 6 秒(5 秒传输 + 1 秒处理)。 -> -> 使用缓冲区能够显著减少总的执行时间,因为它允许处理器批量处理数据,而不是在每次数据传递后都进行等待处理。