自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 mit 6.s081 lab10 mmap

mmap,内存映射文件,是一种在内存和磁盘之间创建映射关系的机制。它允许将一个文件的内容映射到进程的虚拟地址空间中,使得进程可以想访问内存一样访问文件,省去了繁琐的磁盘IO操作。具体来说,进程可以向操纵变量一样去访问文件,而不需要调用read和write等系统调用进行文件IO,大大提高了文件访问的效率。若将同一个文件映射到多个进程的地址空间,则可以实现进程间的共享内存通信。内核首先检查文件描述符的有效性。根据文件描述符找到相应的文件表项。检查文件表项的权限和打开方式,确保可以进行写操作。

2023-08-04 11:36:50 159

原创 mit 6.s081 lab8 实验笔记

优化的策略就是为每个CPU核心分配一个他自己的空闲内存块链表,当前CPU分配内存时会优先从自己的内存块链表中获取空闲的内存,若当前CPU没有空闲内存时,可以从其他CPU的空闲内存链表中“窃取”内存使用,当内存释放是,重新将释放的内存加入自己的链表中。自旋锁的问题是, 如果自旋锁被持有的时间过长, 其它尝试获取自旋锁的线程会一直轮训自旋锁的状态, 这将非常浪费CPU的执行时间, 这时候该线程睡眠会是一个更好的选择。总体的流程还是比较简单的,一些细节需要注意,获取锁之后要确认释放锁的时机,确保锁被释放了。

2023-07-25 10:03:05 139

原创 mit6.s081 lab7 学习笔记

将已进入屏障的线程数量增加 1,然后再判断是否已经达到总线程数」这一步并不是原子操作,并且这一步和后面的两种情况中的操作「睡眠」和「唤醒」之间也不是原子的,如果在这里发生 race-condition,则会导致出现 「lost wake-up 问题」(线程 1 即将睡眠前,线程 2 调用了唤醒,然后线程 1 才进入睡眠,导致线程 1 本该被唤醒而没被唤醒,详见 xv6 book 中的第 72 页,Sleep and wakeup)这里的优化思路,也是多线程效率的一个常见的优化思路,就是降低锁的粒度。

2023-07-09 16:15:59 142

原创 mit6.s081 lab6 实验记录

本期实验实现了操作系统的写时复制功能(COW),cow是操作系统进程内存优化的一项机制。主要用于解决以下场景带来的问题:假设父进程通过fork产生了一个子进程,子进程会复制父进程所有的内存地址,为了确保隔离,子进程会开辟新的物理内存,并将自己的页表建立映射。但往往子进程会调用exec用新的地址空间替换复制的得到的,因此子进程的页表和复制的物理内存全部会被丢弃。子进程复制父进程内存的过程中,如果父进程很大,将会产生一个很大的内存副本,占用内存资源,另外复制过程非常耗时,浪费了大量时间。

2023-06-16 17:35:03 144

原创 mit6.s081 lab5实验记录

操作系统为了减少内存的开销以及大分配的映射内存的开销,会采用一种延时分配的策略。当用户进程申请扩大堆区内存时,可以先记住分配了那些内存。当进程第一次尝试使用延迟分配中新增的页面时,CPU会生成一个页面错误,此时进入trap处理程序,内核通过为期分配物理内存、置零并在用户页表添加映射来处理该错误。当重新返回用户空间再次执行该指令时,就可以正常执行了。

2023-06-14 20:54:06 194

原创 mit6.s081 lab4实验记录

本章实验的内容是xv6系统的陷入机制,主要讲了用户态到内核态的陷入过程。当trap发生时,需要将用户进程的“现场”保存到内核中,内核使用pcb中的trapframe模块来保存所有与进程有关的寄存器。并在返回进程时,从trapframe恢复所有的寄存器。以系统调用为例,下面简单分析一下trap的全部流程:用户进程请求系统调用由于对系统调用函数已经设置了入口entry,所以会将系统调用的编号存入CPU的a7寄存器,同时将相关参数保存在a0-a8寄存中。

2023-06-13 16:34:41 257

原创 mit6.s081 lab3实验记录

