一、Linux组成部分和体系架构
Linux系统一般由4个主要部分组成:内核、shell、文件系统和应用程序。其中最核心的部分就是内核,它主要提供了进程管理,内存管理,文件管理,I/O设备管理功能。Linux的体系架构如下图所示:从宏观上来看,Linux操作系统的体系架构分为用户态和内核态。
用户态即上层应用程序的活动空间,用户态的权限不如内核态。内核从本质上看是一种控制计算机的硬件资源的,并提供上层应用程序运行的环境。用户态的应用程序可以通过系统调用、shell脚本等方式来访问内核态的资源。
二、Linux内核主要功能介绍
1、进程管理:进程是操作系统中分配资源的最小单位。内核负责进程的创建和销毁,并且由调度程序采取合适的调度策略,实现进程间的合理的且实时的处理器资源的共享。从而内核的进程管理活动实现了多个进程在一个或多个处理器上的抽象。内核还负责实现进程间的通信以及进程和其他部件之间的通信。
2、内存管理:在计算机系统中,内存是非常重要的资源。内核可以使得多个进程之间安全而合理地共享内存资源,为每个进程在有限的物理资源上建立一个虚拟地址空间。内存管理部分代码可分为硬件无关部分和硬件有关部分:硬件无关部分实现进程和内存之间的地址映射等功能;硬件有关部分实现不同体系结构上的内存管理相关功能并为内存管理提供与硬件无关的虚拟接口。
3、文件管理:在Linux系统中的任何一个概念几乎都可以看做一个文件。内核在非结构化的硬件上建立了一个结构化的虚拟文件系统,隐藏了各种硬件的具体细节,从而在整个系统的几乎所有机制中使用文件的抽象。Linux在不同物理介质或虚拟结构上支持数十种文件系统。例如,Linux支持磁盘的标准文件系统ext3和虚拟的特殊文件系统。
4、设备管理:Linux系统中几乎每个系统操作终都映射到一个或多个物理设备上。 除了处理器、内存等少数的硬件资源之外,任何一种设备控制操作都由设备特定的驱动代码来进行。内核中必须提供系统中可能要操作的每一种外设的驱动。
5、网络管理:内核支持各种网络标准协议和网络设备。网络管理部分可分为网络协议栈和网络设备驱动程序。网络协议栈负责实现每种可能的网络传输协议(TCP/IP协议等);网络设备驱动程序负责与各种网络硬件设备或虚拟设备进行通信。
三、Linux读文件的流程
1、进程调用库函数向内核发起读文件请求
2、内核通过检查进程的文件描述符定位到虚拟文件系统的已打开文件列表表项;
3、调用该文件可用的系统调用函数read();
4、read()函数通过文件表项链接到目录项模块,根据传入的文件路径,在目录项模块中检索,找到该文件的inode;
5、在inode中,通过文件内容偏移量计算出要读取的页;
6、通过inode找到文件对应的address_space;
7、在address_space中访问该文件的页缓存树,查找对应的页缓存结点;
8、如果缓存命中,直接返回文件内容,如果没命中,产生一个缺页异常,创建一个缓存页,同时通过inode找到文件该页的磁盘地址,读取相应的页填充该缓存页,重新进行第六步查找页缓存。
四、影响程序性能的因素
在Linux下使用GCC将源码编译成可执行文件的过程可以分解为4个步骤,分别是预处理、编译、汇编和链接。一个hello word程序编译过程如下:
可执行文件只有被装载到内存以后才能被CPU执行。操作系统创建一个进程,然后装载相应的可执行文件并且执行,整个过程可以描述如下:
1、创建一个独立的虚拟地址空间。创建虚拟空间实际上只是分配一个页目录,虚拟空间到物理内存的映射关系等到后面程序发生页错误的时候再进行设置。
2、读取可执行文件头,并且建立虚拟空间与可执行文件的映射关系。当操作系统捕获到缺页错误时,通过该映射关系就知道当前所需要的页在可执行文件中的位置。这种映射关系是按照段进行映射的,进程虚拟空间中的一个段叫做虚拟内存区域。
3、将CPU的执行寄存器设置成可执行文件的入口地址,启动运行。ELF文件头中保存了入口地址,操作系统通过设置CPU指令寄存器将控制权转交给进程,由此进程开始执行。
由此过程可以得出,影响程序性能的因素有以下几点:
1、硬件的速度:程序的运行需要将磁盘中静态的程序加载到CPU中,而硬盘的速度相对CPU是程序运行的下限。同样Cpu性能至关重要。
2、缓存的命中:现代计算机的构造中,有多级缓存,在缓存都命中的情况下,程序的运行速度是更快的。但是相反就会影响速度,如矩阵幂,利用缓存命中的特性写程序会使程序性能更优化。
3、缺页异常。
4、网络性能:对网络程序,主机的网络性能对程序影响程序是可以预见的。
5、程序本身的复杂程度
五、总结
通过本门课程的学习,我对Linux操作系统又有了更深刻的认识,了解了Linux内核的一些重要的功能,以及系统调用、中断处理等详细的过程。感谢孟老师和李老师的辛勤指导,使我受益匪浅!