转载:http://blog.csdn.net/youngchang06hpu/article/details/8009947php
一、什么是进程(Process)和线程(Thread)?有何区别?html
进程是具备必定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程本身基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),可是它可与同属一个进程的其余的线程共享进程所拥有的所有资源。一个线程能够建立和撤销另外一个线程,同一个进程中的多个线程之间能够并发执行。node
进程与应用程序的区别在于应用程序做为一个静态文件存储在计算机系统的硬盘等存储空间中,而进程则是处于动态条件下由操做系统维护的系统资源管理实体。程序员
二、Windows下的内存是如何管理的?算法
Windows提供了3种方法来进行内存管理:虚拟内存,最适合用来管理大型对象或者结构数组;内存映射文件,最适合用来管理大型数据流(一般来自文件)以及在单个计算机上运行多个进程之间共享数据;内存堆栈,最适合用来管理大量的小对象。shell
Windows操纵内存能够分两个层面:物理内存和虚拟内存。数组
其中物理内存由系统管理,不容许应用程序直接访问,应用程序可见的只有一个2G地址空间,而内存分配是经过堆进行的。对于每一个进程都有本身的默认堆,当一个堆建立后,就经过虚拟内存操做保留了相应大小的地址块(不占有实际的内存,系统消耗很小)。当在堆上分配一块内存时,系统在堆的地址表里找到一个空闲块(若是找不到,且堆建立属性是可扩充的,则扩充堆大小),为这个空闲块所包含的全部内存页提交物理对象(在物理内存上或硬盘的交换文件上),这时就能够访问这部分地址。提交时,系统将对全部进程的内存统一调配,若是物理内存不够,系统试图把一部分进程暂时不访问的页放入交换文件,以腾出部分物理内存。释放内存时,只在堆中将所在的页解除提交(相应的物理对象被解除),继续保留地址空间。缓存
若是要知道某个地址是否被占用/可不能够访问,只要查询此地址的虚拟内存状态便可。若是是提交,则能够访问。若是仅仅保留,或没保留,则产生一个软件异常。此外,有些内存页能够设置各类属性。若是是只读,向内存写也会产生软件异常。安全
三、Windows消息调度机制是?服务器
A)指令队列;B)指令堆栈;C)消息队列;D)消息堆栈
答案:C
处理消息队列的顺序。首先Windows绝对不是按队列先进先出的次序来处理的,而是有必定优先级的。优先级经过消息队列的状态标志来实现的。首先,最高优先级的是别的线程发过来的消息(经过sendmessage);其次,处理登记消息队列消息;再次处理QS_QUIT标志,处理虚拟输入队列,处理wm_paint;最后是wm_timer。
四、描述实时系统的基本特性
在特定时间内完成特定的任务,实时性与可靠性。
所谓“实时操做系统”,其实是指操做系统工做时,其各类资源能够根据须要随时进行动态分配。因为各类资源能够进行动态分配,所以,其处理事务的能力较强、速度较快。
五、中断和轮询的特色
对I/O设备的程序轮询的方式,是早期的计算机系统对I/O设备的一种管理方式。它定时对各类设备轮流询问一遍有无处理要求。轮流询问以后,有要求的,则加以处理。在处理I/O设备的要求以后,处理机返回继续工做。尽管轮询须要时间,但轮询要比I/O设备的速度要快得多,因此通常不会发生不能及时处理的问题。固然,再快的处理机,能处理的输入输出设备的数量也是有必定限度的。并且,程序轮询毕竟占据了CPU至关一部分处理时间,所以,程序轮询是一种效率较低的方式,在现代计算机系统中已不多应用。
程序中断一般简称中断,是指CPU在正常运行程序的过程当中,因为预先安排或发生了各类随机的内部或外部事件,使CPU中断正在运行的程序,而转到为响应的服务程序去处理。
轮询——效率低,等待时间很长,CPU利用率不高。
中断——容易遗漏一些问题,CPU利用率高。
六、什么是临界区?如何解决冲突?
每一个进程中访问临界资源的那段程序称为临界区,每次只准许一个进程进入临界区,进入后不容许其余进程进入。
(1)若是有若干进程要求进入空闲的临界区,一次仅容许一个进程进入;
(2)任什么时候候,处于临界区内的进程不可多于一个。如已有进程进入本身的临界区,则其它全部试图进入临界区的进程必须等待;
(3)进入临界区的进程要在有限时间内退出,以便其它进程能及时进入本身的临界区;
(4)若是进程不能进入本身的临界区,则应让出CPU,避免进程出现“忙等”现象。
七、说说分段和分页
页是信息的物理单位,分页是为实现离散分配方式,以消减内存的外零头,提升内存的利用率;或者说,分页仅仅是因为系统管理的须要,而不是用户的须要。
段是信息的逻辑单位,它含有一组其意义相对完整的信息。分段的目的是为了能更好的知足用户的须要。
页的大小固定且由系统肯定,把逻辑地址划分为页号和页内地址两部分,是由机器硬件实现的,于是一个系统只能有一种大小的页面。段的长度却不固定,决定于用户所编写的程序,一般由编辑程序在对源程序进行编辑时,根据信息的性质来划分。
分页的做业地址空间是一维的,即单一的线性空间,程序员只须利用一个记忆符,便可表示一地址。分段的做业地址空间是二维的,程序员在标识一个地址时,既需给出段名,又需给出段内地址。
八、说出你所知道的保持进程同步的方法?
进程间同步的主要方法有原子操做、信号量机制、自旋锁、管程、会合、分布式系统等。
九、Linux中经常使用到的命令
显示文件目录命令ls 如ls
改变当前目录命令cd 如cd /home
创建子目录mkdir 如mkdir xiong
删除子目录命令rmdir 如rmdir /mnt/cdrom
删除文件命令rm 如rm /ucdos.bat
文件复制命令cp 如cp /ucdos /fox
获取帮助信息命令man 如man ls
显示文件的内容less 如less mwm.lx
重定向与管道type 如type readme>>direct,将文件readme的内容追加到文direct中
十、Linux文件属性有哪些?(共十位)
-rw-r--r--那个是权限符号,总共是- --- --- ---这几个位。
第一个短横处是文件类型识别符:-表示普通文件;c表示字符设备(character);b表示块设备(block);d表示目录(directory);l表示连接文件(link);后面第一个三个连续的短横是用户权限位(User),第二个三个连续短横是组权限位(Group),第三个三个连续短横是其余权限位(Other)。每一个权限位有三个权限,r(读权限),w(写权限),x(执行权限)。若是每一个权限位都有权限存在,那么满权限的状况就是:-rwxrwxrwx;权限为空的状况就是- --- --- ---。
权限的设定能够用chmod命令,其格式位:chmod ugoa+/-/=rwx filename/directory。例如:
一个文件aaa具备彻底空的权限- --- --- ---。
chmod u+rw aaa(给用户权限位设置读写权限,其权限表示为:- rw- --- ---)
chmod g+r aaa(给组设置权限为可读,其权限表示为:- --- r-- ---)
chmod ugo+rw aaa(给用户,组,其它用户或组设置权限为读写,权限表示为:- rw- rw- rw-)
若是aaa具备满权限- rwx rwx rwx。
chmod u-x aaa(去掉用户可执行权限,权限表示为:- rw- rwx rwx)
若是要给aaa赋予制定权限- rwx r-x r-x,命令为:
chmod u=rwx,go=rx aaa
十一、makefile文件的做用是什么?
一个工程中的源文件不可胜数,其按类型、功能、模块分别放在若干个目录中。makefile定义了一系列的规则来指定哪些文件须要先编译,哪些文件须要后编译,哪些文件须要从新编译,甚至于进行更复杂的功能操做。由于makefile就像一个Shell脚本同样,其中也能够执行操做系统的命令。makefile带来的好处就是——“自动化编译”。一旦写好,只须要一个make命令,整个工程彻底自动编译,极大地提升了软件开发的效率。make是一个命令工具,是一个解释makefile中指令的命令工具。通常来讲,大多数的IDE都有这个命令,好比:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。
十二、简术OSI的物理层Layer1,链路层Layer2,网络层Layer3的任务。
网络层:经过路由选择算法,为报文或分组经过通讯子网选择最适当的路径。
链路层:经过各类控制协议,将有差错的物理信道变为无差错的、能可靠传输数据帧的数据链路。
物理层:利用传输介质为数据链路层提供物理链接,实现比特流的透明传输。
1三、什么是中断?中断时CPU作什么工做?
中断是指在计算机执行期间,系统内发生任何非寻常的或非预期的急需处理事件,使得CPU暂时中断当前正在执行的程序而转去执行相应的事件处理程序。待处理完毕后又返回原来被中断处继续执行或调度新的进程执行的过程。
1四、你知道操做系统的内容分为几块吗?什么叫作虚拟内存?他和主存的关系如何?内存管理属于操做系统的内容吗?
操做系统的主要组成部分:进程和线程的管理,存储管理,设备管理,文件管理。虚拟内存是一些系统页文件,存放在磁盘上,每一个系统页文件大小为4K,物理内存也被分页,每一个页大小也为4K,这样虚拟页文件和物理内存页就能够对应,实际上虚拟内存就是用于物理内存的临时存放的磁盘空间。页文件就是内存页,物理内存中每页叫物理页,磁盘上的页文件叫虚拟页,物理页+虚拟页就是系统全部使用的页文件的总和。
1五、线程是否具备相同的堆栈?dll是否有独立的堆栈?
每一个线程有本身的堆栈。
dll是否有独立的堆栈?这个问题很差回答,或者说这个问题自己是否有问题。由于dll中的代码是被某些线程所执行,只有线程拥有堆栈。若是dll中的代码是exe中的线程所调用,那么这个时候是否是说这个dll没有独立的堆栈?若是dll中的代码是由dll本身建立的线程所执行,那么是否是说dll有独立的堆栈?
以上讲的是堆栈,若是对于堆来讲,每一个dll有本身的堆,因此若是是从dll中动态分配的内存,最好是从dll中删除;若是你从dll中分配内存,而后在exe中,或者另一个dll中删除,颇有可能致使程序崩溃。
1六、什么是缓冲区溢出?有什么危害?其缘由是什么?
缓冲区溢出是指当计算机向缓冲区内填充数据时超过了缓冲区自己的容量,溢出的数据覆盖在合法数据上。
危害:在当前网络与分布式系统安全中,被普遍利用的50%以上都是缓冲区溢出,其中最著名的例子是1988年利用fingerd漏洞的蠕虫。而缓冲区溢出中,最为危险的是堆栈溢出,由于入侵者能够利用堆栈溢出,在函数返回时改变返回程序的地址,让其跳转到任意地址,带来的危害一种是程序崩溃致使拒绝服务,另一种就是跳转而且执行一段恶意代码,好比获得shell,而后随心所欲。经过往程序的缓冲区写超出其长度的内容,形成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其它指令,以达到攻击的目的。
形成缓冲区溢出的主缘由是程序中没有仔细检查用户输入的参数。
1七、什么是死锁?其条件是什么?怎样避免死锁?
死锁的概念:在两个或多个并发进程中,若是每一个进程持有某种资源而又都等待别的进程释放它或它们如今保持着的资源,在未改变这种状态以前都不能向前推动,称这一组进程产生了死锁。通俗地讲,就是两个或多个进程被无限期地阻塞、相互等待的一种状态。
死锁产生的缘由主要是:? 系统资源不足;? 进程推动顺序非法。
产生死锁的必要条件:
(1)互斥(mutualexclusion),一个资源每次只能被一个进程使用;
(2)不可抢占(nopreemption),进程已得到的资源,在未使用完以前,不能强行剥夺;
(3)占有并等待(hold andwait),一个进程因请求资源而阻塞时,对已得到的资源保持不放;
(4)环形等待(circularwait),若干进程之间造成一种首尾相接的循环等待资源关系。
这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不知足,就不会发生死锁。
死锁的解除与预防:理解了死锁的缘由,尤为是产生死锁的四个必要条件,就能够最大可能地避免、预防和解除死锁。因此,在系统设计、进程调度等方面注意如何不让这四个必要条件成立,如何肯定资源的合理分配算法,避免进程永久占据系统资源。此外,也要防止进程在处于等待状态的状况下占用资源。所以,对资源的分配要给予合理的规划。
死锁的处理策略:鸵鸟策略、预防策略、避免策略、检测与恢复策略。
一、程序和进程
进程由两个部分组成:1)操做系统用来管理进程的内核对象。内核对象也是系统用来存放关于进程的统计信息的地方。2)地址空间。它包含全部可执行模块或DLL模块的代码和数据。它还包含动态内存分配的空间。如线程堆栈和堆分配空间。
|
定义 |
使用系统运行资源状况 |
程序 |
计算机指令的集合,它以文件的形式存储在磁盘上。程序是静态实体(passive Entity),在多道程序系统中,它是不能独立运行的,更不能与其余程序并发执行。 |
不使用【程序不能申请系统资源,不能被系统调度,也不能做为独立运行的单位,所以,它不占用系统的运行资源】。
|
进程 |
一般被定义为一个正在运行的程序的实例,是一个程序在其自身的地址空间中的一次执行活动。 定义:进程是进程实体(包括:程序段、相关的数据段、进程控制块PCB)的运行过程,是系统进行资源分配和调度的一个独立单位。 |
使用【进程是资源申请、调度和独立运行的单位,所以,它使用系统中的运行资源。】 |
二、进程与线程
若是说操做系统引入进程的目的是为了提升程序并发执行,以提升资源利用率和系统吞吐量。那么操做系统中引入线程的目的,则是为了减小进程并发执行过程当中所付出的时空开销,使操做系统能很好的并发执行。
进程process定义了一个执行环境,包括它本身私有的地址空间、一个句柄表,以及一个安全环境;线程则是一个控制流,有他本身的调用栈call stack,记录了它的执行历史。
线程由两个部分组成:1)线程的内核对象,操做系统用它来对线程实施管理。内核对象也是系统用来存放线程统计信息的地方。2)线程堆栈,它用于维护线程在执行代码时须要的全部参数和局部变量。当建立线程时,系统建立一个线程内核对象。该线程内核对象不是线程自己,而是操做系统用来管理线程的较小的数据结构。能够将线程内核对象视为由关于线程的统计信息组成的一个小型数据结构。
进程与线程的比较以下:
比较 |
进程 |
线程 |
活泼性 |
不活泼(只是线程的容器) |
活泼 |
地址空间 |
系统赋予的独立的虚拟地址空间(对于32位进程来讲,这个地址空间是4GB) |
在进程的地址空间执行代码。线程只有一个内核对象和一个堆栈,保留的记录不多,所以所须要的内存也不多。由于线程须要的开销比进程少 |
调度 |
仅是资源分配的基本单位 |
独立调度、分派的基本单位 |
并发性 |
仅进程间并发(传统OS) |
进程间、线程间并发 |
拥有资源 |
资源拥有的基本单位 |
基本上不拥有资源 |
系统开销 |
建立、撤销、切换开销大 |
仅保存少许寄存器内容,开销小。 |
三、进程同步
进程同步的主要任务:是对多个相关进程在执行次序上进行协调,以使并发执行的诸进程之间能有效地共享资源和相互合做,从而使程序的执行具备可再现性。
同步机制遵循的原则:
(1)空闲让进;
(2)忙则等待(保证对临界区的互斥访问);
(3)有限等待(有限表明有限的时间,避免死等);
(4)让权等待,(当进程不能进入本身的临界区时,应该释放处理机,以避免陷入忙等状态)。
四、进程间的通讯是如何实现的?
进程通讯,是指进程之间的信息交换(信息量少则一个状态或数值,多者则是成千上万个字节)。所以,对于用信号量进行的进程间的互斥和同步,因为其所交换的信息量少而被归结为低级通讯。
所谓高级进程通讯指:用户能够利用操做系统所提供的一组通讯命令传送大量数据的一种通讯方式。操做系统隐藏了进程通讯的实现细节。或者说,通讯过程对用户是透明的。
高级通讯机制可归结为三大类:
(1)共享存储器系统(存储器中划分的共享存储区);实际操做中对应的是“剪贴板”(剪贴板其实是系统维护管理的一块内存区域)的通讯方式,好比举例以下:word进程按下ctrl+c,在ppt进程按下ctrl+v,即完成了word进程和ppt进程之间的通讯,复制时将数据放入到剪贴板,粘贴时从剪贴板中取出数据,而后显示在ppt窗口上。
(2)消息传递系统(进程间的数据交换以消息(message)为单位,当今最流行的微内核操做系统中,微内核与服务器之间的通讯,无一例外地都采用了消息传递机制。应用举例:邮槽(MailSlot)是基于广播通讯体系设计出来的,它采用无链接的不可靠的数据传输。邮槽是一种单向通讯机制,建立邮槽的服务器进程读取数据,打开邮槽的客户机进程写入数据。
(3)管道通讯系统(管道即:链接读写进程以实现他们之间通讯的共享文件(pipe文件,相似先进先出的队列,由一个进程写,另外一进程读))。实际操做中,管道分为:匿名管道、命名管道。匿名管道是一个未命名的、单向管道,经过父进程和一个子进程之间传输数据。匿名管道只能实现本地机器上两个进程之间的通讯,而不能实现跨网络的通讯。命名管道不只能够在本机上实现两个进程间的通讯,还能够跨网络实现两个进程间的通讯。
|
同一机器两个进程间通讯 |
跨网络通讯 |
剪贴板Clipboard |
能够 |
不能够 |
匿名管道Pipe |
能够 |
不能够 |
命名管道(点对点单一通讯,数据量可较大)Namedpipe |
能够 |
能够 |
邮槽(一对多,数据量较小,424字节如下)Mailslot |
能够 |
能够 |
五、线程同步
根据用户模式及内核模式下的同步方式的不一样,分类及对好比下:
|
内核对象/ 非内核对象 |
含义 |
缺点 |
适用 |
关键代码段(临界区)CriticalSection |
非内核对象,工做在用户方式下,为用户模式对象 |
从程序代码的角度来控制线程的并发性 |
1.由于在等待进入关键代码段时没法设定超时值,因此其很容易进入死锁状态。2.不能跨进程使用。 |
单个进程中线程间的同步(同步速度快) |
事件对象Event |
内核对象 |
全部内核对象中最基本的。 |
速度较慢(相比用户模式实现线程同步) |
多个进程间的各个线程间实现同步 |
互斥对象Mutex |
内核对象 |
表明对一个资源的独占式访问 |
||
信号量 Semaphore |
内核对象 |
使用计数器来控制程序对一个共享资源的访问 |
因为进程同步产生了一系列经典的同步问题“生产者-消费者”问题,“哲学家进餐”问题,“读者-写者”问题。
文件系统是操做系统用于明确磁盘或分区上的文件的方法和数据结构;即在磁盘上组织文件的方法。也指用于存储文件的磁盘或分区,或文件系统种类。操做系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。文件系统由三部分组成:与文件管理有关软件、被管理文件以及实施文件管理所需数据结构。从系统角度来看,文件系统是对文件存储器空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。具体地说,它负责为用户创建文件,存入、读出、修改、转储文件,控制文件的存取,当用户再也不使用时撤销文件等。
【FAT】:
常PC机使用的文件系统是FAT16。像基于MS-DOS,Win 95等系统都采用了FAT16文件系统。在Win 9X下,FAT16支持的分区最大为2GB。咱们知道计算机将信息保存在硬盘上称为“簇”的区域内。使用的簇越小,保存信息的效率就越高。在FAT16的状况下,分区越大簇就相应的要大,存储效率就越低,势必形成存储空间的浪费。而且随着计算机硬件和应用的不断提升,FAT16文件系统已不能很好地适应系统的要求。在这种状况下,推出了加强的文件系统FAT32。同FAT16相比,FAT32主要具备如下特色:
一、同FAT16相比FAT32最大的优势是能够支持的磁盘大小达到32G,可是不能支持小于512MB的分区。
*基于FAT32的Win 2000能够支持分区最大为32GB;而基于 FAT16的Win 2000支持的分区最大为4GB。
二、因为采用了更小的簇,FAT32文件系统能够更有效率地保存信息。如两个分区大小都为2GB,一个分区采用了FAT16文件系统,另外一个分区采用了FAT32文件系统。采用FAT16的分区的簇大小为32KB,而FAT32分区的簇只有4KB的大小。这样FAT32就比FAT16的存储效率要高不少,一般状况下能够提升15%。
三、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的特色主要体如今如下几个方面:
一、NTFS能够支持的分区(若是采用动态磁盘则称为卷)大小能够达到2TB。而Win 2000中的FAT32支持分区的大小最大为32GB。
二、NTFS是一个可恢复的文件系统。在NTFS分区上用户不多须要运行磁盘修复程序。NTFS经过使用标准的事物处理日志和恢复技术来保证分区的一致性。发生系统失败事件时,NTFS使用日志文件和检查点信息自动恢复文件系统的一致性。
三、NTFS支持对分区、文件夹和文件的压缩。任何基于Windows的应用程序对NTFS分区上的压缩文件进行读写时不须要事先由其余程序进行解压缩,当对文件进行读取时,文件将自动进行解压缩;文件关闭或保存时会自动对文件进行压缩。
四、NTFS采用了更小的簇,能够更有效率地管理磁盘空间。在Win 2000的FAT32文件系统的状况下,分区大小在2GB~8GB时簇的大小为4KB;分区大小在8GB~16GB时簇的大小为8KB;分区大小在16GB~32GB时,簇的大小则达到了16KB。而Win 2000的NTFS文件系统,当分区的大小在2GB如下时,簇的大小都比相应的FAT32簇小;当分区的大小在2GB以上时(2GB~2TB),簇的大小都为4KB。相比之下,NTFS能够比FAT32更有效地管理磁盘空间,最大限度地避免了磁盘空间的浪费。
五、在NTFS分区上,能够为共享资源、文件夹以及文件设置访问许可权限。许可的设置包括两方面的内容:一是容许哪些组或用户对文件夹、文件和共享资源进行访问;二是得到访问许可的组或用户能够进行什么级别的访问。访问许可权限的设置不但适用于本地计算机的用户,一样也应用于经过网络的共享文件夹对文件进行访问的网络用户。与FAT32文件系统下对文件夹或文件进行访问相比,安全性要高得多。另外,在采用NTFS格式的Win 2000中,应用审核策略能够对文件夹、文件以及活动目录对象进行审核,审核结果记录在安全日志中,经过安全日志就能够查看哪些组或用户对文件夹、文件或活动目录对象进行了什么级别的操做,从而发现系统可能面临的非法访问,经过采起相应的措施,将这种安全隐患减到最低。这些在FAT32文件系统下,是不能实现的。
六、在Win 2000的NTFS文件系统下能够进行磁盘配额管理。磁盘配额就是管理员能够为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。设置磁盘配额后,能够对每个用户的磁盘使用状况进行跟踪和控制,经过监测能够标识出超过配额报警阈值和配额限制的用户,从而采起相应的措施。磁盘配额管理功能的提供,使得管理员能够方便合理地为用户分配存储资源,避免因为磁盘空间使用的失控可能形成的系统崩溃,提升了系统的安全性。
七、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 能够提供更佳的性能和可靠性,还有更为丰富的功能:
一、与 Ext3 兼容。执行若干条命令,就能从 Ext3 在线迁移到 Ext4,而无须从新格式化磁盘或从新安装系统。原有 Ext3 数据结构照样保留,Ext4 做用于新数据,固然,整个文件系统所以也就得到了 Ext4 所支持的更大容量。
二、更大的文件系统和更大的文件。较之 Ext3 目前所支持的最大 16TB 文件系统和最大 2TB 文件,Ext4 分别支持 1EB(1,048,576TB, 1EB=1024PB, 1PB=1024TB)的文件系统,以及 16TB 的文件。
三、无限数量的子目录。Ext3 目前只支持 32,000 个子目录,而 Ext4 支持无限数量的子目录。
四、Extents。Ext3 采用间接块映射,当操做大文件时,效率极其低下。好比一个 100MB 大小的文件,在 Ext3 中要创建 25,600 个数据块(每一个数据块大小为 4KB)的映射表。而 Ext4 引入了现代文件系统中流行的 extents 概念,每一个 extent 为一组连续的数据块,上述文件则表示为“该文件数据保存在接下来的 25,600 个数据块中”,提升了很多效率。
五、多块分配。当写入数据到 Ext3 文件系统中时,Ext3 的数据块分配器每次只能分配一个 4KB 的块,写一个 100MB 文件就要调用 25,600 次数据块分配器,而 Ext4 的多块分配器“multiblock allocator”(mballoc) 支持一次调用分配多个数据块。
六、延迟分配。Ext3 的数据块分配策略是尽快分配,而 Ext4 和其它现代文件操做系统的策略是尽量地延迟分配,直到文件在 cache 中写完才开始分配数据块并写入磁盘,这样就能优化整个文件的数据块分配,与前两种特性搭配起来能够显著提高性能。
七、快速 fsck。之前执行 fsck 第一步就会很慢,由于它要检查全部的 inode,如今 Ext4 给每一个组的 inode 表中都添加了一份未使用 inode 的列表,从此 fsck Ext4 文件系统就能够跳过它们而只去检查那些在用的 inode 了。
八、日志校验。日志是最经常使用的部分,也极易致使磁盘硬件故障,而从损坏的日志中恢复数据会致使更多的数据损坏。Ext4 的日志校验功能能够很方便地判断日志数据是否损坏,并且它将 Ext3 的两阶段日志机制合并成一个阶段,在增长安全性的同时提升了性能。
九、“无日志”(No Journaling)模式。日志总归有一些开销,Ext4 容许关闭日志,以便某些有特殊需求的用户能够借此提高性能。
十、在线碎片整理。尽管延迟分配、多块分配和 extents 能有效减小文件系统碎片,但碎片仍是不可避免会产生。Ext4 支持在线碎片整理,并将提供 e4defrag 工具进行个别文件或整个文件系统的碎片整理。
十一、inode 相关特性。Ext4 支持更大的 inode,较之 Ext3 默认的 inode 大小 128 字节,Ext4 为了在 inode 中容纳更多的扩展属性(如纳秒时间戳或 inode 版本),默认 inode 大小为 256 字节。Ext4 还支持快速扩展属性(fast extended attributes)和 inode 保留(inodes reservation)。
十二、持久预分配(Persistent preallocation)。P2P 软件为了保证下载文件有足够的空间存放,经常会预先建立一个与所下载文件大小相同的空文件,以避免将来的数小时或数天以内磁盘空间不足致使下载失败。Ext4 在文件系统层面实现了持久预分配并提供相应的 API(libc 中的 posix_fallocate()),比应用软件本身实现更有效率。
1三、默认启用 barrier。磁盘上配有内部缓存,以便从新调整批量数据的写操做顺序,优化写入性能,所以文件系统必须在日志数据写入磁盘以后才能写 commit 记录,若 commit 记录写入在先,而日志有可能损坏,那么就会影响数据完整性。Ext4 默认启用 barrier,只有当 barrier 以前的数据所有写入磁盘,才能写 barrier 以后的数据。(可经过 “mount -o barrier=0” 命令禁用该特性。)
【ZFS】:
ZFS源自于Sun Microsystems为Solaris操做系统开发的文件系统。ZFS是一个具备高存储容量、文件系统与卷管理概念整合、崭新的磁盘逻辑结构的轻量级文件系统,同时也是一个便捷的存储池管理系统。ZFS是一个使用CDDL协议条款受权的开源项目。
【HFS】:
一、HFS文件系统概念
分层文件系统(Hierarchical File System,HFS)是一种由苹果电脑开发,并使用在Mac OS上的文件系统。最初被设计用于软盘和硬盘,同时也能够在在只读媒体如CD-ROM上见到。
二、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卷不能做为启动用。
三、构成方式
分层文件系统把一个卷分为许多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。
在分析了进程的虚拟地址布局,咱们转向内核以及他管理用户内存的机制。下图是gonzo的例子:
Linux进程在内核中是由task_struct进程描述符实现的,task_struct的mm字段指向内存描述符mm_struct,他是进程的一个内存执行摘要。如上图所示,mm_struct存储了内存各个段的开始和结束地址、进程所使用的内存页面数(rss表明常驻集合大小)、使用的虚拟地址空间总数等等。在内存描述符中咱们也能够找到两个用于管理进程内层的字段:虚拟内存集合和页表。Gonzo的内存区域以下图:
每一个虚拟内存区域(VMA)是一个虚拟地址空间上连续的区域;这些区域不会彼此覆盖。Vm_area_struct结构描述了一个内存区域,包括他的开始和技术地址、flags字段指定了他的行为和访问权限,vm_file字段指定了该区域映射的实际文件。一个没有映射文件的VMA成为匿名的。除了内存映射段之外,上面的每一个内存段(堆、栈等等)至关于一个单独的VMA。这不是必须的,尽管在x86机器上一般是这样。VMA不会关心他在哪一个段里面。
一个进程的全部VMA以两种方式存储在他的内存描述符中,一种是以链表的方式存放在mmap字段,以开始虚拟地址进行了排序,另外一种是以红黑树的方式存放,mm_rb字段为这颗红黑树的根。红黑树可让内核根据给定的虚拟地址快速地找到内存区域。当咱们读取文件/proc/pid_of_process/maps,内核仅仅是经过进程VMA的连接同时打印出每个。