操作系统原理

                                                                   操作系统

推荐一个操作系统的教程网站:http://c.biancheng.net/cpp/u/xitong_1/

1.操作系统的主要作用

         设备管理、进程管理、存储管理(内存管理)、文件管理(文件系统)。

2.操作系统的分类

              单道批处理系统、多道批处理系统、分时系统(Unix就是多用户分时系统)、实时系统(操作系统工作时对各种资源进行动态分配,处理事务的能力较强,速度较快)

3.进程管理:

进程概念:进程是具有独立功能的程序,是关于某个数据集合的一次运行过程。是处理器分配与运行的单位。

进程与程序的区别:1.程序是静态的是永久的,而进程是动态的有生命周期;2进程= 程序+数据+PCB(用来存储进程运行时的所有信息);3.一个程序可以对应多个

                               进程(程序多开)4.一个进程可以包含多个程序(这些程序可以看作是一个大程序)

进程的特征:动态、并发、独立、制约、异步

进程与作业:作业是计算机完成一个任务的总和,进程是完成一个程序的过程(作业进入了就绪状态开始到结束叫进程),后者是动态的。

进程与线程:线程是操作系统为了进一步提高效率,避免因进程间的切换耗费时间而引入的,之所以能提高效率是由于同一进程的线程间共享内存等资源,切换速度比较快。

                     但 由此也增加了系统管理的负担,需要有相应的线程调度算法。线程是基本的处理机调度单位,一个进程有独立的内存单元,线程则共享创建它的进程所拥有

                     的内存和其他资源,但线程是可独立执行的(他有自己的堆栈),一个进程可以有多个线程并发执行;
进程的并行与并发:某个时段,有多个程序运行叫并发(一段时间多个程序进入了内存,单道先后处理);某个时刻,有多个程序许运行叫并行(至少要有两个cpu)。并行

                               就只是并行,并发某些情况下有可能涵盖并行。

进程的运行状态:

                         创建:为程序分配内存空间,PCB等资源

                         就绪:具备分配CPU的条件等待运行

                         运行:分配到CPU,正在处理

                         等待:等待事件处理(I/O输入、资源),结束后进入就绪状态

                         结束:释放空间,系统记录进程整个运行信息。包括直接结束和连同子进程一起结束

父进程创建子进程:共享所有资源,共享一部分父进程资源,和不共享父进程资源。运行关系分为:并发(和子进程同时运行)和等待(等待子进程运行结束)

进程调度算法:1.先到先服务

                        2.最短作业优先调度

                        3优先级调度(无穷阻塞解决办法之一老化)

                        4.轮转法调度(分时操作系统的实现算法,缺点:过度依赖时间片(时间片至少要比上下文切换时间长))

                        5.多级队列调度(就绪对列根据进程类型分为多个组每个组都有自己的调度算法,组之间通常采用优先级调度)

                           与多级反馈队列调度(在多级队列调度的基础上允许进程在队列之间移动,等待时间过长移入优先级高的队列,

                           占用CPU时间过长移入优先级低的队列,通常将I/O约束和交互进程放在优先级高的队列)          

中断和轮询的特点: 

                        轮询:对I/O设备的程序轮询的方式,是早期的计算机系统对I/O设备的一种管理方式。它定时对各种设备轮流询问一遍有无处理要求。

                                轮流询问之后,有要求 的,则加以处理。在处理I/O设备的要求之后,处理机返回继续工作。尽管轮询需要时间,但轮询要比I/O

                                设备的速度要快得多,所以一般不会发生不能及时处 理的问题。当然,再快的处理机,能处理的输入输出设备的数量也是有一定

                                限度的。而且,程序轮询毕竟占据了CPU相当一部分处理时间,因此,程序轮询是一种 效率较低的方式,在现代计算机系统中已

                                 很少应用。

                     中断:程序中断通常简称中断,是指CPU在正常运行程序的过程中,由于预先安排或发生了各种随机的内部或外部事件,使CPU中断正

                                    在运行的程序,而转到为响应的服务程序去处理。

                         轮询——效率低,等待时间很长,CPU利用率不高。   中断——容易遗漏一些问题,CPU利用率高。

