各位同学大家好
今天我给大家介绍第四个实验
就是关于内核线程的管理
那我们这次课程呢
主要包含以下几部分
总体介绍 关键数据结构和执行流程
首先我们看一下总体介绍
总体介绍包含三个部分
又包含三个小部分
目标 练习和整个这个
实验流程的一个概述
那目标是什么呢
我们前面已经完成了
从lab1到lab3的一个实验
那么在前面的实验中
我们重点解决了什么呢
重点解决是内存管理相关的
一系列的一些关键的知识
包括物理内存管理
以及虚拟内存管理
那在这个过程中呢
我们已经掌握了
就是关于内存的一部分的一些知识
接下来呢我们要看一下
对于我们CPU而言
我们怎么能够充分利用CPU
让CPU来执行多个
不同的线程或者进程
在这里面我们首先关注是线程
因为相对来说在内核里面
创建一个线程比在用户态
创建进程要容易一些
我们先从这个线程入手
这也和我们大致原理课内容
正好有点相反
我们原理课一般是
从进程开始讲起的
但是没有关系
因为它们很多部分
都是有相同的地方
大家再回忆一下
原理课中讲过一些知识
原理课我们讲一个线程
或者进程在这里面我们不做区别
那他有一个生命周期
从最开始这个启动
到最后的结束
那么创建线程线程处于就绪态
然后占用CPU执行
然后由于某种事件的原因
导致它的等待
在这个整个过程最后还要退出
那么这是
我们说是一个线程一个生命周期
那怎么去有效管理生命周期呢
这就需要在我们操作系统里面
有一个专门数据结构
我们称之为TCB
线程控制块
当然我们可以叫PCB
就是进程控制块
在这里面我们一样不做区分
在本次实验中呢
我们重点讲的是线程
所以我们可以在以后
都用TCB来进行一个表述
那第二方面呢我们希望去了解
这个线程执行一个过程
怎么去执行它
怎么去调度它
那我们可以看到
对于一个线程而言它需要管理的
除了它的代码段 数据段之外呢
还有一个执行的流程
我们需要知道它在
某一个时刻执行到什么地方
这也就是说对于这个线程执行过程呢
我们希望有效管理措施
可以使得单线程和多线程
都能够在我们系统里面
能够正常的工作
对于单线程而言
我们可能涉及不到调度
但是对于多线程而言
我们就会碰到到底在什么时候
应该让这个线程去占用CPU执行
因为存在多个线程
抢一个CPU的情况
所以说呢
在这里面我们希望让大家能够了解到
大致一个线程怎么去创建
以及他怎么去执行
甚至说还进一步去考虑
两个线程或者多线程怎么去切换
来分时的占用CPU来执行的一个过程
这是说我们这个lab4重点要考虑的内容
为此呢你可以看到我们需要
去对TCB做一个比较全面的理解和分析
那么充分利用TCB里面的一些信息
来完成对这个线程的有效的管理
好 那这时候我们讲完这个
关于这个线程目标这一块
我们接下来看一看
我们这个实验要完成的练习
练习有三个
第一个就是你要知道怎么去初始化
创建一个进程控制块
或者线程控制块
这个不做区分
第二个呢 我们会讲怎么为这个
内核的线程分配资源
有了控制块之后呢
它是用来管理
管理很多元数据
管理这个比如说这个线程
占用空间占用堆栈等等
那这些信息怎么能够
怎么能够在创建线程的时候
给它分配好相应
他所需要能够正常运行需要这个资源
第三个呢要理解一个就是相对来说
和我们硬件相关的一个细节
就是怎么去切换的
当有两个进程存在的时候
那我们怎么去能够
完成进程和线程的切换
这是我们说希望
大家通过练习能够掌握的
当然我们在后续的讲解中
对这里面一些关键点和难点呢
给大家做一个介绍
以便于大家能够
比较方便的开展相应的练习
那如果说你完成了这个练习
那么可以看到我们最终会创建出
创建出一个内核线程
它可以完成一个最简单的
hello world一个显示
别小看这个hello world
虽然感觉只是打一个字符串
但其实我们为此做出了很多的工作
包括从lab1建立中断机制
跟外设打交道
lab2管理物理内存
lab3管理虚拟内存
有了前三步基础之后呢
我们才能够去创建一个进程或者线程
那么接下来我们看一下
整个一个实验运行一个流程
首先我们需要去能够
对他的关键数据结构进行一个处理
关键数据结构包含两部分
一个是说我们要有TCB
就是线程控制块
第二个呢 当存在多个线程的时候呢
我们需要把这些线程
有效的管理起来
一堆线程管理起来
那么需要有一个list
这个线程控制块一个列表
那我们可以用list结构呢
来对它进行有效的管理
有了这两部分之后呢
我们就可以说我们一个对线程
关键数据结构呢就可以建好了
第二部分呢就是要去怎么去操作了
那么对于操作而言呢
我们首先要完成相应的初始化
在前面的lab1到lab3
完成了包括中断物理内存
和虚拟内存的初始化工作
这时候我们打下一个基础
那在这个实验中我们还要
进一步要去初始化什么呢
我们内核线程本身初始化
还有怎么去创建相应的
一些关键的一些资源
就是为这个线程要去分配一些资源
然后还要能够去实现线程的切换
只要把这几部分
初始化工作做完之后呢
你才能够有效去让一个线程
能够正确切换和运行
好 最后一步呢就是说
我们能够让我们前面创建好
这个线程能够切换去
让它去执行
从而可以打印出我们
刚才说到这个字符串的信息
可见为了完成这个工作
确实要完成大量前期
一些初始化的工作
当然我们在后面会
逐一给大家讲解其中的一些关键点