os_lab6:调度器
课程主页:https://www.xuetangx.com/course/THU08091000267/5883104?channel=i.area.learn_title实验指导书:https://objectkuan.gitbooks.io/ucore-docs/content/github:https://github.com/chyyuu/ucore_os_lab (master 分支)
前置知识进程调度算法。
改动点相比于 lab5 源代码,lab6 主要做了如下改动:
proc.h 扩展 struct proc_struct 成员属性
12345678910struct proc_struct { ... // 同以往结构的属性 struct run_queue *rq; // 该进程所在的 run_queue list_entry_t run_link; // 以链表形式链接各就绪进程 int time_slice; ...
os:处理机调度
处理器调度概念调度的技术背景在此前我们已经介绍了进程和线程机制, 它们可以使得CPU能够更加有效地展现并发处理的能力。
对于资源基本管理单位的进程来说,CPU资源的当前占用者切换是基本的并发思路。
但有如下两个问题:
如何从就绪队列中选出下一个运行(占用CPU)的进程
从多个CPU中选出就绪进程中当前准备使用的的CPU
这两个选择任务就交由调度算法来实现。
调度时机调度程序除了解决上述提到的进程线程选择之外,还需进行调度时机的选择
当前系统为非抢占系统时,内核在如下两种情况下运行调度程序:
进程从运行状态切换到等待状态(等待某个事件)
进程被终结了
当前系统为抢占系统时,内核在如下情况下运行调度程序:
中断请求被服务例程响应完成时
进程从 运行状态 切换到 就绪状态
当前进程被抢占
进程时间片用完
某进程从 等待状态 切换到 就绪状态 (它的优先级更高,因此会发生抢占)
调度准则评定调度算法好坏的指标从运行效率来说:
CPU使用率:CPU处于忙状态的时间百分比
吞吐量:单位时间内完成的进程数量
从用户使用来说:
周转时间:进程从初始化到完成(包括等待)的时间
...
os_lab5:用户进程管理
课程主页:https://www.xuetangx.com/course/THU08091000267/5883104?channel=i.area.learn_title实验指导书:https://objectkuan.gitbooks.io/ucore-docs/content/github:https://github.com/chyyuu/ucore_os_lab (master 分支)
前置知识进程、虚拟存储、中断机制、系统调用。
改动点相比于 lab4 源代码,lab5 主要做了如下改动:
memlayout.h 增加用户空间的图形表示和宏定义
宏定义 USERTOP/USERBASE 等指明用户虚拟地址空间范围,图形表示显示哪些用户空间属于合法空间。
12345678910111213141516171819202122232425262728293031323334353637383940/* * * Virtual memory map: Permissions * ...
os_lab4:内核线程管理
课程主页:https://www.xuetangx.com/course/THU08091000267/5883104?channel=i.area.learn_title实验指导书:https://objectkuan.gitbooks.io/ucore-docs/content/github:https://github.com/chyyuu/ucore_os_lab (master 分支)
前置知识线程、状态转换。
改动点相比于 lab3 源代码,lab4 主要是添加代码 process/* 以实现进程/线程管理功能。
练习一此练习用于认识进程/线程控制块 PCB。
在 ucore 中,struct proc_struct 用于描述进程/线程:
123456789101112131415161718192021222324252627282930313233343536struct proc_struct { enum proc_state state; // 进程状态(创建、就绪、运行、阻塞、终止) int p ...
os:进程和线程(六)
进程进程的概念进程是一个具有一定独立功能的程序在一个数据集合上的一次动态执行的过程
这里特别注意程序和进程之间的关系:
程序=文件(静态的可执行文件)
进程=程序+执行过程
进程是程序的超集,还包括数据和进程控制块。
程序和进程之间的区别:
同一个程序的多次执行过程对应为不同进程
进程是动态的,程序是静态的
进程是暂时的,程序是永久的
进程的特征:
动态性:动态创建、结束
并发性:可以独立调度并占用处理器运行
独立性:不同的进程的工作互不影响
制约性:因访问共享数据、资源或进程间同步产生制约关系
共享和独立需要有一定限度,进程之间不仅需要去耦合,但不能忘记相互协作的初衷
执行进程需要内存和CPU共同工作:
内存负责保存代码和数据
CPU负责执行指令
进程控制块 (PCB Process Control Block)操作系统管理控制进程运行所用的信息集合 (操作系统用 PCB 来描述进程的基本情况以及运行变化的过程)
PCB 是进程存在的唯一标识(每个进程都在操作系统中有一个对应的 PCB)
进程控制块存些什么?
进程标识信息 (PID)
处理机现场保存 (调度之前 ...
os_lab3:虚拟内存管理
课程主页:https://www.xuetangx.com/course/THU08091000267/5883104?channel=i.area.learn_title实验指导书:https://objectkuan.gitbooks.io/ucore-docs/content/github:https://github.com/chyyuu/ucore_os_lab (master 分支)
前置知识虚拟存储、页面置换算法、中断机制。
改动点相比于 lab2 源代码,lab3 主要是添加部分代码以实现虚拟存储功能,仅见的改动点在于页描述结构 page 和 alloc_pages 函数的具体实现,两者源码如下:
12345678910111213141516171819202122232425262728293031struct Page { int ref; uint32_t flags; unsigned int property; list ...
os:页面置换算法(五)
页面置换算法概念
本节强烈建议看视频:课程第九讲。其中给出了大量的动画示例,有助于理解。
处理缺页异常(需要调入新页面而内存已满)时,用于选择被置换的物理页面的算法。
设计目标:减少调入调出次数,寻找未来不再访问或短期内不访问的页面调出
在给出页面置换的结构之前,我们有一类特例,即不被替换的页面:页面锁定(frame locking)
操作系统的关键部分,描述必须常驻的逻辑页面,这部分页面对响应速度有要求
利用页表中的锁定标志位来实现
评价方法:页面轨迹统计,模拟页面置换行为,记录缺页次数
页面置换算法分类:
局部页面置换算法(选择范围仅限当前进程占用的物理页面)
最优算法:全知全能,量身定制
先进先出算法:先调入的页先调出
最近最久未使用算法:一个统计方法,实现较麻烦
时钟算法,最不常用算法
全局置换算法(选择防卫是所有可换出的物理页面)
工作集算法
缺页率算法
局部页面置换算法最优置换算法(OPT)置换在未来最长时间不访问的页面。
缺页时计算内存中每个逻辑页面的下一次访问时间。全知全能,缺页次数最少,是理想情况。
实际系统中无法实现
无法预制每个页面在下 ...
os:虚拟存储概念(四)
虚存的需求背景实际的存储受限于成本等原因,为了物尽其用,往往设计为层次结构,大容量存储往往性能较差,性能较好的存储往往设计的很小。
但借助软硬件的协同,将读写较快的内存作为读写较慢的磁盘的缓存来使用,如果处理得当,相当于提高了存储的综合性能。
覆盖技术和交换技术目前已经有一些解决内存不够的思路,比如之前提到的段式存储中的共用策略(覆盖),连续存储中的交换策略。
这一类时间换空间的方法,都是比较真诚的资本家想法,在于充分的增加内存的时间占用率,让每一块区域尽可能都不闲下来。
覆盖技术:
必要部分:常驻
可选部分:用到时装入
不会同时使用的几个模块:相互覆盖,共用存储
这样就减小了单个程序运行的内存开销,可以在较小的内存上运行较大的程序。
但这种方式,不能自动完成,需要程序员自行指定调用关系,机器才会进行覆盖。这增加了编程的难度。
交换技术着眼于不同进程的调度,区别相对繁忙和闲置的进程,并换入换出。通常我们使用电脑时看到的临时文件.swp就是被换到外存的部分(当然不一定是整个进程)。
交换技术的问题
交换时机:何时需要交换?只当内存空间不够或者有不够的可能时换出
交换区大小:存放用户 ...
os_lab2:物理内存管理
课程主页:https://www.xuetangx.com/course/THU08091000267/5883104?channel=i.area.learn_title实验指导书:https://objectkuan.gitbooks.io/ucore-docs/content/github:https://github.com/chyyuu/ucore_os_lab (master 分支)
前置知识分段机制、分页机制、物理内存管理机制、伙伴系统、slub 分配算法。
改动点相比于 lab1 源代码,lab2 主要做了如下改动:
bootasm.S 增加内存探测功能
借助于 BIOS 提供的 int 0x15 中断功能,探测当前机器的内存布局,并将其结果放置于 0x8000 处。
该结果以 地址范围描述符 结构体形式进行存放:
12345678struct e820map { int nr_map; struct { long long addr; // 基址 long long size; // 大小 long type; // 类型 ...
os:非连续内存分配(三)
非连续内存分配的背景与需求之前已经讲到操作系统的连续内存分配,但比如在WFA(worst-fit allocation,先拆最大块方法)中,随着分配的进行,较大的内存申请很可能将不再能一次满足。所以我们思考有没有一种方法将较为离散的内存块组织起来,组织成逻辑上的相对大块的内存。借用段式存储管理中的这张图,我们将这个过程示意如下:
另外,连续内存的申请和释放都伴随着一些麻烦,同时还不免地产生内外碎片。
非连续分配的提出就是为了提高内存的利用率和管理的灵活性。
允许程序使用非连续的物理地址空间
允许共享代码和数据
支持动态加载和动态链接
非连续分配的实现过程中需要解决的问题: 实现虚拟地址和物理地址的转换
软件实现:利用类似外排序的思路,灵活地组织处在不同区域的内存,但是开销大;
硬件实现:每执行一条指令都需要做转换,那么直接使用硬件做映射是比较好的。
非连续分配硬件辅助机制:如何选择非连续分配中的内存分块大小(拆多大?如何组织?)
段式存储管理(segmentation)
页式存储管理(paging)
访问不在当前段的地址的错误就叫段错误(segmentation fa ...