日度归档:2015年7月1日

虚拟存储器--小结

虚拟存储器是对主存的一个抽象。
支持虚拟存储器的处理器通过使用一种叫做虚拟寻址的间接形式来引用主存。处理器产生一个虚拟地址,在被发送至主存之前,这个地址被翻译成一个物理地址。从虚拟地址空间到物理地址空间翻译要求硬件和软件紧急合作。专门的硬件通过使用页表来翻译虚拟地址,而页表的内容是由操作系统提供。
虚拟存储器提供三个重要的功能。
第一:它在主存中自动缓存最近使用的存放磁盘上的虚拟地址空间的内容。虚拟存储器缓存中的块叫做页。对磁盘上页的引用会触发缺页处理程序,缺页将控制转移到操作系统的一个缺页处理程序。缺页处理程序将页面从磁盘拷贝到主存缓存中。
第二:虚拟存储器简化了存储器管理,简化了链接 进程间共享数据 进程间存储器分配 以及程序加载
第三:虚拟存储器通过在每条页条目中加入保护位,简化存储器的保护。
地址翻译的过程必须和系统中任意硬件缓存的操作集成在一起。大多数页表条目位于L1高速缓存中,但是一个称为TLB条目在芯片上的高速缓存,通常会消除访问在L1页表条目的开销。
现代系统通过将虚拟存储器块和磁盘上的文件组块关联起来,来初始化虚拟存储器组块,这个过程称为存储器映射。存储器映射为共享数据、创建新的进程以及程序加载,提供一种高效的机制,
1 应用mmap函数手工创建和删除虚拟地址空间的区域
2 通过malloc free动态创建和管理虚拟地址空间区域

相关阅读:
虚拟存储器之–垃圾收集
常见的虚拟存储器错误
malloc free函数的用法
malloc的使用方法及注意事项
为什么要使用动态存储器分配(malloc)

数据库中写法注意事项


1 s ql写法

1.1 所有的查询语句 列名显示前都必须 加上表的“别名”
例:
s elect a,b,writeDate f rom tableA(nolock) l eft join tableB(nolock) on tableA.a = tableB.a
以上的写法,可能导致后续的扩展错误
假如在后期 tableB
tableB表中新增字段writeDate
那么就会导致 这条查询语句出错
所以
s elect a.a,a.b f rom tableA a(nolock) l eft join tableB b(nolock) on a.a=b.a

1.2 在数据库中禁止使用复杂计算 会导致sql查询计划失效
1.3 禁止使用 select * 会导致程序获取列所消耗时间 会使系统增加列导致其它异常
1.4 索引列上禁止使用 函数计算 这样会导致索引失效
1.5 sql查询中的参数数据类型需同数据库中表的数据类型一致 避免数据转换消耗cpu 、数据转换导致参数异常
1.6 参数化查询 避免SQL注入式漏洞
1.7 限制join个数
1.8 限制sql语句长度及in条件使用
1.9 避免大事务操作,这样会导致表死锁时间过长
1.10 关闭影响行数信息返回 听说sql 后续不支持此模式
1.11 s elect a f rom table(nolock) 查询语句后最好加上(nolock) 避免查询锁表
1.12 union all 比union要好 union all 程序不做排序和过滤 可以减少程序执行时间
1.13 exists 替换 in in 表 条数在上千条后 会影响性能 因为 in语句会转换为 s elect a f rom table where a=’a’ or select a f rom table where a=’b’ …
1.14 临时表 表变量 多用表变量 少用临时表 表变量 数据存储在内存中 速度会快一些
1.15 少用or运算符


2 字段规范

2.1字段名需要可以非常直接的表示字段的含义
2.2在不同的表中 需要关联的字段或表示相同含义的字段 字段名最好一致
2.3各数据类型按需求定义:
字符为 varchar nvarchar
金额货币 采用money
科学计数法 采用numeric
自增列采用bigint数据类型(避免增长导致数据不够用)
时间类型采用datetime数据类型

3 表规范

3.1 每张表都必须设置主键
3.2 少用外键
3.3 禁止列为NULL,方便后续程序的编写

4 表附加设置

4.1 常用的查询字段处 添加索引
4.2 order by 中常用字段 添加索引
4.3 表索引不要大于5个
4.4 如果列所存在的值为 1/-1 两个选项,此列最好不要添加索引
4.5 索引中包含列不要超过 5个


5 程序

5.1 程序需要保证数据完整性 ,将数据的大量检测放入程序中
5.2 复杂的s ql计算和转换尽量放入程序中进行