mmap

Java I/O体系原理

℡╲_俬逩灬. 提交于 2020-01-29 00:20:15
基础概念 在介绍I/O原理之前,先重温几个基础概念: (1) 操作系统与内核 操作系统:管理计算机硬件与软件资源的系统软件内核:操作系统的核心软件,负责管理系统的进程、内存、设备驱动程序、文件和网络系统等等,为应用程序提供对计算机硬件的安全访问服务 2 内核空间和用户空间 为了避免用户进程直接操作内核,保证内核安全,操作系统将内存寻址空间划分为两部分:内核空间(Kernel-space),供内核程序使用用户空间(User-space),供用户进程使用 为了安全,内核空间和用户空间是隔离的,即使用户的程序崩溃了,内核也不受影响 3 数据流 计算机中的数据是基于随着时间变换高低电压信号传输的,这些数据信号连续不断,有着固定的传输方向,类似水管中水的流动,因此抽象数据流(I/O流)的概念:指一组有顺序的、有起点和终点的字节集合, 抽象出数据流的作用:实现程序逻辑与底层硬件解耦,通过引入数据流作为程序与硬件设备之间的抽象层,面向通用的数据流输入输出接口编程,而不是具体硬件特性,程序和底层硬件可以独立灵活替换和扩展 I/O 工作原理 1 磁盘I/O 典型I/O读写磁盘工作原理如下: tips: DMA:全称叫直接内存存取(Direct Memory Access),是一种允许外围设备(硬件子系统)直接访问系统主内存的机制。基于 DMA 访问方式,系统主内存与硬件设备的数据传输可以省去CPU

V4L2编程初体验

有些话、适合烂在心里 提交于 2020-01-28 08:20:10
内容摘要: Video for Linux two(Video4Linux2)简称V4L2,是V4L的改进版。V4L2是linux操作系统下用于采集图片、视频和音频数据的API接口,配合适当的视频采集设备和相应的驱动程序,可以实现图片、视频、音频等的采集。在远程会议、可视电话、视频监控系统和嵌入式多媒体终端中都有广泛的应用。在Linux中,视频设备是设备文件,可以像访问普通文件一样对其进行读写,摄像头在/dev/video2下。 最近想做智能机器人,想加上视频采集这个模块,于是对linux下的视频方面的编程产生了兴趣,首先从入门开始吧! 一、Video for Linux Tow 在Linux下,所有外设都被看成一种特殊的文件,成为“设备文件”,可以象访问普通文件一样对其进行读写。一般来说,采用V4L2驱动的摄像头设备文件是/dev/v4l/video0。为了通用,可以建立一个到/dev/video0的链接。V4L2支持两种方式来采集图像:内存映射方式(mmap)和直接读取方式(read)。V4L2在include/linux/videodev.h文件中定义了一些重要的数据结构,在采集图像的过程中,就是通过对这些数据的操作来获得最终的图像数据。Linux系统V4L2的能力可在Linux内核编译阶段配置,默认情况下都有此开发接口。V4L2从Linux 2.5.x版本的内核中开始出现。

file fragmentation caused by file mapping

喜夏-厌秋 提交于 2020-01-25 05:37:08
问题 I have a program (written in c) that creates 200+ files simultaneously and writes to them all simultaneously by using mmap to map them into the programs address space. Everything works fine, but when I come to back up the directory, files that are created and written in one go by the same program copy off the same disk much faster (5-10x) than those that are mapped and written a few bytes at a time. I can only imagine that this is due to some kind of file fragmentation, though I didn't think

How to get the value of huge page size?

天大地大妈咪最大 提交于 2020-01-24 13:08:08
问题 I am looking to get the value of huge page size directly from my C code without to run a bash command. From bash i can do this grep pse /proc/cpuinfo > /dev/null && echo '2M huge page size are supported' grep pdpe1gb /proc/cpuinfo> /dev/null && echo '1G huge page size are supported' Secondly how to use mmap with 1G huge page size ? thanks Update snippet code #include <stdio.h> #include <limits.h> #include <hugetlbfs.h> int main(void){ long result1 = gethugepagesize(); printf( "%d\n", result1

C++ io streams versus mmap

*爱你&永不变心* 提交于 2020-01-24 12:32:13
问题 I am starting a small project for a key-value store, in C++. I am wondering how C++ std streams compare to mmap in terms of scalability and performance. How does using ifstream::seekg on a file that wouldn't fit in RAM compare to using mmap/lseek? 回答1: Ultimately, any Linux user-land application is using syscalls(2), including the C++ I/O library. With great care , mmap and madvise (or lseek + read & posix_fadvise ) could be more efficient that C++ streams (which are using read and other

Android源码分析之SharedPreferences

谁说我不能喝 提交于 2020-01-24 02:38:07
  在Android的日常开发中,相信大家都用过SharedPreferences来保存用户的某些settings值。Shared Preferences 以键值对的形式存储私有的原生类型数据,这里的私有的是指只对你自己的app可见的,也就是说别的app是无法访问到的。 客户端代码为了使用它有2种方式,一种是通过Context#getSharedPreferences(String prefName, int mode)方法, 另一种是Activity自己的getPreferences(int mode)方法,其内部还是调用了前者只是用activity的类名做了prefName而已, 我们先来看下Conext#getSharedPreferences的内部实现。其具体实现在ContextImpl.java文件中,代码如下: @Override public SharedPreferences getSharedPreferences(String name, int mode) { SharedPreferencesImpl sp; // 这个是我们接下来要分析的重点类 synchronized (ContextImpl.class) { if (sSharedPrefs == null) { // sSharedPrefs是一个静态的ArrayMap,注意这个类型

mmap 映射的内存访问出错

倾然丶 夕夏残阳落幕 提交于 2020-01-20 12:00:24
现象 把一个打开的文件描述符,通过mmap映射到一片内存区间,对这块区间进行读写,长时间运行后出现访存错误 SIGBus Error, GDB分析相应的core出现一些内存空间不可用的错误。 问题分析 参考man mmap , 在出现下列情况下,会出错: ERRORS EBADF fd is not a valid file descriptor (and MAP_ANONYMOUS was not set). EACCES A file descriptor refers to a non-regular file. Or MAP_PRIVATE was requested, but fd is not open for reading. Or MAP_SHARED was requested and PROT_WRITE is set, but fd is not open in read/write (O_RDWR) mode. Or PROT_WRITE is set, but the file is append-only. EINVAL We don't like start or length or offset. (E.g., they are too large, or not aligned on a PAGESIZE boundary.) ETXTBSY

mmap on /proc/pid/mem

和自甴很熟 提交于 2020-01-19 06:01:49
问题 Has anybody succeeded in mmap'ing a /proc/pid/mem file with Linux kernel 2.6? I am getting an ENODEV (No such device) error. My call looks like this: char * map = mmap(NULL, PAGE_SIZE, PROT_READ, MAP_SHARED, mem_fd, offset); And I have verified by looking at the /proc/pid/maps file while debugging that, when execution reaches this call, offset has the value of the top of the stack minus PAGE_SIZE. I have also verified with ptrace that mmap is setting errno to ENODEV. 回答1: See proc_mem

mmap on /proc/pid/mem

青春壹個敷衍的年華 提交于 2020-01-19 06:01:07
问题 Has anybody succeeded in mmap'ing a /proc/pid/mem file with Linux kernel 2.6? I am getting an ENODEV (No such device) error. My call looks like this: char * map = mmap(NULL, PAGE_SIZE, PROT_READ, MAP_SHARED, mem_fd, offset); And I have verified by looking at the /proc/pid/maps file while debugging that, when execution reaches this call, offset has the value of the top of the stack minus PAGE_SIZE. I have also verified with ptrace that mmap is setting errno to ENODEV. 回答1: See proc_mem

频繁分配释放内存导致的性能问题的分析

和自甴很熟 提交于 2020-01-18 06:37:13
频繁分配释放内存导致的性能问题的分析 现象 1 压力测试过程中,发现被测对象性能不够理想,具体表现为: 进程的系统态CPU消耗20,用户态CPU消耗10,系统idle大约70 2 用ps -o majflt,minflt -C program命令查看,发现majflt每秒增量为0,而minflt每秒增量大于10000。 初步分析 majflt代表major fault,中文名叫大错误,minflt代表minor fault,中文名叫小错误。 这两个数值表示一个进程自启动以来所发生的缺页中断的次数。 当一个进程发生缺页中断的时候,进程会陷入内核态,执行以下操作: 检查要访问的虚拟地址是否合法 查找/分配一个物理页 填充物理页内容(读取磁盘,或者直接置0,或者啥也不干) 建立映射关系(虚拟地址到物理地址) 重新执行发生缺页中断的那条指令 如果第3步,需要读取磁盘,那么这次缺页中断就是majflt,否则就是minflt。 此进程minflt如此之高,一秒10000多次,不得不怀疑它跟进程内核态cpu消耗大有很大关系。 分析代码 查看代码,发现是这么写的:一个请求来,用malloc分配2M内存,请求结束后free这块内存。看日志,发现分配内存语句耗时10us,平均一条请求处理耗时1000us 。 原因已找到! 虽然分配内存语句的耗时在一条处理请求中耗时比重不大,但是这条语句严重影响了性能