首页 > 其他分享 >20201306吴龙灿第十二章学习笔记

20201306吴龙灿第十二章学习笔记

时间:2022-11-01 19:26:27浏览次数:61  
标签:int 第十二章 磁盘控制器 吴龙灿 缓冲区 sem buf CPU 20201306

知识点归纳

1.块设备I/O缓冲区

什么是块设备:块设备是i/o设备中的一类,是将信息存储在固定大小的块中,每个块都有自己的地址,还可以在设备的任意位置读取一定长度的数据,例如硬盘,U盘,SD卡等。
文件系统使用一系列I/O缓冲区作为块设备的缓存内存。当进程试图读取(dev,blk)标识的磁盘块时。它首先在缓冲区缓存中搜索分配给磁盘块的缓冲区。如果该缓冲区存在并且包含有效数据、那么它只需从缓冲区中读取数据、而无须再次从磁盘中读取数据块。如果该缓冲区不存在,它会为磁盘块分配一个缓冲区,将数据从磁盘读人缓冲区,然后从缓冲区读取数据。

当某个块被读入时、该缓冲区将被保存在缓冲区缓存中,以供任意进程对同一个块的下一次读/写请求使用。
当进程写入磁盘块时,它首先会获取一个分配给该块的缓冲区。然后,它将数据写入缓冲区,将缓冲区标记为脏,以延迟写入,并将其释放到缓冲区缓存中。
定义一个bread(dev, blk)函数,它会返回一个包含有效数据的缓冲区(指针)。
从缓冲区读取数据后,进程通过brelse(hp)格缓冲区释放回缓冲区缓存。 write_block(dev, blk, data)函数

2.Unix I/O缓冲区管理算法

使用 硬件作为缓冲区 的成本较高,容量也较小,一般仅用在对速度要求非常高的场合(如存储器管理中用的联想寄存器,即 快表,由于对页表的访问频率极高,因此使用速度很快的联想寄存器来存放页表项的副本)
一般情况下,更多的是利用内存作为缓冲区,“设备独立性软件”的缓冲区管理就是要组织管理好这些缓冲区

单缓冲策略

当缓冲区数据非空时,不能往缓冲区冲入数据,只能从缓冲区把数据传出;当缓冲区为空时,可以往缓冲区冲入数据,但必须把缓冲区充满以后,才能从缓冲区把数据传出。

双缓冲策略

假设某用户进程请求某种块设备读入若干块的数据。若采用双缓冲的策略,操作系统会在主存中为其分配两个缓冲区(若题目中没有特别说明,一个缓冲区的大小就是一个块)
结论:采用双缓冲策略,处理一个数据块的平均耗时为Max (T, C+M)
两台机器之间通信时,可以配置缓冲区用于数据的发送和接受。

注:管道通信中的“管道”其实就是缓冲区。要实现数据的双向传输,必须设置两个管道

循环缓冲区

将多个大小相等的缓冲区链接成一个循环队列。

注:以下图示中,橙色表示已充满数据的缓冲区,绿色表示空缓冲区。

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

1.系统组织

用户界面:这是模拟系统的用户界面部分。它会提示输人命令、显示命令执行、显示系统状态和执行结果等。在开发过程中,读者可以手动输入命令来执行任务。在最后测试过程中,任务应该有自己的输入命令序列。例如,各任务可以读取包含命令的输入文件。

2.多任务处理系统

3.磁盘驱动程序

start io():维护设备I/O队列,并对I/O 队列中的缓冲区执行 I/O操作。
中断处理程序:在每次I/O操作结束时,磁盘控制器会中断CPU。当接收到中断后,中断处理程序首先从 IntStatus中读取中断状态。

4.磁盘中断

