刷新缓存区方式和刷新内存到磁盘方式总结。

  首先聊这个话题,我们先了解两个函数:

  1.printf函数

  2.write函数

  

  一.首先了解缓冲区的概念,Linux下的缓冲区分为以下三种:

  1.全缓冲,顾名思义,除非你主动刷新缓冲区,不然只能等到缓冲区满,才能刷新缓冲区。比如写入磁盘。

  2.行缓冲,当遇到‘\n‘时,刷新缓冲区,比如 C库函数。

  3.无缓冲,接受多少给多少,比如stderr。

  今天主要讲述的是行缓冲,如果想在不使用‘\n‘的情况下刷新缓存区,有下列手段——

  1.fflush()函数。

  函数原型:int fflush(FILE *stream),在这里的stream就是所要清除缓存区的文件。

  举个很简单的例子,我想模拟实现一个shell界面就会用如下方式:

printf("Myshell$[");
fflush(stdout):

  

  2.getchar()和scanf()函数。

  当我想要使用键盘与屏幕终端时,printf也会主动刷新缓冲区。

  比如:

  

  在暂停下,输出毫无反应。

  如果我加入getchar,则会出现如下情况:

  

  屏幕终端在等待我的键盘输入。同时他也刷新了输出缓冲区。

  需要说明的是,千万不要认为输入输出是同一块缓冲区,虽然可能有该系统存在,但是Linux下并不是这样的。

  

  3.setbuf()函数。

  函数原型:void setbuf(FILE* stream, char *buf);

  该函数作用就是关闭缓存区并将缓存区指向buf区域。

  看下列代码:

  

int main(void)
{
    setbuf(stdout,NULL);
    printf("hello");

    sleep(15);
    return 0;
}

  

  可以看到 在sleep过程中,也就是进程还没结束的时候,stdout缓冲区关闭且无跳转,所以直接输出。

  二.接下来再了解刷新内存内容到磁盘的几大方式:

  write()函数,它与read不同,read是直接系统调用将磁盘中的内容读到内存中。而write仅仅只是将内存中的东西写到磁盘文件的缓冲区中,至于何时将这些内容放入磁盘,得看操作系统的心情——CPU的调度,队列的优先级都是关键。

  当然也会有如下情况,我们意图立即将内容刷新至磁盘,因为可能现在在一个多用户条件下,磁盘内容极有可能马上要被别人获取。

  以下情况会立即刷新数据到磁盘:

  1.exit函数,而非_exit函数,

  exit函数的主要步骤有下面三项:

    1.调用退出处理函数。

    2.刷新输出缓存。

    3.调用_exit函数。

   

  2.return时。

  这个不用解释,当进程结束,PCB回收,当然会释放文件描述符表中的文件。

  3.缓存区满。

  4.fsync()函数。

  函数原型:int fsync(int fd);//成功返回0,出错返回-1.

  《UNIX高级环境编程》如下简单描述:

  

  

原文地址:https://www.cnblogs.com/shy0322/p/9192578.html

时间: 2024-11-08 22:53:50

刷新缓存区方式和刷新内存到磁盘方式总结。的相关文章

网络图片的获取以及二级缓存策略(Volley框架+内存LruCache+磁盘DiskLruCache)

在开发安卓应用中避免不了要使用到网络图片,获取网络图片很简单,但是需要付出一定的代价——流量.对于少数的图片而言问题不大,但如果手机应用中包含大量的图片,这势必会耗费用户的一定流量,如果我们不加以处理,每次打开应用都去网络获取图片,那么用户可就不乐意了,这里的处理就是指今天要讲的缓存策略(缓存层分为三层:内存层,磁盘层,网络层). 关于缓存层的工作,当我们第一次打开应用获取图片时,先到网络去下载图片,然后依次存入内存缓存,磁盘缓存,当我们再一次需要用到刚才下载的这张图片时,就不需要再重复的到网络

Java中基本数据类型的存储方式和相关内存的处理方式(java程序员必读经典)

