首页 > 其他分享 >第十一周学习笔记

第十一周学习笔记

时间:2023-11-18 11:33:55浏览次数:40  
标签:read 第十一 笔记 学习 fd 缓冲区 SIZE block 设备

块设备I/O和缓冲区管理

知识点总结

块设备I/O

1.块设备概念:

  • 块设备是按照固定大小的块(block)进行数据传输的设备,例如硬盘、SSD等。
  • 与字符设备(按字符传输,如键盘、打印机)相对,块设备以块为单位进行读写操作,提高了效率。

2.I/O调度算法:

  • I/O调度算法用于决定何时执行哪个块设备的I/O请求。
  • 常见的算法包括先来先服务(FCFS)、最短寻道时间优先(SSTF)、扫描算法(SCAN)等。

3.Elevator算法:

  • 一种常见的块设备I/O调度算法,模拟电梯的运行过程,提高磁盘访问效率。

4.I/O请求队列:

  • 操作系统维护一个I/O请求队列,存储等待进行I/O操作的请求。
  • 调度算法从队列中选择下一个执行的I/O请求。

5.异步I/O和同步I/O:

  • 异步I/O允许程序继续执行而不等待I/O完成,适用于多任务环境。
  • 同步I/O会阻塞程序直到I/O完成。

缓冲区管理

1.缓冲区概念:

  • 缓冲区是位于内存中的临时存储区域,用于保存从块设备读取或写入的数据。
  • 缓冲区管理负责将数据从内存缓冲区传输到块设备或从块设备传输到内存缓冲区。

2.缓冲区的作用:

  • 提高I/O性能:通过在内存中保留块设备的部分数据,减少直接访问块设备的需求,提高性能。
  • 缓解速度差异:内存的读写速度远高于块设备,缓冲区能够平衡两者之间的速度差异。

3.缓冲区的管理策略:

  • 缓冲区替换算法:当内存中的缓冲区已满时,选择哪个缓冲区用于新的数据。
  • 常见的替换算法包括最近最少使用(LRU)、先进先出(FIFO)等。

4.延迟写和预读:

  • 延迟写将写入操作延迟到必要时执行,提高写入效率。
  • 预读则在实际需要数据之前就提前读取,减少读取时的延迟。

5.缓冲区同步:

  • 缓冲区同步确保数据的一致性,即使系统崩溃或发生故障。
  • 同步操作包括写回(write back)和刷新(flush)。

苏格拉底挑战




问题及解决方法

1.性能瓶颈问题:

  • 问题: I/O性能不达预期,出现延迟或吞吐量低的情况。
  • 解决方案: 考虑优化I/O调度算法、改进缓冲区管理策略,以及使用异步I/O等技术。分析系统瓶颈,可能需要进行性能调优和系统优化。

2.缓冲区同步引发的数据一致性问题:

  • 问题: 缓冲区中的数据与块设备上的数据不一致,可能导致数据损坏或错误。
  • 解决方案: 使用合适的缓冲区同步机制,确保数据在内存和块设备之间的正确同步。常见的同步机制包括写回(write back)和刷新(flush)。

3.缓冲区替换算法导致的性能问题:

  • 问题: 缓冲区替换算法选择不当,导致缓冲区中常用的数据被频繁替换,影响性能。
  • 解决方案: 选择适当的缓冲区替换算法,如LRU(最近最少使用)或FIFO(先进先出),以最大程度地保留常用数据。

4.错误处理和容错问题:

  • 问题: 在I/O操作中发生错误,可能是硬件故障或其他异常情况。
  • 解决方案: 实施良好的错误处理机制,包括错误检测、报告和恢复策略。使用冗余技术如RAID(独立磁盘冗余阵列)来提高数据的容错性。

5.并发访问问题:

  • 问题: 多个进程或线程同时访问块设备和缓冲区,可能导致数据一致性和竞态条件问题。
  • 解决方案: 使用锁或其他同步机制来确保并发访问的安全性。设计合适的并发控制策略,避免竞态条件。

6.资源管理问题:

  • 问题: 系统中的缓冲区占用过多内存或其他资源。
  • 解决方案: 优化资源管理,考虑限制缓冲区的大小,实施动态调整策略以适应系统负载。

实践过程

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>

#define BLOCK_SIZE 512
#define FILE_PATH "block_device.bin"

void write_block(char *data, off_t block_number) {
    int fd = open(FILE_PATH, O_WRONLY | O_CREAT, 0666);
    if (fd == -1) {
        perror("Error opening file");
        exit(EXIT_FAILURE);
    }

    off_t offset = block_number * BLOCK_SIZE;
    if (lseek(fd, offset, SEEK_SET) == -1) {
        perror("Error seeking file");
        close(fd);
        exit(EXIT_FAILURE);
    }

    if (write(fd, data, BLOCK_SIZE) == -1) {
        perror("Error writing to file");
        close(fd);
        exit(EXIT_FAILURE);
    }

    close(fd);
}

void read_block(char *buffer, off_t block_number) {
    int fd = open(FILE_PATH, O_RDONLY);
    if (fd == -1) {
        perror("Error opening file");
        exit(EXIT_FAILURE);
    }

    off_t offset = block_number * BLOCK_SIZE;
    if (lseek(fd, offset, SEEK_SET) == -1) {
        perror("Error seeking file");
        close(fd);
        exit(EXIT_FAILURE);
    }

    if (read(fd, buffer, BLOCK_SIZE) == -1) {
        perror("Error reading from file");
        close(fd);
        exit(EXIT_FAILURE);
    }

    close(fd);
}