探索页表,完成简化内核读写用户数据的方法。参考实现(强烈建议大家先自己动手做,把相关的代码好好地阅读一下,要有自己的理解,搞懂内核、用户进程、页表的实现原理和作用时刻,最后实在搞不出来可以参考一下,但是至少要确保思路要是一致的):lab3教程定义一个vmprint函数,他有一个参数pagetable,实现按照层级打印页表。在xv6系统中,采用3级页式内存关系,页表level分为2、1、0.内核程序拥有自己的内核页表,内核的虚拟地址空间分布如下:在本系统中,内核的虚拟地址到物理地址是恒等映射,但是这

2023-06-08 19:49:17 306

原创 git clone下来的项目修改后push到自己的仓库

有时候从别人的远程仓库clone了一个项目,想修改后push到自己的远程仓库中。

2023-06-05 10:50:17 832

原创 mit6.s081 lab2实验记录

这一个实验主要考察的是对进程内存地址空间分布、内核态和用户态之间的区别和联系、以及系统调用的实现原理。进程的虚拟内存地址空间分为用户态和内核态,用户态分为bss数据区、data区、代码区、堆、栈,保存着程序的二进制代码、数据、堆栈等。内核态包含了内核代码、数据和内核堆栈,用于执行内核的功能和服务。内核空间和用户空间是相互隔离的,用户进程无法直接访问内核空间的代码和数据,可以通过系统调用向内核请求服务。

2023-06-01 15:13:25 266

原创 mit6.s081 lab1实验记录

具体可以了解一下find . b | args grep 123 和 find . b | grep 123 的区别,前者会将找到的文件作为grep的命令行参数一起执行,这样grep会返回文件内部含有123的行;另一个用于子进程写入,父进程读取。这里需要用fork和exec实现,exec会执行新的程序,替换当前进程的资源和上下文内容,但会保留文件描述符,exec(程序路径, 程序执行的参数);用到了素数筛的思想,每个进程保留当前数组最小的,并去除他所有的倍数,接着进入下一个进程。

2023-05-30 14:54:40 107

原创 Ubuntu 安装 OpenCV

Ubuntu安装opencvUbuntu 安装 OpenCV(亲测有效)1.安装准备:1.1安装cmakesudo apt-get install cmake11.2依赖环境sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg-dev libswscale-dev libtiff5-devsudo apt-get install libgtk2.0-devsudo

2022-04-13 20:21:09 657

原创 银河麒麟/Ubuntu安装cuda和显卡驱动、cuDNN

银河麒麟/Ubuntu安装cuda和显卡驱动银河麒麟介绍第一步:更换apt软件源(换过的忽略)安装前的准备确认安装环境安装cuda以及显卡驱动安装CUDNN退出tty模式,完成安装银河麒麟介绍银河麒麟系统是一个国产操作系统,是基于Ubuntu进行深度优化的,除了操作界面与Ubuntu不同外,文件系统和命令与Ubuntu基本一致。所以此教程也适用于Ubuntu系统。第一步:更换apt软件源(换过的忽略)由于Ubuntu系统的软件源在国外,所以需要更换国内的镜像源。通常可以通过以下两种方法进行换源方法

2022-04-13 20:00:54 11975 1

原创 win10+VS2019安装openCV3.4.x和opencv_contrib附加模块

1.下载opencvopencv下载链接:选择你想要的版本(点我)2.下载opencv_contrib下载链接:要与opencv的版本相同,找到相同的版本(点我进入)3.下载cmake直接官网下载即可4.安装过程将下载好的opencv和opencv_contrib解压打开cmake(你的安装路径,例如F:\cmake-3.21.2-windows-x86_64\bin),双击cmake-gui.exe打开Where is the source code是opencv源码路径,即“

2021-09-17 11:12:57 715

原创 C/C++多线程并行编程

需要引入thread库创建线程:thread thr = thread(fun_name, argvs());//参数列表当线程被创建以后,就会自动开始执行线程函数fun_name,函数的参数中如果有引用,需要用ref()函数,不能用&符号创建线程数组:thread* th = new thread[thr_num]; //新建一个线程数组for(int i=0;i<thr_num;i++){ //对每个线程进行初始化 th[i] = thread(函数名称, 参数列表);

