精华内容
下载资源
问答
  • 直写和回写 千次阅读
    2019-12-07 20:20:45

    目录

    直写(Write Through)

    回写(Write Back)

    总结


    直写式和回写式是缓冲区内存的两种工作方式。

    直写(Write Through)

    当 CPU 要将数据写入内存时,除了更新缓冲内存上的数据外,还要数据写在 DRAM 中,以维持主存与缓冲内存的一致性,当要写入内存的数据一多 ,速度自然就慢了下来。

    在直写式规定中,处理器会直接将高速缓存中的数据写入主内存。直至将数据存储至主内存,写入循环才能完成。

    回写(Write Back)

    当 CPU 要将数据写入内存时 ,只会先更新缓冲内存上的数据, 随后再让缓冲内存在总线不塞车的时候 ,才把数据写回 DRAM 所以速度自然快得多。

    在回写式规定中,高速缓存将充当缓冲区。处理器开始写入循环时,高速缓存将接收数据并停止循环。当系统总线可用时,高速缓存再将数据写回主内存。

    总结

    两种方式各有利弊,直写缓存方法利用了高速缓存中的数据始终与主存储器中数据匹配的特点。但是,需要的总线周期却非常耗时,从而降低性能。回写缓存可以维持性能,因为写入始终是在“爆发”中进行的,因而运行所需的总线周期将大大减少。

    更多相关内容
  • 有人说无盘配套别的虚拟盘借助不了本身无盘的回写功能,此版本带您实现锐起、网众等众多无盘回写,虚拟盘做到零回写教程和工具。
  • MyBatis 实现主键回写

    千次阅读 2018-06-26 23:55:42
    useGeneratedKeys:开启主键回写 keyColumn:主键列名(既数据库表中的列名) keyProperty:主键对应的属性名(实体中的属性名) 插入数据时,传过来的参数是一个对象,#{***}中的名字必须与对象中属性名一致 -->...

    当我们向数据库插入数据时,主键是设置的自增的,但是我们插入好数据库后,我们希望得到刚刚插入的数据的主键,mybatis可以实现这样的功能
    应用场景:
    员工与部门,当新员工进公司,该员工肯定属于某个部门,插入数据的时候,要告诉部门表,这个员工属于哪个部门

    数据库表

    这里写图片描述

    mapper.xml文件代码

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper
      PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
      "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="UserDaoMapper">
    
        <!-- 插入statement 
            useGeneratedKeys:开启主键回写
            keyColumn:主键列名(既数据库表中的列名)
            keyProperty:主键对应的属性名(实体中的属性名)
            插入数据时,传过来的参数是一个对象,#{***}中的名字必须与对象中属性名一致
        -->
        <insert id="saveUser" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
            INSERT INTO tb_user (
                user_name,
                password,
                name,
                age,
                sex,
                birthday,
                created,
                updated
            )
            VALUES(
                #{userName},
                #{password},
                #{name},
                #{age},
                #{sex},
                #{birthday},
                NOW(),
                NOW()
            )
        </insert>
    </mapper>

    mybatis-config.xml文件代码

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE configuration
      PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
      "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
        <!-- 引入外部属性资源 -->
      <properties resource="jdbc.properties"  />
    
      <settings>
      <!-- 设置驼峰匹配 -->
        <setting name="mapUnderscoreToCamelCase" value="true" />
      </settings>
      <typeAliases>
        <!-- package 扫描该包下的类,别名就是类名-->
        <package name="cn.itcast.domain"/>
      </typeAliases>
        <environments default="development" >
            <environment id="development">
                <transactionManager type="JDBC" />
                <dataSource type="POOLED">
                    <!-- 指定驱动类 -->
                    <property name="driver" value="${jdbc.driverClass}" />
                    <!-- 指定连接地址 -->
                    <property name="url" value="${jdbc.url}" />
                    <!-- 指定数据库登录用户 -->
                    <property name="username" value="${jdbc.username}" />
                    <!-- 数据库密码 -->
                    <property name="password" value="${jdbc.password}" />
                </dataSource>
            </environment>
        </environments>
        <!-- 引入map文件 -->
        <mappers>
            <mapper resource="UserDaoMapper.xml"/>
        </mappers>
    </configuration>

    jdbc.properties文件

    jdbc.driverClass=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql://localhost:3306/mybatis
    jdbc.username=root
    jdbc.password=123

    Test测试类

    
    public class UserDaoTest {
        private SqlSession sqlSession;
    
        @Before
        public void setUp() throws IOException {
            // 加载mybatis-config.xml文件
            InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
            // 创建sqlSessionFactory的构造器
            SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
            // 创建sqlSession工厂
            SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
            // 通过工厂生成sqlSession
            sqlSession = sqlSessionFactory.openSession();
    
        }
        @Test
        /**
         * 插入用户信息
         * @throws IOException
         */
        public void inserUser() throws IOException {
            UserDao dao = new UserDaoImpl(sqlSession);
            User user =new User();
            user.setUserName("jiumozhi");
            user.setPassword("123456");
            user.setName("鸠摩智");
            user.setAge(30);
            user.setSex(1);
            user.setBirthday(new Date());
            dao.saveUser(user);
    
            System.out.println(user);
    
        }
    }
    

    dao层方法

    @Override
        public void saveUser(User user) {
            sqlSession.insert("UserDaoMapper.saveUser", user);
            sqlSession.commit();
            sqlSession.close();
        }

    展示结果

    这里写图片描述
    这里写图片描述

    展开全文
  • 直写与回写

    千次阅读 2018-01-19 11:13:56
    概念定义:直写式 WT,Write Through 与 回写式 WB,Write Back 指的是缓冲内存的工作方式 直写式缓存方式是 当 CPU 要将数据写入内存时 除了更新缓冲内存上的数据外也将数据写在 DRAM 中 以维持主存与缓冲内存的一致性...
    概念定义:
    直写式 WT,Write Through 与 回写式 WB,Write Back 指的是缓冲内存的工
    作方式 直写式缓存方式是 当 CPU 要将数据写入内存时 除了更新缓冲内存上的数据外
    也将数据写在 DRAM 中 以维持主存与缓冲内存的一致性 当要写入内存的数据一多 速度
    自然就慢了下来 回写式的缓存方式是 每当 CPU 要将数据写入内存时 只会先更新缓冲内
    存上的数据 随后再让缓冲内存在总线不塞车的时候 才把数据写回 DRAM 所以速度自然
    快得多
    白皮书规定:
    在回写式规定中,高速缓存将充当缓冲区。处理器开始写入循环时,高速缓存将接收数据并停止循环。当系统总线可用时,高速缓存再将数据写回主内存。
    在直写式规定中,处理器会直接将高速缓存中的数据写入主内存。直至将数据存储至主内存,写入循环才能完成。
    优劣分析:
    两种方式各有利弊,直写缓存方法利用了高速缓存中的数据始终与主存储器中数据匹配的特点。但是,需要的总线周期却非常耗时,从而降低性能。回写缓存可以维持性能,因为写入始终是在“爆发”中进行的,因而运行所需的总线周期将大大减少。
    展开全文
  • 脏页回写

    千次阅读 2016-03-01 23:13:15
    由于页高速缓存的缓存作用,操作实际上会被延迟。当页高速缓存中的数据比后台存储的数据更新时,那么该数据就被称为脏数据。在内存中积累起来的页最终必须被写回磁盘。在以下两种情况发生时,脏页被写回磁盘: ...
    由于页高速缓存的缓存作用,写操作实际上会被延迟。当页高速缓存中的数据比后台存储的数据更新时,那么该数据就被称为脏数据。在内存中积累起来的页最终必须被写回磁盘。在以下两种情况发生时,脏页被写回磁盘:

    1. 当空闲的内存低于一个特定的阈值时,内核必须将脏页写回磁盘,以便释放内存。

    2. 当脏页在内存中驻留时间超过一个特定的阈值时,内核必须将超时的脏页写回磁盘,以确保脏页不会无限期地驻留在内存。

       在老内核中,这是由两个独立的内核线程分别完成。但是在2.6版本中,由一组内核线程统一执行这两种工作---pdflush后回写线程。这两个目标是如何实现的?

       首先,pdflush线程在系统中的空闲内存低于一个阈值时,将脏页刷新回磁盘。该后台回写例程的目的在于在可用物理内存过低时,释放脏页以重新获得内 存。特定的内存与之可以通过dirty_background_ratio sysctl系统调用设置(看kernel/Sysctl.c)。

      

    1. 在mm/Page_writeback.c中
    2. /* Start background writeback (via pdflush) at this percentage
    3.  */
    4. int dirty_background_ratio = 10;

       当空闲内存比阈值dirty_background_ratio还低时,内核便会调用函数wakeup_bdflush()唤醒一个pdflush线程,随后pdflush线程进一步调用函数background_writeout()开始将脏页写回磁盘。该函数的参数指定试图写回的页面数目,该函数会连续的写出数据,直到满足一下两个条件:

    1. 已经有指定的最小数据的页被写出到磁盘

    2. 空闲内存数已经回升,超过阈值dirty_background_ratio

    1. 在mm/Page-writeback.c中
    2. /*
    3.  * writeback at least _min_pages, and keep writing until the amount of dirty
    4.  * memory is less than the background threshold, or until we're all clean.
    5.  */
    6. static void background_writeout(unsigned long _min_pages)
    7. {
    8.     long min_pages = _min_pages;
    9.     struct writeback_control wbc = {
    10.         .bdi        = NULL,
    11.         .sync_mode  = WB_SYNC_NONE,
    12.         .older_than_this = NULL,
    13.         .nr_to_write    = 0,
    14.         .nonblocking    = 1,
    15.         .range_cyclic   = 1,
    16.     };
    17.     for ( ; ; ) {
    18.         long background_thresh;
    19.         long dirty_thresh;
    20.         get_dirty_limits(&background_thresh, &dirty_thresh, NULL);
    21.         if (global_page_state(NR_FILE_DIRTY) +
    22.             global_page_state(NR_UNSTABLE_NFS) < background_thresh
    23.                 && min_pages <= 0)
    24.             break;
    25.         wbc.encountered_congestion = 0;
    26.         wbc.nr_to_write = MAX_WRITEBACK_PAGES;
    27.         wbc.pages_skipped = 0;
    28.         writeback_inodes(&wbc);
    29.         min_pages -= MAX_WRITEBACK_PAGES - wbc.nr_to_write;
    30.         if (wbc.nr_to_write > 0 || wbc.pages_skipped > 0) {
    31.             /* Wrote less than expected */
    32.             congestion_wait(WRITE, HZ/10);
    33.             if (!wbc.encountered_congestion)
    34.                 break;
    35.         }
    36.     }
    37. }

       pdflush后台例程会被周期唤醒,将那些在内存中驻留时间过长的脏页写出,确保内存中不会有长期存在的脏页。如果系统发生崩溃,由于内存处于混乱中,所以那些在内存中还没来得及写回磁盘的脏页就会丢失,所以周期性同步页高速缓存和磁盘非常重要。

      在系统启动时,内核初始化一个定时器,让它周期地唤醒pdflush线程,随后使其运行函数wb_kupdate()。该函数将把所有驻留时间超过百分之 dirty_expire_centisecs秒的脏页写回。然后定时器将再次被初始化为百分之dirty_expire_centisecs秒后唤醒 pdflush线程。

    1. 在mm/Page-writeback.c中
    2. /*
    3.  * Periodic writeback of "old" data.
    4.  *
    5.  * Define "old": the first time one of an inode's pages is dirtied, we mark the
    6.  * dirtying-time in the inode's address_space.  So this periodic writeback code
    7.  * just walks the superblock inode list, writing back any inodes which are
    8.  * older than a specific point in time.
    9.  *
    10.  * Try to run once per dirty_writeback_interval.  But if a writeback event
    11.  * takes longer than a dirty_writeback_interval interval, then leave a
    12.  * one-second gap.
    13.  *
    14.  * older_than_this takes precedence over nr_to_write.  So we'll only write back
    15.  * all dirty pages if they are all attached to "old" mappings.
    16.  */
    17. static void wb_kupdate(unsigned long arg)
    18. {
    19.     unsigned long oldest_jif;
    20.     unsigned long start_jif;
    21.     unsigned long next_jif;
    22.     long nr_to_write;
    23.     struct writeback_control wbc = {
    24.         .bdi        = NULL,
    25.         .sync_mode  = WB_SYNC_NONE,
    26.         .older_than_this = &oldest_jif,
    27.         .nr_to_write    = 0,
    28.         .nonblocking    = 1,
    29.         .for_kupdate    = 1,
    30.         .range_cyclic   = 1,
    31.     };
    32.     sync_supers();
    33.     oldest_jif = jiffies - dirty_expire_interval;
    34.     start_jif = jiffies;
    35.     next_jif = start_jif + dirty_writeback_interval;
    36.     nr_to_write = global_page_state(NR_FILE_DIRTY) +
    37.             global_page_state(NR_UNSTABLE_NFS) +
    38.             (inodes_stat.nr_inodes - inodes_stat.nr_unused);
    39.     while (nr_to_write > 0) {
    40.         wbc.encountered_congestion = 0;
    41.         wbc.nr_to_write = MAX_WRITEBACK_PAGES;
    42.         writeback_inodes(&wbc);
    43.         if (wbc.nr_to_write > 0) {
    44.             if (wbc.encountered_congestion)
    45.                 congestion_wait(WRITE, HZ/10);
    46.             else
    47.                 break;  /* All the old data is written */
    48.         }
    49.         nr_to_write -= MAX_WRITEBACK_PAGES - wbc.nr_to_write;
    50.     }
    51.     if (time_before(next_jif, jiffies + HZ))
    52.         next_jif = jiffies + HZ;
    53.     if (dirty_writeback_interval)
    54.         mod_timer(&wb_timer, next_jif);
    55. }

       总而言之,pdflush线程周期地被唤醒并把超过特定期限的脏页写回磁盘。

       系统管理员可以在/proc/sys/vm中设置回写的相关参数,也可以通过sysctl系统调用设置它们。

      pdflush线程的实现代码在文件mm/pdflush.c中,回写机制的实现代码在文件mm/page-writeback.c和fs-writeback.c中。

     pdflush设置

    变量描述
    dirty_expire_centisecs该数值以百分之一秒为单位,它描述超时多久的数据将被周期性执行的pdflush线程写出
    dirty_ratio占全部内存百分比,当一个进程产生的脏页达到这个比例时,就开始被写出
    dirty_writeback_centisecs该数值以百分之一秒为单位,它描述pdflush线程的运行频率
    laptop_mode一个布尔值,用于控制膝上型电脑模式
    dirty_background_ratio占全部内存的百分比。当内存中空闲页到达这个比例时,pdflush线程开始回写脏页

     

    • 膝上型电脑模式

      膝上型电脑模式是一种特殊的页回写策略,该策略主要意图是将硬盘转动的机械行为最小化,允许硬盘尽可能长时间的停滞,以此延长电池供电时间。该模式可通过 /proc/sys/vm/laptop_mode文件进行配置。通常,该配置文件内容为0,即膝上型电脑模式关闭,写1则启用该模式。

      该模式的页写回行为与传统方式相比只有一处变化。除了当缓存中的页面太旧要执行回写脏页以外,pdflush还好找准磁盘运转的实际,把所有其他的物理磁盘IO、刷新脏换成等统统写回磁盘,以便保证不会专门为了写磁盘而去主动激活磁盘运行。

       所述Linux发布版会在电脑接上或拔下电池时,自动开启或禁止膝上型电脑模式及其需要的pdflush可调节开关。因此机器可在使用电池电源时自动进入膝上型电脑模式,而在插上交流电源时恢复到常规的页回写模式。

    • 避免拥塞的方法:使用多线程

      因为磁盘的吞吐量有限,如果只有惟一线程执行回写操作,那么这个线程很容易等待对一个磁盘上的操作。为了避免出现这样的情况,内核需要多个回写线程并发执行,这样单个设备队列的拥塞就不会称为系统的瓶颈了。

       2.6内核使用多个pdflush线程,每个线程可以相互独立地将脏页刷新回磁盘,而且不同的pdflush线程处理不同的设备队列。线程的数目可以根据 系统的运行时间进行调整。pdflush线程数量取决于页回写的数量和拥塞情况,动态调整。如果所有存在的pdflush线程都忙着写回数据,那么一个新 线程就会被创建,确保不会出现一个设备队列处于拥塞状态,而其他设备队列却在等待---不是接收--回写数据的情况。如果堵塞,pdflush线程的数量 便会自动减少,以便节约内存。

       为了避免每一pdflush线程都挂起在同一个堵塞的队列上,pdflush线程利用了拥塞避免策略,它们会积极的试图写回那些不属于拥塞队列的页面。这样一来,pdflush线程通过分派回写工作,阻止多个线程在同一个忙设备上纠缠。

    展开全文
  • Pyspark动态回写Hive分区表

    千次阅读 2020-05-16 22:56:32
    由于要处理大批量数据,涉及到线上交互,比较看重时效,所以这几个月来一直用pyspark跑模型,遇到很多问题,比如说回写预测结果到hive分区表。 下面是第一种尝试,但奇怪地是,分区没有生效,回写的时候会将存量数据...
  • Write Through和Write Back是阵列卡Cache的两种使用方式,也称为透写和回写。Write Through也是RAID阵列卡的默认模式。当选用write through方式时,系统的写磁盘操作并不利用阵列卡的Cache,而是直接与磁盘进行数据...
  • MyBatis 3.3.1 批量插入多行回写自增id

    万次阅读 2016-09-01 23:19:02
    MyBatis 3.3.1支持批量插入多行回写自增id的功能,具体介绍请参看Support insert multiple rows and write-back id #547。实现原理其实现原理就是一条SQL语句:INSERT INTO tablename (column-a, [column-b, ...]) ...
  • 最近用tkmybatis插件做项目时,发现在事务中有些新插入的数据需要被用到主键,主键不能回写,特意查了下原先作者的文档和博客,发现没有uuid的回写实现,只能自己写个用下,现发出来分享下,愿以后的小伙伴都能有...
  • 回写缓存预读及磁盘调整

    千次阅读 2016-12-30 21:34:17
    因为cpu,内存操作速度要比磁盘的速度快,所以系统在设计的时候,用了回写缓存。 回写缓存怎么理解呢?就是应用提交了写的请求,数据被放在了缓存中,应用就认为是持久化完毕了,去干别的事情了,而实际上系统可能...
  • 当然对于交叉报表的样式实现数据回填较困难,和smartbi人员沟通后,尽管可以使用回写多个规则来实现,当然也不一定,我本来想尝试,但由于smartbi版本问题,造成汉字的 过滤总是实现不了效果,而升级又需要备份知识...
  • 前变址、回写前变址、后变址

    千次阅读 2016-08-24 17:01:20
    根据数据传输传输的时机以及在指令执行后基址寄存器是否被更新,寄存器变址有前变址、回写前变址和后变址暗中方式。  执行指令的时候,如果先进行变址运算,后传递数据,那么这种方式就是前变址方式。如图1所示  ...
  • 基于JQuery实现表单元素值的回写

    千次阅读 2014-08-19 23:07:46
    表单回写 $(function() { var obj={ name:"张四", area:"591", sex:"11", enjoy:"100011", note:"xxxxxxxxxxx" }; FormUtil.set(obj); }); 姓名: 地区: ---请选择--- 福州 厦门 ...
  • linux文件系统(三) - 内核回写机制

    千次阅读 2016-07-17 15:12:16
    将数据到page cache文件的时候其实是通过文件系统到page cache中,然后再由相应的线程在适当的时机将page cache中的数据到磁盘中。//fs/fat/file.c const struct file_operations fat_file_operations = { ....
  • BIEE回写

    千次阅读 2013-01-14 12:14:07
    利用BIEE的回写功能。 第一步:创建要回写调用的模板。 OracleBI\web\msgdb\customMessages\ 目录下创建一个XML文件,内容如下:            UPDATE BI_USERS SET PASSWORD='@{c3}' WHERE...
  • Write-Through(透写)和Write-Back(回写).

    千次阅读 2012-09-14 22:54:44
    大方面有两种,Write-Through(通写)和Write-Back(回写). Write-Through,也就是说OS发送的处理data的请求,一直要等到全部memory里面的data正确写到稳定存储media(如硬盘)中,然后返回给OS报告处理完毕,然后OS才会...
  • BIEE 11g回写功能

    千次阅读 2014-03-20 15:09:44
    表结构,原数据库数据如下: 注意:1.启用回写的权限需要开放给用户,在管理权限里面进行设置 2.需要回写的字段需要在RPD的逻辑层中勾选 “可写” 属性 3.在RPD的展示层中需要给予用户此...1)需要回写的字段需要在
  • web页面需要动态展示网站的业务数据,所以开发我们一般采用web的...以前没有web框架时,大量使用js在表单中控制赋值回写等,现在有了好的web框架,带来了很多方便,下面以struts2为例,对常见的表单控件(如checkbox,s
  • Linux内核学习笔记(八)Page Cache与Page回写

    万次阅读 多人点赞 2018-06-02 23:38:19
    此外,还要确保在page cache中的数据更改时能够被同步到磁盘上,后者被称为page回写(page writeback)。一个inode对应一个page cache对象,一个page cache对象包含多个物理page。 对磁盘的数据进行缓存从而提高...
  • dsp中的cache回写

    千次阅读 2011-01-06 17:08:00
    电脑中的回写回写是通过暂时将数据存在CACHE里,从而推迟将数据写到慢设备(如硬盘、磁带机)的一种工作方式。数据将在随后的时间,硬盘闲置的时候写到硬盘中。写的时候也是统一将CACHE内的尚未写出的数据按照数据...
  • param属性是什么 ![param属性是什么 ] ... 我用的是阿里巴巴的一个工具类回写数据 ![我用的是阿里巴巴的一个工具类回写数据](https://img-ask.csdn.net/upload/201801/07/1515257639_412457.png)
  • 以前一直在绕弯路,其实用c#自己的datagridview的数据绑定向导有便利的特征,就是能够简单的显示数据库中的某个表,但是问题是,对datagridview的更改无法通过简单的方法回写到数据库中。 所以我已开始尝试的是在...
  • linux块设备的IO调度算法和回写机制

    千次阅读 2014-10-27 15:08:35
    如果同时要调度读和两个请求,算法会选择“读”方向,除非该“”方向已经被放弃很多次了(为了避免请求饿死)。 接下来,算法检查与被选择方向相关的最后期限队列:如果队列中的第一个请求的最后期限已...
  • Netty服务如何出数据

    万次阅读 2021-07-30 16:59:48
    Netty服务如何出数据 上一节,我们一起学习了 Netty 接收新数据过程的源码剖析,我们又发现了一个有趣的现象, Netty 的 ByteBuf 竟然也是对 Java 原生 ByteBuffer 的包装。 经过前面的学习,我想你一定迫不及待地...
  • 在《BDI writeback脏页回写》中我们了解了BDI的一些基本结构以及初始化和一些触发路径,现在我们要更深入了解下脏页的writeback,一个是脏页什么时候会被处理,另一个是多久会触发脏页的writeback。 2、脏页形成路径...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,809,671
精华内容 723,868
关键字:

回写