Linux系统的架构浅析(2)
inode是文件从抽象--->具体的关键。inode存储了一些指针,这些指针指向存储设备的一些数据块,文件的内容就存储在这些数据块中。Linux想打开一个文件时,只需要找到文件对应的inode,然后沿着指针,将所有的数据块攒起来,就可以在内存中组成一个文件的数据了。 inode 结构 inode并不是组织文件的唯一方式,最简单的组织文件的方式,是把文件依次顺序的放入存储设备,但如果有删除操作的话,删除造成的空余空间夹杂在正常文件之间,很难利用和管理;复杂方式可以用来链表来做,每个数据块有个指针,指向属于同一文件的下一个数据块,这样的好处是可以利用零散的空余空间,坏处是对文件的操作必须按照线性方式进行,如果随机读取就必须要遍历链表,直到目标位置。由于这一遍历不是在内存进行,所以速度很慢。 inode既可以充分利用空间,在内存占据空间不与存储设备相关,解决了上面的问题。但inode也有自己的问题。每个inode能够存储的数据块指针总数是固定的。如果一个文件需要的数据块超过这一总数,inode需要额外的空间来存储多出来的指针。 dentry 代表一个目录项,是路径的一部分,比如一个路径/home/jackycao/hello.txt,那么目录项就有home、jackycao、hello.txt。 block 代表具体的数据,一个文件由分散的多个block组成,组织的方式由inode来指向。 设备驱动 与外设的交互,说白了就是输入(input)、操作(operate)、输出(ouput)的操作。 内核需要完成三件事情: 1. 针对不同的设备类型实现不同的方法来寻址硬件。 2. 必须为用户空间提供操作不同硬件设备的方法,且需要一个统一的机制来确保尽量有限的编程工作。 3. 让用户空间知道在内核中有哪些设备。 设备通信图 内核访问外设主要有两种方式:I/O端口和I/O内存映射。具体不展开介绍了。 内核动态接收外设发来的请求(数据)主要通过两种方式:轮询和中断。 轮询:周期性的访问查询设备是否有数据,如果有,便获取数据。这种方法比较浪费CPU资源。 中断:核心思想是外设有请求时主动通知CPU,中断的优先级最高,会中断CPU的当前进程运行,每个CPU都提供了中断线,每个中断由唯一的中断号识别,内核为每个应用的中断提供一个中断处理方法。当有数据已准备好可以给内核或者间接被一个应用程序使用的时候,外设出发一个中断。使用中断确保系统只有在外设需要处理器介入的时候才会通知CPU,提高了效率。 PS:块和扇区的概念:块是一个指定大小的字节序列,用于保存在内核和设备间传输的数据,块的大小可以被设置,默认是4096 bytes,扇区是存储设备操作的最小单元,默认是512 Bytes,块是一段连续的扇区。 网络 Linux的网络子系统的模型基于ISO的OSI模型,Linux内核中会简化相应层级。下图为Linux使用的TCP/IP参考模型。 网络模型 Host-to-Host层:相当于OSI模型的物理层和数据链路层,负责将数据从一个计算机传输到另一个计算机。在Linux内核的角度来看,这一层是通过网卡的设备驱动程序实现的。 Internet层:相当于OSI模型的网络层,负责让网络中的计算机可以交换数据(这些计算机并不一定是直连的)。该层同时负责传输的包分成指定的大小,因为包在传输路径上每个计算机支持的最大网络包的大小不一样,在传输时数据被分割成不同的包,在接收端再组合。该层为网络中的计算机分配唯一的网络地址。 Transport层:相当于OSI模型的传输层,负责让两个连接的计算机上运行的应用程序之间的数据传输。比如,两台计算机上的客户端和服务端程序,通过端口号来识别通信的应用程序。 App层:相当于OSI模型的会话层、表示层、应用层,网络中不同计算机的两个应用程序建立连接后,这一层负责实际内容的传输。 Linux内核子系统的实现通过C代码实现,每个层只能和它上下层通信。 Linux网络分层图 【编辑推荐】
点赞 0 (编辑:ASP站长网) |