• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
导航菜单
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • windows
  • 服务器硬件
  • 服务器运维
  • 云计算
  • 虚拟化
  • IIS教程
  • Linux
  • Apache
  • Ftp
  • DNS
  • Nginx
您的位置:首页 > 服务器 >windows > 一个IO的传奇一生 (4) ---

一个IO的传奇一生 (4) ---

作者:网友 字体:[增加 减小] 来源:互联网

本文主要包含一个io口控制两个灯,agar.io游戏,io,温氏io登录,agar.io游戏中文版等服务器相关知识,网友希望可以进行参考

 

块设备buffer cache机制

 

在EXT3文件IO踏上新的征程之前,需要介绍一位EXT3文件IO的同伴,他们即将踏上相同的旅程。只不过这位同伴没有经历过EXT3文件系统的精彩,却领略了另外一番略有差别的风情。这位同伴是在块设备写操作时创建诞生的,我们可以称它为块设备IO。

在很多应用中都会直接进行块设备操作,我们常用的命令dd就可以进行块设备的读写。例如:dd if=/dev/sda of=./abc bs=512 count=1 命令可以实现将/dev/sda设备的第一个扇区读入到当前目录的abc文件中。读到这里我们想一下:访问一个块设备文件和一个EXT3文件到底有何本质上的区别呢?说到区别还是可以列举一二的:

1)EXT3是一个通用的文件系统,数据在磁盘上的分布是采用元数据的形式进行描述的。所以,对于一个EXT3文件的读写操作会涉及到元数据和文件数据两种类型。由于这两种数据类型存在相关性,所以为了保证两者之间操作的原子性,EXT3通常会采用日志的方式保证操作的原子性。

2)块设备没有EXT3文件系统那么复杂,写入的数据直接在磁盘存储,不存在任何的元数据信息。

所以,比较块设备和EXT3文件系统,数据的读写方式存在差别。两者之间一个很大的共同点是都存在磁盘访问的性能问题,都可以采用内存对磁盘进行性能优化。EXT3采用page cache对IO性能进行优化,块设备同样可以采用page cache对其进行性能优化。前面我们已经了解到,每个EXT3文件都有一棵radix tree用于维护这个文件内容的page cache,而裸设备可以等价成一个EXT3文件,同样可以采用一棵radix tree对块设备上的数据进行cache维护。所以,在这两者之间是有很大共同点的。

正因为如此,Linux在实现块设备IO操作的时候和EXT3是类似的,对于块设备访问的这个子系统可以称之为bdev文件系统。VFS实现了所有类型文件访问的功能,应用程序所调用的API是完全相同的。对于块设备的访问,穿过VFS层会调用bdev文件系统提供的相关函数。

在初始化块设备的时候,会调用init_special_inode函数初始化这个块设备的inode:

void init_special_inode(struct inode *inode, umode_t mode, dev_t rdev)
{
inode->i_mode = mode;
if (S_ISCHR(mode)) {
/* 初始化字符设备操作方法 */
inode->i_fop = &def_chr_fops;
inode->i_rdev = rdev;
} else if (S_ISBLK(mode)) {
/* 初始化块设备操作方法 */
inode->i_fop = &def_blk_fops;
inode->i_rdev = rdev;
} else if (S_ISFIFO(mode))
inode->i_fop = &def_fifo_fops;
else if (S_ISSOCK(mode))
inode->i_fop = &bad_sock_fops;
else
printk(KERN_DEBUG "init_special_inode: bogus i_mode (%o) for"
" inode %s:%lu\n", mode, inode->i_sb->s_id,
inode->i_ino);
}

在用户程序调用open函数打开指定块设备的时候,会初始化一个file对象,并且采用上述inode对file对象进行初始化。因此,通过file对象的文件操作方法就可以调用通用的块设备操作函数。Linux中定义的通用块设备操作函数说明如下:

const struct file_operations def_blk_fops = {
.open       = blkdev_open,
.release    = blkdev_close,
.llseek     = block_llseek,
.read       = do_sync_read,
.write      = do_sync_write,
.aio_read   = generic_file_aio_read,
.aio_write  = blkdev_aio_write,
.mmap       = generic_file_mmap,
.fsync      = blkdev_fsync,
.unlocked_ioctl = block_ioctl,
#ifdef CONFIG_COMPAT
.compat_ioctl   = compat_blkdev_ioctl,
#endif
.splice_read    = generic_file_splice_read,
.splice_write   = generic_file_splice_write,
};

因此,对于一个块设备的写操作,通过write函数陷入内核执行do_sync_write。在do_sync_write函数中会调用blkdev_aio_write函数实现块设备的异步写入过程。blkdev_aio_write函数的核心是

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 一个IO的传奇一生 (6) --
  • 一个IO的传奇一生 (4) ---

相关文章

  • Win2003哪里下载
  • windows服务器asp木马删除不了解决办法
  • Windows中的RunDLL32命令用法集锦
  • Hyper-V 和 VMware 虚拟机软件共存的设置方法
  • windows2003系统无盘终端网组建详细教程(1/3)
  • Zabbix 之监控Juniper防火墙与深信服设备以及NetScaler设备
  • linux生产服务器有关网络状态的优化措施
  • 四、配置开机自动启动Nginx + PHP【LNMP安装 】
  • windows2000上怎么装PHP+MYSQL(IIS版)
  • ↑mysql主从复制实现SSL加密和半同步复制↑

文章分类

  • windows
  • 服务器硬件
  • 服务器运维
  • 云计算
  • 虚拟化
  • IIS教程
  • Linux
  • Apache
  • Ftp
  • DNS
  • Nginx

最近更新的内容

    • 如何降级Windows 2003 server域控制器
    • Exchange Server 2010 邮件发送延迟排错
    • 从两方面分析 有效地减少电脑死机或蓝屏
    • xampp修改mysql默认密码详解
    • windows2003系统无盘终端网组建详细教程(1/3)
    • Windows下安装配置apache+mysql+php运行环境详细
    • Windows 2003系统配置NAT端口映射
    • 64位Windows系统配置IIS 7.0+PHP+Mysql图解
    • WMS中添加默认发布点的方法[图文教程]
    • 操作系统音效制作的乐曲,绝对经典[视频]

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有