自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(25)
  • 收藏
  • 关注

原创 lab7同步互斥实现

哲学家就餐问题描述:有五个哲学家,他们的生活方式是交替地进行思考和进餐。哲学家们公用一张圆桌,周围放有五把椅子,每人坐一把。在圆桌上有五个碗和五根筷子,当一个哲学家思考时,他不与其他人交谈,饥饿时便试图取用其左、右最靠近他的筷子,但他可能一根都拿不到。只有在他拿到两根筷子时,方能进餐,进餐完后,放下筷子又继续思考。互斥是指某一资源同时只允许一个进程对其进行访问,具有唯一性和排它性,但互斥不用限制进程对资源的访问顺序,即访问可以是无序的。同步是指在进程间的执行必须严格按照规定的某种先后次序来运行,即访问是有

2021-06-22 22:48:58 183

原创 ucore操作系统总结

lab1 BootLoader启动ucoreos1、系统从一上电到加载完成的执行过程2、中断机制3、函数调用堆栈过程lab2 物理内存管理1、物理内存页分配算法first-fit(接下来要关注伙伴系统实现解决内存碎片问题)2、二级页表映射的建立lab3 虚拟内存管理1、Page Fault页访问异常处理2、页面置换机制lab4 内核线程管理1、第0个和第1个内核线程的创建2、调度并执行第1个内核线程lab5 用户进程管理1、进程创建与执行2、系统调用的实现lab6 调度器1

2021-06-14 22:35:05 899 3

原创 lab8文件系统与IO子系统原理

文件描述符文件访问方式:进程访问文件数据前必须先打开文件内核跟踪进程打开的所有文件:操作系统为每个进程维护一个打开文件表,文件描述符是打开文件的标识,即 文件描述符是操作系统在打开文件表中维护的打开文件状态和信息,其中包括:访问模式:顺序访问:按字节顺序一次读取(大多数)随机访问:从中间读写(不常用,但很重要,比如虚拟内存中把内存页存储在文件)索引访问:依据数据特征索引,操作系统通常不提供文正索引访问,可以在上面建数据库,数据块建立索引内容网络/分布式文件系统a. 例如:NFS,SMB,AF

2021-06-14 20:38:05 168

原创 死锁与进程通信原理

死锁概念:多个进程由于互相等待对方持有的资源而造成的谁都无法执行的情况叫死锁。进程访问资源的流程:申请空闲资源——进程占用资源——进程释放资源死锁检测死锁检测算法:死锁恢复:进程通信信号:进程间的软件中断通知和处理机制管道:进程间基于内存文件的通信机制消息队列:由操作系统维护的以字节序列为基本单位的间接通信机制共享内存:把同一个物理内存区域同时映射到多个进程的内存地址空间的通信机制...

2021-06-14 17:17:05 120 1

原创 lab7同步互斥原理

fork()是怎么实现的多进程并发运行,导致多个进程间有资源共享,比如CPU、内存,因此存在不确定性和不可重现,可能导致多次运行结果不一致。因此操作系统需要利用同步机制在并发执行的同时,保证一些操作是原子操作。原子操作是指一次不存在任何中断或失败的操作类比事务的原子性:要么操作成功完成,要么操作没有执行,不会出现部分执行的状态。互斥是指一个进程占用了某个资源,其他进程都不能使用该资源;死锁是指多个进程各占有了一部分资源,形成了循环等待;饥饿是指其他进程轮流占用资源,一个进程一直得不到资源。进入

2021-06-14 16:00:33 136 1

原创 lab6处理机调度实现

C语言实现类,函数指针接口什么情况下会触发调度?进程切换的详细过程,内核栈等等的切换

2021-06-14 11:10:08 496

转载 lab6处理机调度原理

处理机调度概念: 进程切换就是CPU资源当前占用者的切换,通过进程切换实现CPU的时分复用。进程切换时需要保存当前进程在PCB中的执行上下文,同时恢复下一个进程的执行上下文。**而处理机调度就是要实现从进程就绪队列中挑选下一个占用CPU运行的进程;如果存在多个可用CPU,还要从中挑选就绪进程可用的CPU资源。因此其中要关注两个内容:调度策略与调度时机。**调度时机: 有进程从运行状态切换到等待状态(非抢占);有进程退出(非抢占);正在运行的进程时间片用完(抢占);进程由等待转换到就绪(抢占)

2021-06-13 21:46:44 174

原创 lab5用户进程管理实现