进程通信的方式:1.存储共享  2.消息传递 (阻塞和非阻塞两种)
# 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
# 有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
# 信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
# 消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
# 信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
# 共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。
# 套接字( socket ) : 套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。
临界段:一次只能被一个进程使用的资源称为临界资源,而进程使用临界资源的代码段称为临界区/段。一般共享变量或数据结构和慢速设备属于临界资源。临界段分为进入区(空闲让进,忙则等待),临界区,退出区(让权等待)。
临界资源使用原则
                              忙则等待、空闲让进
                              有限等待:是因无法获得临界资源没有进入临界区的进程等待获得临界资源的时间不能是无限的;
                              让权等待:是如果一个进程在当前状态下根本无法获得临界资源而进入临界区应该释放处理机暂时退让(避免忙等)。
                                               而信号量机制增加了一个等待队列(挂起队列),可以实现让权等待(解决了硬件同步的忙等问题),在等
                                             待队列里的进程要保证不会永远不出(就是不发生饥饿现象),保证“有限等待”。
进程同步:为了解决进程对临界资源的使用问题,我们进程之间要进行同步(避免同时对临界资源进行使用)

                 同步的方式:

                 硬件同步(用机器指令的办法):不能解决忙等的问题

                 信号量机制:wait/p申请资源   singal/v释放资源):可能死锁。一般有几个互斥关系就要定义几个信号量

                  管程:解决了死锁的问题

                  原子操作、自旋锁、管程、会合、分布式系统等。

经典的同步问题:生产者——消费者,读者——写者,科学家进餐

同步产生的问题:死锁

死锁的概念:在两个或多个并发进程中,如果每个进程持有某种资源而又都等待别的进程释放它或它们现在保持着的资源,在未改变这种状态之前都不能向前推进,

                     称这一组进程产生了死锁。通俗地讲,就是两个或多个进程被无限期地阻塞、相互等待的一种状态。

死锁产生的原因主要是:1. 系统资源不足;2. 进程推进顺序非法。

产生死锁的必要条件:

                             (1)互斥(mutualexclusion),一个资源每次只能被一个进程使用;

                             (2)不可抢占(nopreemption),进程已获得的资源,在未使用完之前,不能强行剥夺;

                             (3)占有并等待(hold andwait),一个进程因请求资源而阻塞时,对已获得的资源保持不放;

                             (4)环形等待(circularwait),若干进程之间形成一种首尾相接的循环等待资源关系。

                             这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。

死锁的解除与预防:理解了死锁的原因,尤其是产生死锁的四个必要条件,就可以最大可能地避免、预防和解除死锁。所以,在系统设计、进程调度等方面注意 如何不让

                                      这四个必要条件成立,如何确定资源的合理分配算法,避免进程永久占据系统资源。此外,也要防止进程在处于等待状态的情况下占用资源。因此,

                                      对资源 的分配要给予合理的规划。

死锁的处理策略

                                预防策略:一次性分配(打破占有并等待)、资源有序分配(打破环形等待)

                                避免策略:银行家算法(预先计算所有进程所需的资源,看分配当前申请资源是否会在资源收回前导致死锁,如果不会则分配,会则不分配)

                                检测:类似银行家算法的安全检测

                                恢复策略:终止进程(造成资源的浪费,代码的重复执行),资源抢占

                                鸵鸟策略(假设不会发生死锁)

 
4.内存管理:

意义:进程要进入cpu中运行必须先从硬盘中把数据读入内存(就绪),再在运行的时候从内存进入cpu的寄存器中。而由于寄存器和内存之间的访问速度相差很大,所以我们

           在这之间加入了高速内存(这种用来协调速度差异的内存缓存区叫做高速缓存)。由于每个进程都要有独立的内存空间所以我们需要对内存进行管理。

          在为进程分配地址时我们在三个阶段进行:

          静态绑定: 编译时进行绑定:生成绝对代码           加载时绑定:生成可重定位代码          动态绑定:运行时

          动态绑定是我们并不知道程序的实际内存地址,这时我们就要用到逻辑地址。然后在运行是通过重定位寄存器找到分配的实际内存位置。

         我们知道程序进入内存要经过编译,加载,链接。而为了节约内存空间,我们一般采用动态加载(程序被调用时才进行加载)和动态链接(程序要运行时才进行

         链接,通过动态链接库(DDL)实现)。

