进程与线程:06 操作系统之“树”
操作系统核心知识回顾与思维训练
在之前的学习中,我们深入探讨了CPU管理相关内容。
- CPU管理内容回顾:我们学习了CPU直观管理方法,了解如何让简单程序执行,分析了CPU效率低下的原因及处理办法,即实现多程序执行。接着引出进程概念,深入探讨多进程图像以及操作系统实现多进程所需的准备工作,其中核心是交替执行,包括用户级线程和内核级线程的交替执行实现方式与相关源码。
- 学习难点与课程目的:目前所学内容是操作系统中最核心的部分,理解起来难度较大。每年讲到此处,很多同学会感到吃力。为激励大家,同时帮助大家训练思维能力,掌握构建复杂系统的方法,我们引入本堂课。本堂课旨在让大家明白操作系统从初始想法逐步发展成复杂系统的过程,培养大家研究和构建复杂系统的决心与能力。
复杂系统与操作系统
复杂系统的时代意义
霍金曾指出,在21世纪,复杂系统将成为科学发展的核心。如今,像操作系统、互联网、大脑神经网络、豪华汽车、石油管道、宇宙、生物群落、生命循环等都属于复杂系统。当前,对这些复杂系统的研究备受关注,例如脑科学领域对大脑工作机制的探索。若人类能深入了解这些复杂系统,如大脑工作原理、人体运作机制,将极大推动科学发展,甚至攻克癌症等难题。
操作系统的发展历程
操作系统作为复杂系统的典型代表,其发展并非一蹴而就。就像一棵大树是从一颗种子逐渐生长而成,操作系统也是从一个初始想法,历经不断发展与完善,才形成如今庞大复杂的系统。我们接下来将梳理操作系统从简单到复杂的发展思路,帮助大家理解其构建过程。
学习的本质与思维培养
学习的正确方式
哲学家曾说:“人的头脑不是一个盛水的装满水的器皿,而是一团需要点燃的火。”这意味着学习不应仅仅是知识的机械记忆,像将知识简单填充进大脑,只为应付考试。这种学习方式虽能记住知识,但无法将其转化为思考和解决问题的能力,知识也就失去了实际价值。真正的学习应从一个点出发,激发思考,不断向外探索,如同火焰燃烧般,将知识转化为解决问题的动力。
操作系统学习的启示
操作系统的构建过程充分体现了这种学习和思维方式。它从一个初始的小想法,不断拓展思维,逐步实现复杂功能,最终形成完整系统。我们在学习操作系统时,也要培养这种从点到面、不断深入思考的能力,学会运用已有知识解决实际问题,点燃思维的火焰,而不是被动接受知识。
操作系统的构建思路
从简单想法到多程序切换
管理CPU的最初想法是设置PC初值,使其取指执行,让CPU运转起来,但这种方式导致CPU利用率低。
为解决此问题,借鉴生活中烧水时可同时做其他事的智慧,提出在CPU执行到需要等待时,切换执行其他程序,从而实现多个程序切换。由于程序切换类似于跳转,我们利用栈来实现这一功能,通过实践和思考,不断改进和完善实现方式。
解决切换中的问题
在使用栈实现程序切换过程中,出现了混乱问题,一个栈无法满足需求,于是自然想到使用两个栈。
进一步明确在业务切换时,需先切换栈,再根据栈进行其他操作,如找到TCB(任务控制块),切换新栈等,从而实现用户多个执行序列之间的切换。
但此时仅能在用户态实现,为实现在内核态的切换,通过思维递进,考虑到内核也有栈,进而思考从用户栈到内核栈,再到TCB之间的切换关系,最终形成两套栈的切换机制。
实现想法的具体目标与实践
有了上述想法后,我们需要在实际计算机上实现这些切换。以在屏幕上交替打出a和b为具体目标,该目标能体现多个执行序列在内核中的交替切换,若能实现,说明我们的想法具有可行性。
Linux 0.01最初就是在屏幕上交替打出a和b,这是Linux操作系统发展的起点,如同小树的种子发芽。
为实现此目标,我们创建两个进程,每个进程在死循环中分别循环打出a和b。
在这里插入图片描述
具体实现过程涉及系统调用fork,fork执行int 0x80,在内核中通过一系列操作,如执行CS_call、cs_folk,最终跳转到copy_process,在该函数中创建新的PCB(进程控制块)和栈,设置相关参数,如eip指向打印a或b的函数地址,ax设为0等。父进程创建完子进程后,调用wait将自身状态变为阻塞态,然后调用schedule进行进程调度。
调度算法与切换实现
schedule负责选择进程,初始可采用简单算法选择第一个进程,后续可根据需求优化。选择进程后,通过switch_to进行切换,切换过程基于对硬件手册的研究,利用TSS(任务状态段)完成,即将当前进程的CPU寄存器内容保存到TSS,再将下一个进程TSS中的内容恢复到CPU。
当a进程执行时,eip指向打印a的函数地址,开始打印a。此时为实现a和b的交替打印,需要引入调度点调用schedule,而进入内核调用schedule靠中断实现,经思考选择时钟中断。初始化时钟中断后,在每次时钟中断时,让当前进程的counter减一,当counter减为0时,调用schedule,从而实现a和b进程的交替执行,在屏幕上交替打出a和b。
总结与展望
通过梳理操作系统从初始想法到实现屏幕上交替打出a和b的过程,我们串联起之前所学知识,清晰呈现了一个想法如何通过程序逐步实现的思维过程。如果大家能根据上述思路,独立编写代码实现该功能,就相当于拥有了操作系统的0.01版,这是操作系统构建的良好开端。即便大家未来不想开发操作系统,理解这一思维过程对研究和构建其他任何系统都具有重要意义。希望大家在学习中培养这种从点到面、不断探索的思维能力,点燃思维火焰,创造出属于自己的“大树”。