1.java是如何管理内存的 java的内存管理就是对象的分配和释放问题.(其中包括两部分) 分配:内存的分配是由程序完成的,程序员需要通过关键字new为每个对象申请内存空间(基本类型除外),所有的对象都在堆(Heap)中分配空间. 释放:对象的释放是由垃圾回收机制决定和执行的,这样做确实简化了程序员的工作.但同时,它也加重了JVM的工作.因为,GC为了能够正确释放对象,GC必须监控每一个对象的运行状态,包括对象的申请.引用.被引用.赋值等,GC都需要进行监控. 2.什么叫java的内存泄露 在

Spring Cache扩展:注解失效时间+主动刷新缓存

*:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* BLOCKS =============================================================================*/ p, blockquote, ul, ol, dl, table, pre { margin: 15px 0; } /* HEAD

springboot redis-cache 自动刷新缓存

这篇文章是对上一篇 spring-data-redis-cache 的使用 的一个补充,上文说到 spring-data-redis-cache 虽然比较强悍,但还是有些不足的,它是一个通用的解决方案,但对于企业级的项目,住住需要解决更多的问题,常见的问题有 缓存预热(项目启动时加载缓存) 缓存穿透(空值直接穿过缓存) 缓存雪崩(大量缓存在同一时刻过期) 缓存更新(查询到的数据为旧数据问题) 缓存降级 redis 缓存时,redis 内存用量问题 本文解决的问题 增强 spring-data-r

浏览器中回车(Enter)和刷新的区别是什么?[转载]

在浏览器中回车和F5刷新有什么区别那?今天就来说说:浏览器中回车(Enter)和刷新的区别是什么? 这点事. 概论: 1.回车在 Expires有效的时候,是不会去请求服务器的,打开调试看到的请求也只是伪造的,比如 谷歌浏览器可能显示 200(cached)(比正常的200多了) 其实是没有发起实际的缓存,直接读取本地硬盘缓存. 2.如果按了 f5则 Expires设置不再起效果,只有Last-Modified/ETag有效果,如果在缓存期间内则返回 304,再读取本地缓存内容 3.ctrl+f

部署spring boot + Vue遇到的坑(权限、刷新404、跨域、内存)

部署spring boot + Vue遇到的坑(权限.刷新404.跨域.内存) 项目背景是采用前后端分离,前端使用vue,后端使用springboot. 工具 工欲善其事必先利其器,我们先找一个操作Linux系统的工具极力推荐FinalShell. 一眼看过去是不是感觉很方便,对内存.CPU的监控也可以实时看到,访问目录更是方便,对于Linux小白来说简直是神兵利器. 好了,我要开始入坑了. 问题一:权限不够 把vue包放到tomcat->webapps->ROOT目录下. 启动tomcat:

python 写文件刷新缓存

搞爬虫的时候,结果是通过file.write(strs)写入文件的. 带来的问题是,进程如果是被杀死的时候,最后一条结果总是缺损的,因为缓存的部分还未写入文件. 解决办法是每次写入文件时,都刷新缓存,直接将缓存数据全部写入文件: fi = open('file', 'wb') fi.write('strs') fi.flush() ...

新版本七牛刷新缓存

有时候上传apk到七牛,发现一天都没有刷新,扫码下载到的还是旧版本,这太耽误事了.经过本主仔细才知道,只要2步操作,即可手工刷新.如下: 1.打开右上角个人面版,点击刷新缓存. 2.弹出界面,复制你软件的外链到文件框,点击提交,缓存立刻被刷新了,取到最新上传的apk.

Hibernate 脏检查和刷新缓存机制

刷新缓存: Session是Hibernate向应用程序提供的操作数据库的主要接口,它提供了基本的保存,更新,删除和加载java对象的方法,Session具有一个缓存,可以管理和追踪所有持久化对象,对象和数据库中的相关记录对应,在某些时间点,Session会根据缓存中对象的变化来执行相关SQL语句,将对象包含的变化数据更新到数据库中,这一过程成为刷新缓存. 脏检查: 当刷新缓存时,Hibernate会对Session中的持久状态的对象进行检测,判断对象的数据是否发生了改变,这种判断成为脏检查,