int main() {
    char data_to_write[BLOCK_SIZE] = "This is block 0.";
    char read_buffer[BLOCK_SIZE];

    // Writing to block 0
    write_block(data_to_write, 0);

    // Reading from block 0
    read_block(read_buffer, 0);

    printf("Data read from block 0: %s\n", read_buffer);

    return 0;
}

block_device.bin 用于模拟块设备。程序首先写入一个块的数据,然后再从相同的块读取数据。

  • 使用 open 函数打开文件,可以选择 O_WRONLY(写入)或 O_RDONLY(读取)等标志。
  • 使用 lseek 函数设置文件指针的位置,模拟对块设备的定位操作。
  • 使用 write 函数进行数据写入,read 函数进行数据读取。
  • 块的大小由 BLOCK_SIZE 定义,可以根据实际需求进行调整。

标签:read,第十一,笔记,学习,fd,缓冲区,SIZE,block,设备
From: https://www.cnblogs.com/wujiuchun/p/17840230.html

相关文章

  • 20211316郭佳昊 《信息安全系统设计与实现(上)》 第十周学习总结 块设备I/O和缓冲区处理
    一、任务要求[1]知识点归纳以及自己最有收获的内容,选择至少2个知识点利用chatgpt等工具进行苏格拉底挑战,并提交过程截图,提示过程参考下面内容(4分)我在学****知识点,请你以苏格拉底的方式对我进行提问,一次一个问题核心是要求GPT:请你以苏格拉底的方式对我进行提问然后GPT就会......
  • 第十周学习笔记
    块设备I/O和缓冲区管理(一)块设备I/O缓冲区在第11章中,我们学习了读写普通文件的算法。这些算法依赖于两个关键操作,即get_block和put_block,这两个操作将磁盘块读写到内存缓冲区中。由于与内存访问相比,磁盘I/O速度较慢,所以不希望在每次执行读写文件操作时都执行磁盘I/O。因......
  • 20211128《信息安全系统设计与实现》第12章学习笔记
    一、任务内容自学教材第12章,提交学习笔记(10分)1.知识点归纳以及自己最有收获的内容,选择至少2个知识点利用chatgpt等工具进行苏格拉底挑战,并提交过程截图,提示过程参考下面内容(4分)“我在学***X知识点,请你以苏格拉底的方式对我进行提问,一次一个问题”核心是要求GPT:“请你以苏格......
  • 打工笔记-------------layui弹出窗使用
    //初体验//layer.alert('内容')//第三方扩展皮肤//layer.alert('内容',{//icon:1,//skin:'layer-ext-moon'//该皮肤由layer.seaning.com友情扩展。关于皮肤的扩展规则,去这里查阅//})//询问框//layer.confirm('您是如何看待前端开发?',{//btn:['重要','奇葩'......
  • Activiti工作流学习笔记(四)——工作流引擎中责任链模式的建立与应用原理
    原创/朱季谦本文需要一定责任链模式的基础与Activiti工作流知识,主要分成三部分讲解:一、简单理解责任链模式概念二、Activiti工作流里责任链模式的建立三、Activiti工作流里责任链模式的应用一、简单理解责任链模式概念网上关于责任链模式的介绍很多,菜鸟教程上是这样说的:责任链模式(C......
  • 学习笔记10
    教材知识点总结当涉及Unix/Linux系统编程中的块设备I/O缓冲区、UnixI/O缓冲区管理算法、新的I/O缓冲区管理算法、PV算法、多任务处理系统、缓冲区管理器、磁盘驱动程序、磁盘控制器、磁盘中断、虚拟磁盘、模拟系统的改进、PV算法的改进等知识点时,我们可以进行以下详细的总结和拓......
  • linux学习-5
    文件查找、打包压缩及解压文件查找Which:在环境变量PATH设置的目录中查找符合条件的命令文件,可查看其是否存在以及执行的位置。Locate:让用户快速查找到所需要的文件或目录。它不搜索全部数据信息,而是搜索数据库/var/lib/mlocate/mlocate.db。(该数据库包含本地系统内所有文件名......
  • 学习笔记十
    学习笔记十一、任务详情自学教材第12章,提交学习笔记(10分),评分标准如下知识点归纳以及自己最有收获的内容,选择至少2个知识点利用chatgpt等工具进行苏格拉底挑战,并提交过程截图,提示过程参考下面内容(4分)“我在学***X知识点,请你以苏格拉底的方式对我进行提问,一次一个问题”核......
  • 打工笔记----------------------------iframe重定向让父级页面跳转
    "top.location.href"是最外层的页面跳转$.ajax({url:URL+"SystemPrivileges/UserChangePW",data:{userName:userName,passWord:passWord,oldpwd:passWordold,token:token},type:"post",dataType:"json&q......
  • MySQL调优学习-快速获取占用CPU较高的SQL语句
    MySQL调优学习-快速获取占用CPU较高的SQL语句背景早上突然发现一个MySQL数据库的CPU使用率居高因为是一个混布的环境上面还有一个redis怕影响业务就上去像查看一下具体是何种原因导致的速度慢因为实发突然,并没有mysqlem等工具所以从网上学到了一个方法进行简单学习与验......