Linux实验总结分析报告

一、Linux系统概念模型

  

  以宏观角度看,Linux体系结构可以分为用户空间和内核空间。用户空间包含了C库、用户的应用程序;内核空间包含系统调用、内核、与平台架构相关的代码。用户空间和内核空间是程序执行的两种不同状态,可以通过系统调用和硬件中断来进行用户空间到内核空间的状态转移。

  

  Linux内核结构包含进程管理、内存管理、虚拟文件系统、网络管理、设备驱动等。

 

  1、进程管理(Process Management)

    进程实际是某特定应用程序的一个运行实体,进程管理是Linux内核中最重要的子系统,主要提供对CPU的访问控制。因为在计算机中,CPU资源是有限的,而众多的应用程序都要使用CPU资源,所以需要进程管理对CPU进行调度管理。

    内核通过 SCI 提供了一个应用程序编程接口(API)来创建一个新进程(fork、exec或Portable Operating System Interface[POSIX]函数),停止进程(kill、exit),并在它们之间进行通信和同步(signal 或者POSIX机制)。

    进程的创建:在Linux系统中,除了系统启动之后的第一个进程由系统来创建,其余的进程都必须由已存在的进程来创建,新创建的进程叫做子进程,而创建子进程的进程叫做父进程。那个在系统启动及完成初始化之后,Linux自动创建的进程叫做根进程。Linux提供了一个系统调用fork()使一个进程中分裂出子进程,如果fork()失败,返回-1,否则会出现父进程和子进程两个进程,子进程fork()返回0,父进程fork()返回子进程的ID;Linux提供了系统调用execv()在程序运行中能够加载并运行一个可执行文件,如果一个进程调用了execv(),那么该函数便会把函数参数path所指定的可执行文件加载到进程的用户内存空间,并覆盖掉原文件,然后便运行这个新加载的可执行文件。

    进程的停止:如果一个进程调用exit(),那么这个进程会立即退出运行,并负责释放被中止进程除了进程控制块之外的各种内核数据结构。这种只剩下“身份证”的进程叫做“僵尸进程”,其进程控制块域state的值为TASK_ZOMBLE。

 

  2、内存管理(Memory Management)

    

    内存管理主要提供对内存资源的访问控制,Linux系统会在硬件物理内存和进程所使用的内存(称作虚拟内存)之间建立一种映射关系,这种映射是以进程为单位,因而不同的进程可以使用相同的虚拟内存,而这些相同的虚拟内存,可以映射到不同的物理内存上。Linux内核从虚拟内存(VM)、DMA mapping以及DMA buffer sharing三个角度,对内存进行管理。

    VM是内存管理的主要模块,也是我们通常意义上所讲的狭义“内存管理”,代码主要分布在mm/以及arch/xxx/mm/两个目录下,其中arch/xxx/mm/*提供平台相关部分的实现,mm/*提供平台无关部分的实现。

    DMA mapping是内存管理的辅助模块,主要提供dma_alloc_xxx(申请可供设备直接访问的内存----dma_addr)和dma_map_xxx(是在CPU视角的虚拟内存和dma_addr之间转换)两类接口。该模块的具体实现依赖于设备访问内存的方式,代码主要分别在drivers/base/*(通用实现)以及arch/xxx/mm/(平台相关的实现)。

    DMA buffer sharing的机制,用于在不同设备之间共享内存,一般包括两种方法:传统的、利用CPU虚拟地址中转的方法,例如scatterlist;dma buffer sharing framework,位于drivers/dma-buf/dma-buf.c中。

 

  3、虚拟文件系统(Virtual File System)

    虚拟文件系统VFS(也称虚拟文件交换)作为内核子系统,为用户空间程序提供了文件和文件系统相关的统一接口。通过VFS,应用程序可以使用相同接口完成不同介质上不同文件系统的数据读写操作。VFS是内核对所有实际文件系统(ext2\ext3\vfat\nfs等)操作接口的一层通用封装(故称虚拟)。通过这个抽象层,应用程序调用相同接口完成不同文件系统之间的数据操作,而底层可以支持各种文件系统,也可以轻松的新增文件系统而不会对应用程序有任何影响。

     VFS中有四个主要的对象类型:

      超级块对象:代表一个具体的已安装文件系统,存在物理介质。

      索引节点对象:代表一个具体的文件,存在物理介质。

      目录项对象:代表一个目录项,是路径的一个组成部分,存在内存。

      文件对象:代码由进程打开的文件,存在内存。

 

二、应用程序的性能分析

  缺页中断就是要访问的页不在主存,需要操作系统将其调入主存后再进行访问。在这个时候,被内存映射的文件实际上成了一个分页交换文件。与直接访问物理内存不同,缺页中断过程大部分是由软件完成的,消耗时间比较久,所以是影响性能的一个关键指标。Linux把缺页中断又进一步分为minor page fault和major page fault。分配物理内存,构建映射表过程可以看做是minor page fault。major page fault是由交换机制引入的,对于交换情况,地址映射好了后,还需要从外部存储读取数据,这个过程涉及到IO操作,耗时更久。简单而言,minor page fault这种缺页可以直接利用内存中的缓存页满足,major page fault可以通过磁盘IO来满足。查看应用程序page fault的两种方法:

  使用time命令:比如我想看看svm-train的情况 \time svm-train age_train_equal.txt(斜杠表示不使用shell的内嵌time命令)。输出是:7.68user 0.02system0:07.71elapsed 99%CPU (0avgtext+0avgdata 42768maxresident)k0inputs+6696outputs (0major+15445minor)pagefaults 0swaps。可以看到只有minor page fault,没有major page fault。time命令的实现是用到了Linux提供的rusage机制。Linux的wait API可以返回一个应用程序的运行过程的资源消耗情况。如果你想在自己的代码中获取资源利用情况,可以使用libc的getrusage函数,这个函数也是内核的API。

  proc文件系统:Linux系统下的/proc/PID/stat文件,也提供了相关统计数据。

posted @ 2021-05-18 14:25  test271  阅读(514)  评论(0编辑  收藏  举报