Linux实验总结分析报告

精简的 Linux 系统模型

从整体而言,Linux系统分为用户空间和内核空间两部分,按照功能可以划分为进程管理、内存管理、文件管理以及设备管理,这些有关计算机底层的操作都只能在内核空间进行。

  • 完整的Linux内核运行于内核空间,它管理底层的所有硬件设备;

  • 用户空间可以通过系统调用接口来使用特权操作,存在一个用户态向内核态的切换过程;

Linux 内核

Linux内核运行在内核空间,向下负责管理计算机系统的硬件设备,向上为应用程序提供服务支持。主要提供以下服务:系统调用接口、中断管理、进程管理、内存管理、文件系统以及硬件驱动程序。

 

进程管理

进程是处于执行期的程序以及相关资源的总称。线程在linux上称为轻量级进程,没有独立的地址空间,一个进程下的所有线程共享地址空间、文件系统资源、文件描述符、信号处理程序等。

进程管理是一个操作系统内核的核心实现部分,进程的调度管理等一系列操作都由此完成;

  1. 什么是进程?在Linux内核中,一个进程使用一个PCB(task_struct)来描述一个进程,进程是一个程序的执行过程,是程序的动态体现。

  2. 进程的状态:有五个,创建 / 就绪 / 阻塞 / 运行 / 结束,其中最主要的状态有三个: 就绪 / 阻塞 / 运行。

  3. 进程的切换:通过切换进程的虚拟地址空间和CPU的执行上下文实现。即:切换⻚全局⽬录(CR3)以安装⼀个新的地址空间 和 切换内核态堆栈和进程的CPU上下⽂,因为进程的CPU上下⽂提供了内核执 ⾏新进程所需要的所有信息,包含所有CPU寄存器状态。

  4. 调度时机:有三种

    1. 内核线程主动调用schedule函数

    2. 用户进程上下文中主动调用系统调用,进入中断上下文,在系统调用返回用户态前进行进程调度

    3. 内核进程或可中断的中断处理程序,执行过程中发生中断进入中断上下文,在中断返回前进行进程调度

 

内存管理

内存是计算机系统中主要的资源,在Linux中,内存空间被分为用户空间和内核空间两大块。

用户线程申请内存,不会直接分配,而是“懒”分配,只是给了一个新的线性地址空间的一个使用权,直到后续使用到这块内存的时候,才产生缺页中断,进行真正的分配。如果是内核线程申请分配内存,则会直接分配。

内核使得多个进程安全而合理地共享内存资源,为每个进程在有限的物理资源上建立一个虚拟地址空间。

 

文件系统

在LINUX系统中有一个重要的概念:一切都是文件。 其实这是UNIX哲学的一个体现,而Linux是重写UNIX而来,所以这个概念也就传承了下来。所有的“文件”都可以用统一的接口(open,close,read,write)实现

文件系统不仅包含着文件中的数据而且还有文件系统的结构,所有Linux 用户和程序看到的文件、目录、软连接及文件保护信息等都存储在其中。

Linux下文件系统的体系结构如下:

 

中断管理

中断是指CPU在执行过程中,出现某些突发事件急待处理,CPU暂停执行当前程序,转去处理突发事件,处理完后CPU又返回原程序被中断的位置继续执行。

Linux有两种中断类型:

  • 硬中断(可屏蔽,NMI除外),是指由请求响应的设备发出的(磁盘I/O中断、网络适配器中断、键盘中断、鼠标中断)

  • 软中断(不可屏蔽),是指被用于处理可以延迟的任务(TCP/IP操作,SCSI协议操作等等)

为了满足系统的实时性要求,中断的处理应该要越快越好。Linux中为了实现这个特点,当中断发生的时候,硬中断处理那一些短时间内就可以完成的工作,而将那些处理时间比较长的工作,放在中断之后来完成,也就是软中断来完成。

 

系统调用接口

