30天自制操作系统:第十五天 多任务(1)

1 挑战任务切换(harib12a)

多任务(multitask),顾名思义就是“多个任务”的意思。稍稍思考一下我们就会发现,多任务这个东西还真是奇妙,它究竟是怎样做到让多个程序同时运行的呢?如果我们的电脑里面装了好多个CPU的话,同时运行多个程序倒也顺理成章,但实际上就算我们只有一个CPU,照样可以实现多任务。

其实说穿了,这些程序根本没有同时在运行,只不过看上去好像是在同时运行一样:程序A运行一会儿,接下来程序B运行一会儿,再接下来轮到程序C,然后再回到程序A… …如此反复,在OS上有个专业点的名词为:并发。
在这里插入图片描述


如何让CPU来处理多任务。
当你向CPU发出多任务切换的指令时,CPU会把寄存器中的值全部写入内存中,这样做时为了当以后切换回这个程序的时候,可以从中断的地方继续运行。接下来,为了运行下一个程序,CPU会把所有寄存器中的值从内存中读取出来(当然,这个读取的地址和刚刚写入的地址一定是不同的,不然就相当于什么都没变嘛),这样就完成了一次切换。我们前面所说的任务切换所需要的时间,正是对内存进行写入和读取操作所消耗的时间。


在这里插入图片描述
在这里插入图片描述
下面主要是一些实现切换任务的代码:

在这里插入图片描述
将tss_a定义在gdt的3号,段长限制为103字节,tss_b也采用类似的定义。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
书中的部分知识比较基础,比如涉及到为什么要单独给任务B定义一个栈,所以这里很多内容笔者不再贴图。

2 任务切换进阶(harib12b)

这一小节只是在上一节的基础上加了几行代码,实现在10s后光标停止闪烁,再过5s光标又重新开始闪烁,之前键盘输入进去的字一口气冒了出来。
在这里插入图片描述

_taskswitch3函数

在这里插入图片描述
简单的完成一个跳转指令,随后执行 ret 指令回到原程序。

3 做个简单的多任务(1)(harib12c)

这里做了一个统一的跳转函数:
在这里插入图片描述
在HariMain中实现每0.02s执行一次任务切换。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
上面的程序不是太难,跟住作者的注释还是比较好理解的:当从 farjmp 返回的时候,我们都将计时器重新设定到0.02秒之后,以便让程序在返回0.02秒之后,再次执行任务切换。

4 做个简单的多任务(2)(harib12d)

小节为确认 task_b_main 函数到底有没有运行,这里让函数显示计数。
在这里插入图片描述
在这里插入图片描述

5 提高运行速度(harib12e)

降低数字的刷新频率提升速度。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

6 测试运行速度(harib12f)

小节中作者对程序运行的速度进行了测试。

7 多任务进阶(harib12g)

为了实现真正的多任务:在程序本身不知道的情况下进行任务切换。
在这里插入图片描述
后续为一大片程序,可以到原书翻阅。

感受

今天的状态不是特别好,不过介于有OS的基础,程序还是可以看得懂的,继续坚持。over

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nepu_bin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值