dll是否有独立的堆栈

   dll是否有独立的堆栈?这个问题不好回答,或者说这个问题本身是否有问题。因为dll中的代码是被某些线程所执行,只有线程拥有堆栈。如果dll中 的代码是exe中的线程所调用,那么这个时候是不是说这个dll没有独立的堆栈?如果dll中的代码是由dll自己创建的线程所执行,那么是不是说dll 有独立的堆栈?

  以上讲的是堆栈,如果对于堆来说,每个dll有自己的堆,所以如果是从dll中动态分配的内存,最好是从dll中删除;如果你从dll中分配内存,然后在exe中,或者另外一个dll中删除,很有可能导致程序崩溃。

虚拟地址:没有分配实际内存的逻辑地址,逻辑地址对应的页仍在磁盘上。在要使用使用调页程序(懒惰交换)将该页从硬盘移入内存(这与下面的交换程序不同)。

页面置换算法:FIFO(最早的页被置换)、最优置换(将来最晚使用的页被置换)、LRU(最近最少使用的页被置换)。过于频繁的页面置换会导致系统抖动(缺页率过高)。

对内存的使用方式:交换(用一个备份存储,通常是快速磁盘。来对在内存中的进程进行换入换出,现在用的比较少,但这种思想运用在了虚拟内存上),连续分配(会产生内存碎片),分页(可以通过共享页来减少物理内存的使用),分段,页段式。

分页:允许进程的物理地址是非连续的。

PTBR(页表基寄存器):每一个进程都需要分配自己一个页表,所以操作系统需要对页表进行保存。若操作系统直接将页表放入专用寄存器来保存,页表过大肯定不适合所以将页表放在内存中,而页表基寄存器指向页表,改变页表就只要改变该寄存器就可以了
PTLR(页表长度寄存器):一个进程很少会使用器所有的地址空间(分配的虚拟地址),如果将所有地址都做成页表的条目,这样会造成很大的浪费,所以有些系统共用该寄存器来表示页表的大小,该寄存器的值可用于检查每个逻辑地址一验证其是否位于进程的有效范围内。这是针对逻辑地址(虚拟分配的地址)来检验的。
TLB(转换表缓冲区是一中硬件缓冲):采用页表基寄存器,我们要访问一个数据必须要经过两次内存访问(一次页表,一次用于该存在内存中的该数据),为了提高速度,我们将一部分页表放入TLB,我们发现这样如果也好在TLB中的概率达到(80%),我们就可以提高速度。

分页改进

       现在还能多计算机支持大逻辑地址空间(2^32——3^64),而页大小不变的情况下,这样页表可以非常大,我们每个进程都需要很大的物理地址来存储页表本身。而我们不可能在内存中连续的分配这个页表,这就需要我们缩小页表(多级页表、哈希页表、反向页表(解决了虚拟内存页对应的条目,每一个条目对应一个实际的物理内存页,这样系统就只有一个页表。可以和哈希页表结合使用,逻辑地址的查找时间))。使用多级页表、哈希页表也可以获得更大的寻址空间。

 分段和分页

  页是信息的物理单位,分页是为实现离散分配方式,以消减内存的外碎片,提高内存的利用率;或者说,分页仅仅是由于系统管理的需要,而不是用户的需要。

  段是信息的逻辑单位,它含有一组其意义相对完整的信息。分段的目的是为了能更好的满足用户的需要。

  页的大小固定且由系统确定,把逻辑地址划分为页号和页内地址两部分,是由机器硬件实现的,因而一个系统只能有一种大小的页面。段的长度却不固定,决定于用户所编写的程序,通常由编辑程序在对源程序进行编辑时,根据信息的性质来划分。

  分页的作业地址空间是一维的,即单一的线性空间,程序员只须利用一个记忆符,即可表示一地址。分段的作业地址空间是二维的,程序员在标识一个地址时,既需给出段名,又需给出段内地址。


什么是缓冲区溢出?有什么危害?其原因是什么?

  缓冲区溢出是指当计算机向缓冲区内填充数据时超过了缓冲区本身的容量,溢出的数据覆盖在合法数据上。

  危害:在当前网络与分布式系统安全中,被广泛利用的50%以上都是缓冲区溢出,其中最著名的例子是1988年利用fingerd漏洞的蠕虫。而缓冲区 溢出中,最为危险的是堆栈溢出,因为入侵者可以利用堆栈溢出,在函数返回时改变返回程序的地址,让其跳转到任意地址,带来的危害一种是程序崩溃导致拒绝服 务,另外一种就是跳转并且执行一段恶意代码,比如得到shell,然后为所欲为。通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序 的堆栈,使程序转而执行其它指令,以达到攻击的目的。

  造成缓冲区溢出的主原因是程序中没有仔细检查用户输入的参数。

 

 5.文件管理

 

常见的操作系统使用的文件系统整理http://blog.csdn.net/youngchang06hpu/article/details/8009947

文件系统是操作系统用 于明确磁盘或分区上的文件的方法和数据结构;即在磁盘上组织文件的方法。也指用于存储文件的磁盘或分区,或文件系统种类。操作系统中负责管理和存储文件信 息的软件机构称为文件管理系统,简称文件系统。文件系统由三部分组成:与文件管理有关软件、被管理文件以及实施文件管理所需数据结构。从系统角度来看,文 件系统是对文件存储器空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。具体地说,它负责为用户建立文件,存入、读出、修改、转储文 件,控制文件的存取,当用户不再使用时撤销文件等。

  【FAT】:

  常PC机使用的文件系统是FAT16。像基于MS-DOS,Win 95等系统都采用了FAT16文件系统。在Win 9X下,FAT16支持的分区最大为2GB。我们知道计算机将信息保存在硬盘上称为“簇”的区域内。使用的簇越小,保存信息的效率就越高。在FAT16的 情况下,分区越大簇就相应的要大,存储效率就越低,势必造成存储空间的浪费。并且随着计算机硬件和应用的不断提高,FAT16文件系统已不能很好地适应系 统的要求。在这种情况下,推出了增强的文件系统FAT32。同FAT16相比,FAT32主要具有以下特点:

  1、同FAT16相比FAT32最大的优点是可以支持的磁盘大小达到32G,但是不能支持小于512MB的分区。

  *基于FAT32的Win 2000可以支持分区最大为32GB;而基于 FAT16的Win 2000支持的分区最大为4GB。

  2、由于采用了更小的簇,FAT32文件系统可以更有效率地保存信息。如两个分区大小都为2GB,一个分区采用了FAT16文件系统,另一个分区采用 了FAT32文件系统。采用FAT16的分区的簇大小为32KB,而FAT32分区的簇只有4KB的大小。这样FAT32就比FAT16的存储效率要高很 多,通常情况下可以提高15%。

  3、FAT32文件系统可以重新定位根目录和使用FAT的备份副本。另外FAT32分区的启动记录被包含在一个含有关键数据的结构中,减少了计算机系统崩溃的可能性。

  【NTFS】:

  NTFS文件系统是一个基于安全性的文件系统,是Windows NT 所采用的独特的文件系统结构,它是建立在保护文件和目录数据基础上,同时照顾节省存储资源、减少磁盘占用量的一种先进的文件系统。使用非常广泛的 Windows NT 4.0采用的就是NTFS 4.0文件系统,相信它所带来的强大的系统安全性一定给广大用户留下了深刻的印象。Win 2000采用了更新版本的NTFS文件系统??NTFS 5.0,它的推出使得用户不但可以像Win 9X那样方便快捷地操作和管理计算机,同时也可享受到NTFS所带来的系统安全性。

  NTFS 5.0的特点主要体现在以下几个方面:

  1、NTFS可以支持的分区(如果采用动态磁盘则称为卷)大小可以达到2TB。而Win 2000中的FAT32支持分区的大小最大为32GB。

  2、NTFS是一个可恢复的文件系统。在NTFS分区上用户很少需要运行磁盘修复程序。NTFS通过使用标准的事物处理日志和恢复技术来保证分区的一致性。发生系统失败事件时,NTFS使用日志文件和检查点信息自动恢复文件系统的一致性。

  3、NTFS支持对分区、文件夹和文件的压缩。任何基于Windows的应用程序对NTFS分区上的压缩文件进行读写时不需要事先由其他程序进行解压缩,当对文件进行读取时,文件将自动进行解压缩;文件关闭或保存时会自动对文件进行压缩。

  4、NTFS采用了更小的簇,可以更有效率地管理磁盘空间。在Win 2000的FAT32文件系统的情况下,分区大小在2GB~8GB时簇的大小为4KB;分区大小在8GB~16GB时簇的大小为8KB;分区大小在 16GB~32GB时,簇的大小则达到了16KB。而Win 2000的NTFS文件系统,当分区的大小在2GB以下时,簇的大小都比相应的FAT32簇小;当分区的大小在2GB以上时(2GB~2TB),簇的大小 都为4KB。相比之下,NTFS可以比FAT32更有效地管理磁盘空间,最大限度地避免了磁盘空间的浪费。

  5、在NTFS分区上,可以为共享资源、文件夹以及文件设置访问许可权限。许可的设置包括两方面的内容:一是允许哪些组或用户对文件夹、文件和共享资 源进行访问;二是获得访问许可的组或用户可以进行什么级别的访问。访问许可权限的设置不但适用于本地计算机的用户,同样也应用于通过网络的共享文件夹对文 件进行访问的网络用户。与FAT32文件系统下对文件夹或文件进行访问相比,安全性要高得多。另外,在采用NTFS格式的Win 2000中,应用审核策略可以对文件夹、文件以及活动目录对象进行审核,审核结果记录在安全日志中,通过安全日志就可以查看哪些组或用户对文件夹、文件或 活动目录对象进行了什么级别的操作,从而发现系统可能面临的非法访问,通过采取相应的措施,将这种安全隐患减到最低。这些在FAT32文件系统下,是不能 实现的。

  6、在Win 2000的NTFS文件系统下可以进行磁盘配额管理。磁盘配额就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁 盘空间。设置磁盘配额后,可以对每一个用户的磁盘使用情况进行跟踪和控制,通过监测可以标识出超过配额报警阈值和配额限制的用户,从而采取相应的措施。磁 盘配额管理功能的提供,使得管理员可以方便合理地为用户分配存储资源,避免由于磁盘空间使用的失控可能造成的系统崩溃,提高了系统的安全性。

  7、NTFS使用一个“变更”日志来跟踪记录文件所发生的变更。