计算机系统的各种硬件资源是有限的,在现代多任务操作系统上同时运行的多个进程都需要访问这些资源,为了更好的管理这些资源进程是不允许直接操作的,否则会出现一些不可预估的错误,所有对这些资源的访问都必须由操作系统控制。也就是说使用这些资源的必须通过操作系统提供的入口,而这个入口就是操作系统提供的系统调用,比如 malloc 函数就是通过函数 api 来调用系统调用来分配内存的。

 

硬件驱动程序

设备驱动程序是计算机硬件与应用程序的接口,是软件系统与硬件系统沟通的桥梁。如果没有设备驱动程序,那么硬件设备就只是一堆废铁,没有什么功能。

我们应该为不同的硬件设备提供不同的驱动程序,同一类硬件设备,应当可以通过相同的驱动程序来驱动,为用户屏蔽一些硬件设备的底层实现细节,而提供同一的操作API接口,比如打印机。

 

 

举例验证

以读写文件为例。

读文件:

  1. 进程调用库函数发起读文件请求

  2. 内核通过检查进程的 fd 定位到 VFS 的已打开文件列表表项

  3. 调用该 fd 可用的系统调用函数 read()

  4. read() 函数根据传入的文件路径,在目录项模块中检索,找到该文件的 Inode

  5. 在 Inode 中通过文件内容偏移量计算出要读取的页

  6. 找到文件对应的 address_space

  7. 在页缓存树中,查找相应的页缓存结点,这其中可能会发生缺页异常,

  8. 完成读文件

 

写文件:

  1. 与读文件的步骤一致,直到查找页缓存结点是否存在

  2. 如果缓存命中,直接写到页缓存中即可;如果缓存缺失,产生缺页异常,从磁盘中 load 相应的页到缓存后,再写缓存即可。

  3. 缓存页如果被修改过,则会标记为脏,有两种刷脏方式:

    • 手动调用 sync() 或 fsync() 函数写回磁盘

    • pdflush 进程定时刷脏

 

影响性能的因素

  1. CPU:CPU 的速度与性能很大一部分决定了系统整体的性能,CPU的调度策略和代码优化策略也会对程序执行产生影响。因此 CPU 数量越多、主频越高,服务器性能也应该越好,但并不总是这样。因为目前大部分 CPU 在同一时间内只能运行一个线程,超线程的处理器可以在同一时间运行多个线程,因而可以利用处理器的超线程特性提髙系统性能。而在 Linux 系统下,只有运行 SMP 内核才能支持超线程,但是安装的 CPU 数量越多,从超线程获得的性能上的提高就越少。

  1. 内存:内存大小也是制约性能的一大因素,从容量到频率到双通道。内存如果太小,会频繁触发缺页中断,进程相应地会被阻塞,整个系统的速度也会被拖慢。Linux系统提供虚拟内存来缓解内存不足的问题,但是占用过多的虚拟内存,应用程序的性能将明显下降,因为这是由硬件特性所决定的。

  2. 磁盘IO能力:磁盘IO在当今这个CPU和内存配置都趋同的背景下,可以算得上是最影响用户体验的一个部分,尤其是机械硬盘同固态硬盘进行比较的时候,差距更是明显。因为我们日常使用中所有的程序都是在硬盘中的,只有在用到的时候才会加载到内存中,所以磁盘IO的性能就显得尤为重要了。

  3. 网络带宽:如果我们的应用是基于互联网的,网络带宽也是影响性能的一个重要因素,低速的、不稳定的网络将导致网络应用程序的访问阻塞;而稳定、高速的带宽,可以保证应用程序在网络上畅通无阻地运行。

 

致谢

感谢孟老师和李老师这个学期的细心教导,让我更深层次的了解了Linux系统。

 

 

 

 

 

 

 

posted @ 2021-05-18 15:00  晚风吻尽荷花叶  阅读(314)  评论(0编辑  收藏  举报