目录
Accessing Files
Reading from a File
Read-Ahead of Files
Writing to a File
Memory Mapping
Non-Linear Memory Mapping
Direct I/O Transfer
Asynchronous I/O
首页 数据库 mysql教程 Accessing a File (Linux Kernel)

Accessing a File (Linux Kernel)

Jun 07, 2016 pm 03:36 PM
ac file kernel linux

Accessing Files Different Ways to Access a File Canonical Mode (O_SYNC and O_DIRECT cleared) Synchronous Mode (O_SYNC flag set) Memory Mapping Mode Direct I/O Mode (O_DIRECT flag set, user space - disk) Asynchronous Mode Reading a file is

Accessing Files

Different Ways to Access a File

ð  Canonical Mode (O_SYNC and O_DIRECT cleared)

ð  Synchronous Mode (O_SYNC flag set)

ð  Memory Mapping Mode

ð  Direct I/O Mode (O_DIRECT flag set, user space disk)

ð  Asynchronous Mode

 

Reading a file is always page-based: the kernel always transfers whole pages of data at once.

Allocate a new page frame -> fill the page with suitable portion of the file -> add the page to the page cache -> copy the requested bytes to the process address space

 

Writing to a file may involve disk space allocation because the file size may increase.

 

Reading from a File

/**

 * do_generic_file_read - generic file read routine

 * @filp:  the file to read

 * @ppos:        current file position

 * @desc:        read_descriptor

 * @actor:       read method

 *

 * This is a generic file read routine, and uses the

 * mapping->a_ops->readpage() function for the actual low-level stuff.

 *

 * This is really ugly. But the goto's actually try to clarify some

 * of the logic when it comes to error handling etc.

 */

static void do_generic_file_read(struct file *filp, loff_t *ppos,

                   read_descriptor_t *desc, read_actor_t actor)

 

 

Read-Ahead of Files

Many disk accesses are sequential, that is, many adjacent sectors on disk are likely to be fetched when handling a series of process’s read requests on the same file.

Read-ahead consists of reading several adjacent pages of data of a regular file or block device file before they are actually requested. In most cases, this greatly improves the system performance, because it lets the disk controller handle fewer commands. In some cases, the kernel reduces or stops read-ahead when some random accesses to a file are performed.

 

Natural language description -> design (data structure + algo) -> code

Description:

ð  Read-ahead may be gradually increased as long as the process keeps accessing the file sequentially.

ð  Read-ahead must be scaled down when or even disabled when the current access is not sequential.

ð  Read-ahead should be stopped when the process keeps accessing the same page over and over again or when almost all the pages of the file are in the cache.

 

 

 

Design:

Current window: a contiguous portion of the file consisting of pages being requested by the process

 

Ahead window: a contiguous portion of the file following the ones in the current window

 

/*

 * Track a single file's readahead state

 */

struct file_ra_state {

       pgoff_t start;                     /* where readahead started */

       unsigned int size;              /* # of readahead pages */

       unsigned int async_size;   /* do asynchronous readahead when

                                      there are only # of pages ahead */

 

       unsigned int ra_pages;            /* Maximum readahead window */

       unsigned int mmap_miss;        /* Cache miss stat for mmap accesses */

       loff_t prev_pos;          /* Cache last read() position */

};

 

 

struct file {

       struct file_ra_state    f_ra;

}

 

When is read-ahead algorithm executed?

1.     Read pages of file data

2.     Allocate a page for a file memory mapping

3.     Readahead(), posix_fadvise(), madvise()

 

Writing to a File

Deferred write

 

Memory Mapping

ð  Shared Memory Mapping

ð  Private Memory Mapping

 

System call: mmap(), munmap(), msync()

mmap, munmap - map or unmap files or devices into memory

msync - synchronize a file with a memory map

 

The kernel offers several hooks to customize the memory mapping mechanism for every different filesystem. The core of memory mapping implementation is delegated to a file object’s method named mmap. For disk-based filesystems and for block devices, this method is implemented by a generic function called generic_file_mmap().

 

 

Memory mapping mechanism depends on the demand paging mechanism.

For reasons of efficiency, page frames are not assigned to a memory mapping right after it has been created, but at the last moment that is, when the process tries to address one of its pages, thus causing a Page Fault exception.

 

Non-Linear Memory Mapping

The  remap_file_pages()  system call is used to create a non-linear mapping, that is, a mapping in which the pages of the file are mapped into a non-sequen

       tial order in memory.  The advantage of using remap_file_pages() over using repeated calls to mmap(2) is that the former approach does not require the  ker

       nel to create additional VMA (Virtual Memory Area) data structures.

 

       To create a non-linear mapping we perform the following steps:

 

       1. Use mmap(2) to create a mapping (which is initially linear).  This mapping must be created with the MAP_SHARED flag.

 

       2. Use  one  or more calls to remap_file_pages() to rearrange the correspondence between the pages of the mapping and the pages of the file.  It is possible

          to map the same page of a file into multiple locations within the mapped region.

 

 

