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缓冲区管理算法