学习笔记10

20211301 学习笔记10

教材知识点总结

12.1 块设备I/O缓冲区

  • 读写到内存缓冲区中的操作:get_block,put_block

  • I/O缓冲原理:文件系统使用一系列I\O缓冲区作为块设备的缓冲内存,当进程读取标识的磁盘块时,首先在缓冲区缓存中搜索分配给磁盘块的缓冲区,若存在并包含有效数据,则读取数据,若不存在,会分配一个缓冲区,将数据从磁盘读入缓冲区,然后从缓冲区读取数据

  • bread函数:

  • awrite:

  • 中断处理程序的算法:

12.2 Unix I\O缓冲区管理算法

  • I\O缓冲区:结构体由两部分组成(用于管理的缓冲头部分和用于数据块的数据部分)

  • 设备表

  • 缓冲区初始化:系统启动时,所有I\O缓冲区都在空闲列表中,所有设备列表和IO队列均为空

  • 缓冲区列表:分配时,会被插入设备表中

  • getblk brelse算法:

  • 算法:数据一致性、缓存效果、临界区

  • Unix算法的缺点:效率低下、缓存效果不可预知、会出现饥饿、只适用于单处理器系统的休眠、唤醒操作

新的I\O缓冲区管理算法

  • 信号量实现进程同步的主要优点
    • 计数信号量可用来表示可用资源的数量
    • 当多个进程等待一个资源,信号量上的v操作只会释放一个等待进程
  • 使用信号量的缓冲区管理算法:
    • 保证数据一致性
    • 良好的缓存效果
    • 高效率:没有重试循环
    • 无死锁和饥饿

代码实现

#include<stdio.h>
#include<pthread.h>
#define NUM 5
void *print_msg(void *);
int main()
{
    pthread_t t1,t2;
    pthread_create(&t1,NULL,print_msg,(void*)"hello");
    pthread_create(&t2,NULL,print_msg,(void*)"world\n");
    pthread_join(t1,NULL);
    pthread_join(t2,NULL);
    printf("t1,t2 finished!\n");
    return 0;
}
void *print_msg(void *msg)
{
    char *cp = (char *) msg;
    int i;
    for(i=0;i<NUM;i++)
    {
        printf("%s",cp);
        fflush(stdout);
        sleep(1);
    }
    return NULL;
}

问题与解决方案

  • 问题一:代码报错如下

  • 问题一解决方案:

  • 问题二:代码找不到pthread库

  • 问题二解决方案:

苏格拉底提问

  • 信号量






  • I\O缓冲区管理算法






posted @ 2023-11-18 19:50  20211301郑润芃  阅读(1)  评论(0编辑  收藏  举报