【Ext2】:

  Ext2是 GNU/Linux 系统中标准的文件系统,其特点为存取文件的性能极好,对于中小型的文件更显示出优势,这主要得利于其簇快取层的优良设计。

  其单一文件大小与文件系统本身的容量上限与文件系统本身的簇大小有关,在一般常见的 x86 电脑系统中,簇最大为 4KB,则单一文件大小上限为 2048GB,而文件系统的容量上限为 16384GB。

  但由于目前核心 2.4 所能使用的单一分割区最大只有 2048GB,实际上能使用的文件系统容量最多也只有 2048GB。

  至于Ext3文件系统,它属于一种日志文件系统,是对ext2系统的扩展。它兼容ext2,并且从ext2转换成ext3并不复杂。

  【Ext3】:

  Ext3是一种日志式文件系统,是对ext2系统的扩展,它兼容ext2。日志式文件系统的优越性在于:由于文件系统都有快取层参与运作,如不使用时 必须将文件系统卸下,以便将快取层的资料写回磁盘中。因此每当系统要关机时,必须将其所有的文件系统全部shutdown后才能进行关机。

  如果在文件系统尚未shutdown前就关机 (如停电) 时,下次重开机后会造成文件系统的资料不一致,故这时必须做文件系统的重整工作,将不一致与错误的地方修复。然而,此一重整的工作是相当耗时的,特别是容 量大的文件系统,而且也不能百分之百保证所有的资料都不会流失。

  为了克服此问题,使用所谓‘日志式文件系统 (Journal File System) ’。此类文件系统最大的特色是,它会将整个磁盘的写入动作完整记录在磁盘的某个区域上,以便有需要时可以回溯追踪。

  由于资料的写入动作包含许多的细节,像是改变文件标头资料、搜寻磁盘可写入空间、一个个写入资料区段等等,每一个细节进行到一半若被中断,就会造成文件系统的不一致,因而需要重整。

  然而,在日志式文件系统中,由于详细纪录了每个细节,故当在某个过程中被中断时,系统可以根据这些记录直接回溯并重整被中断的部分,而不必花时间去检查其他的部分,故重整的工作速度相当快,几乎不需要花时间。

  【Ext4】:

  Linux kernel 自 2.6.28 开始正式支持新的文件系统 Ext4。Ext4 是 Ext3 的改进版,修改了 Ext3 中部分重要的数据结构,而不仅仅像 Ext3 对 Ext2 那样,只是增加了一个日志功能而已。Ext4 可以提供更佳的性能和可靠性,还有更为丰富的功能:

  1、与 Ext3 兼容。执行若干条命令,就能从 Ext3 在线迁移到 Ext4,而无须重新格式化磁盘或重新安装系统。原有 Ext3 数据结构照样保留,Ext4 作用于新数据,当然,整个文件系统因此也就获得了 Ext4 所支持的更大容量。

  2、更大的文件系统和更大的文件。较之 Ext3 目前所支持的最大 16TB 文件系统和最大 2TB 文件,Ext4 分别支持 1EB(1,048,576TB, 1EB=1024PB, 1PB=1024TB)的文件系统,以及 16TB 的文件。

  3、无限数量的子目录。Ext3 目前只支持 32,000 个子目录,而 Ext4 支持无限数量的子目录。

  4、Extents。Ext3 采用间接块映射,当操作大文件时,效率极其低下。比如一个 100MB 大小的文件,在 Ext3 中要建立 25,600 个数据块(每个数据块大小为 4KB)的映射表。而 Ext4 引入了现代文件系统中流行的 extents 概念,每个 extent 为一组连续的数据块,上述文件则表示为“该文件数据保存在接下来的 25,600 个数据块中”,提高了不少效率。

  5、多块分配。当写入数据到 Ext3 文件系统中时,Ext3 的数据块分配器每次只能分配一个 4KB 的块,写一个 100MB 文件就要调用 25,600 次数据块分配器,而 Ext4 的多块分配器“multiblock allocator”(mballoc) 支持一次调用分配多个数据块。

  6、延迟分配。Ext3 的数据块分配策略是尽快分配,而 Ext4 和其它现代文件操作系统的策略是尽可能地延迟分配,直到文件在 cache 中写完才开始分配数据块并写入磁盘,这样就能优化整个文件的数据块分配,与前两种特性搭配起来可以显著提升性能。

  7、快速 fsck。以前执行 fsck 第一步就会很慢,因为它要检查所有的 inode,现在 Ext4 给每个组的 inode 表中都添加了一份未使用 inode 的列表,今后 fsck Ext4 文件系统就可以跳过它们而只去检查那些在用的 inode 了。

  8、日志校验。日志是最常用的部分,也极易导致磁盘硬件故障,而从损坏的日志中恢复数据会导致更多的数据损坏。Ext4 的日志校验功能可以很方便地判断日志数据是否损坏,而且它将 Ext3 的两阶段日志机制合并成一个阶段,在增加安全性的同时提高了性能。

