Linux系统的数据写入机制--延迟写入

我们都知道,在Linux关机的之前都会要运行一个命令那就是sync,这个命令是同步的意思,那为什么要运行这个?而且之前的数据改变我们已经看见了,为什么还要运行这个命令?要回答这个问题就要说一下Linux在这方面的执行机制。

首先我们要从buffer和cache说起,如下图:

buffer和cache都可以翻译成缓存,但是到底有什么区别呢?

cache:

目的是为了数据重复使用,在一定程度上解决读的效率,这里就是用来存放经常用到的数据,而不用每次都去磁盘上面读取,如果本次操作用到的数据没有,则会到磁盘上去寻找。这样就可以在一定程度上协议快速和慢速设备(比如:CPU和硬盘),另外cache也有换进换出机制,就是把原来经常用到,现在不常用的清除掉,这样就可以有空间放最近访问的数据了,以达到下次访问就直接从cache中读取。

buffer:

为了提高写如磁盘时的效率,其实也是为了协调快慢设备,避免造成把数据都提交到写入磁盘队列造成拥堵,因为内核把数据提交到写入队列不可能不管,它必须要等到有返回值才行。所以buffer的作用是先把数据写入(Linux中的write()函数)到buffer中,然后后台再去根据其他机制,把buffer中的数据提交到队列,最终完整同步到磁盘的过程。

我们知道用户发起的程序都会运行在内存中的用户空间内,这时候数据是放在内存中的,如果我们此时需要保存数据,这时候系统其实是先调用一个write()函数,然后再调用sync()或者fsync()函数(对于任何程序来说只要想把数据写入磁盘其过程都一样,有些也有例外)。

用户空间:常规进程所在区域,用户发起的,此区域的代码不能直接访问硬件

内核空间:操作系统所在区域,能访问硬件

当调用了write()函数时,该函数一旦返回正常值,我们可能就认为数据已经写入到了磁盘,但实际上,操作系统在实现磁盘文件的IO时,为了保证IO的效率,会在内存中使用一段专门的地址空间,该空间叫做内核空间,而内核空间之内又会有一段是用作IO的数据缓冲区(这个缓冲区就是buffer),write()函数的作用就是把数据写入到内核空间的IO缓冲区中。

内核空间的IO缓冲区也有一定大小,当该缓冲区没有写满时或者没有到一个同步周期时,会持续的把write()函数传递的数据写入到该缓冲区中,而当该缓冲区写满或者到了一个同步周期,则会把该缓冲区的内容提交到输出队列,当需要数据到达队列队首的时候,开始执行真正的磁盘IO操作,把数据写入磁盘(这里虽然用了写入磁盘,但是真正的动作不是移动而是复制,复制完成之后,内核空间的IO缓冲区才会释放该数据占用的空间)。这种方式叫做延迟写入。

所以这就会出现一个问题,当调用了write()函数后并不等于数据真的保存到了磁盘,但是这里又会有一个错觉,就是你再次请求该文件的时候,可以显示你最后一次更新的内容,其实这个内容并不是从磁盘上读取过来的,而是从用户空间的缓冲区读取的。接着刚才提到的问题,如果数据在内核空间的IO缓冲区内,而此时操作系统出现故障、断电等异常情况就会造成数据丢失。

为了解决数据丢失问题,Unix系统提供了sync、fsync和fdatasync三个函数。

函数 功能
sync 函数返回0表示成功,该函数负责把所有内核空间中IO缓冲区内修改过的内容推送到输入队列,然后就返回,它并不等待所有磁盘IO操作完成。所以即使调用了sync函数,也不等于成功保存到磁盘了。
fsync 函数返回0表示成功,与sync不同,它只会对指定文件描述符的单一文件生效,强制与该文件相连的所有修改过的数据传送到磁盘上,并且等待磁盘IO完毕,然后返回。当该函数返回0时,才真正表示成功保存到磁盘。数据库会在调用了write()之后调用fsync()。
fdatasync 它与fsync类似,它只影响文件数据部分,不涉及数据属性,比如inode信息。所以相对于fsync它需要较少的写磁盘操作。

看了上面的内容你就应该明白为什么关机前要运行一下sync命令了。

时间: 2024-10-10 07:38:29

Linux系统的数据写入机制--延迟写入的相关文章

Linux系统的快速启动机制(内核切换) 【转】

转自:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=26807463&id=4187846 原文地址:Linux系统的快速启动机制(内核切换) 作者:Renwen0524 快速启动机制:允许通过已经运行的Linux内核的上下文启动另一个Linux内核,不需要经过BIOS.BIOS可能会消耗很多时间,特别是带有众多数量的外设的大型服务器.这种办法可以为经常启动机器的开发者节省很多时间. 1.使用该机制要满足两个基本条件1)内核

