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_(斜杠表⽰不使⽤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⽂件,也提供了相关统计数据。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论