前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >linux系统调用之sync源码解析(基于linux0.11)

linux系统调用之sync源码解析(基于linux0.11)

作者头像
theanarkh
发布2019-05-14 12:22:20
2.8K0
发布2019-05-14 12:22:20
举报
文章被收录于专栏:原创分享

我们知道write函数写入的数据不是实时同步硬盘的,系统提供了一个函数让我们的数据可以实时地同步到硬盘,那就是sync。但这个实时也是相对的,毕竟同步数据也需要时间的,如果正在同步,就断电,那同步就会失败。

代码语言:javascript
复制
int sys_sync(void)
{
    int i;
    struct buffer_head * bh;
    // 把所有inode写入buffer,等待回写,见下面代码
    sync_inodes();      /* write out inodes into buffers */
    bh = start_buffer;
    for (i=0 ; i<NR_BUFFERS ; i++,bh++) {
        wait_on_buffer(bh);
        if (bh->b_dirt)
            // 请求底层写硬盘操作,等待底层驱动回写到硬盘,不一定立刻写入
            ll_rw_block(WRITE,bh);
    }
    return 0;
}

我们先看sync_inode。该函数把inode table里的,即进程打开的文件对应的inode节点,写入到buffer里。

代码语言:javascript
复制
// 遍历所有inode,从硬盘读包括该inode的数据块,然后用内存的inode覆盖硬盘读进来的,存在buffer里,等待回写    
void sync_inodes(void)
{
    int i;
    struct m_inode * inode;

    inode = 0+inode_table;
    for(i=0 ; i<NR_INODE ; i++,inode++) {
        wait_on_inode(inode);
        // 管道的内容存放在内存,所以不需要同步
        if (inode->i_dirt && !inode->i_pipe)
            write_inode(inode);
    }
}
// 先把inode从硬盘中读进来,然后覆盖,等待回写
static void write_inode(struct m_inode * inode)
{
    struct super_block * sb;
    struct buffer_head * bh;
    int block;

    lock_inode(inode);
    if (!inode->i_dirt || !inode->i_dev) {
        unlock_inode(inode);
        return;
    }
    if (!(sb=get_super(inode->i_dev)))
        panic("trying to write inode without device");
    // 算出inode的块号,2 + inode位图块数 + 块位图块数 + inode的相对偏移
    block = 2 + sb->s_imap_blocks + sb->s_zmap_blocks +
        (inode->i_num-1)/INODES_PER_BLOCK;
    // 读入包含该inode的整个数据块
    if (!(bh=bread(inode->i_dev,block)))
        panic("unable to read i-node block");
    // 找到数据块中inode所属的位置,写到高速缓存等待回写到硬盘
    ((struct d_inode *)bh->b_data)
        [(inode->i_num-1)%INODES_PER_BLOCK] =
            *(struct d_inode *)inode;
    bh->b_dirt=1;
    inode->i_dirt=0;
    brelse(bh);
    unlock_inode(inode);
}

把inode写入到buffer里后,就遍历buffer,需要回写到硬盘的则通过ll_rw_block请求驱动进行回写操作。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-05-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 编程杂技 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档