2021-06-01 11:05:03 2373

原创 GPU学习笔记

GPU(图形处理器),一般指计算机的显卡,可以代替CPU完成大量复杂的矩阵(图像)运算,从而让CPU专注与逻辑运算,提高计算机的整体效率,提升图像的处理能力。与CPU相比,GPU具有更多的ALU(算术逻辑单元),能够进行大量的并行运算。CUDA C 是英伟达公司推出的能够在该公司显卡上进行编程的语言,与C语言有很大的类似之处,并且能够兼容C语言。在这里需要区分两个概念分别是host(CPU & memory)和device(GPU & memory)。在使用CUDA..

2021-01-12 22:16:16 402

原创 牛客-音乐研究,锦标赛

音乐研究链接:https://ac.nowcoder.com/acm/problem/13222来源:牛客网题目描述美团外卖的品牌代言人袋鼠先生最近正在进行音乐研究。他有两段音频,每段音频是一个表示音高的序列。现在袋鼠先生想要在第二段音频中找出与第一段音频最相近的部分。具体地说,就是在第二段音频中找到一个长度和第一段音频相等且是连续的子序列,使得它们的 difference 最小。两段等长音频的 difference 定义为:difference = SUM(a[i] - b[i])2 (1 ≤

2020-05-09 22:56:54 360

原创 谁要的数据结构作业

描述:举神和ww经常在一起玩关于石子的游戏,今天他们又发明了一种新的玩法,每次他们两个可以把两堆石子合并得到一堆更重的石子,但需要消耗与这两堆石子相同重量的体力。比如:举神和ww把重量为3和5的石子堆合并,可以得到一个重量为8的石子堆,但同时需要消耗3+5的体力值。现在他两想把n堆石子合并到只剩下一堆,但他们又不想消耗太多体力,你能帮他们求出消耗的最少体力吗? 数据范围:n<=20000Input第一行为一个整数n,表示开始时石子的总堆数接下来n行,每行一个整数ai代表开始时每堆石子的重量

2020-05-08 21:59:34 179

原创 基础题-修井

标题问题描述:输入一个长度为n(1 <= n <= 1000)的数组a,元素为a1…an,之后进行m次询问,每次询问给出两个值(l,r)(r >= l),求数组:al + al+1 + … ar的值。标题Input第一行2个数,n和m,中间用空格分隔(1 <= n, m <= 1000)。 之后n+m行, 第 1 至 n 行:每行一个数字ai(0 <...

2020-05-08 10:03:03 367

原创 n个数的最小公倍数

描述:标题:6是最小的,1到3所有数的倍数。(6 = 1 * 6 = 2 * 3 = 3 * 2)2520是最小的,1到10的所有数字的倍数。输入n,输出最小的正整数,他是1到n所有数的倍数。Input输入第一行组数T, 接下来T行,每行一个整数n。 (1 <= T <= 20) (1 <= N <= 20)Output对于每组数据,输出一个数,表示1到n的最小...

2020-05-07 22:18:24 304

原创 Fibonacci数列

Fibonacci数列的每一项是之前两项的和。Fibonacci数列以1和2开始,前10项是1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...输入一个n,求所有小于等于n,且为偶数的Fibonacci数之和。Input输入第一行组数T, 接下来T行,每行一个整数n。 (1 <= T <= 23) (1 <= N <= 4000000)...

2020-05-07 21:42:58 416

原创 最短区间

最短区间现在给定一个整数s以及一个长度为n的整数数列a00,a11,a22,a33....an−1n−1 (全为正数),请你求出总和不小于s的连续子序列的长度的最小值。如果解不存在,则输出0。Input第一行:两个整数,表示 s 与 n,其中1≤s≤10^9,1≤n≤500000; 第二行:n个用空格隔开的整数,表示 a00a11... an−1n−1,其中对于任意aii有1...

2020-05-07 21:08:10 224

空空如也

空空如也

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

TA关注的人

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