实验总结分析报告:从系统的角度分析影响程序执行性能的因素
• 请您根据本课程所学内容总结梳理出一个精简的Linux系统概念模型,最大程度统摄整顿本课程及相关的知识信息,模型应该是逻辑上可以运转的、自洽的,并举例某一两个具体例子(比如读写文件、分配内存、使用I/O驱动某个硬件等)纳入模型中验证模型。
• 然后将一个应用程序放入该系统模型中系统性的梳理影响应用程序性能表现的因素,并说明原因。
• 产出要求是发表一篇博客文章,长度不限,1要简略,2是重点,只谈自己的思考和梳理,严禁引用任何资料(包括本课程的资料)造成文章虚长。
一、linux是什么
linux是什么?百度百科给的定义是:Linux,全称GNU/Linux,是一种免费使用和自由传播的类UNIX操作系统,其内核由林纳斯·本纳第克特·托瓦兹于1991年10月5日首次发布,它主要受到Minix和Unix思想的启发,是一个基于POSIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的Unix工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。Linux有上百种不同的发行版,如基于社区开发的debian、archlinux,和基于商业开发的Red Hat Enterprise Linux、SUSE、Oracle Linux等。
它的主要结构如下图。
Linux主要分成三个部分:用户空间、内核空间、硬件空间
通常32位Linux内核虚拟地址空间划分03G为用户空间,34G为内核空间(注意,内核可以使用的线性地址只有1G)。Linux操作系统和驱动程序运行在内核空间,应用程序运行在用户空间。两者不能简单地使用指针传递数据,因为linux存在内存机制,用户空间的数据可能被换出,当内核空间使用用户空间指针时,对应的数据可能不在内存中,用户空间采用段页式,而内核空间有自己的规则。另外 内核空间的数据对于计算机的安全十分重要,不应当被用户程序获取。
二、内核
内核的作用:
1。从技术层面说,充当硬件与软件之间中间层,当作底层驱动程序,对系统各种设备和组件进行寻址。
2。从应用程序说,内核对应用程序向下屏蔽更底层
3。内核是一个资源管理程序,负责共享资源分配
4。内核是一个库,提供一组面向系统的命令
实现策略:
1。微内核:只保留一些中央内核,其它的都给一些独立的进程
2。宏内核,所有的子系统都组成一个文件中,成为一个完成的内核。
当前的Linux系统在宏内核的基本上,向微内核靠拢,可以以模块的方式将子系统编译进系统中。在卸载和安装都方便。
三 、系统调用
定义:linux内核中设置了一组用于实现各种系统功能的子程序、称为系统调用。
int 0x80指令会使“执行”跳转到系统调用在内核空间定义的入口地址。
eax指定具体的系统调用号
edi,esi等向系统调用传递参数
系统调用过程:
• 保存寄存器当前值(SAVE_ALL)
• 检验是否为合法的系统调用
• 根据系统调用表sys_call_table和EAX持有的系统调用号找出并转入系统调用响应函数
• 从该响应函数返回后,让EAX寄存器保存函数返回值,跳转至ret_from_sys_call
• 最后,在执行位于用户程序中系统调用命令后面余下的指令之前,若INT 0x80的返回值为非,则直接按类型type返回;否则,将INT 0x80的返回值取其绝对值,保留在errno变量中,返回-1.
四、进程管理
进程:进程是最小的拥有资源的单位,是动态的程序。与此对应的是线程,它是linux中最小的高度单位,与进程对比,它的体积更小,线程之间切换和通信更加方便。
在Linux内核中使用struct task_struct来描述进程,所有进程都被这个结构休描述,这个结构体中包括进程的状态、pid、进程的亲属关系、进程的调度信息、ptrace系统调用等。
进程是如何创建?
三个特殊的进程:idle进程(pid = 0)、init进程(1号、kthreadd进程(2号
idel进程由系统自动创建,运行在内核态,它也是系统创建的第一个进程,也是唯一一个没有通过fork或者kernel_thread产生创建的进程,它在完成加载系统后,演变为进程调度、交换
init进程由idel通过kernel_thread创建,在内核完成初始化后,加载Init程序,它是系统中所有其它用户进程的祖先进程。
kthreadd进程由idel通过kernel_thread创建,并始终运行在内核空间中,负责所有内核进程的调度和管理。
普通进程一般由fork进程创建
进程的状态
进程的基本状态有五种:创建态、就绪态、阻塞态、执行态、终止态
创建态:进程申请到了一个PCB,但是进程所需要的资源并未就绪,因而还不能被操作系统调度。
就绪态:进程所以需要的资源都被分配了,那么它就可以被CPU所调度,而进程的调度下面会说。
执行态:进程被CPU调度,进程CPU中运行。
阻塞态:正在执行任务的进程由于某种事件(如I/O请求、申请缓存)而暂时无法运行,进程受到阻塞。而相应的,它会在对应的事件应正常响应后,进入就绪态等待系统调用。
终止态:进程执行完成、进程被终止、或者出现错误
进程的调度
进程的调度分为两种:抢占式、非抢占式
抢占式分为进程优先级更高的进程分配CPU。
具体的算法有:短作业优先(SJF),最短剩余时间优先(SRTF),先进先出(FIFO),多级轮转高度
五、中断与异常
linux内核中处理中断主要有三种数据结构:irq_desc(中断描述符),irq_chip(中断控制器),irqaction(特定设备的中断描述符
linux中断机制分为三个部分:
• 中断子系统初始化:内核自身初始化过程中对中断处理机制初始化,分为两个过程
• 第一个过程在内核引导过程,首先给IDT分配2KB空间,并初始化,然后把IDT地址给DTR
• 第二个过程内核在初始化自身的start_kernel函数中使用trap_init初始化系统保留中断向量,使用inti_irq完成其余中断向量初始化
• 中断或异常处理:中断整体处理过程
• 中断处理:设备产生中断,通过中断线将信号给中断控制器,如果没有被屏蔽就会到CPU的INTR引脚,CPU会立即路上当前的工作,根据中断向量号找出中断描述符,执行中断程序
• 异常是由CPU内部发生所以不会通过中断控制器,CPU直接很IDT找描述符,执行中断程序
• 中断API:为设备驱动提供API,注册、释放、激活等。
六、vps
在Linux中,一切都是文件
1.硬盘驱动,在Linux系统中,对不同硬盘所提供的驱动模块一般都存放内核目标树drivers/ata中,对于一般通用的硬盘驱动,也许会编译至内核中,不以模块方式出现。
2.内核会为所有的硬盘驱动接口形成一个统一的对外接口,屏蔽硬件的不同
3.文件系统,常用的就是ext4
七、举例--读文件
• 运行如C中的open函数
• 触发int或者syscall指令触发128号中断,并传参
• open系统调用找到文件名及对应的文件结点,并在系统文件打开表中添加这一FCB(如果存在,增加引用即可
八、影响程序执行性能的因素
- 硬件的速度:程序的运行需要将磁盘中静态的程序加载到CPU中,而硬盘的速度相对CPU是程序运行的下限。同样Cpu性能至关重要。
- 缓存的命中:现代计算机的构造中,有多级缓存,在缓存都命中的情况下,程序的运行速度是更快的。但是相反就会影响速度,如矩阵幂,利用缓存命中的特性写程序会使程序性能更优化。
- 缺页异常,基本同上
- 网络性能:对网络程序,主机的网络性能对程序影响程序是可以预见的。
九、致谢
在本学期之前,我还只是个对linux简单命令有所了解的萌新,而在李老师和孟老师辛勤教学和指导下,加之做实验的实际上手操作,我对linux的运行机制以及基本组件有了相当的了解,同时也对linux内核产生了更大的兴趣。在些十分感谢二位老师的辛苦付出。