Linux系统实时数据同步inotify+rsync

一.inotify简介 inotify是Linux内核的一个功能,它能监控文件系统的变化,比如删除.读.写和卸载等操作.它监控到这些事件的发生后会默认往标准输出打印事件信息.要使用inotify,Linux内核版本必须是大于2.6.13,在这之前的内核都没有这个功能.我们可以利用inotify去监控我们要监控的资源,当资源发生变化时,我们扑捉它的事件,从而触发同步数据等操作. 二.inotify软件介绍 inotify是内核的一个功能,众所周知内核的功能我们必须要配合工具才能使用,通常情况下用户

Linux系统SCSI磁盘扫描机制解析及命令实例(转)

转载请在文首保留原文出处:EMC中文支持论坛 介绍 Linux系统扫描SCSI磁盘有几种方式?Linux新增LUN之后,能否不重启主机就认出设备?如果安装了PowerPath,动态添加/删除LUN的命令是什么?本文总结了Linux主机对磁盘设备进行重新配置的方式,并附加命令实例. 更多信息 Linux系统提供多重机制以重新扫描SCSI总线并重认系统中加入的SCSI设备.在2.4内核方案中,由于动态LUN扫描机制不具备一致性,往往需要中断I/O. 2.6内核里,LUN扫描有了显著改进并添加了动态L

备份Linux系统的数据到坚果云

坚果云支持webdav,则可以在Linux下使用命令行或脚本将数据备份到坚果云空间. 开启坚果云WebDAV服务 "账户信息"--"安全选项" 方式1:使用cadaver客户端 1. 安装cadaver [[email protected] ~]# yum install cadaver 2. 使用cadaver连接webdav服务器 [[email protected] ~]# cadaver https://dav.jianguoyun.com/dav/ Aut

java web项目部署在linux系统出现第一次登录高延迟的问题

今天记录一下之前遇到的问题:项目部署在window登录能很快完成,部署到linux后,第一次登录过程变得很慢.通过查看系统日志,发现时间主要消耗在了创建session,并且定位到是SecureRandom的初始化问题,继续查看,发现session的id创建方式为uuid,到这里,熟悉linux的人就会明白问题在哪了.Java的UUID依赖于SecureRandom.nextBytes方法,而SecureRandom又依赖于操作系统提供的随机数源.在Linux系统下,它的默认依赖是/dev/ran

阿里云里面的Linux 系统挂载数据盘

转自:http://www.cnblogs.com/adjk/p/5112360.html 适用系统:非IO优化+SSD云盘Linux(Redhat , CentOS,Debian,Ubuntu)实例,IO优化实例+SSD云盘数据盘分区挂载建议使用脚本:工具:auto_fdisk_ssd.sh *  Linux的云服务器数据盘未做分区和格式化,可以根据以下步骤进行分区以及格式化操作. 下面的操作将会把数据盘划分为一个分区来使用. 1.查看数据盘 在没有分区和格式化数据盘之前,使用 “df –h”

Linux 系统挂载数据盘

适用系统:Linux(Redhat , CentOS,Debian,Ubuntu) *  Linux的云服务器数据盘未做分区和格式化,可以根据以下步骤进行分区以及格式化操作. 下面的操作将会把数据盘划分为一个分区来使用. 1.查看数据盘 在没有分区和格式化数据盘之前,使用 “df –h”命令,是无法看到数据盘的,可以使用“fdisk -l”命令查看.如下图: 友情提示:若您执行fdisk -l命令,发现没有 /dev/xvdb 表明您的云服务无数据盘,那么您无需进行挂载,此时该教程对您不适用 2

Linux系统挂载数据盘

1. 查看数据盘 在没有分区和格式化数据盘之前, 使用"df -h"命令, 是无法看到数据盘的, 可以使用"fdisk -l" 命令查看. 2. 对数据盘进行分区 执行 " fdisk /dev/xvdb "根据提示输入 "n" , "p" "1", 两次回车, "wq", 分区就开始了. 很快完成. 3. 查看新的分区 fdisk -l 4. 格式化分区 mkfs.

Linux系统下常见的数据盘分区丢失的问题以及对应的处理方法

在修复数据前,您必须先对分区丢失的数据盘创建快照,在快照创建完成后再尝试修复.如果在修复过程中出现问题,您可以通过快照回滚将数据盘还原到修复之前的状态. 前提条件 在修复数据前,您必须先对分区丢失的数据盘创建快照,在快照创建完成后再尝试修复.如果在修复过程中出现问题,您可以通过快照回滚将数据盘还原到修复之前的状态. 工具说明 在Linux实例里,您可以选择以下任一种工具修复磁盘分区并恢复数据: fdisk:Linux系统默认安装的分区工具. testdisk:主要用恢复Linux系统的磁盘分区或