不同的进程有各自的页表,所以即使不同进程的用户态虚拟地址相同,但由于页表把虚拟页映射到了不同的物理页帧,所以不同进程的虚拟内存空间是被隔离开的,相互之间无法直接访问。ucore把用户进程的虚拟地址空间分了两块,一块与内核线程一样,是所有用户进程都共享的内核虚拟地址空间,映射到同样的物理内存空间中,这样在物理内存中只需放置一份内核代码,使得用户进程从用户态进入核心态时,内核代码可以统一应对不同的内核程序;另外一块是用户虚拟地址空间,虽然虚拟地址范围一样,但映射到不同且没有交集的物理内存空间中。用户进程是如

2021-06-13 20:09:28 192

原创 lab4内核线程管理实现

一、关键数据结构1、TCB(线程控制块)二、内核线程的管理内核线程是一种特殊的进程,内核线程与用户进程的区别有两个:内核线程只运行在内核态用户进程会在在用户态和内核态交替运行所有内核线程共用ucore内核内存空间,不需为每个内核线程维护单独的内存空间而用户进程需要维护各自的用户内存空间如果要让内核线程运行,我们首先要创建内核线程对应的进程控制块,还需把这些进程控制块通过链表连在一起,便于随时进行插入,删除和查找操作等进程管理事务。这个链表就是进程控制块链表。然后在通过调度器(schedul

2021-06-08 22:15:16 193

转载 lab4、lab5进程管理原理

进程控制块(Process Control Block, PCB):定义:操作系统管理控制进程运行所用的信息集合。操作系统用PCB来描述进程的基本情况以及运行变化的过程PCB是进程存在的唯一标志,每个进程都在操作系统中有一个对应的PCB内容:进程标识信息PID:进程号UID等处理机现场保存堆栈指针:记录堆栈现场指令指针:记录进程运行到哪进程控制信息调度和状态信息:进程和处理机使用情况调度进程间通信信息:进程间通信相关的各种标识存储管理信息:指向进程映像存储空间数据结构进程所

2021-06-07 22:13:13 189

原创 lab3虚拟内存管理实现

通过内存地址虚拟化,可以使得软件在没有访问某虚拟内存地址时不分配具体的物理内存,而只有在实际访问某虚拟内存地址时,操作系统再动态地分配物理内存,建立虚拟内存到物理内存的页映射关系,这种技术称为按需分页(demand paging)。把不经常访问的数据所占的内存空间临时写到硬盘上,这样可以腾出更多的空闲内存空间给经常访问的数据;当CPU访问到不经常访问的数据时,再把这些数据从硬盘读入到内存中,这种技术称为页换入换出(page swap in/out)。这种内存管理技术给了程序员更大的内存“空间”,从而可以让更

2021-06-02 22:31:03 391

转载 lab3虚拟内存管理原理

覆盖:目标:在较小的可用内存中运行较大的程序。方法:依据程序逻辑,将程序划分为若干功能相对独立的模块,不会同时执行的模块共享同一块内存区域。具体有以下几点:必要部分(常用功能)的代码和数据常驻内存;可选部分(不常用功能)放在其它程序模块中,只在需要时加载到内存;不存在调用关系的模块可以相互覆盖,共用同一块内存区域。交换:交换与覆盖讨论的尺度是不太一样的。覆盖是一个程序内,如果无法全部加载到内存,而交换是内存足够放一个程序,而无法放多个程序。目标:增加正在运行或需要运行的程序的内存。实

2021-06-02 22:11:43 218

原创 lab2物理内存管理实现

lab2代码执行流程本次实验主要完成ucore内核对物理内存的管理工作。内存管理相关的总体控制函数是pmm_init函数(kern_init调用pmm_init),它完成的主要工作包括:1、初始化物理内存页管理器框架pmm_manager;2、建立空闲的page链表,这样就可以分配以页(4KB)为单位的空闲内存了;3、检查物理内存页分配算法;4、为确保切换到分页机制后,代码能够正常执行,先建立一个临时二级页表;5、建立一一映射关系的二级页表;6、使能分页机制;7、从新设置全局段描述符表;

2021-05-30 22:34:20 522

原创 lab2 物理内存管理原理

一、连续内存分配最先匹配(First-fit):找到的第一个大于我要分配的大小的空闲块最佳匹配(Best-fit):找到那个比我大,但是又是大的最小的那个最差匹配(Worst-fit):找到那个比我大,但是又是大的最多的那个二、非连续内存分配1、段氏存储管理如下图所示:在程序P运行过程中,CPU要访问逻辑地址中的某个位置,已经知道段号与偏移。操作系统中维护段表,段表记录段号对应的基址与长度,首先MMU比对偏移量与段号对应的长度,如果偏移量大于长度说明操作不合法内存异常,否则是合法的,此时将段基

2021-05-29 22:34:22 369

原创 lab2 练习

练习1:实现first-fit连续物理内存分配算法1.first-fit算法原理(最先匹配)从前往后找,找到第一个比我要分配空间大的分区代码如下(示例):struct Page { int ref; // page frame's reference counter uint32_t flags; // array of flags that describe the status of the page

2021-05-26 22:07:17 225

原创 lab1 BootLoader启动ucoreos实现

1

2021-05-21 21:04:27 228 1

原创 lab1练习

##实验目的完成一个能够切换到x86的保护模式并显示字符的bootloader,为启动操作系统ucore做准备。lab1中包含一个bootloader和一个OS。这个bootloader可以切换到X86保护模式,能够读磁盘并加载ELF执行文件格式,并显示字符。而这lab1中的OS只是一个可以处理时钟中断和显示字符的幼儿园级别OSlab1主要分为6个练习###练习1:理解通过make生成执行文件的过程。操作系统镜像文件 ucore.img 是如何一步一步生成的?一个被系统认为是符合规范的硬盘主引

2021-05-12 22:37:44 231

原创 lab0 实验环境搭建

安装VM VirtualBox虚拟机安装ubuntu 14.04(64bit)操作系统所需工具

2021-05-07 22:35:37 203

原创 从零实现操作系统(ucore)

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片lab0——实验环境搭建生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar

2021-05-07 22:30:00 179

原创 C++中new的用法示例

大佬们将new的用法总结介绍的很透彻,但是在查看过程中很少有人写出各种用法的示例。下面浅显易懂的说一下new的各种用法(详细细节未列出,如有错误恳请批评指正):1.new operator可分解为两个大动作:(1)调用operator new:作用为分配内存(内部相当于使用malloc(n)n为想要分配元素的大小)(2)使用placement:调用构造函数*用法示例:T ptr=new T ();2.operator new主要作用为分配内存**用法示例:int v=static_cast

2021-01-13 10:27:39 882

原创 C++中虚函数的调用

C++中虚函数的调用引自侯捷老师课程:C++面向对象高级开发

2021-01-11 16:21:40 153

原创 Qt中tableview最后一行显示不完整显示不全问题

如上示意图,将mainwindow稍微拖大一点就ok

2020-11-24 09:20:33 1582

原创 Qt中关于Qfuture线程销毁问题

Qt中关于Qfuture线程销毁问题在这里我遇到一个由于子线程语句错误导致的程序中断问题,我的线程布置为:主线程中启动一个一级子线程,然后一级子线程中套用三个并行二级子线程(目前运行没有发现问题,因此我推测对于Qfuture来说,线程是可以套用的,网上实在查找不到这方面的知识),主线程需要等待一级子线程结束后再循环开启新的一级子线程,然后如此循环下去。一级子线程中出错导致主线程等待一个被销毁的线程,所以整个程序崩溃。这是我整个问题的示意图前面说了我的主线程需要等待一级子线程的结束,我第一次采取的方式

2020-11-17 10:59:35 2277 3

转载 C++Primer 第五版课后习题答案

一、本书的Part I(C++基础)是C++基础,必须进行通读掌握。这几章有非常多的小细节比较坑爹,指针与数组、指针与const、sizeof()运算符、this指针等等,看完这部分,一些最基础的程序基本上都能解决。第3、6、7章个人觉得对新手最困难,而且非常重要,需要重点理解。二、Part II(C++标准库) ,第8、9章最为重要,IO库和容器对于一个程序来说是比较基础的,记得不要在C++中还依然保持C的习惯,使用cout而不是printf()、使用vector而不是内置数组、使用迭代器进行遍历。第1

2020-11-10 10:19:27 1378

原创 C++中cout与printf的区别

C++中cout与printf的区别原理部分格式部分打印速度相关知识原理部分cout输出原理:1、使用重载:根据输出内容的类型来重载不同类型的函数,所以可以输出包括自定义类型在内的多种类型。举个例子——在cout中,相当于有很多cout的同名函数,但它们有不同类型的参数:如int float char等,当"输出内容"为char类型时,调用参数为char的cout函数2、开辟缓冲区:定义每一个流对象时,系统会在内存中开辟一段缓冲区,用来暂存数据(系统内有多个缓冲区)。当收到endl时,cout行会

2020-11-09 22:53:38 3480

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除