linux课程总结分析报告
1、计算机系统的基本工作原理
? 在学习操作系统代码前,先要掌握最基本的计算机系统基础性的逻辑框架,主要有“三大法宝”,分别是:存储程序计算机、函数调用堆栈及中断。
1.1、存储程序计算机
? 存储程序是计算机能自动控制处理的基础。其原理是:将程序存放到存储器中,然后按存储器中的存储程序的首地址执行程序的第一条指令,之后按照该程序的规定顺序执行其他指令,直至程序结束执行。
1.2、函数调用堆栈
? 函数调用通过堆栈机制实现,每次函数调用的时候,将call指令的下一条指令的地址压入栈顶,然后设置程序计数器指向被调用的程序执行被调用函数。
1.3、中断
? 中断指的是在程序运行期间,遇到特殊情况,让CPU暂时当前正在运行的程序,转去处理中特殊情况。等处理完成后返回原来原程序断点处继续执行,或者调度新的进程执行的过程。中断机制可以更好的利用系统资源,并且提供了一种响应特殊情况的机制。
? 中断分硬件中断和内部中断(软件中断),内部中断又称为异常,异常分为故障和陷阱。
2、系统调用
? linux操作系统将系统状态分成系统态和用户态这两种状态,系统态时可以执行所有指令(包括特权指令),访问所有地址空间及硬件资源;而用户态只能执行非特权指令,访问用户空间。
? 将系统状态分成系统态和用户态的原因,是因为一些指令,比如清内存,设置时钟,对系统的影响非常大,如果允许应用程序随意使用,很容易造成系统奔溃,系统的安全性,稳定性无法得到保障。并且如果允许应用程序访问其他应用程序的内存空间也会产生问题。
? 由于用户态进程无法直接访问硬件设备,这时就需要一种机制来实现这个功能。系统调用就是这样一种机制。系统调用是操作系统为用户态进程访问硬件设备提供的一组接口。
3、进程管理
? 进程是操作系统中分配资源的最小单位。内核负责进程的创建和销毁,并且由调度程序采取合适的调度策略,实现进程间的合理的且实时的处理器资源的共享。从而内核的进程管理活动实现了多个进程在一个或多个处理器上的抽象。内核还负责实现进程间的通信以及进程和其他部件之间的通信。
4、内存管理
? 计算机中数据主要存放在内存中。为了让多个进程安全又合理地共享内存资源,内核为每个进程在有限的物理资源上建立一个虚拟地址空间。
? 要保证应用程序的高性能运行,要保证足够的物理内存,避免占用虚拟内存过多的情况。
? 同时,采用页表机制和虚拟内存,根据局部性原理的cache命中率也对性能影响大。
5、文件系统
? Linux系统以文件的形式对计算机中的数据(程序,音视频数据等)和硬件资源(i/o设备)进行管理,将所有对象都当作是文件。
? 文件类型主要有:普通文件、目录文件、设备文件、链接文件、管道文件及套接字文件等。各种类型的文件被Linux使用目录树进行管理, 目录树指的是以/为根,整体结构为树一样的文件系统。
? linux下调用read函数读文件主要过程:执行软中断指令int 0x80,并且将系统调用号放入eax寄存器,system_call函数调用系统调用服务例程sys_read()函数,该函数读取数据然后返回。
6、应用程序实例分析
? 在下面的func2函数中,由于数据存放的不连续,在运行时发生缺页异常的几率特别高,因此执行的时间效率会比较差。
#include <stdio.h>
#include <time.h>
#define N 10000
void func1(int num[][N]);
void func2(int num[][N]);
int main(void) {
clock_t start, end;
int arr[N][N];
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
arr[i][j] = i + j;
}
}
start = clock();
for (int i = 0; i < 10000; i++) {
func1(arr);
}
end = clock();
printf("func1运行10000次时间为: %lf(ms)\n\n", (end - start) / 100000.0);
start = clock();
for (int i = 0; i < 1000; i++) {
func2(arr);
}
end = clock();
printf("\nfunc2运行10000次的时间为: %lf(ms)\n", (end - start) / 10000.0);
return 1;
}
void func1(int num[][N])
{
for(int i = 0; i < N; i++) {
for(int j = 0; j < N; j++) {
num[i][j]++;
}
}
}
void func2(int num[][N])
{
for(int j = 0; j < N; j++) {
for(int i = 0; i < N; i++) {
num[i][j]++;
}
}
}
7、影响linux系统性能的因素
? 不仅硬件资源不足会对系统产生影响,用户编写的程序也会极大影响系统性能。
7.1、硬件资源
? cpu的时钟频率、cache的容量、内存的容量、磁盘的存取速度及网络带宽大小等硬件资源都会影响系统的性能。
7.2、软件编写
? 最后应用程序本身的执行过程也会影响程序的执行性能,而遵循时间局部性和空间局部性的程序往往能过得更高的执行性能。
8、总结
? 通过对本门课程的学习,我对Linux内核的工作机制和工作原理有了更加深入的理解,完成的几个实验也让我收益良多,让我对linux的强大之处了解的更多,同时也明白自己对linux了解的不足之处。
? 最后,感谢孟宁老师和李春杰老师这一学期的辛勤教学。