linux课程总结:从系统的角度分析影响程序执行性能的因素

实验总结分析报告:从系统的角度分析影响程序执行性能的因素

  Linux内核实现了操作系统的三大核心功能,即进程管理、内存管理和文件系统,对应操作系统原理课程中最重要的 3 个抽象概念是进程、虚拟地址和文件。

 一、精简Linux模型

二、进程管理

 进程的初始化

 linux进程的初始化在start_kernel()函数中完成。

 

内核通过硬件静态创造出了一个特殊的进程0号进程init_task进程,而0号通过fork又创建出了1号进程第一个用户态进程,没有父进程,由Linux内核直接启动,是所有用户进程的父进程和2进程一个kthreadd内核线程,实际上就是内核进,用来管理系统的资源

进程的管理

实际的Linux内核管理的进程状态操作系统原理中的进程有就绪态、运行态、阻塞态这3种基本状态有些不同

PCB: 进程由一个进程控制块PCB来描述(task_struct类型结构体),使用PID进程标识符来标识进程,每个进程有一个PID号,存放在PCB的pid域中,新创建的进程通常是前一个进程的PID加1

进程的创建

进程在执行过程中可能通过 fork() 创建多个新的进程。创建进程称为父进程,而新的进程称为子进程。每个新进程可以再创建其他进程,从而形成进程树。

进程切换

1、查找PCB 根据prio_array中的bitmap位图找到优先级最高的运行队列

2、切换上下文

  Schedule 实现进程的调度

  Context_switch 完成页表和进程上下文的切换(switch_to)

进程调度策略

  实时进:FIFO,时间片轮转

  普通进程:时间片轮转

  实时进程 > 交互进程 > 普通进程

进程调度时机

  1、进程时间片用完

  2、进程状态发生改变

  3、高优先级进程从其他的状态转换为就绪状态或者新的高优先级进程被创建

  4、中断处理退出

  5、系统调用退出

三、中断

Intel将指令特权等级分为了Ring0~Ring3,Linux只使用了Ring3(用户态)和Ring0(内核态)

中断的过程

硬件: 1. 中断源发出中断请求;

    2. 判断当前处理机是否允许中断和该中断源是否被屏蔽;

    3. 优先权排队;

    4. 处理机执行完当前指令或当前指令无法执行完,则立即停止当前程序,保护断点地址和处理机当前状态,转入相应的中断服务程序;

软件: 5. 执行中断服务程序;

    6. 恢复被保护的状态,执行“中断返回”指令回到被中断的程序或转入其他程序。

四、VFS文件系统

通用文件模型有下列对象类型组成

超级块对象(superblock object

  存放文件系统相关信息:例如文件系统控制块

索引节点对象(inode object

  存放具体文件的一般信息:文件控制块/inode

  Inode对象内包含了内核在操作文件或目录时需要的全部信息,文件名可以更改,但inode对文件是唯一的,且随文件的存在而存在。 

文件对象(file object

  存放已打开的文件和进程之间交互的信息

目录项对象(dentry object) 

  每一个文件除了有一个inode数据结构外,还有一个dentry数据结构与之关联

  dentry数据结构可以加快对文件的快速定位,改进文 件系统的效率

打开文件过程

根据给定的文件路径名搜索目录结构。一旦文件被找到,文件的FCB 被复制到内存里的系统打开文件表里。在进程打开文件表里创建一个指针字段,指向系统打开文件表里相应的表项。

五、影响Linux性能的因素以及优化

硬件上: cpu、内存、磁盘I/O

cpu

目前大部分CPU在同一时间内只能运行一个线程,超线程的处理器可以在同一时间运行多个线程,因此,可以利用处理器的超线程特性提高系统性能。

内存

Linux系统采用了物理内存和虚拟内存两种方式,虚拟内存虽然可以缓解物理内存的不足,但是占用过多的虚拟内存,应用程序的性能将明显下降,要保证应用程序的高性能运行,物理内存一定要足够大;但是过大的物理内存,会造成内存资源浪费。因此,要使用更大的内存,建议安装64位的操作系统,同时开启Linux的大内存内核支持。

文件系统优化

文件系统的优化是系统资源优化的一个重点,在Linux下可选的文件系统有ext2、ext3、ReiserFS、ext4、xfs,根据不同的应用,选择不同的文件系统。

cpu优化

系统调用会带来用户态和内核切换的开销,造成用户态上下文栈压栈弹栈,有损耗。

解决:降低系统调用使用次数

例如: 反复的read,write,就改为mmap,消息队列没有共享内存实现的消息队列,

   多次的malloc可以升级为一次malloc

      持久使用一块内存可以用大页 4K 2M 1G hugepages 避免发生tlb miss

   通过使用 sendfile及splice 降低系统调用带来的开销 零COPY (进程池sendfile和splice) 

用栈代替堆-栈空间速度比堆空间快

1. 栈空间在申请空间时是4K的整数倍,跟物理页是对等的,缺页异常次数较少

2. 硬件上,栈顶指针时刻在寄存里,不会从寄存器唤出,效率高

内存优化-解决物理内存不足的问题

LRU (最近最少使用算法)

比较冷的物理页 — 放入、Windows 虚拟内存 / Linux swap分区 (缺页异常)

TLB快表、| 虚拟地址 | 物理地址|、TLB未命中,通过多级页表进行翻译得到物理地址

避免锁引起的调度,实现无锁设计

 例:线程池

减少上下文切换开销

主线程 和 子线程 来回切换执行- -mutex 加解锁

六.总结

感谢孟老师和李老师的教学与付出, 让我对linux操作系统的设计与实现理论有了初步的了解。通过学习《Linux操作系统分析》理论课及多次实验,我对linux的兴趣更深入了一步,受益匪浅。

posted @ 2021-05-17 23:58  f-a-dd  阅读(188)  评论(0)    收藏  举报