Direct I/O Transfer

There’s no substantial difference between:

1.     Accessing a regular file through filesystem

2.     Accessing it by referencing its blocks on the underlying block device file

3.     Establish a file memory mapping

 

However, some highly-sophisticated programs (self-caching application such as high-performance server) would like to have full control of the I/O data transfer mechanism.

 

Linux offers a simple way to bypass the page cache: direct I/O transfer.

O_DIRECT

 

Generic_file_direct_IO() -> __block_dev_direct_IO(), it does not return until all direct IO data transfers have been completed.

 

 

Asynchronous I/O

“Asynchronous” essentially means that when a User Mode process invokes a library function to read or write a file, the function terminates as soon as the read or write operation has been enqueued, possibly even before the real I/O data transfer takes place. The calling process thus continue its execution while the data is being transferred.

 

aio_read(3), aio_cancel(3), aio_error(3), aio_fsync(3), aio_return(3), aio_suspend(3), aio_write(3)

 

Asynchronous I/O Implementation

ð  User-level Implementation

ð  Kernel-level Implementation

 

User-level Implementation:

Clone the current process -> the child process issues synchronous I/O requests -> aio_xxx terminates in parent process

 

io_setup(2), io_cancel(2), io_destroy(2), io_getevents(2), io_submit(2)

 

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

deepseek网页版入口 deepseek官网入口 deepseek网页版入口 deepseek官网入口 Feb 19, 2025 pm 04:54 PM

DeepSeek 是一款强大的智能搜索与分析工具,提供网页版和官网两种访问方式。网页版便捷高效,免安装即可使用;官网则提供全面产品信息、下载资源和支持服务。无论个人还是企业用户,都可以通过 DeepSeek 轻松获取和分析海量数据,提升工作效率、辅助决策和促进创新。

deepseek怎么安装 deepseek怎么安装 Feb 19, 2025 pm 05:48 PM

DeepSeek的安装方法有多种,包括:从源码编译(适用于经验丰富的开发者)使用预编译包(适用于Windows用户)使用Docker容器(最便捷,无需担心兼容性)无论选择哪种方法,请仔细阅读官方文档并充分准备,避免不必要的麻烦。

如何解决Linux终端中查看Python版本时遇到的权限问题? 如何解决Linux终端中查看Python版本时遇到的权限问题? Apr 01, 2025 pm 05:09 PM

Linux终端中查看Python版本时遇到权限问题的解决方法当你在Linux终端中尝试查看Python的版本时,输入python...

BITGet官方网站安装(2025新手指南) BITGet官方网站安装(2025新手指南) Feb 21, 2025 pm 08:42 PM

BITGet 是一款加密货币交易所,提供各种交易服务,包括现货交易、合约交易和衍生品。该交易所成立于 2018 年,总部位于新加坡,致力于为用户提供安全可靠的交易平台。BITGet 提供多种交易对,包括 BTC/USDT、ETH/USDT 和 XRP/USDT。此外,该交易所还在安全性和流动性方面享有盛誉,并提供多种功能,如高级订单类型、杠杆交易和 24/7 全天候客户支持。

gate.io安装包免费拿 gate.io安装包免费拿 Feb 21, 2025 pm 08:21 PM

Gate.io是一款受欢迎的加密货币交易所,用户可通过下载其安装包并安装在设备上使用。获取安装包步骤如下:访问Gate.io官方网站,点击“下载”,选择对应操作系统(Windows、Mac或Linux),将安装包下载至计算机。安装过程中建议暂时禁用杀毒软件或防火墙,确保安装顺利。完成后,用户需创建Gate.io账户以开始使用。

如何在系统重启后自动设置unixsocket的权限? 如何在系统重启后自动设置unixsocket的权限? Mar 31, 2025 pm 11:54 PM

如何在系统重启后自动设置unixsocket的权限每次系统重启后,我们都需要执行以下命令来修改unixsocket的权限:sudo...

欧易okx安装包直接进 欧易okx安装包直接进 Feb 21, 2025 pm 08:00 PM

欧易 OKX,全球领先的数字资产交易所,现推出官方安装包,提供安全便捷的交易体验。欧易 OKX 安装包无需通过浏览器访问,可直接在设备上安装独立应用程序,为用户打造稳定高效的交易平台。安装过程简便易懂,用户只需下载最新版本安装包,按照提示一步步操作即可完成安装。

欧易交易所下载官方入口 欧易交易所下载官方入口 Feb 21, 2025 pm 07:51 PM

欧易,又称OKX,是一个全球领先的加密货币交易平台。文章提供了欧易官方安装包的下载入口,方便用户在不同设备上安装欧易客户端。该安装包支持 Windows、Mac、Android 和 iOS 系统,用户可根据自己的设备类型选择相应版本下载。安装完成后,用户即可注册或登录欧易账户,开始交易加密货币和享受平台提供的其他服务。

See all articles