通过本课程的学习,简单将Linux系统分为以下三层结构:用户程序、Linux内核、硬件。
用户程序通过库函数和系统调用访问计算机资源。Linux内核向上对用户程序提供系统调用接口,向下使用驱动程序访问硬件。硬件通过硬件中断与内核打交道。
在Linux内核中,还提供了进程管理、内存管理、文件管理等功能。
(1)进程管理:Linux将一个任务(程序)表示为一个进程,提供进程调度、进程通信等功能。
(2)内存管理:LInux提供了对内存的管理。
(3)文件管理:Linux将一切看为文件,使用虚拟文件系统(VFS)隐藏具体的文件系统,向上提供统一的接口。
(1)用户编写了一个读磁盘文件的程序,程序被表示为一个进程。
(2)程序调用read()库函数,read再调用对应的系统调用,进入内核。
(3)内核通过进程描述符里的用户打开文件表找到文件描述信息,通过虚拟文件系统的系统打开文件表找到文件的inode节点。
(4)使用预先注册好的在file_operations里定义的读操作,执行真正的读文件。
按照上面的三层结构来分析影响性能的因素。
包括CPU性能、内存大小、磁盘性能等。
如进程调度策略,时间片的大小。这些都会影响进程调度的顺序和时间,最终影响性能。
应用程序编写不好也会影响系统性能。
实际上很多时候影响程序性能的原因是多方面的。
下面两个程序使用了两种不同的顺序计算矩阵乘法。
其中,程序A里的矩阵c和矩阵b都是行优先。程序B里的矩阵c和矩阵a都是列优先。
程序A:
程序B:
它们的cache misses次数分别为:
程序A的cache misses次数:
程序B的cache misses次数:
最终程序A的性能远好于程序B。
分析:局部性原理,cache会添加一块连续的内存数据,为了cache高命中,我们应该尽可能连续的访问内存中的成员,比如上述的行优先访问数组。在编写程序时,应该编写cache友好的代码。