Linux操作系统分析 课程学习总结报告

       在linux操作系统分析课程中,我了解到操作系统的三⼤核⼼功能为进程管理、内存管理和⽂件系统。事实上,通过查阅资料,可以知道linux操作系统有五个子模块:进程调度,内存管理,虚拟文件系统,网络接口,进程间通信。其中,网络接口和进程间通信在课上涉及较少,故本文主要围绕进程管理,内存管理和文件系统展开。

 

Linux操作系统分析 课程学习总结报告_第1张图片

linux系统模型

       首先先了解操作系统的主要功能。操作系统是管理计算机硬件与软件资源的计算机程序,普通用户通过操作系统来使用计算机的各种底层硬件和软件资源,这样既方便了用户的操作,省去了用户很多不必要的麻烦,同时能够保证计算机系统的安全性。为了能够让用户很好地使用这些资源,操作系统需要实现很多复杂的功能,这里大略地谈谈其中最核心的三个模块——进程管理、内存管理和文件系统。

       在操作系统中,使用进程描述符PCB来描述、管理一个进程,具体地,在Linux中使用task_struct来实现PCB。task_struct中有许多内容,比如进程状态、进程堆栈、进程号、打开文件、管理内存指针,等等。

       Linux操作系统分析 课程学习总结报告_第2张图片

task_struct结构

        进程的管理主要是指对进程的创建及调度。在计算机启动后会有硬件程序自动创建一个0号进程Init,之后的所有进程都通过fork这个0号进程来创建。fork底层主要是调用_do_fork,然后_do_fork再调用一系列函数完成了复制父进程、获得pid、创建子进程内核堆栈、将子进程放入就绪队列等一系列过程。至于进程调度,则是通过进程调度算法考虑各个进程的优先级并在适当的时机(进程状态发生变化时、当前进程时间片用完时、进程从系统调用返回到用户态时、中断处理后,进程返回到用户态时)切换进程。本质上说每个进程切换有两步组成:1.切换页全局目录以安装一个新的地址空间2.切换内核态堆栈和硬件上下文。而上述过程涉及的具体的寄存器、堆栈的切换过程已经在之前的博客中提及,此处便略过。

        说完了进程,便谈谈内存管理。内存管理实际上是通过进程地址空间进行管理。Linux把进程地址空间分成内核区和用户区两部分:

Linux操作系统分析 课程学习总结报告_第3张图片

进程内存布局

给内核分配内存时,采用前面页面级内存分配和小内存分配以及非连续内存区;而给用户态进程分配内存时,并没有立即获得实际的物理页框,而仅仅获得对一个新的线性地址区间的使用权。这个线性地址区间会成为进程地址空间的一部分,称作线性区。在linux中,通过task_struct中的mm_struct结构控制进程的内存管理,包括内存访问权限、缺页异常等处理都是通过该结构进行。值得一提的是,linux中的各个进程的内存块通过双向链表链接在一起。

         再来谈谈文件系统。事实上,文件系统才是我们用户最能直观感受到的功能。计算机能够如此有用,存储信息是其中的重要一点,而文件系统恰是计算机组织、存取和保存信息的重要手段。对于用户来说,是直接通过文件名来读写文件,但是对于操作系统来说,则是使用了文件控制块FCB来管理文件,将文件名映射到inode上再映射到具体的物理地址。

         一个小例子:

         在shell终端中执行c程序,使用new分配内存,实际上该程序所在进程会从其父进程(shell进程)拷贝内存描述符mm_struct,有如下调用:do_fork——>copy_process——>copy_mm——>mm_alloc_pgd,之后mm_struct再根据所要求分配的内存大小的具体情况调用brk或者mmap进行内存分配。

         心得体会:本次上课从孟老师和李老师那里学到了许多有关linux内核的知识,学会如何使用gdb调试内核代码,这样以后自己也能够自己尝试去分析内核代码,对找实习也起到了很大帮助。

         改进建议:李老师讲的某些内容可能需要一些前置知识才好理解(比如进程地址空间的部分可能需要有更多的内存管理的前置知识),希望老师能在ppt中扩充一些前置知识。

你可能感兴趣的:(Linux操作系统分析 课程学习总结报告)