[置顶] 长期出售:Godaddy老域名,Godaddy历史BA老域名!

[置顶] 长期出售:搜狗pr域名,搜狗收录域名,搜狗权重域名!

[置顶] 长期出售:高外链域名,高反链域名,权重域名,有收录的域名!

YAFFS嵌入式文件系统

YAFFS文件系统有些类似于JFFS/JFFS2文件系统,与之不同的是JFFS1/2文件系统最初是针对NOR Flash的应用场合设计的,而NOR Flash和NAND Flash本质上有较大的区别,所以尽管JFFS1/2文件系统也能应用于NAND Flash,但由于它在内存占用和启动时间方面针对NOR的特性做了一些取舍,所以对NAND来说通常并不是最优的方案。NAND上的每一页数据都有额外的空间用来存储附加信息,YAFFS正好利用了该空间中一部分来存储文件系统相关的内容。
YAFFS (Yet Another Flash File System, http://www.yaffs.net)文件系统是专门针对 NAND 闪存设计的嵌入式文件系统,目前有YAFFS和YAFFS2两个版本,两个版本的主要区别之一在于 YAFFS2能够更好地支持大容量的NAND Flash芯片,而前者只针对页大小为512字节的NAND。

全面详解终端设备

在Linux系统中,终端是一种字符型设备,它有多种类型,通常使用tty来简称各种类型的终端设备。tty是Teletype的缩写,Teletype是最早出现的一种终端设备,很像电传打字机,是由Teletype公司生产的。Linux系统中包含如下几类终端设备。

1.串行端口终端(/dev/ttySn)

串行端口终端(Serial Port Terminal)是使用计算机串行端口连接的终端设备。计算机把每个串行端口都看作是一个字符设备。这些串行端口所对应的设备名称是/dev/ttySO(或/dev/tts/0)、/dev/ttySl (或/dev/tts/1)等,设备号分别是(4,0)、(4,1)等。

Linux 2.6内核的特点

尽管Linux 2.4目前仍然被广泛应用,但是本书是基于Linux 2.6内核的。从2003年12月Linux 2.6.0发布至今,一直还处于开发之中,并还将稳定较长一段时间。Linux 2.6相对于Linux 2.4有相当大的改进,主要体现在如下几个方面。

1.新的调度器

2.6版本的Linux内核使用了新的进程调度算法,它在高负载的情况下执行得极其出色,并且当有很多处理器时也可以很好地扩展。

2.内核抢占

在2.6版本的Linux内核中,内核任务可以被抢占,从而提高系统的实时性。这样做最主要的优势在于可以极大地增强系统的用户交互性。

缓存系统解析

每个缓存服务器只有有限大小的磁盘和内存可以作为缓存使用。因为我们的照片工作集太大以至于缓存被填满。一个填满的缓存需要经常决定迁出哪个对象来为新来的对象腾出空间。该过程基于一个替换或“迁出”算法。虽然存在着很多的迁出算法,但是最通用的算法是采用最近最少使用(Least Recently Used , LRU)原则。
我们提过磁盘是基础设施中最慢的部分,对其的访问最耗时间。多数大型网站通过将数据缓存在不同位置来减轻这种昂贵操作的需求。

在Web架构中,缓存最经常被用于存储数据库结果(比如用Memcached)或实际文件 (比如用Squid和Varnish)。这两种方法对容量规划都要求有所考虑。它们是反向代理的示例,都是将缓存数据从Web服务器发向客户端(通常是Web浏览器)的专门系统。

体系结构总结及名词解释

体系结构问题:被优化的代码调度利用了现代计算机体系结构的一些特性。这样的机器常常允许以流水线方式执行代码,也就是多条指令在同一个时刻处于不同的执行阶段。有些机器还允许多条指令在同一个时刻开始执行。

•数据依赖:在调度运算指令时,我们必须知道这些指令对于每个内存位置和寄存器的影响。如果一条指令必须在另一指令对某个内存位置写人之后才读取该位置的值,那么这两条指令之间具有真依赖关系。如果有一个对同一位置的读指令之后的写指令,那么两条指令之间就出现反依赖关系;当有两个对同一位置的写指令时就会出现输出依赖。

数组数据依赖关系分析

并行化或局部性优化经常对原程序中执行的运算重新排序。和所有的优化一样,只有当对运算的重新排序不会改变程序输出时才可以对这些运算重新排序。一般来说,我们不可能深人理解一个程序到底做了什么,代码优化通常选用一个较简单的、保守的测试方法来决定在什么时候可以肯定程序的输出不会受到优化的影响:检查在原程序中和在修改后的程序中,对同一内存位置的各个运算被执行的顺序是否一样。在当前的研究中,我们关注的是数组访问,因此数组元 素就是需要考虑的内存位置。

如果两个访问(不管是读还是写)指向两个不同的位置,显然它们是相互独立的(可以被重 新排序)。另外,读运算不会改变内存的状态,因此各个读运算之间是独立的。如果两个访问指向同一个内存位置并且其中至少有一个写运算,那么就说这两个访问是数据 依赖的。为了保证修改后的程序和原程序做同样的事情,每一对有数据依赖关系的运算在原程 序中的执行顺序必须在新的程序中得到保持。

整数线性规划

对数据依赖关系的分析要求找出是否存在一些整数满足由等式和不等式组成的约束系统。其中的等式是从数组访问的矩阵向量表示中得到的;不等式是从循环界限中得到的。等式可以用不等式表示:等式z 可以用两个不等式:x≥y和y≥x表示。

因此,数据依赖关系问题可以被表示为寻找满足一组线性不等式的整数解,这个问题就是众所周知的整数线性规划(integer linear programming)。整数线性规划是一个NP完全问题。虽然没有已知的多项式复杂性的算法,但人们研发了多种启发式解法来解决涉及很多变量的线性规划问题。这些解法在很多情况下运行得是相当快的。遗憾的是,这样的标准启发式解法并不适合数据依赖关系分析。在数据依赖分析中,问题的难点在于如何解决很多小且简单的整数线性规划,而不是大型的复杂整数线性规划。

多指令发送处理器

我们也可以使用仿射循环转换来优化多指令发送计算机的性能。一个软件流水线化循环的性能受到两个因素的限制:先后关系约束中的环,以及对关键资源的使用。通过改变最内层循环的组成,我们可以改进这些限制。

首先,我们可以使用循环转换来创立最内层的可并行化循环,从而完全消除先后关系约束中的环。假设一个程序有两个循环,其中的外层循环是可并行化的,而内层循环不可并行化。我们可以交换这两个循环,使得内层循环变成可并行化的,从而创造出更多的指令级并行化机会。请注意,我们并不要求最内层循环的迭代之间一定是完全可并行化的。只要其依赖关系所确定的环短到可以充分利用硬件资源就足够了。

缓冲区溢出

为了防止缓冲区溢出,我们要么必须通过静态的方法证明每个数组写运算都处于边界之内,要么必须进行适当的动态数组边界检查。因为在C和C++程序中必须手工插入这些边界检查,程序员很容易忘记插人测试代码,或者插人错误的测试代码。人们已经开发了启发式工具来检查是否在调用一个strcpy之前至少进行了某些测试,虽然这些测试不一定是正确的。
当一个由用户提供的精心制作的数据被写到了预想的缓冲区之外并操纵程序的执行时,就发生了缓冲区溢出攻击(buffer overflow attack)。比如,一个C程序可能从用户那里读取一个字符 串h然后使用函数调用

一个指针和引用的模型

因为我们进行的是上下文无关的分析,所以只需要断定一个给定的变量u能够指向一个给定的堆对象h,不需要指出在程序中的什么地方u可能指向h,或者在什么样的上下文中u可以指向h请注意,变量可以通过它的全名来命名。在Java中,这个全名包括了模块、类、方法和方法中的块以及变量名本身。因此,我们可以区分标识符相同的多个变量。
假设我们的语言可以用下列方式来表示和操作引用:

1)某些程序变量的类型为“指向T的指针”或“指向r的引用”,其中T是一个类型。这些变量可以是静态的,也可能位于运行时刻栈中。我们简单地称它们为变量。

«727374757677787980818283848586»

热门搜索: 外链域名 高外链域名 高收录域名

Copyright www.thyst.cn. Some Rights Reserved.