首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

/dev/shm中的文件在使用ftruncate增长但未写入时是否占用内存?

在Linux系统中,/dev/shm是一个特殊的文件系统,它允许进程在内存中共享数据。在这个文件系统中创建的文件可以被多个进程同时访问,而不需要进行磁盘I/O操作。

对于/dev/shm中的文件,在使用ftruncate函数增长但未写入数据时,不会占用实际的物理内存。ftruncate函数用于改变文件的大小,但并不会分配实际的内存空间来存储文件内容。因此,当文件增长但未写入数据时,操作系统只会为文件分配一个虚拟内存地址空间,而不会分配实际的物理内存。

只有当进程开始向文件写入数据时,操作系统才会将虚拟内存映射到物理内存,并分配相应的物理内存页来存储数据。这种延迟分配的机制可以提高性能和效率,避免不必要的内存占用。

总结起来,/dev/shm中的文件在使用ftruncate增长但未写入时不会占用实际的物理内存,只会占用一部分虚拟内存地址空间。只有当文件开始写入数据时,才会分配实际的物理内存来存储数据。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 腾讯云云数据库 MySQL 版:https://cloud.tencent.com/product/cdb_mysql
  • 腾讯云云原生容器服务(TKE):https://cloud.tencent.com/product/tke
  • 腾讯云云存储(COS):https://cloud.tencent.com/product/cos
  • 腾讯云区块链服务(BCS):https://cloud.tencent.com/product/bcs
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Linux进程间通信:共享内存 (下)

现在绝大多数Linux系统都有一个叫做/dev/shmtmpfs目录,就是这样一种存在。具体使用方法,大家可以参考我另一篇文章《Linux内存Cache真的能被回收么?》。...Linux提供POSIX共享内存,实际上就是/dev/shm下创建一个文件,并将其mmap之后映射其内存地址即可。...使用ftruncate方法来设置“共享内存大小。其实就是更改文件长度。 要以共享方式做mmap映射,并且指定文件描述符为shmfd。 shm_unlink实际上就是unlink系统调用封装。...上面说过,实际上POSIX共享内存就是/dev/shm目录一个tmpfs格式文件,所以shm_open无非就是open系统调用封装,所以起函数使用参数几乎一样。...使用ftruncate设置共享内存大小,实际上就是对tmpfs文件进行指定长度截断。使用fchmod、fchown、fstat等系统调用修改和查看相关共享内存属性。

8K12

linux网络编程之POSIX 共享内存和 系列函数

共享内存简单来说就是一块真正物理内存区域,可以使用一些函数将这块区域映射到进程地址空间进行读写,而posix 共享内存与system v 共享内存不同是它是用虚拟文件系统(tmpfs)实现,已经挂载...mode:此参数总是需要设置,如果oflag没有指定了O_CREAT,可以指定为0 返回值:成功返回非负整数文件描述符;失败返回-1 注意,不存在所谓shm_close 函数,可以直接使用close...功能:修改共享内存对象大小,shm_open不像shmget一样可以设置共享内存大小,但可以使用ftruncate 设置大小。...;失败返回-1 在前面曾经介绍了mmap 函数 将文件映射到进程地址空间作用,其实它还可以将共享内存对象映射到进程地址空间,类似shmat作用,只是传入文件描述符fd 是shm_open 返回...shm/xyz  -rw-rw-r-- 1 simba simba 36 Jun 16 15:01 /dev/shm/xyz 即创建了一个36字节共享内存段,/dev/shm 目录下。

1.7K00

Linux进程间通信(四) - 共享内存

共享内存内容往往是解除映射时才写回文件。因此,采用共享内存通信方式效率是非常高。 ? ?...Linux 2.6.x,对于POSIX信号量和共享内存名字会在/dev/shm下建立对应路径名 [root@rocket shm]# ll /dev/shm/|grep mem -rwxr-xr-x...内核保证shmget获得或创建一个共享内存区,初始化该共享内存区相应shmid_kernel结构注同时,还将在特殊文件系统shm,创建并打开一个同名文件,并在内存建立起该文件相应dentry及...同时,shmid_kernel结构file类型指针shm_file指向文件系统shm相应文件,这样,共享内存区域就与shm文件系统文件对应起来。...由于调用shmget()时,已经创建了文件系统shm一个同名文件与共享内存区域相对应,因此,调用shmat()过程相当于映射文件系统shm同名文件过程,原理与mmap()大同小异。

7K61

