目錄
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脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
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)

熱門話題

Java教學
1666
14
CakePHP 教程
1425
52
Laravel 教程
1327
25
PHP教程
1273
29
C# 教程
1253
24
Linux體系結構:揭示5個基本組件 Linux體系結構:揭示5個基本組件 Apr 20, 2025 am 12:04 AM

Linux系統的五個基本組件是:1.內核,2.系統庫,3.系統實用程序,4.圖形用戶界面,5.應用程序。內核管理硬件資源,系統庫提供預編譯函數,系統實用程序用於系統管理,GUI提供可視化交互,應用程序利用這些組件實現功能。

vscode上一步下一步快捷鍵 vscode上一步下一步快捷鍵 Apr 15, 2025 pm 10:51 PM

VS Code 一步/下一步快捷鍵的使用方法:一步(向後):Windows/Linux:Ctrl ←;macOS:Cmd ←下一步(向前):Windows/Linux:Ctrl →;macOS:Cmd →

git怎麼查看倉庫地址 git怎麼查看倉庫地址 Apr 17, 2025 pm 01:54 PM

要查看 Git 倉庫地址,請執行以下步驟:1. 打開命令行並導航到倉庫目錄;2. 運行 "git remote -v" 命令;3. 查看輸出中的倉庫名稱及其相應的地址。

notepad怎麼運行java代碼 notepad怎麼運行java代碼 Apr 16, 2025 pm 07:39 PM

雖然 Notepad 無法直接運行 Java 代碼,但可以通過借助其他工具實現:使用命令行編譯器 (javac) 編譯代碼,生成字節碼文件 (filename.class)。使用 Java 解釋器 (java) 解釋字節碼,執行代碼並輸出結果。

sublime寫好代碼後如何運行 sublime寫好代碼後如何運行 Apr 16, 2025 am 08:51 AM

在 Sublime 中運行代碼的方法有六種:通過熱鍵、菜單、構建系統、命令行、設置默認構建系統和自定義構建命令,並可通過右鍵單擊項目/文件運行單個文件/項目,構建系統可用性取決於 Sublime Text 的安裝情況。

Linux的主要目的是什麼? Linux的主要目的是什麼? Apr 16, 2025 am 12:19 AM

Linux的主要用途包括:1.服務器操作系統,2.嵌入式系統,3.桌面操作系統,4.開發和測試環境。 Linux在這些領域表現出色,提供了穩定性、安全性和高效的開發工具。

laravel安裝代碼 laravel安裝代碼 Apr 18, 2025 pm 12:30 PM

要安裝 Laravel,需依序進行以下步驟:安裝 Composer(適用於 macOS/Linux 和 Windows)安裝 Laravel 安裝器創建新項目啟動服務訪問應用程序(網址:http://127.0.0.1:8000)設置數據庫連接(如果需要)

git軟件安裝 git軟件安裝 Apr 17, 2025 am 11:57 AM

安裝 Git 軟件包括以下步驟:下載安裝包運行安裝包驗證安裝配置 Git安裝 Git Bash(僅限 Windows)

See all articles