Linux操作系统实验总结分析报告
从系统的⾓度分析影响程序执⾏性能的因素
1.Linux系统概念模型
从全局的⾓度来看,Linux系统分为内核空间和⽤户空间,但毫⽆疑问内核空间是Linux系统的核⼼,因为内核负责管理整个系统的进程、内存、设备驱动程序、⽂件,决定着系统的性能和稳定性。于是从这个⾓度我构建的Linux系统的概念模型如下图所⽰:
此模型将Linux系统主要划分为四个模块:内存管理、进程管理、设备驱动程序、⽂件系统。这四个部分也是⼀个操作系统最基本也是最重要的功能。
2.概念模型解析
2.1 内存管理
Linux系统采⽤虚拟内存管理技术,使得每个进程都有各⾃互不⼲涉的进程地址空间。该空间是块⼤⼩为4G的线性虚拟空间,⽤户所看到和接触到的都是该虚拟地址,⽆法看到实际的物理内存地址。利⽤这种虚拟地址不但能起到保护操作系统的效果(⽤户不能直接访问物理内存),⽽且更重要的是,⽤户程序可使⽤⽐实际物理内存更⼤的地址空间。内存管理主要有分为如下⼏个功能:地址映射、虚拟地址管理、物理内存管理、内核空间管理、页⾯换⼊换出策略和⽤户空间内存管理,这些模块的架构图如下所⽰:
2.2 进程管理
进程管理是Linux系统⾮常重要的⼀部分,进程管理虽然不像内存管理、⽂件系统等模块那样复杂,但是它与其他⼏个模块的联系是⾮常紧密的。进程管理主要包括进程的创建、切换、撤销和进程调度。
2.2.1 进程的创建、切换、撤销
进程的创建:在Linux编程中,⼀般采⽤fork()函数来创建新的进程,当然,那是在⽤户空间的函数,它会调⽤内核中的clone()系统调⽤,由clone()函数继续调⽤do_fork()完成进程的创建。
整个进程创建过程可能涉及到如下函数:
fork()/vfork()/_clone----------->clone()--------->do_fork()---------->copy_process()
进程的切换:进程切换⼜称为任务切换、上下⽂切换。它是这样⼀种⾏为,为了控制进程的执⾏,内核挂起当前在CPU上运⾏的进程,并恢复以前挂起的某个进程的执⾏。跟函数的调⽤类似,进程切换时,⼀般要在CPU上装载要执⾏进程的进程上下⽂。进程的硬件上下⽂指:可执⾏程序上下⽂的⼀个⼦集,是进程恢复执⾏前装⼊寄存器的⼀组数据。其中⼀部分放在TSS段,即任务状态段,剩余部分存放在内核态堆栈中。进程的切换只发⽣在内核态,在执⾏进程切换之前,⽤户态进程使⽤的所有寄存器内容都已保存在内核态堆栈上。
进程的切换有两种⽅法,⼀种是硬件切换,⼀种是软件切换。软件切换就是利⽤程序逐步执⾏切换,它的优点是,可以对切换时装⼊的数据进⾏合法性检查,执⾏时间虽与硬件切换⼤致相同,但仍有可改进的地⽅。
进程的撤销:进程终⽌后,需要通知内核以便内核释放进程所拥有的资源,包括内存、打开⽂件以及其
他资源,如信号量。进程终⽌的⼀般⽅式是调⽤exit()库函数,该函数释放C函数库所分配的资源,执⾏编程者所注册的每个函数,并结束从系统回收进程的那个系统调⽤。
2.2.2 进程调度
Linux操作系统的进程调度基于分时技术:多个进程以“时间多路复⽤”⽅式运⾏,因为CPU的时间被分成“⽚”,给每个可运⾏进程分配⼀⽚。调度策略也是根据进程的优先级对它们进⾏分类。在Linux中,进程的优先级是动态的。调度程序跟踪进程正在做什么,并周期性地调整它们的优先级。根据不同的分类标准,可以把进程分成不同的类型。⽐如可以把⼀个进程看作是“I/O受限”或“CPU受限”。也可把进程区分为以下三类:交互式进程、批处理进程、实时进程。Linux的进程是抢占式的,⽆论是处于内核态还是⽤户态。时间⽚的长短对系统性能是很关键的:它既不能太长也不能太短。如果平均时间⽚太短,由进程切换引起的系统额外开销就变得⾮常⾼。如果平均时间⽚太长,进程看起来就不再是并发执⾏的。对时间⽚⼤⼩的选择始终是⼀种折中。
2.3 设备驱动程序
和Linux操作系统的其它部分类似,设备驱动程序运⾏在⾼特权级的处理器环境中,从⽽可以直接对硬件进⾏操作,但正因为如此,任何⼀个设备驱动程序的错误都可能导致操作系统的崩溃。设备驱动程序实际控制操作系统和硬件设备之间的交互。
设备驱动程序提供⼀组操作系统可理解的抽象接⼝完成和操作系统之间的交互,⽽与硬件相关的具体操作细节由设备驱动程序完成。其中设备分为字符设备、块设备、⽹络设备。
2.4 ⽂件系统
Linux 操作系统将独⽴的⽂件系统组合成了⼀个层次化的树形结构,并且由⼀个单独的实体代表这⼀⽂件系统。Linux 中最普遍使⽤的⽂件系统是 Ext2,它也是 Linux ⼟⽣⼟长的⽂件系统。但 Linux 也能够
⽀持 FAT、VFAT、FAT32、MINIX 等不同类型的⽂件系统,从⽽可以⽅便地和其它操作系统交换数据。由于 Linux ⽀持许多不同的⽂件系统,并且将它们组织成了⼀个统⼀的虚拟⽂件系统(VFS)。
虚拟⽂件系统(Virtual File System, 简称VFS),是Linux内核中的⼀个软件层,⽤于给⽤户空间的程序提供⽂件系统接⼝;同时,它也提供了内核中的⼀个抽象功能,允许不同的⽂件系统共存。系统中所有的⽂件系统不但依赖 VFS 共存,⽽且也依靠VFS协同⼯作。
为了能够⽀持各种实际⽂件系统,VFS 定义了所有⽂件系统都⽀持的基本的、概念上的接⼝和数据结构;同时实际⽂件系统也提供 VFS 所期望的抽象接⼝和数据结构,将⾃⾝的诸如⽂件、⽬录等概念在形式上与VFS的定义保持⼀致。换句话说,⼀个实际的⽂件系统想要被Linux⽀持,就必须提供⼀个符合VFS标准的接⼝,才能与 VFS 协同⼯作。实际⽂件系统在统⼀的接⼝和数据结构下隐藏了具体的实现细节,所以在VFS 层和内核的其他部分看来,所有⽂件系统都是相同的。
下图显⽰了VFS在Linux内核中与实际的⽂件系统的协同关系。
3.影响应⽤程序性能表现的因素
在上述的系统模型中,编写⼀个程序test.c来查看影响应⽤程序性能的表现,test.c的代码如下:
#include<stdio.h>
void longa() {
int i,j;
for(i = 0; i < 1000000; i++)
j=i;
}
void foo2() {
int i;
for(i=0 ; i < 10; i++)
longa();linux是一个分时操作系统
}
void foo1() {
int i;
for(i = 0; i< 100; i++)
longa();
}
int main(void) {
foo1();
foo2();
}
我采⽤perf⼯具来查看系统在运⾏该程序时的性能表现。
在测试中可以看到cpu的利⽤率、进程切换次数、cpu迁移等数据。
再⽤perf的另⼀个功能来查看程序的时间运⾏情况:
在这⾥可以很明显的看出占⽤率最⾼的是test.c⾥的longa函数,这是因为在这个函数⾥执⾏了100万次的循环。
通过这个程序,可以系统的总结出影响应⽤程序性能表现的因素有:
1. CPU的频率及利⽤率。CPU的频率决定了处理速度,利⽤率可以表现程序的多数时间是花费在CPU上还是IO上
2. 进程切换次数。这⼀点记录了程序运⾏中发⽣了多少次进程切换,频繁的进程切换应该被避免。
3. Cache命中率。缓存的命中率⾼低也是程序执⾏性能很重要的⼀点。
4. 磁盘读取速度。该项决定了系统读盘的速度。
5. 应⽤程序的⾃我优化。如果⼀个应⽤程序像test.c⼀样使⽤了次数⾮常⼤的循环,那么性能表现是会⼗分糟糕的,因此程序⾃⾝的编写优化也是很重要的⼀个因素。
4.总结
本⽂⾸先根据Linux的核⼼功能构建Linux的系统逻辑模型,再对模型的各个模块进⾏探究。最后结合系统模型和具体的程序执⾏情况,总结出影响应⽤程序性能表现的因素。
最后,通过孟⽼师和李⽼师教授的Linux操作系统课程,学到了关于Linux操作系统的进程管理、中断处理、系统调⽤、设备驱动、可执⾏程序的⼯作原理等等知识,对Linux操作系统的底层有了⼀些更深⼊的收获与理解,在此感谢两位⽼师的⾟勤付出!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。