linux无文件执行— fexecve 揭秘

memfd_create 和 fexecve 1 . memfd_create:允许我们在内存创建一个文件,但是它在内存存储并不会被映射到文件系统,至少,如果映射了,我是没找到,因此不能简单通过...0; } 代码主要是分为了三步: 首先通过shm_open函数 /dev/shm创建了wurstverschwendung文件 将ls 命令文件写入到wurstverschwendung文件 通过...fexecve执行wurstverschwendung文件,因为/dev/shm内存,因此fexecve实际上是在内存执行文件。...对fexecve_test.c 进行编译并执行,可以看到/dev/shm下面确实生成了wurstverschwendung文件。 ? 调试角度 fexecve是如何执行内存文件呢?...大家可以看到shmopen 其实是/dev/shm创建文件,而execve执行文件为/proc/self/fd/3,为进程打开文件符号链接,这个指向就是shm_open创建文件,但是从监控execve

4.5K40

一种C程序使用IPC多进程共享内存并实现热迁移方法

软件,术语共享内存指可被多个进程存取内存,一个进程是一段程序单个运行实例。在这种情况下,共享内存被用作进程间通讯。...——WikiPedia Linux系统,有多种C语言支持共享内存使用方法,包括以下几种: 基于传统 SYS V 共享内存; 基于 POSIX mmap 文件映射实现共享内存; 通过 memfd_create...CRIU 是用于 Linux 操作系统软件工具。使用此工具,可以冻结正在运行应用程序,并将其作为文件集合检查点到持久性存储。然后,人们可以使用这些文件从冻结点还原并运行应用程序。...之后可以 /dev/shm/ 、 /run/shm 下面看到一个文件。.../migrate_imgs/ -j -t 4763 # 略去拷贝快照文件步骤,自行拷贝至目标机器任意位置即可 # 拷贝共享内存文件至目标位置 $ scp /dev/shm/posixsm root

1.2K20

基础拾遗--【转】df与du不一致情况分析

506M 0 506M 0% /dev/shm 模拟某个进程正在使用文件: # tail -f /tmp/test.iso 2、删除该文件 打开另一个终端,登陆到系统。...y # ls /tmp/test.iso ls: /tmp/test.iso: 没有那个文件或目录 查看是否还有进程使用(注意结尾标记): 引用 # lsof |grep test.iso tail...二、说明 从上面的实验,可得出一些情况: 引用 1、若有进程占用某个文件,而其他进程把这文件删掉,只会删除其磁盘标记,而不会释放其占用磁盘空间;直到所有访问该文件进程退出为止; 2、df 是从内核获取磁盘占用情况数据...三、解决问题 通常解决方法有两个: 1、把占用文件相关进程关闭 这可通过下面的命令得到这些已被删除,但未释放空间文件和进程信息: # lsof |grep deleted 找到这些进程后,安全情况下把其关闭...,这样文件叫 'sparse file',即文件空洞 容易发生在一个进程一个文件,这是人工进行清空文件操作,就会产生。

82570

POSIX共享内存

很大程度上提高了系统效率和代码简洁性。 使用mmap函数主要目的是: 对普通文件提供内存映射I/O,可以提供无亲缘进程间通信; 提供匿名内存映射,以供亲缘进程间进行通信。  ...Linux也定义了一些非标准标志,例如MAP_ANONYMOUS(MAP_ANON),MAP_LOCKED等,具体参考Linux手册。 fd:有效文件描述符。...通过匿名内存映射提供亲缘进程间通信 我们可以通过父进程fork之前指定MAP_SHARED调用mmap,通过映射一个文件来实现父子进程间通信,POSIX保证了父进程内存映射关系保留到子进程,父子进程对内存映射区修改双方都可以看到...POSIX共享内存使用方法有以下两个步骤: 通过shm_open创建或打开一个POSIX共享内存对象 然后调用mmap将它映射到当前进程地址空间 和通过内存映射文件进行通信使用上差别在于mmap描述符参数获取方式不一样...Linux 2.6.18,对于POSIX信号量和共享内存名字会在/dev/shm下建立对应路径名,例如上面的测试代码,会生成如下路径名: # ll /dev/shm/ total 8 -rw-r

2.8K10

unix共享内存要点

