当前位置: 首页 > news >正文

Rust 中 `madvise` 和 `posix_fadvise`的区别

在 Linux 操作系统中,madviseposix_fadvise 是两个用于内存管理的系统调用,它们提供了一些类似的功能,但也有一些关键的区别。以下是它们的详细对比:

madvise

madvise 是一个系统调用,用于向内核提供关于应用程序如何使用一段内存区域的建议。定义如下:

int madvise(void *addr, size_t length, int advice);
参数说明:
  • addr:指向内存区域的起始地址。
  • length:内存区域的长度。
  • advice:建议的类型,决定了内核如何管理这段内存。这些建议包括:
    • MADV_NORMAL: 默认的内存访问行为。
    • MADV_SEQUENTIAL: 预期顺序访问。
    • MADV_RANDOM: 预期随机访问。
    • MADV_WILLNEED: 预期将会需要这段内存,内核应尽早加载。
    • MADV_DONTNEED: 预期不再需要这段内存,内核可以释放。
    • 其他更多的建议类型。

posix_fadvise

posix_fadvise 是一个 POSIX 标准的函数,用于向内核提供关于文件访问模式的建议。定义如下:

int posix_fadvise(int fd, off_t offset, off_t len, int advice);
参数说明:
  • fd:文件描述符,表示要操作的文件。
  • offset:文件中的起始偏移量。
  • len:建议操作的字节数。
  • advice:建议的类型,决定了内核如何管理文件的缓存。这些建议包括:
    • POSIX_FADV_NORMAL: 默认的文件访问行为。
    • POSIX_FADV_SEQUENTIAL: 预期顺序访问。
    • POSIX_FADV_RANDOM: 预期随机访问。
    • POSIX_FADV_WILLNEED: 预期将会需要这部分文件,内核应尽早加载。
    • POSIX_FADV_DONTNEED: 预期不再需要这部分文件,内核可以释放。
    • POSIX_FADV_NOREUSE: 预期这部分文件不会被再次访问。

区别与应用场景

  1. 作用对象

    • madvise 作用于内存区域。它主要用于优化内存管理,适用于内存映射文件或匿名内存。
    • posix_fadvise 作用于文件。它主要用于优化文件 I/O 操作,适用于文件访问模式的优化。
  2. 建议类型

    • 两者的建议类型有一些重叠,比如 SEQUENTIALRANDOM,但也有一些独特的建议类型。例如,madviseMADV_DONTNEED 可以用来释放内存,而 posix_fadvisePOSIX_FADV_NOREUSE 可以用来表示不再重用这部分文件。
  3. 标准与兼容性

    • madvise 是 Linux 特有的系统调用,是 Linux 内核 API 的一部分。
    • posix_fadvise 是 POSIX 标准的一部分,因而具有更广泛的可移植性,适用于遵循 POSIX 标准的操作系统。
  4. 使用场景

    • 使用 madvise 的典型场景是对内存映射文件的优化和管理,例如数据库管理系统在管理内存映射的数据库文件时。
    • 使用 posix_fadvise 的典型场景是对文件 I/O 的优化,例如在大数据处理过程中对文件的顺序或随机访问进行优化。

示例代码

以下是一个使用 madviseposix_fadvise 的示例:

使用 madvise
use std::fs::OpenOptions;
use std::io;
use std::os::unix::io::AsRawFd;
use mmap2::{Mmap, MmapOptions};
use nix::sys::mman::{madvise, MmapAdvise};fn use_madvise(path: &str, len_of_range: usize, offset: i64) -> Result<(), io::Error> {let file = OpenOptions::new().read(true).open(path)?;let mmap = unsafe {MmapOptions::new().len(len_of_range).offset(offset as u64).map(&file)?};let mem = mmap.as_ptr();// Provide advice to the kernel about the memory usagelet ret = unsafe { madvise(mem, len_of_range, MmapAdvise::MADV_SEQUENTIAL) };if let Err(err) = ret {eprintln!("unable to madvise file {} ({})", path, err);}Ok(())
}
使用 posix_fadvise
use std::fs::OpenOptions;
use std::io;
use std::os::unix::io::AsRawFd;
use nix::fcntl::{posix_fadvise, PosixFadviseAdvice};fn use_posix_fadvise(path: &str, len_of_range: usize, offset: i64) -> Result<(), io::Error> {let file = OpenOptions::new().read(true).open(path)?;let fd = file.as_raw_fd();// Provide advice to the kernel about the file accesslet ret = posix_fadvise(fd, offset, len_of_range as i64, PosixFadviseAdvice::POSIX_FADV_SEQUENTIAL);if let Err(err) = ret {eprintln!("unable to posix_fadvise file {} ({})", path, err);}Ok(())
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 华为OD机试真题 - 多段数据压缩(Java/Python/JS/C/C++ 2024 D卷 100分)
  • Django+Vue农产品销售系统的设计与实现
  • 《探讨——关于三层架构前在前端项目的应用》第一版
  • 百望云携手春秋航空 迈入航空出行数电票新时代
  • Visual Studio Community 2022 + Win10 编译 OpenCPN 5.9.0 记录
  • 【算法每日一练及解题思路】找出模式匹配字符串的异位词在原始字符串中出现的索引下标
  • 大数据-105 Spark GraphX 基本概述 与 架构基础 概念详解 核心数据结构
  • Java算法之TimSort
  • 【面试经验】京东技术产品笔试 G
  • 生成艺术,作品鉴赏:物似主人形
  • Openldap可视化工具PhpLdapAdmin服务配置
  • 【攻防世界新手入门】simple_js
  • JVM2-JVM组成、字节码文件、类的生命周期、类加载器
  • NetSuite AI 图生代码
  • 多目标应用:基于MOPSO的移动机器人路径规划研究(提供MATLAB代码)
  • 分享一款快速APP功能测试工具
  • 「面试题」如何实现一个圣杯布局?
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • 5、React组件事件详解
  • - C#编程大幅提高OUTLOOK的邮件搜索能力!
  • EventListener原理
  • Flex布局到底解决了什么问题
  • JavaScript创建对象的四种方式
  • Js基础——数据类型之Null和Undefined
  • mysql常用命令汇总
  • node入门
  • quasar-framework cnodejs社区
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • 从零开始在ubuntu上搭建node开发环境
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 基于组件的设计工作流与界面抽象
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 前端之Sass/Scss实战笔记
  • 终端用户监控:真实用户监控还是模拟监控?
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • No resource identifier found for attribute,RxJava之zip操作符
  • k8s使用glusterfs实现动态持久化存储
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • ## 基础知识
  • #java学习笔记(面向对象)----(未完结)
  • (175)FPGA门控时钟技术
  • (二)斐波那契Fabonacci函数
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (七)Knockout 创建自定义绑定
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (限时免费)震惊!流落人间的haproxy宝典被找到了!一切玄妙尽在此处!
  • (转)jQuery 基础
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • .NET建议使用的大小写命名原则