从磁盘控制器到CPU的中断由 SIGUSR1(#10)信号实现。在每次I/O操作结束时,磁盘控制器会发出kill(ppid,SIGUSR1)系统调用,向父进程发送 SIGUSR1信号,充当虚拟CPU中断。
为防止竞态条件,磁盘控制器必须要从CPU接收一个中断确认,才能再次中断。

5.虚拟磁盘

使用Linux系统调用lseek()、read()和 write(),我们可以支持虚拟磁盘上的任何块I/O操作。

6.磁盘控制器

磁盘控制器是主进程的一个子进程。因此,它与CPU 端独立运行,除了它们之间的通信通道,通信通道是 CPU和磁盘控制器之间的接口。通信通道由主进程和子进程之间的管道实现。
命令:从 CPU到磁盘控制器的I/O命令。

DataOut:在写操作中从 CPU 到磁盘控制器的数据输出。
DataIn:在读操作中从磁盘控制器到CPU 的数据。
IntStatus:从磁盘控制器到CPU 的中断状态。
IntAck:从CPU到磁盘控制器的中断确认。

实践内容与截图,代码

通过对信号量PV操作,消除父子进程间的竞争条件,使得其调用顺序可控。

pv.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/sem.h>
#include <sys/ipc.h>
#include "sem_com.c"

#define DELAY_TIME 3
int main() {
pid_t pid;
int sem_id;
key_t sem_key;
sem_key=ftok(".",'a');
sem_id=semget(sem_key,1,0666|IPC_CREAT);
init_sem(sem_id,1);

 if ((pid=fork())<0) {
    perror("Fork error!\n");
     exit(1);
 } else if (pid==0) {
    sem_p(sem_id); 
     printf("Child running...\n");
     sleep(DELAY_TIME);
     printf("Child %d,returned value:%d.\n",getpid(),pid);
     sem_v(sem_id);
     exit(0);
 } else {
     sem_p(sem_id); 
    printf("Parent running!\n");
   sleep(DELAY_TIME);
    printf("Parent %d,returned value:%d.\n",getpid(),pid);
   sem_v(sem_id); 
     waitpid(pid,0,0);
     del_sem(sem_id);
   exit(0);
}
}

sem_com.c

union semun {
int val;
struct semid_ds *buf;
unsigned short *array;
};

int init_sem(int sem_id,int init_value) {
union semun sem_union;
sem_union.val=init_value;
if (semctl(sem_id,0,SETVAL,sem_union)==-1) {
perror("Sem init");
exit(1);
}
return 0;
}
int del_sem(int sem_id) {
union semun sem_union;
if (semctl(sem_id,0,IPC_RMID,sem_union)==-1) {
perror("Sem delete");
exit(1);
}
return 0;
}
int sem_p(int sem_id) {
struct sembuf sem_buf;
sem_buf.sem_num=0;
sem_buf.sem_op=-1;
sem_buf.sem_flg=SEM_UNDO;
if (semop(sem_id,&sem_buf,1)==-1) {
perror("Sem P operation");
exit(1);
}
return 0;
}

int sem_v(int sem_id) {
struct sembuf sem_buf;
sem_buf.sem_num=0;
sem_buf.sem_op=1;
sem_buf.sem_flg=SEM_UNDO;
if (semop(sem_id,&sem_buf,1)==-1) {
perror("Sem V operation");
exit(1);
}
return 0;
}

运行截图

标签:int,第十二章,磁盘控制器,吴龙灿,缓冲区,sem,buf,CPU,20201306
From: https://www.cnblogs.com/wulongcan20201306/p/16848849.html

相关文章

  • 第十二章学习总结
    第12章块设备I/O和缓冲区管理一、知识点总结12.1块设备I/O和缓冲区I/O缓冲的基本原理非常简单。文件系统使用一系列I/O缓冲区作为块设备的缓存内存。当进程试图读......
  • 20201306吴龙灿第五章学习笔记
    Ⅰ知识点归纳一、硬件定时器定时器是由时钟源和可编程计数器组成的硬件设备。时钟源通常是一个晶体振荡器,会产生周期性电信号,以精确的频率驱动计数器。硬件定时器能够按......
  • 【数据库】期末必知必会-----第十二章 数据库恢复
    第十二章数据库恢复1、故障的种类1)事务故障2)系统故障3)介质故障4)其他故障2、数据库备份恢复的原理冗余:冗余是基本原理,利用存储的冗余数据来重建数据库中已经被破坏或者不正......
  • 20201306吴龙灿第四章学习笔记
    知识点归纳前言学习了解并发编程的概念,理解并行计算的概念和重要性;掌握线程的原理和其对于进程的优势。通过学习Pthread线程操作,了解如何使用线程进行并发编程;理解死锁问......
  • 20201306吴龙灿第三章学习笔记
    目录Ⅰ知识点归纳1.进程的概念·什么是进程?·进程的特征动态性并发性独立性异步性结构性·程序和进程主要区别2.多任务处理系统(1)背景(2)多任务处理系统代码介绍3.进程同步(1)同......
  • 20201306吴龙灿第十一章学习笔记
    目录Ⅰ知识点归纳前言一、EXT2文件系统二、EXT2文件系统数据结构(一)通过mkfs创建虚拟硬盘(二)虚拟硬盘布局(三)超级块(四)EXT2的索引节点三、mkdir命令1.语法:2.功能:3.参数:Ⅱ最有收......
  • 13第十二章:Docker网络
    一、Docker平台架构图解1、整体说明从其架构和运行流程来看,Docker是一个C/S模式的架构,后端是一个松耦合架构,众多模块各司其职。Docker运行的基本流程为:用户是使......
  • 20201306吴龙灿第七、八章学习笔记
    知识点归纳一、文件操作1.文件操作级别​文件操作分为五个级别,按照从低到高的顺序可以如下表示:硬盘级别​这些操作多是针对系统的实用程序,一般用户不会涉及到它......
  • 第十二章 systemctl管理脚本
    一、介绍1.systemctl脚本存放在:/usr/lib/systemd/,有系统(system)和用户(user)之分 1)/usr/lib/systemd/system#系统服务,开机不需要登陆就能运行的程序(相当于开启自启) 2)/us......
  • 第十二章 Redis高可用-哨兵模式(Sentinel)
    一、Sentinel介绍Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案,当用Redis做Master-slave的高可用方案时,假如master宕机了,Redis本身(包括它的很多客户端)都没有实......