2.随内核持续     *nix共享内存有两套API:Posix和System V     两者主要差别是共享内存大小         1.Posix共享内存大小可通过函数ftruncate随时修改...,int fd,off_t offset)     函数将一个句柄映射到内存,这个句柄可以是open文件句柄,也可以是shm_open共享内存区对象。    ...*nix一切皆文件观点,shm_open也是/dev/shm目录下创建一个文件对象,返回对象描述符。    ...mmap将句柄作为共享内存底层支撑对象,映射到内存,这样可以不通过read、write进程之间共享内存。由此推测一下,*nix进程间传 递数据更加原始方法是进程间读写一个文件。...V共享内存有大小限制,所以可考虑,使用共享内存数组来解决这个问。

870100

unix共享内存要点

2.随内核持续     *nix共享内存有两套API:Posix和System V     两者主要差别是共享内存大小         1.Posix共享内存大小可通过函数ftruncate随时修改...,int fd,off_t offset)     函数将一个句柄映射到内存,这个句柄可以是open文件句柄,也可以是shm_open共享内存区对象。    ...*nix一切皆文件观点,shm_open也是/dev/shm目录下创建一个文件对象,返回对象描述符。    ...mmap将句柄作为共享内存底层支撑对象,映射到内存,这样可以不通过read、write进程之间共享内存。由此推测一下,*nix进程间传 递数据更加原始方法是进程间读写一个文件。...V共享内存有大小限制,所以可考虑,使用共享内存数组来解决这个问。

89850

Linux 进程间通信:信号量

我们结合例子来看一下它们使用,我们用sem实现一套互斥锁,这套锁除了可以锁文件,也可以用来给共享内存加锁,我们可以用它来保护上面共享内存使用临界区。...跟POSIX共享内存类似,信号量也会在/dev/shm目录下创建一个文件,如果有这个文件名就是一个命名信号量。其它进程可以通过这个文件名来通过sem_open方法使用这个信号量。...匿名内存初始化方法跟sem_open不一样,sem_init要求对一段已有内存进行初始化,而不是/dev/shm下产生一个文件。...这就要求:如果信号量是一个进程多个线程中使用,那么它所在内存区应该是这些线程应该都能访问到全局变量或者malloc分配到内存。...如果是多个进程间共享,那么这段内存应该本身是一段共享内存使用mmap、shmget或shm_open申请内存)。

6.6K01

Linux内核编程--内存映射和共享内存

一,内存映射 对于磁盘文件和进程: 将一个文件或其它对象映射到进程地址空间,实现文件磁盘存储地址和进程地址空间中一段虚拟地址映射关系。...一般用信号量来同步共享内存访问。 共享内存系统存储位置: 为什么要用共享内存: 对于涉及到内核操作,内核和进程之间,经历了四次复制操作,开销很大。...若失败,返回-1 2.销毁共享内存 int shm_unlink(const char *name); 3.修改共享内存大小(还可以修改文件大小) int ftruncate(int fd, off_t...length) 处理mmap时候,普通文件或共享内存区对象大小都可以通过调用ftruncate修改。...若失败,返回-1 两个版本微小差异:Posix共享内存区对象大小可在任意时刻由ftruncate函数修改,System V共享内存区对象大小是调用shmget创建时固定下来

5.9K10

宋宝华:世上最好共享内存(Linux共享内存最透彻一篇)

Linux敲ipcs命令看到share memory就是这种共享内存: ? 下面一个最简单程序来看共享内存端sw.c: ? 以及共享内存读端sr.c: ? 编译和准备运行: ?...理论上,共享内存属于匿名页,但是由于这里面有个非常特殊tmpfs(/dev/shm指向/run/shm,/run/shm则mount为tmpfs): ?...这样我们会在/dev/shm/、/run/shm下面看到一个文件: ?...所以,当你Linux里面编程时候,碰到这样场景:需要一个fd,当成文件一样操作,但是又不需要真实地位于文件系统,那么,就请立即使用memfd_create()吧,它manual page是这样描述...上图中,进程A访问设备A并获得其使用bufferfd,之后通过socket把fd发送给进程B,而后进程B导入fd到设备B,B获得对设备Abuffer共享访问。

39.5K1311

一次诡异磁盘空间占用问题排查