9、“无日志”(No Journaling)模式。日志总归有一些开销,Ext4 允许关闭日志,以便某些有特殊需求的用户可以借此提升性能。

  10、在线碎片整理。尽管延迟分配、多块分配和 extents 能有效减少文件系统碎片,但碎片还是不可避免会产生。Ext4 支持在线碎片整理,并将提供 e4defrag 工具进行个别文件或整个文件系统的碎片整理。

  11、inode 相关特性。Ext4 支持更大的 inode,较之 Ext3 默认的 inode 大小 128 字节,Ext4 为了在 inode 中容纳更多的扩展属性(如纳秒时间戳或 inode 版本),默认 inode 大小为 256 字节。Ext4 还支持快速扩展属性(fast extended attributes)和 inode 保留(inodes reservation)。

  12、持久预分配(Persistent preallocation)。P2P 软件为了保证下载文件有足够的空间存放,常常会预先创建一个与所下载文件大小相同的空文件,以免未来的数小时或数天之内磁盘空间不足导致下载失败。 Ext4 在文件系统层面实现了持久预分配并提供相应的 API(libc 中的 posix_fallocate()),比应用软件自己实现更有效率。

  13、默认启用 barrier。磁盘上配有内部缓存,以便重新调整批量数据的写操作顺序,优化写入性能,因此文件系统必须在日志数据写入磁盘之后才能写 commit 记录,若 commit 记录写入在先,而日志有可能损坏,那么就会影响数据完整性。Ext4 默认启用 barrier,只有当 barrier 之前的数据全部写入磁盘,才能写 barrier 之后的数据。(可通过 “mount -o barrier=0” 命令禁用该特性。)

  【ZFS】:

  ZFS源自于Sun Microsystems为Solaris操作系统开发的文件系统。ZFS是一个具有高存储容量、文件系统与卷管理概念整合、崭新的磁盘逻辑结构的轻量级 文件系统,同时也是一个便捷的存储池管理系统。ZFS是一个使用CDDL协议条款授权的开源项目。

  【HFS】:

  1、HFS文件系统概念

  分层文件系统(Hierarchical File System,HFS)是一种由苹果电脑开发,并使用在Mac OS上的文件系统。最初被设计用于软盘和硬盘,同时也可以在在只读媒体如CD-ROM上见到。

  2、HFS文件系统开发过程

  HFS首次出现在1985年9月17日,作为Macintosh电脑上新的文件系统。它取代只用于早期Mac型号所使用的平面文件系统 Macintosh File System(MFS)。因为Macintosh电脑所产生的数据,比其它通常的文件系统,如DOS使用的FAT或原始Unix文件系统所允许存储的数据 更多。苹果电脑开发了一种新式更适用的文件系统,而不是采用现有的规格。例如,HFS允许文件名最多有31个字符的长度,支持metadata和双分支 (每个文件的数据和资源支分开存储)文件。

  尽管HFS象其它大多数文件系统一样被视为专有的格式,因为只有它为大多数最新的操作系统提供了很好的通用解决方法以存取HFS格式磁盘。

  在1998年,苹果电脑发布了HFS Plus,其改善了HFS对磁盘空间的地址定位效率低下,并加入了其它的改进。当前版本的Mac OS仍旧支持HFS,但从Mac OS X开始HFS卷不能作为启动用。

  3、构成方式

  分层文件系统把一个卷分为许多512字节的“逻辑块”。这些逻辑块被编组为“分配块”,这些分配块可以根据卷的尺寸包含一个或多个逻辑块。HFS对地址分配块使用16位数值,分配块的最高限制数量是65536。

  组成一个HFS卷需要下面的五个结构:

  1)卷的逻辑块0和1是启动块,它包含了系统启动信息。例如,启动时载入的系统名称和壳(通常是Finder)文件。

  2)逻辑块2包含主目录块(Master Directory Block,简称MDB)。

  3)逻辑块3是卷位图(Volume Bitmap)的启动块,它追踪分配块使用状态。

  4)总目录文件(Catalog File)是一个包含所有文件的记录和储存在卷中目录的B*-tree。

  5)扩展溢出文件(Extent Overflow File)是当最初总目录文件中三个扩展占用后,另外一个包含额外扩展记录的分配块对应信息的B*-tree。

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值