精华内容
下载资源
问答
  • C++有三种管理数据内存的方式——自动存储/静态存储/动态存储

    C++有三种管理数据内存的方式——自动存储/静态存储/动态存储

    1 自动存储
    在函数内部定义的常规变量使用自动存储空间,被称为自动变量,这意味着它们在所属
    的函数被调用时自动产生,在该函数结束时消亡。
    5 自动变量是一个局部变量,其作用域为包含他的代码块
    6 自动变量通常存储在栈中。这意味着执行代码块时,其中的变量将依次加入到栈中,而
    在离开代码块时,将按相反的顺序释放这些变量,这被称为后进先出。因此程序执行过
    程中,栈将不断增大和缩小。
    7
    8 2. 静态存储
    9 静态存储是在整个程序执行期间都存在的存储方式。
    10 使变量成为静态的方式有两种:一种是在函数外面定义它;另一种是在声明变量时使用
    关键字static:
    11 在K&RC中,只能初始化静态数组和静态结构,而C++ Release2.0(及后续版本)和ANSI C中,也可以初始化自动数组和自动结构。然而,有些C++实现还不支持对自动数组和自
    动结构的初始化
    12 第九章详细介绍静态存储。
    13 自动存储和静态存储的关键在于:这些方法严格限制了变量的寿命。变量可能存在于程
    序的整个生命周期(静态变量),也可能只是在特定函数被执行时存在(自动变量)。
    14
    15 3. 动态存储
    16 new 和 delete运算符提供了一种比自动变量和静态变量更灵活的方法。它们管理了一> 个内存池,这在C++中被称为自由存储空间(free store)或堆(heap)。该内存池同> 用于静态变量和自动变量的内存是分开的
    17 new和delete让您能够在一个函数中分配内存,又在另一个函数中释放他。因此数据的> 生命周期完全不受程旭或函数的生存时间的控制。
    18
    19 评价:虽然使用动态存储方式使得程序员对内存使用有了更大的控制权。然而内存管理
    也更复杂了。怎么讲呢?在栈中,自动添加和删除机制使得占用的内存总是连续的,但
    是new 和 delete 的相互影响可能导致占用的自由存储区不连续,这使得跟踪分配内存
    的位置更困难。

    展开全文
  • 分页存储管理方式

    2019-03-31 11:26:35
    离散分配的三种方式 分页存储管理方式:将用户程序的地址空间按“页”或“块”进行分割(固定大小,如1kB),同样地,将内存空间也按“页”或“块”进行划分,这样便可以分散地将用户程序的任一页放入内存空间中 ...

    离散分配:允许将一个进程分散地分配到许多不相邻接的分区中,高效利用分区空间,不必再进行紧凑的方式。

    离散分配的三种方式
    • 分页存储管理方式:将用户程序的地址空间按“页”或“块”进行分割(固定大小,如1kB),同样地,将内存空间也按“页”或“块”进行划分,这样便可以分散地将用户程序的任一页放入内存空间中
    • 分段存储管理方式:将用户程序的地址空间分为若干个大小不同的段,每段都有一组相对完整的信息。
    • 段页式存储管理方式:以上两种方式的结合,目前应用广泛

    分页存储管理方式

    1. 页面和物理块

    • 页面:进程逻辑地址分为若干个,并给予编号(0,1)。内存物理地址分为若干个,同样也有编号(0#,1#)。一个物理块可以装入若干个逻辑页。
      • 页内碎片:由于最后一页经常填不满一个块所产生的不可利用的空间。
    • 页面大小:
      • 太小:空间利用率高,但是会有很多页面,导致页表过长,页面换入换出频繁,占用大量内存。
      • 太大:空间利用率低,减少页面,缩短页表,提高换入换出速度,但是会增加页内碎片。
      • 大小的选择:大小应该是2的幂,通常为 2KB ~ 8 KB

    2. 地址结构
    如下

    3. 页表

    • 解释:系统为进程创建一张页面映射表,可以将页号对应到物理块。

    地址变换机构

    • 基本任务:完成逻辑地址到物理地址的转换。
      • 因为页内地址和物理块内的地址是一一对应的,所以实际上是将页转化为物理块号。借助于页表
    • 页表寄存器
      • 页表始址: 页表在内存中的起始位置
      • 页表长度: 页表的长度
    • 变换过程:
      • 先将逻辑地址转化为页号 p 和页内地址 d。页号用来检索页表。
      • 如果 p 大于 页表长度,则发生越界中断
      • 否则得到物理块号 = 页表始址 + 页表长度 × 页号
      • 将物理块号放入物理地址寄存器,再将页内地址送入物理地址寄存器
      • 逻辑地址到物理地址的变换结束

    基本地址变换机构

    • 具有快表的地址变换机构
      • 出现原因:基本地址变换机构是处理机的速度降低了 1/2(存取一个数据时要访问两次内存)
      • 快表:特殊的高速缓存寄存器,又叫“联想寄存器”
      • 变换过程
        • 先将页号p送入告诉缓存寄存器,如果缓存器中有与 pp 匹配的页号,则表示p的物理块号在快表中,直接得到物理快号。
        • 如果没有匹配的页号,则去内存中寻找页表。找到后将此页表号放入快表中。(需要找一个老的页号换掉)
        • 将物理块号放入物理寄存器中。
          具有快表的地址寄存器

    访问内存的有效时间

    • 有效访问时间(EATEffectiveAccessTimeEAT, Effective Access Time): 进程发出指定逻辑地址的请求,经过地址变换,到内存中获得实际物理地址单元的数据的时间。

    假设一次访问内存的时间为 t, 命中率为a, 查找快表的时间为 lambda

    • 基本的地址变换结构中的
      EAT=t+t=2tEAT = t + t = 2t
    • 具有快表的地址变换结构中
      EAT=a×λ+(t+λ)(1a)+t=2t+λt×aEAT = a × \lambda + (t + \lambda )(1 -a ) + t = 2t + \lambda - t × a

    两级页表和多级页表

    • 出现目的:解决页表占用内存太大的问题

    • 方式

      • 采用离散分配方式(多级页表)。
      • 当需要某个页表时,再请求调入该页表。
    • 两级页表

      • 外层页表:其页表项记录页表页面(页表)所在的物理块
      • 外层页内地址:页表的地址,最大地址在数值上表示一个外层页表可以记录的最大页表数
    • 多级页表

    反置页表

    • 反置页表:为每一个物理块设置一个页表项,并将他们按物理块的编号排序
    展开全文
  • 装入的三种方式 1、绝对装入:编译时完成地址变换 2、静态重定位:装入时完成地址变换 3、动态重定位:运行时才进行地址变换表(普遍使用) 从写程序到程序运行 链接的三种方式 内存管理 内存空间的分配与回收 覆盖...

    本文已收录至 Github(MD-Notes),若博客中有图片打不开,可以来我的 Github 仓库https://github.com/HanquanHq/MD-Notes,涵盖了互联网大厂面试必问的知识点,讲解透彻,长期更新中,欢迎一起学习探讨。
    面试必会系列专栏https://blog.csdn.net/sinat_42483341/category_10300357.html
    操作系统系列专栏https://blog.csdn.net/sinat_42483341/category_10519484.html


    第三章 内存管理1 - 存储管理方式,段表、页表详解


    第三章 内存管理

    基础知识

    1 Byte(字节) = 8 bit

    1 字 = 16 / 32 / … bit,字由若干个字节构成,不同的机器有不同的字长。

    2^10 = 1 K(千)
    2^20 = 1 M(兆,百万)
    2^30 = 1 G (十亿,百兆)

    例如,4 GB = 4 * 2^30 bit = 2^32 bit

    逻辑地址 / 物理地址

    为了简化理解,本节中我们默认操作系统给进程分配的是一片连续的内存空间

    装入的三种方式

    1、绝对装入:编译时完成地址变换
    • 编译时,如果知道程序将放到内存中的哪个位置,编译程序 将产生 绝对地址 的目标代码。
    • 装入时,装入程序按照装入模块中的地址,将程序和数据装入内存。

    特点:只适用于单道程序环境。

    2、静态重定位:装入时完成地址变换
    • 编译、链接后的装入模块的地址都是 从 0 开始逻辑地址
    • 装入时,根据内存的当前情况,对地址进行 重定位,将 逻辑地址 变换为 物理地址

    特点:一个作业装入内存时,必须分配其要求的全部内存空间,如果没有足够的内存,就不能装入该作业。作业一旦进入内存,在运行期间不能再移动,也不能再申请内存空间。

    3、动态重定位:运行时才进行地址变换表(普遍使用)
    • 编译、链接后的装入模块的地址都是 从 0 开始
    • 执行时,才将 逻辑地址 转换为 物理地址。这种方式需要 重定位寄存器 的支持。

    特点:允许程序在内存中发生移动。

    从写程序到程序运行

    在这里插入图片描述

    1. 编译:由编译程序将用户源代码编译成若干个目标模块(编译就是把高级语言翻译为机器语言)
    2. 链接:由链接程序将编译后形成的一组目标模块,以及所需库函数链接在一起,形成一个完整的装入模块
    3. 装入(装载):由装入程序将装入模块装入内存运行
    链接的三种方式
    1. 静态链接:程序运行之前,先将各目标模块及它们所需的库函数连接成一个完整的可执行文件(装入模块),之后不再拆开。
    2. 装入时动态链接:将各目标模块装入内存时,边装入边链接。
    3. 运行时动态链接:在程序执行中需要该目标模块时,才对它进行链接。便于修改、更新、共享模块。

    内存管理

    内存空间的分配与回收

    覆盖技术(只用于早期的操作系统)

    思想:将程序分为多个段(多个模块)。常用的段常驻内存,不常用的段在需要时调入内存。

    内存中分为一个 固定区 和若干 覆盖区

    • 常驻内存的段放在“固定区”中,运行过程中不再调出
    • 不常用的段放在“覆盖区”,根据需要调入调出

    由程序员声明覆盖结构,操作系统完成自动覆盖。对用户不透明,增加了用户编程负担。

    在这里插入图片描述

    交换技术

    内存紧张时,换出某些进程以腾出内存空间,再换入某些进程。进程的 PCB 需要常驻内存。

    中级调度 就是要决定将哪个处于挂起状态的进程重新调入内存。

    磁盘分为 文件区对换区(swap分区),换出的进程放在对换区。

    • 文件区:离散分配方式,空间利用率高
    • 交换区:连续分配方式,IO 速度快
    覆盖与交换的区别

    覆盖是在同一个程序 / 进程中的,交换是在不同进程 / 作业间的。

    连续分配管理方式

    为用户进程分配的必须是一个连续的内存空间

    单一连续分配

    在这里插入图片描述

    支持单道程序,内存分为系统区 / 用户区

    • 系统区:存放操作系统相关数据
    • 用户区:存放用户进程相关数据。内存中只能有一道用户程序,独占整个用户区空间。

    无外部碎片,有内部碎片

    固定分区分配

    支持多道程序,内存用户空间分为若干个固定大小的分区,每个分区只能装一道作业

    两种分区方式:分区大小相等 / 分区大小不等

    在这里插入图片描述

    分区说明表(可用数组 / 链表表示)

    在这里插入图片描述

    无外部碎片,有内部碎片

    动态分区分配

    支持多道程序,在程序装入内存时,根据进程的大小动态地建立分区

    无内部碎片,有外部碎片

    回收内存分区时,可能遇到的四种情况:空间相邻的分区需要合并

    • 回收区之后有相邻的空闲分区
    • 回收区之前有相邻的空闲分区
    • 回收区前后都有相邻的空闲分区
    • 回收区前后都没有相邻的空闲分区
    动态分区分配算法

    两种常用的数据结构:空闲分区链 / 空闲分区表

    在这里插入图片描述

    算法 算法思想 分区排列顺序 优点 缺点
    首次适应 从头到尾找适合的分区 空闲分区以地址递增次序排列 综合看性能最好。算法开销小,回收分区后一般不需要对空闲分区队列重新排序 低地址不断划分,产生很多小外部碎片,而每次从低地址开始找,增大了查找开销
    最佳适应 优先使用更小的分区,以保留更多大分区 空闲分区以容量递增次序排列 会有更多的大分区被保留下来,更能满足大进程需求 会产生很多太小的、难以利用的碎片;算法开销大,回收分区后可能需要对空闲分区队列重新排序
    最坏适应 优先使用更大的分区,以防止产生太小的不可用的碎片 空闲分区以容量递减次序排列 可以减少难以利用的小碎片 大分区容易被用完,不利于大进程;算法开销大(原因同上)
    邻近适应 由首次适应演变而来,每次从上次查找结束位置开始查找 空闲分区以地址递增次序排列(可排列成循环链表) 不用每次都从低地址的小分区开始检索。算法开销小(原因同首次适应算法) 会使高地址的大分区先被用完

    非连续分配管理方式

    基本分页存储管理
    思想
    • 把进程分页,各页面放入不同内存块中
    易混
    • 页框 = 页帧 = 内存块 = 物理块 = 物理页面**(内存空间划分)** VS 页 = 页面**(进程逻辑空间划分)**
    • 页框号 = 页帧号 = 内存块号 = 物理块号 = 物理页号 VS 页号 = 页面号
    • 页面页框 是一一对应关系,使用 页表 记录这种对应关系
    页表(page frame)

    在这里插入图片描述

    • 页表记录 页面 -> 内存块 映射关系
    • 一个进程对应一张页表,进程每一页对应一个页表项(页号 + 块号)
    • 页表项的大小相同。页号隐含,不占空间
    • i 号页表项存放地址 = 页表地址 + i * 页表项大小
    逻辑地址结构
    • 逻辑地址用 页号、页内偏移量 表示

      • 页号 = 逻辑地址 / 页面大小

      • 页内偏移量 = 逻辑地址 / 页面大小 -> 为何页面大小取 2 的整数次幂?类似于子网掩码方便二进制运算

        假设物理地址也用32个二进制位表示,则由于内存块的大小=页面大小,因此:

        0号内存块的起始物理地址是 00000000000000000000 000000000000
        1号内存块的起始物理地址是 00000000000000000001 000000000000
        2号内存块的起始物理地址是 00000000000000000010 000000000000
        3号内存块的起始物理地址是 00000000000000000011 000000000000

        假设通过查询页表得知1号页面存放的内存块号是9(1001),则9号内存块的起始地址= 9*4096 = 00000000000000001001000000000000,则逻辑地址4097对应的物理地址= 页面在内存中存放的起始地址+ 页内偏移量 =(00000000000000000011000000000001)

        即,如果页面大小刚好是2的整数幂,则只需把页表中记录的物理块号拼接上页内偏移量,就能得到对应的物理地址

    如何实现地址转换
    1. 计算出逻辑地址的页号、页内偏移量
    2. 找到对应页面在内存中的存放位置(查页表)
    3. 物理地址 = 页面地址 + 页内偏移量
    基本地址变换机构

    是用于实现 逻辑地址物理地址 转换的一组硬件机构

    页表寄存器存放 页表起始地址、页表长度

    地址变换手算过程:

    1. 计算页号、页内偏移量
    2. 比较页号 P 和页表长度 M,若P≥M,则产生越界中断,否则继续执行(页号从0开始)
    3. 页表项地址 = 页表起始地址F + 页号P * 页表项长度,取出该页表项内容b,即为内存块号
    4. 计算E = b * L + W,用得到的物理地址E 去访存(若二进制,可直接拼接)

    其他小细节

    • 页内偏移量位数、页面大小之间可以互相计算
    • 页式管理中地址是一维的
    • 实际应用中,通常使一个页框恰好能放入整个页表项
    • 为了方便找到页表项,页表一般是放在连续的内存块中的
    具有快表的地址变换机构

    快表,又称联想寄存器(TLB, translation lookaside buffer),是一种高速缓存。由于程序的局部性原理,通过存放最近访问的页表项的副本,加快地址变换的速度。

    对应地,内存中的页表常称为慢表。

    在这里插入图片描述

    引入快表前后的地址变换过程:

    地址变换过程 访问一个逻辑地址的访存次数
    基本地址变换机构 ①算页号、页内偏移量
    ②检查页号合法性
    ③查页表,找到页面存放的内存块号
    ④根据内存块号与页内偏移量得到物理地址
    ⑤访问目标内存单元
    两次访存
    具有快表的地址变换机构 ①算页号、页内偏移量
    ②检查页号合法性
    ③查快表。若快表命中,即可知道页面存放的内存块号,可直接进行⑤;若未命中,则进行④
    ④查页表,找到页面存放的内存块号,并且将页表项复制到快表中
    ⑤根据内存块号与页内偏移量得到物理地址
    ⑥访问目标内存单元
    快表命中,只需一次访存;快表未命中,需要两次访存
    两级页表

    单级页表存在的问题:

    • 所有页表项必须连续存放,页表过大时需要很大的连续空间
    • 在一段时间内并非所有页面都用得到,因此没必要让整个页表常驻内存

    两级页表:

    • 将长长的页表再分页
    • 逻辑地址结构:一级页号 / 二级页号 / 页内偏移量
    • 注意几个术语:页目录表 / 外层页表 / 顶级页表

    如何实现地址变换:

    • 按照地址结构将逻辑地址拆分成三份
    • 从 PCB 中读出页目录表起始地址,根据一级页号查询页目录表,找到下一级页表在内存中的存放位置
    • 根据二级页表查表,找到最终想访问的内存号
    • 结合业内偏移量得到物理地址

    几个细节

    • 多级页表中,各级页表的大小不能超过一个页面,若两级页表不够,可以分更多级
    • 多级页表的访问次数(假设没有快表机构):N 级页表访问一个逻辑地址需要 N+1 次访存
    例题

    在这里插入图片描述

    基本分段存储管理
    分段

    以段为单位进行分配,段内连续,段间可不相邻。

    在这里插入图片描述

    分段系统的逻辑地址结构由段号(段名)和段内地址(段内偏移量)所组成。

    • 段号的位数 决定了每个进程最多可以分几个段
    • 段内地址位数 决定了每个段的最大长度是多少
    段表

    为了能从物理内存中找到各个逻辑段的存放位置,需为每个进程建立一张段映射表,称 段表

    各个段表项的长度是相同的。因此段号是隐含的,不占存储空间。

    在这里插入图片描述

    地址变换
    1. 根据逻辑地址得到段号、段内地址
    2. 判断 段号是否越界。若 S ≥ M,则产生越界中断(段表长度至少是1,而段号从0开始)
    3. 查询段表,找到对应的段表项,段表项的存放地址 = F + S * 段表项长度
    4. 检查 段内地址是否超过段长(因为段长各不相同)。若 W ≥ C,则产生越界中断
    5. 计算得到物理地址
    6. 访问目标内存单元
    分段、分页管理的对比
    • 页是物理单位。分页是系统管理,对用户不可见;地址空间是一维的。
    • 段是逻辑单位。分段是用户需求,需要程序员指出段名。地址空间是二维的(段名 + 段内地址)

    注:分段存储也可以引入快表机构。

    段页式存储管理
    优点 缺点
    分页管理 内存空间利用率高,不会产生外部碎片,只有少量页内碎片 不方便按照逻辑模块实现信息的共享和保护
    分段管理 方便按照逻辑模块实现信息共享 / 保护 如果段长过大,为其分配很大的连续空间会很不方便。段式管理会产生外部碎片。

    段页式系统的逻辑地址结构由段号、页号、页内地址(页内偏移量)组成。

    “分段”对用户是可见的,程序员编程时需要显式地给出段号、段内地址。而将各段“分页”对用户是不可见的。系统会根据段内地址自动划分页号和页内偏移量。因此段页式管理的地址结构是二维的。

    • 段号的位数决定了每个进程最多可以分几个段
    • 页号位数决定了每个段最大有多少页
    • 页内偏移量决定了页面大小、内存块大小是多少

    在这里插入图片描述

    地址变换
    1. 由逻辑地址得到段号、页号、页内偏移量
    2. 段号与段表寄存器中的段长度比较,检查是否越界
    3. 由段表起始地址、段号,找到对应的段表项
    4. 根据段表中记录的页表长度,检查页号是否越界
    5. 由段表中的页表地址、页号得到查询页表,找到相应页表项
    6. 由页面存放的内存块号、页内偏移量,得到最终物理地址
    7. 访问目标单元
    访存次数

    3 次访存。查段表、查页表、访问目标单元。可引入快表机构,由(段号+页号)直接找到目标地址,只需要一次访存。

    展开全文
  • 前端三种本地存储方式

    万次阅读 2018-01-29 17:30:22
     网络早期最大的问题之一是如何管理状态。简而言之,服务器无法知道两个请求是否来自同一个浏览器。当时最简单的方法是在请求时,在页面中插入一些参数,并在下一个请求中传回参数。这需要使用包含参数的隐藏的表单...

    前言

         网络早期最大的问题之一是如何管理状态。简而言之,服务器无法知道两个请求是否来自同一个浏览器。当时最简单的方法是在请求时,在页面中插入一些参数,并在下一个请求中传回参数。这需要使用包含参数的隐藏的表单,或者作为URL参数的一部分传递。这两个解决方案都手动操作,容易出错。cookie出现来解决这个问题。

    作用

        cookie是纯文本,没有可执行代码。存储数据,当用户访问了某个网站(网页)的时候,我们就可以通过cookie来向访问者电脑上存储数据,或者某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密)

    如何工作

          当网页要发http请求时,浏览器会先检查是否有相应的cookie,有则自动添加在request header中的cookie字段中。这些是浏览器自动帮我们做的,而且每一次http请求浏览器都会自动帮我们做。这个特点很重要,因为这关系到“什么样的数据适合存储在cookie中”。

    存储在cookie中的数据,每次都会被浏览器自动放在http请求中,如果这些数据并不是每个请求都需要发给服务端的数据,浏览器这设置自动处理无疑增加了网络开销;但如果这些数据是每个请求都需要发给服务端的数据(比如身份认证信息),浏览器这设置自动处理就大大免去了重复添加操作。所以对于那种设置“每次请求都要携带的信息(最典型的就是身份认证信息)”就特别适合放在cookie中,其他类型的数据就不适合了。

    特征

       

    1. 不同的浏览器存放的cookie位置不一样,也是不能通用的。

    2. cookie的存储是以域名形式进行区分的,不同的域下存储的cookie是独立的。

    3. 我们可以设置cookie生效的域(当前设置cookie所在域的子域),也就是说,我们能够操作的cookie是当前域以及当前域下的所有子域

    4. 一个域名下存放的cookie的个数是有限制的,不同的浏览器存放的个数不一样,一般为20个。

    5. 每个cookie存放的内容大小也是有限制的,不同的浏览器存放大小不一样,一般为4KB。

    6. cookie也可以设置过期的时间,默认是会话结束的时候,当时间到期自动销毁


    设置

    客户端设置

    document.cookie = '名字=值';
    
    document.cookie = 'username=cfangxu;domain=baike.baidu.com'//并且设置了生效域

    注意:客户端可以设置cookie 的下列选项:expires、domain、path、secure(有条件:只有在https协议的网页中,客户端设置secure类型的 cookie 才能成功),但无法设置HttpOnly选项。

    服务器端设置

    不管你是请求一个资源文件(如 html/js/css/图片),还是发送一个ajax请求,服务端都会返回response。而response header中有一项叫set-cookie,是服务端专门用来设置cookie的。

    Set-Cookie 消息头是一个字符串,其格式如下(中括号中的部分是可选的):

    Set-Cookie: value[; expires=date][; domain=domain][; path=path][; secure]

    注意:一个set-Cookie字段只能设置一个cookie,当你要想设置多个 cookie,需要添加同样多的set-Cookie字段。

    服务端可以设置cookie 的所有选项:expires、domain、path、secure、HttpOnly

    通过 Set-Cookie 指定的这些可选项只会在浏览器端使用,而不会被发送至服务器端。

    读取
          我们通过document.cookie来获取当前网站下的cookie的时候,得到的字符串形式的值,它包含了当前网站下所有的cookie(为避免跨域脚本(xss)攻击,这个方法只能获取非 HttpOnly 类型的cookie)。它会把所有的cookie通过一个分号+空格的形式串联起来,例如 username=chenfangxu;job=coding

    修改cookie
           要想修改一个cookie,只需要重新赋值就行,旧的值会被新的值覆盖。但要注意一点,在设置新cookie时,path/domain这几个选项一定要旧cookie 保持一样。否则不会修改旧值,而是添加了一个新的 cookie。

    删除
    把要删除的cookie的过期时间设置成已过去的时间,path/domain/这几个选项一定要旧cookie 保持一样。

    注意
    如果只设置一个值,那么算cookie中的value; 设置的两个cookie,key值如果设置的相同,下面的也会把上面的覆盖。

    cookie的属性(可选项)
    过期时间

    如果我们想长时间存放一个cookie。需要在设置这个cookie的时候同时给他设置一个过期的时间。如果不设置,cookie默认是临时存储的,当浏览器关闭进程的时候自动销毁。

    注意:document.cookie = '名称=值;expires=' + GMT(格林威治时间)格式的日期型字符串;

    一般设置天数: newDate().setDate(oDate.getDate()+5);比当前时间多5天

    一个设置cookie时效性的例子:

    function setCookie(c_name, value, expiredays){
        var exdate=new Date();
        exdate.setDate(exdate.getDate() + expiredays);
        document.cookie=c_name+ "=" + escape(value) + ((expiredays==null) ? "" : ";expires="+exdate.toGMTString())
    }
    使用方法;
    setcookie('username','zxy',30);
         expires 是 http/1.0协议中的选项,在新的http/1.1协议中expires已经由 max-age 选项代替,两者的作用都是限制cookie 的有效时间。expires的值是一个时间点(cookie失效时刻= expires),而max-age 的值是一个以秒为单位时间段(cookie失效时刻= 创建时刻+ max-age)。

    另外,max-age 的默认值是 -1(即有效期为 session );max-age有三种可能值:负数、0、正数。

    • 负数:有效期session;

    • 0:删除cookie;

    • 正数:有效期为创建时刻+ max-age


    cookie的域概念

          domain指定了 cookie 将要被发送至哪个或哪些域中。默认情况下,domain 会被设置为创建该 cookie 的页面所在的域名,所以当给相同域名发送请求时该 cookie 会被发送至服务器。
         浏览器会把 domain 的值与请求的域名做一个尾部比较(即从字符串的尾部开始比较),并将匹配的 cookie 发送至服务器
    document.cookie = "username=cfangxu;path=/;domain=qq.com"
    如上:“www.qq.com" 与 "sports.qq.com" 公用一个关联的域名"qq.com",我们如果想让 "sports.qq.com" 下的cookie被 "www.qq.com" 访问,我们就需要用到 cookie 的domain属性,并且需要把path属性设置为 "/"。
    服务端设置
    Set-Cookie:username=zxy;path=/;domain=qq.com;
    注:一定的是同域之间的访问,不能把domain的值设置成非主域的域名。

    cookie的路径概念(path选项)
          cookie 一般都是由于用户访问页面而被创建的,可是并不是只有在创建 cookie 的页面才可以访问这个 cookie。 因为安全方面的考虑,默认情况下,只有与创建 cookie 的页面在同一个目录或子目录下的网页才可以访问。即path属性可以为服务器特定文档指定cookie,这个属性设置的url且带有这个前缀的url路径都是有效的。

    客户端设置

    最常用的例子就是让 cookie 在根目录下,这样不管是哪个子页面创建的 cookie,所有的页面都可以访问到了。

    document.cookie="username=zxy;path=/"

    服务端设置

    Set-Cookie:name=zxy;path=/blog'

          如上设置:path 选项值会与 /blog,/blogrool 等等相匹配;任何以 /blog 开头的选项都是合法的。需要注意的是,只有在 domain 选项核实完毕之后才会对 path 属性进行比较。path 属性的默认值是发送 Set-Cookie 消息头所对应的 URL 中的 path 部分。

    domain和path总结

    domain是域名,path是路径,两者加起来就构成了 URL,domain和path一起来限制 cookie 能被哪些 URL 访问。

    所以domain和path2个选项共同决定了cookie何时被浏览器自动添加到请求头部中发送出去。如果没有设置这两个选项,则会使用默认值。domain的默认值为设置该cookie的网页所在的域名,path默认值为设置该cookie的网页所在的目录。

    cookie的安全性(secure选项)

          通常 cookie 信息都是使用HTTP连接传递数据,这种传递方式很容易被查看,所以 cookie 存储的信息容易被窃取。假如 cookie 中所传递的内容比较重要,那么就要求使用加密的数据传输。

          secure选项用来设置cookie只在确保安全的请求中才会发送。当请求是HTTPS或者其他安全协议时,包含 secure 选项的 cookie 才能被发送至服务器。

    document.cookie="username=zxy;secure'

    把cookie设置为secure,只保证 cookie 与服务器之间的数据传输过程加密,而保存在本地的 cookie文件并不加密。就算设置了secure 属性也并不代表他人不能看到你机器本地保存的 cookie 信息。机密且敏感的信息绝不应该在 cookie 中存储或传输,因为 cookie 的整个机制原本都是不安全的。

    注意:如果想在客户端即网页中通过 js 去设置secure类型的 cookie,必须保证网页是https协议的。在http协议的网页中是无法设置secure类型cookie的。

    httpOnly

          这个选项用来设置cookie是否能通过 js 去访问。默认情况下,cookie不会带httpOnly选项(即为空),所以默认情况下,客户端是可以通过js代码去访问(包括读取、修改、删除等)这个cookie的。当cookie带httpOnly选项时,客户端则无法通过js代码去访问(包括读取、修改、删除等)这个cookie。

    在客户端是不能通过js代码去设置一个httpOnly类型的cookie的,这种类型的cookie只能通过服务端来设置。

    cookie的编码

    cookie其实是个字符串,但这个字符串中等号、分号、空格被当做了特殊符号。所以当cookie的 key 和 value 中含有这3个特殊字符时,需要对其进行额外编码,一般会用escape进行编码,读取时用unescape进行解码;当然也可以用encodeURIComponent/decodeURIComponent或者encodeURI/decodeURI,查看关于编码的介绍

    第三方cookie

    通常cookie的域和浏览器地址的域匹配,这被称为第一方cookie。那么第三方cookie就是cookie的域和地址栏中的域不匹配,这种cookie通常被用在第三方广告网站。为了跟踪用户的浏览记录,并且根据收集的用户的浏览习惯,给用户推送相关的广告。

    关于第三方cookie和cookie的安全问题可以查看

    点击打开链接c

    localStorage(本地存储)

    HTML5新方法,不过IE8及以上浏览器都兼容。

    特点:

    • 生命周期:持久化的本地存储,除非主动删除数据,否则数据是永远不会过期的。

    • 存储的信息在同一域中是共享的。

    • 当本页操作(新增、修改、删除)了localStorage的时候,本页面不会触发storage事件,但是别的页面会触发storage事件。

    • 大小:据说是5M(跟浏览器厂商有关系)

    • 在非IE下的浏览中可以本地打开。IE浏览器要在服务器中打开。

    • localStorage本质上是对字符串的读取,如果存储内容多的话会消耗内存空间,会导致页面变卡

    • localStorage受同源策略的限制

    设置

    lacalStorage.setItem('username','zxy');

    获取

    localStorage.getItem('username');

    删除

    localStorage.remove('username');

    也可以一次清除所有存储

    localStorage.clear();

    storage事件

    当storage发生改变的时候触发。

    注意:当前页面对storage的操作会触发其他页面的storage事件。

    事件的回调函数中有一个参数event,是一个StorageEvent对象,提供了一些实用的属性,如下表:

    Property Type Description
    key String The named key that was added, removed, or moddified
    oldValue Any The previous value(now overwritten), or null if a new item was added
    newValue Any The new value, or null if an item was added
    url/uri String The page that called the method that triggered this change
    sessionStorage

    其实跟localStorage差不多,也是本地存储,会话本地存储

    特点

    用于本地存储一个会话(session)中的数据,这些数据只有在同一个会话中的页面才能访问并且当会话结束后数据也随之销毁。因此sessionStorage不是一种持久化的本地存储,仅仅是会话级别的存储。也就是说只要这个浏览器窗口没有关闭,即使刷新页面或进入同源另一页面,数据仍然存在。关闭窗口后,sessionStorage即被销毁,或者在新窗口打开同源的另一个页面,sessionStorage也是没有的。

    cookie,localStorage,sessionStorage区别

    相同:在本地(浏览器端)存储数据。

    不同:

    • localStorage只要在相同的协议、相同的主机名、相同的端口下,就能读取/修改到同一份localStorage数据。

    • sessionStorage比localStorage更严苛一点,除了协议、主机名、端口外,还要求在同一窗口(也就是浏览器的标签页)下。

    • localStorage是永久存储,除非手动删除。

    • sessionStorage当会话结束(当前页面关闭的时候,自动销毁)

    • cookie的数据会在每一次发送http请求的时候,同时发送给服务器而localStorage、sessionStorage不会。






    展开全文
  • 一、引入  在存储器管理中连续...基于这一思想便产生了离散分配方式,根据在离散分配时所分配地址空间的基本单位不同,又可将离散分配方式分为以下三种:(1)分页存储管理方式(2)分段存储管理方式(3)段页式...
  • 安卓文件存储权限管理三种目录

    千次阅读 2017-12-04 14:10:15
    由于安卓6.0更新了权限管理,使用最新的SDK编译的时候, 缓存到自定义的目录下出现问题,因为没有获取对应的权限, 6.0以前的系统不需要获取权限,最快的方式是使用官方推荐的缓存地址 (不推荐) ...
  • 连续分配管理方式是指为用户分配一个连续的内存空间,连续分配的方式有单一连续分区,固定分区和可变分区三种方式。 单一连续分区 这种方案,整个内存区域被分成了系统区域跟用户区域两部分,其中,系统区域提供给...
  • 存储在多个服务器上转变为存储在单个服务器上。此模式可以降低管理工作的复杂l生和对数据中心占地面积的要求;直接将多个异构型服务器附加到一个存储设备上。此模式极大降低了存储成本,同时也可 以简化管 理 ;...
  • 三种前端本地存储方式讲解

    千次阅读 2017-12-29 00:00:00
    (点击上方公众号,可快速关注)作者:琪琪好笨笨github.com/Nealyang/YOU-SHOULD-KNOW-JS/blob/master/doc/basic_js/JavaScript中的跨域总结.mdcookie前言网络早期最大的问题之一是如何管理状态。简而言之,服务器...
  • 外接存储根据连接的方式分为: 直连式存储(DAS);网络接入存储(NAS);存储区域网络(SAN)。 DAS存储 DAS存储就是直连式寸,小阵列一根线直连电脑,USB接口(含type c接口)或者雷电接口是最主流接口。 ...
  • 不同的状态后端以不同的方式存储其状态,并且使用不同的数据结构来保存正在运行的应用程序的状态。 MemoryStateBackend: 1 基于内存的状态管理器,聚合类算子的状态会存储在JobManager的内存中 2 单次状态...
  • 1.自动存储 在函数内部定义的常规变量使用自动存储空间,即自动变量。在所属函数被调用时自动产生,在函数结束时...静态存储是在整个程序运行期间都存在的存储方式,在函数外面定义变量或者在声明变量的时候加上...
  • 管理三种形式 命令式对象管理 kubectl create deployment nginx --image nginx 命令式对象配置 kubectl create -f nginx.yaml 声明式对象配置 kubectl apply -f nginx.yaml 三个概念 object configuration ...
  • 可以在Container可写层存储数据,但是有三个缺点: 当Container销毁时,数据不能持久保存。 Container的可写层和Container所在的主机紧耦合,不容易将数据...Docker提供了三种数据Mount方式: Volumes ...
  • DAS存储更多的依赖服务器主机操作系统进行数据的IO读写和存储维护管理,数据备份和恢复要求占用服务器主机资源(包括CPU、系统IO等),数据流需要回流主机再到服务器连接着的磁带机(库),数据备份通常占用服务器...
  • 目录 概述 一、单一连续分配 1. 应用背景 2.基本思想 3,实现 4,特点 ...、动态分区分配 ...连续分配方式是最早出现的一存储器分配方式,曾被广泛应用于上世纪60~80年代的OS中,该分配方式为一个
  • 根据分配内存的方式,C++有3种管理数据内存的方式:自动存储,静态存储和动态存储(又是也叫自由存储空间或堆)。...3.new和delete关键字提供比上面两种方式更灵活的内存管理方式——动态存储,他们管理一个
  • 操作系统——文件链接组织方式存在的问题及解决方法一、文件的三种外存组织方式1.2 连续组织方式1.3 链接组织方式1.3.1 隐式链接1.3.2 显式链接1.3.3 链接组织的优点与缺点1.4 索引组织方式1.4.1 单级索引组织方式...
  • 操作系统的内存的分配与回收连续存储管理主要介绍了,内存管理中连续存储管理三种方法,重点掌握动态分区分配的分配算法。主要的重点冷月做出了标识,知识点如下图(pdf版或xmind源文件请私聊我:操作系统)。冷月点...
  • 操作系统的内存的分配与回收连续存储管理主要介绍了,内存管理中连续存储管理三种方法,重点掌握动态分区分配的分配算法。 主要的重点冷月做出了标识,知识点如下图(pdf版或xmind源文件请私聊我:操作系统)。 ...
  • 1、自动存储 在函数内部定义的常规变量使用自动存储空间,被称为自动变量,这意味着它们在所属的函数被调用时...静态存储是整个程序执行期间都存在的存储方式。 (1)在函数外面定义它 (2)在声明变量时使用sta...
  •  目前,外置磁盘存储系统从存储系统的连接方式上分为DAS、NAS、SAN三种。  1) DAS存储系统  直接连接存储DAS(Direct Attached Storage)是对SCSI总线的进一步发展。它对外利用SCSI总线通道和多个主机连接,...
  • 数据存储管理ABC

    2020-03-04 09:49:51
    信息系统有三种方式,可以把信息以数据的形式存放于存储设备中,它们是在线、近线和离线存储。这三种方式的组合应用,将会带给用户完善的数据存储和管理方案。数据管理有别于存储管理存储管理的对象是存储空间其...
  • 存储管理

    2018-11-28 19:40:46
    存储器管理的对象是主存,也称内存。它的主要功能包括分配和回收主存空间、提高主存利用率、扩充主存...分区存储管理又有三种不同的方式:静态分区、可变分区、可重定位分区 。 静态分区 静态分区存储管理是预先把...
  • 目录 进程通信:四种高级通信: 线程与进程: 进程基本属性: 线程的基本属性: 作业调度算法: 先来先服务调度算法(FCFS): 短作业优先调度算法(SPF): 最高响应比优先算法(HRN): ...程序的三种装入方式: 程...
  • 按虚拟化对象划分,虚拟化存储实现方式主要有三种。 虚拟化存储三种实现方式 基于主机的虚拟存储 基于主机的虚拟存储依赖于代理或管理软件,它们安装在一个或多个主机上,实现存储虚拟化的控制和管理。由于控制...
  • 存储管理

    2017-10-11 17:17:18
    段式存储管理是实现内存访问控制的一种方式,相比于直接根据地址访问,段式访问增加了一些额外的过程以及对一些寄存器的含义进行了重新定义。参考Linux内核源代码情景分析,简要记录如下。对段寄存器进行了重新定义...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,583
精华内容 633
关键字:

存储管理方式三种方式