2023-2024-1 20211327 信息安全系统设计与实现 学习笔记10

学习笔记

  • 块与I/O缓冲区
  • I/O缓冲区管理算法比较
  • 实践过程

块与I/O缓冲区

块设备

1.定义: 块设备是一种数据存储设备,其数据以块为单位进行读写。块通常是一个固定大小的数据块,比如512字节或4KB。

2.示例: 硬盘驱动器、固态硬盘、光盘等都是块设备的例子。

3.特点:

  • 数据以块为单位传输,而不是逐字节。
  • 支持随机访问,可以直接读写指定块而无需顺序读取整个设备。
  • 文件系统: 块设备通常包含文件系统,文件系统负责组织和管理块设备上的数据,提供对文件和目录的抽象。

4.缓存: 为了提高性能,操作系统通常会使用缓存来暂时存储从块设备读取的数据,以减少对物理设备的频繁访问。

I/O缓冲区

1.定义: I/O缓冲区是在内存中设置的一块区域,用于暂时存储即将被输入或输出的数据。它是为了优化I/O操作而引入的。

2.作用:

  • 提高效率: 通过在内存中暂时存储数据,可以减少与外部设备的直接交互次数,提高数据传输效率。

  • 异步操作: 允许程序继续执行其他任务,而不必等待I/O操作完成。
    缓冲策略:

  • 写缓冲: 用于存储即将被写入外部设备的数据。

  • 读缓冲: 用于存储从外部设备读取的数据。

3.同步和异步I/O:

  • 同步I/O: 程序在发起I/O操作后会等待操作完成,再继续执行。
  • 异步I/O: 程序发起I/O操作后可以立即继续执行其他任务,不需要等待操作完成。

I/O缓冲区管理算法比较

管理组织

1.系统组织:

  • 单缓冲系统: 只有一个缓冲区,数据传输时需要等待缓冲区空闲。
  • 双缓冲系统: 两个缓冲区,允许数据传输和处理同时进行,提高效率。
  • 环形缓冲系统: 多个缓冲区组成一个环形队列,实现无限制的数据传输。

2. 多任务处理系统:

  • 并发缓冲管理: 考虑多任务并发执行时,需要确保缓冲区的正确分配和同步。
  • 优先级调度: 为不同任务分配不同优先级,高优先级任务可能获得更多的缓冲区资源。

3.缓冲区管理器:

  • 先进先出 (FIFO): 缓冲区按照进入的顺序进行分配和释放。
  • 最近最少使用 (LRU): 根据缓冲区中数据的使用频率选择淘汰最长时间未使用的缓冲区。
  • 最佳适应 (Best Fit): 将新数据放入使得剩余空间最小的缓冲区中。

4. 磁盘驱动程序:

  • 请求调度算法: 确定磁盘上的数据访问顺序,以最小化寻道时间和旋转延迟。
  • SCAN算法: 磁头按照一个方向移动,服务请求直到到达最边缘,然后改变方向。

5. 磁盘控制器:

  • 缓冲预读: 提前从磁盘读取可能需要的数据,放入缓冲区,减少实际I/O的等待时间。
  • 写缓冲: 将要写入磁盘的数据暂时存储在缓冲区中,提高写操作的效率。

6.磁盘中断:

  • 中断响应时间: 中断服务程序需要迅速响应,以最小化对系统性能的影响。
  • 中断处理策略: 根据中断的类型,执行相应的中断处理程序,如数据传输完成、错误处理等。

7. 虚拟磁盘相关内容:

  • 页面置换算法: 当物理内存不足时,将不常用的页面移到磁盘上,以腾出空间。
  • 页面调度策略: 确定哪些页面应该被置换,以最小化页面缺页率。

代码示例

1.缓冲区管理器示例(python):

class IOBufferManager:
    def __init__(self, buffer_size):
        self.buffer_size = buffer_size
        self.buffer = [None] * buffer_size

    def read_from_disk(self, block_number):
        # Check if the block is already in the buffer
        if self.buffer[block_number] is not None:
            return self.buffer[block_number]
        else:
            # If not, fetch the block from the disk
            data = self.fetch_from_disk(block_number)
            # Place the data in the buffer using a buffer replacement policy (e.g., LRU)
            self.replace_buffer_block(block_number, data)
            return data

    def fetch_from_disk(self, block_number):
        # Simulate fetching data from the disk
        # In a real system, this would involve communication with disk drivers
        return f"Data from disk block {block_number}"

    def replace_buffer_block(self, block_number, data):
        # Implement a buffer replacement policy (e.g., LRU)
        # Replace the least recently used block with the new data
        # Update metadata as needed
        # ...

    def write_to_disk(self, block_number, data):
        # Simulate writing data to the disk
        # Update the buffer or other metadata as needed
        # ...

# Example usage:
buffer_manager = IOBufferManager(buffer_size=3)
data_block_1 = buffer_manager.read_from_disk(1)
print(data_block_1)

data_block_2 = buffer_manager.read_from_disk(2)
print(data_block_2)

# Writing data to disk
buffer_manager.write_to_disk(3, "New data block 3")

2.虚拟磁盘管理示例(C语言):

#include <stdio.h>

#define BLOCK_SIZE 512
#define NUM_BLOCKS 1000

typedef struct {
    char data[BLOCK_SIZE];
} DiskBlock;

DiskBlock virtual_disk[NUM_BLOCKS];

void read_from_virtual_disk(int block_number, char* buffer) {
    // Simulate reading data from virtual disk
    memcpy(buffer, virtual_disk[block_number].data, BLOCK_SIZE);
}

void write_to_virtual_disk(int block_number, const char* data) {
    // Simulate writing data to virtual disk
    memcpy(virtual_disk[block_number].data, data, BLOCK_SIZE);
}

int main() {
    int block_number = 1;
    char buffer[BLOCK_SIZE];

    // Read data from virtual disk
    read_from_virtual_disk(block_number, buffer);
    printf("Data read from virtual disk block %d: %s\n", block_number, buffer);

    // Write data to virtual disk
    const char* new_data = "New data block 1";
    write_to_virtual_disk(block_number, new_data);
    printf("Data written to virtual disk block %d: %s\n", block_number, new_data);

    return 0;
}

实践过程

posted @ 2023-11-17 10:50  沈楗翔  阅读(9)  评论(0编辑  收藏  举报