Linux内核分析 —— 【实验二:计算机工作机制 】
计算机作为二十世纪以来最重要的发明之一,它已经完全融入到我们的生活,成为我们工作、娱乐、学习等过程中必不可少的一部分。我们可以用它来浏览网页、查询资料、看电影、听音乐、玩游戏、聊天等等,更重要的是计算机可以同时满足我们的这些要求。到底计算机是如何做到的呢?下面做一个简单的实验并分析。
首先,我们要模拟一个Linux内核平台,步骤如下:
~$ sudo apt-get install qemu # 安装QEMU
~$ sudo ln -s /usr/bin/qemu-system-i386 /usr/bin/qemu
~$ wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.9.4.tar.xz # 下载Linux内核代码
~$ wget https://raw.github.com/mengning/mykernel/master/mykernel_for_linux3.9.4sc.patch # 下载补丁
~$ xz -d linux-3.9.4.tar.xz # 解压缩
~$ tar -xvf linux-3.9.4.tar # 解开包裹
~$ cd linux-3.9.4 # 切换目录
~$ patch -p1 < ../mykernel_for_linux3.9.4sc.patch #打补丁
~$ make allnoconfig
~$ make #编译链接
~$ qemu -kernel arch/x86/boot/bzImage #运行
运行结果:
从图中可知,程序会一直死循环,这相当于我们的cpu在不停的运转;字符串“my_start_kernel here”相当于执行的进程,而每隔一段时间就有一个“my_timer_handler”,这个相当于是调度程序。通过不断地调度、中断、执行,确保每个进程都得以运行。
接着,分析代码。
cd mykernel
打开mymain.c和myinterrupt.c文件
先看mymain.c文件,图片上之所以显示mymain0.c是因为我自己修改了名字。
这里只有一个my_start_kernel函数,里面是一个死循环,它就不停的执行。
这是一个时间调度函数,每过一段时间就会执行,代表着中断和调度。
运行结果
从图中我们可以看到,程序在执行过程中,会产生一个中断,打印一串字符。这就是计算机的基本运行过程,系统内核不停的执行,等待任务的降临(产生中断),然后做出响应,只不过这里的响应过程没有体现出来。
上面例子比较简单,下面将模拟四个任务的执行过程。CPU都是从调度队列中获取任务的,调度队列中保存了每个将要执行的进程的相关信息——进程控制块。如下图
它包括:进程号、进程状态、栈空间大小、执行线程等。
下面看代码执行过程
初始化,将各个任务分配进程号,设置进程状态,分配栈空间,设置线程,设置下一个任务。这里没有使用调度算法,直接按照顺序循环执行各个任务。my_process函数是进程实际执行的任务,这里每个进程都一样。在my_process中有一个判断是否需要调度的标记符my_need_sched,当他的值为1时,则表示需要调度,调用函数如下:
首先是一个my_timer_handler函数,它用于控制调度的时间,每当运行了一段时间后,就会更改my_need_sched的值为1。这就相当于一个时间片轮转机制,每个进程每次只能执行这么多时间,然后跳转到另一个进程。
my_schedule函数用于实现进程之间的更替,根据调度队列里的顺利依次调度。最为重要的是保存当前进程现场,修改进程上下文环境,以便能正常恢复及顺利运行。
运行结果
以上就是模拟四个进程的运行结果。综上所述,我们知道计算机并不能同时执行多个进程,而是快速地交替执行,让我们察觉不到它们的停顿。计算机就是用这种时间片轮转的方法,不停地执行各种进程,完成各项工作。
=========== 王杰 原创作品转载请注明出处==============
《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ”