课程学习总结报告
Linux操作系统 课程学习总结报告
Linux内核概念
Linux内核作为操作系统内核,向下承接最底层的硬件驱动,向上提供应用层的接口实现,适用于各类软硬件结合系统。
其拥有五大核心部分:进程管理、内存管理、文件系统、设备驱动与网络模块,课程中主要学习了前三个部分。
进程管理
在Linux中,父进程通过复制自己的地址空间(fork)创建一个新的子进程结构。
每个新进程分配一个唯一的进程ID(PID),任何进程都可以创建子进程,所有进程都是第一个系统进程的后代。
子进程继承了父进程的安全性身份、过去和当前的文件描述符,端口和资源特权,环境变量,以及程序代码。
fork出的子进程可能exec自己的程序代码,父进程在子进程运行期间一般处于睡眠(sleeping)状态,子进程完成时会发出exit信号请求,在退出时子进程会关闭资源,剩余部分僵停。父进程收到信号而被唤醒,清理子进程剩余的结构,然后继续执行其自己的程序代码。
子进程继承父进程的安全性身份、过去和当前的文件描述符,端口和资源特权,环境变量,以及程序代码。随后,子进程可能exec自己的程序代码,通常,父进程在子进程运行期间处于睡眠(sleeping)状态,当子进程完成时发出(exit)信号请求,在退出时,子进程已经关闭或丢弃了资源环境,剩余的部分称为僵停(Zombie)。父进程在子进程退出时收到信号而被唤醒,清理剩余的结构,然后继续执行自己的程序代码。
下图描述了子进程的生命状态转换流程:
图中子进程在被fork出来之后,一直到最后僵停回收(reap),期间的进程活动与普通概念上的进程状态转换一致,其中包括了内核态与用户态之间的转变(syscall与return)。
内存管理
Linux管理内存时使用了虚拟内存,它使得每个应用程序都认为自己拥有独立且连续的可用的内存空间(一段连续完整的地址空间),而实际上,它通常是被映射到多个物理内存段,还有部分暂时存储在外部磁盘存储器上,在需要时再加载到内存中来。
当进程执行一个程序时,需要先从内存中读取该进程的指令然后执行,获取指令时用到的就是虚拟地址,这个地址是程序链接时确定的(内核加载并初始化进程时会调整动态库的地址范围),为了获取到实际的数据,CPU需要将虚拟地址转换成物理地址,CPU转换地址时需要用到进程的page table,而page table里面的数据由操作系统维护。
虚拟内存与物理内存的关系:
虚拟内存和物理内存的page之间通过page table进行映射。进程X和Y的虚拟内存是相互独立的,且page table也是独立的,它们之间共享物理内存。进程可以访问自己的虚拟地址空间,而page table和物理内存由内核维护。当进程需要访问内存时,CPU会根据进程的page table将虚拟地址翻译成物理地址,然后进行访问。
文件系统
Linux文件系统需要一个应用程序接口(API),从而提供对文件系统对象,比如文件和目录进行操作的系统功能调用的访问。API提供了诸如创建、移动和删除文件的功能,也提供了某些信息,比如文件存于文件系统中的位置。
文件系统确保用户只能访问自己的文件,而不能访问其他用户的文件或操作系统本身。
Linux使用两层软件实现的方式来提高系统和程序员的效率:
心得体会与改进建议
本门课程的学习,不仅接触到了很多Linux内核的实现细节,而且对内核原理也给出了很精要的概括。学习完课程最大的体会就是,对自己以前学过的操作系统课程有了更清晰的概念,知道了理论究竟是如何在具体应用中实现的。
关于课程的建议:课程前半部分与后半部分分别由两位老师授课,在进程与系统调用方面课程内容有部分重叠。但是并没有冲突,孟老师主要讲解了具体的内核实现,李老师主要是针对原理进行分析,这一块如果两位老师的实操和原理换一下顺序授课会更容易接受一点。