/dev/shm /dev/xvdb1 50G 45G 5.3G 90% /home   然后cd到home目录下,来看看哪个文档比较大,我最常用命令就是du -h...#所有文件占用总空间   这就很诡异了,上面提示我/home目录已使用45G,实际上只用了1.9G,无果。...*文件(有时候也是小文件太多,导致磁盘满),依旧无果,额。。。已有知识有点不够用了。   看了下监控系统,发现磁盘占用空间一直增长,肯定一直是有什么进程文件,那我就看看服务器上进程吧。...优先排除是nginx-proxy问题后,我查到node进程pid是 10163,让我来看下这鬼进程哪些文件使用如下命令。...峰回路转,突然服务器上发现了重启进程脚本,重启后再用df命令查看磁盘使用率,降到10%了。   总结一下,如何避免以后出现类似的情况。

2K40

JAVA 应用线上故障排查手册

new native thread 这个意思是没有足够内存空间给线程分配 Java 栈,基本上还是线程池代码有问题,比如说忘记 shutdown,所以说应该首先从代码层面来寻找问题, 使用 jstack...首先堆外内存溢出表现就是物理常驻内存增长快,报错的话视使用方式都不确定, 如果由于使用 Netty 导致,那错误日志里可能会出现OutOfDirectMemoryError错误,注意一下是否是线程阻塞了...堆外内存溢出往往是和 NIO 使用相关,一般先通过 pmap 来查看下进程占用内存情况pmap -x pid | sort -rn -k3 | head -30, 这段意思是查看对应 pid 倒序前...这边可以再一段时间后再跑一次命令看看内存增长情况,或者和正常机器比较可疑内存段在哪里。...晋升失败: GC 时候没有足够内存供存活/晋升对象使用,所以触发了 Full GC。

58420

libatbus 大幅优化

符号隐藏和DLL导出 之前时候没太注意跨平台符号这块,所以都是建议使用静态库。...我们前段时间预研了一段时间Unreal Engine引擎,涉及一个问题就是把服务器通信组件集成到Unreal Engine,然后使用Unreal EngineDedicated Server和我们自己服务器通信...切到protobuf之前,我还考虑过使用flatbuffer,写了个简单对比,有兴趣童鞋可以看看 《protobuf、flatbuffer、msgpack 针对小数据包简单对比》 。...支持使用字符串路径共享内存通道 现在支持字符串路径共享内存(使用: shm_open/ftruncate/mmap/munmap/shm_unlink/close/fstat 来管理),支持字符串命名共享内存...另外linux下英文功能内存会放 tmpfs 目录 /dev/shm 里,可以建立子目录。但是为了统一跨平台兼容性,我还是没有支持多级目录

97620

JDK核心JAVA源码解析(5) - JAVA File MMAP原理解析

缺页中断:当程序试图访问已映射在虚拟地址空间中但未被加载至物理内存一个分页时,由MMC发出中断。如果操作系统判断此次访问是有效,则尝试将相关页从虚拟内存文件载入物理内存。 2....fd, Runnable unmapper),而且是通过反射,所以没走到sun对于DirectMemory使用统计 我们可以代码添加查看直接内存占用代码来看是否占用,这个参考我系列上一篇文章...Rss:表示该映射区域当前物理内存占用了多少空间  Pss:该虚拟内存区域平摊计算后使用物理内存大小(有些内存会和其他进程共享,例如mmap进来)。...proc下相关控制参数: /proc/sys/vm/dirty_ratio: 这个参数控制一个进程文件系统文件系统缓冲区大小,单位是百分比,表示系统内存百分比,表示当一个进程缓冲使用到系统内存多少时候...,所以如果你每次内存映射文件后都调用force()方法,你就不能真正从内存映射文件获益,而是跟disk IO差不多。

1.2K20

索引构建磁盘IO太高,巧用tmpfs让内存来帮忙

文本索引构建这种需要大量占用磁盘IO任务,如果正巧你内存还有点余粮,是否可以先索引存储到内存,然后再顺序写入到磁盘呢?...,需要大量占用磁盘IO,如果正巧你内存还有点余粮,是否可以先索引存储到内存,然后再顺序写入到磁盘呢? 将Linux内存变为磁盘,可以通过tmpfs文件系统实现。...tmpfs介绍 以下是ChatGPT介绍: tmpfs文件系统是Linux内核自带一种内存文件系统,它可以将内存空间作为虚拟磁盘使用。...使用tmpfs文件系统将内存变为磁盘,可以通过以下步骤实现: 创建一个tmpfs文件系统: sudo mkfs.tmpfs -m 100M -o size=100M /dev/shm/mydisk...挂载tmpfs文件系统: sudo mount -t tmpfs /dev/shm/mydisk /mnt/mydisk 这条命令将/dev/shm/mydisk设备上tmpfs文件系统挂载到/mnt

10910
领券