<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[laplacebh的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/laplacebh</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; laplacebh]]></copyright><item><title><![CDATA[秋招的一些总结和感想]]></title><link>https://blog.youkuaiyun.com/laplacebh/article/details/120533092</link><guid>https://blog.youkuaiyun.com/laplacebh/article/details/120533092</guid><author>laplacebh</author><pubDate>Tue, 28 Sep 2021 22:42:34 +0800</pubDate><description><![CDATA[写在前面
目前拿了几个比较满意的意向了，秋招暂时结束了，随便写点东西总结一下。以下内容仅供参考。
关于岗位
我是只会C++和Python，所以主要投了C++后台开发岗、基础架构，还有一些游戏开发岗。
关于实习
实习挺重要的，建议7月前去实习，7月份开始准备秋招。另外实习经历好好准备一下，每次面试大概率问道。主要关于实习期间做的项目，项目的背景，自己实现的部分，遇到什么难点，还可以怎样优化，收获等等。
关于笔试
多刷leetcode，我是每日一题加周赛，保持手感。笔试大多数公司都是ACM模式，就是需要自己进行]]></description><category></category></item><item><title><![CDATA[MIT6.S081学习总结-lab10:mmap]]></title><link>https://blog.youkuaiyun.com/laplacebh/article/details/118608426</link><guid>https://blog.youkuaiyun.com/laplacebh/article/details/118608426</guid><author>laplacebh</author><pubDate>Fri, 09 Jul 2021 16:44:03 +0800</pubDate><description><![CDATA[lab10 实现mmap
介绍
mmap和munmap系统调用允许UNIX程序对它们的地址空间进行详细的控制。它们可以用于在进程之间共享内存，将文件映射到进程地址空间，以及作为用户级页面错误方案的一部分，比如在讲座中讨论的垃圾收集算法。在本实验中，您将向xv6添加mmap和munmap，重点关注内存映射文件。
void *mmap(void *addr, size_t length, int prot, int flags, 
		   int fd, off_t offset);

mmap可以通过多种方]]></description><category></category></item><item><title><![CDATA[MIT6.S081学习总结-lab9:file system]]></title><link>https://blog.youkuaiyun.com/laplacebh/article/details/118530417</link><guid>https://blog.youkuaiyun.com/laplacebh/article/details/118530417</guid><author>laplacebh</author><pubDate>Tue, 06 Jul 2021 23:45:17 +0800</pubDate><description><![CDATA[lab9 是文件系统相关，主要实现大文件的支持和软链接。
Large files
实现对大文件的支持
文件分配策略就是国内操作系统教材上讲的索引分配。原本xv6中每个文件有13个地址索引，前12个是直接地址索引，对应的数据块直接存储数据，最后一个是一级间接地址索引，对应的数据块存储地址索引，因此最大文件为256+12=268256+12=268256+12=268个数据块。
增大支持的最大文件大小，可以增加一个二级间接地址索引，变为前11个直接地址索引，第12个一级间接地址索引，最后一个是二级间接地址索引，]]></description><category></category></item><item><title><![CDATA[MIT6.S081学习总结-lab8:Lock]]></title><link>https://blog.youkuaiyun.com/laplacebh/article/details/118497015</link><guid>https://blog.youkuaiyun.com/laplacebh/article/details/118497015</guid><author>laplacebh</author><pubDate>Mon, 05 Jul 2021 19:38:59 +0800</pubDate><description><![CDATA[lab8 是关于锁的应用，重新设计内存分配和缓冲区分配，来增加多核并行速度
Memory allocator
物理内存分配，之前的实现里每次分配内存kalloc、释放内存kfree都需要获得全局锁kmem.lock,在多核系统里这会导致很激烈的race condition。改进时，可以考虑为每个CPU一个空闲内存列表，每次分配内存时先分配当前cpu空闲内存列表里的内存，如果不够就从其他空闲列表里‘steal’一个内存快。这样需要每个列表一个锁，可以大量减少锁的竞争。
实现：
kmem修改为每个CPU一个fr]]></description><category></category></item><item><title><![CDATA[MIT6.S081学习总结-lab7:Multithreading]]></title><link>https://blog.youkuaiyun.com/laplacebh/article/details/118394978</link><guid>https://blog.youkuaiyun.com/laplacebh/article/details/118394978</guid><author>laplacebh</author><pubDate>Thu, 01 Jul 2021 20:25:24 +0800</pubDate><description><![CDATA[lab7 是多线程相关，将会实现一个用户级线程，使用多线程加速程序以及实现一个barrier
Uthread:switching between threads
实现用户级线程的切换，主要修改thread_create()、thread_schedule()和thread_switch.
实现：
刚开始没怎么懂，照着kernel里的swtch写了一下，竟然过了
新增上下文数据结构：

thread_create里初始化该线程上下文信息中的ra和sp寄存器值，ra是返回地址，就是函数返回之后继续执行的点，sp]]></description><category></category></item><item><title><![CDATA[MIT6.S081学习总结-lab6:Copy-On-Write Fork]]></title><link>https://blog.youkuaiyun.com/laplacebh/article/details/118358462</link><guid>https://blog.youkuaiyun.com/laplacebh/article/details/118358462</guid><author>laplacebh</author><pubDate>Wed, 30 Jun 2021 13:09:25 +0800</pubDate><description><![CDATA[lab6 也是虚拟内存的一种应用，主要实现fork时的写时复制copy-on-write功能。
问题
xv6中的fork()系统调用将所有父进程的用户空间内存复制到子进程中。如果父进程用户空间很大，复制可能需要很长时间。更糟糕的是，这种复制工作经常被浪费;例如，子进程中的fork()后跟exec()将导致子进程丢弃复制的内存，可能根本就没有使用复制来的很大一部分内存。另一方面，如果父类和子类都使用一个页面，而其中一方或双方都编写该页面，则确实需要一个副本。
解决方法
写时拷贝(COW) fork()的目标是]]></description><category></category></item><item><title><![CDATA[MIT6.S081学习总结-lab5:lazy page allocation]]></title><link>https://blog.youkuaiyun.com/laplacebh/article/details/118311740</link><guid>https://blog.youkuaiyun.com/laplacebh/article/details/118311740</guid><author>laplacebh</author><pubDate>Mon, 28 Jun 2021 22:59:49 +0800</pubDate><description><![CDATA[lab5 是lazy page allocationi相关,主要解决页面错误问题。O/S可以对页表硬件使用的许多巧妙技巧之一是延迟分配用户空间堆内存。Xv6应用程序使用sbrk()系统调用向内核请求堆内存。在我们给出的内核中，sbrk()分配物理内存并将其映射到进程的虚拟地址空间。内核为一个较大的请求分配和映射内存可能需要很长时间。例如，考虑一个gb由262,144 4096字节的页组成;即使每一种都很便宜，这也是一笔巨大的投资。此外，一些程序分配的内存比实际使用的要多(例如，实现稀疏数组)，或者在使用之前]]></description><category></category></item><item><title><![CDATA[MIT6.S081学习总结-lab4:traps]]></title><link>https://blog.youkuaiyun.com/laplacebh/article/details/118222295</link><guid>https://blog.youkuaiyun.com/laplacebh/article/details/118222295</guid><author>laplacebh</author><pubDate>Fri, 25 Jun 2021 16:30:39 +0800</pubDate><description><![CDATA[lab4 是traps相关
Backtrace
添加一个backtrace函数，sys_sleep调用这个函数后可以打印出函数调用栈
实现：
kernel/riscv.h里添加函数来获取frame pointer：

在kernel/printf.c里添加backtrace函数：
sys_sleep里调用即可

Alarm
实现两个系统调用：int sigalarm(int ticks, void (*handler)()) 每ticks时钟单位调用handler；int sigreturn(void)在h]]></description><category></category></item><item><title><![CDATA[MIT6.S081学习总结-lab3:page tables]]></title><link>https://blog.youkuaiyun.com/laplacebh/article/details/117933464</link><guid>https://blog.youkuaiyun.com/laplacebh/article/details/117933464</guid><author>laplacebh</author><pubDate>Tue, 15 Jun 2021 23:49:37 +0800</pubDate><description><![CDATA[lab3 主要是页表相关，难度突然提高了好多，遇到了无数个坑，太难了。
打印页表
第一个进程启动时打印页表内容
实现：
kernel/vm.c里添加，递归实现即可

每个进程一张内核页表
目前xv6的实现里，每个进程只有一张独立的用户地址空间页表，共享一张内核页表，这样的话每次内核不能直接使用用户指针，只能先将其通过用户页表转为物理地址。本节及下一节要做的是使内核可以直接解引用用户指针，就是可以直接通过虚拟地址访问。
本节要做的就是为每个进程复制一个内核页表。
实现
省略了 添加函数到defs.h的步骤，这]]></description><category></category></item><item><title><![CDATA[MIT6.S081学习总结-lab2: system calls]]></title><link>https://blog.youkuaiyun.com/laplacebh/article/details/117558563</link><guid>https://blog.youkuaiyun.com/laplacebh/article/details/117558563</guid><author>laplacebh</author><pubDate>Fri, 04 Jun 2021 14:49:35 +0800</pubDate><description><![CDATA[lab2 主要实现两个系统调用
添加系统调用过程

user/user.h里添加系统调用函数,这个lab需要添加两个系统调用，下图中最后两个：trace 和 sysinfo

user/usys.pl里添加一个entry，这个文件会生成user/usys.S,就是系统调用的具体实现，之后会使用ecall指令跳转到相应的系统调用去执行。

kernel/syscall.h添加系统调用的编号

kernel/syscall.c添加系统调用的函数映射，syscalls这个数组存放了所有指向系统调用的实现函数指针
]]></description><category></category></item><item><title><![CDATA[MIT6.S081学习总结-lab1: Xv6 and Unix utilities]]></title><link>https://blog.youkuaiyun.com/laplacebh/article/details/117518581</link><guid>https://blog.youkuaiyun.com/laplacebh/article/details/117518581</guid><author>laplacebh</author><pubDate>Thu, 03 Jun 2021 14:05:39 +0800</pubDate><description><![CDATA[最近学习MIT比较有名的操作系统课程6.S081,这门课程主要亮点就是设计精巧的lab了。这里记录一下lab1:Xv6 and Unix utilities.
1.sleep
用系统调用实现sleep
#include "kernel/types.h"
#include "user/user.h"

int
main(int argc, char* argv[])
{
    if (argc &lt;= 1) {
        fprintf(2, "sleep: missing operand\n")]]></description><category></category></item><item><title><![CDATA[Linux网络编程之TCP相关]]></title><link>https://blog.youkuaiyun.com/laplacebh/article/details/117364351</link><guid>https://blog.youkuaiyun.com/laplacebh/article/details/117364351</guid><author>laplacebh</author><pubDate>Fri, 28 May 2021 16:02:44 +0800</pubDate><description><![CDATA[目录TCP连接建立服务器端客户端TCP断开连接一些细节：1.文件描述符的阻塞非阻塞问题2.三次握手发生在哪步3.关于 listen 第二个参数 backlog4.通信的一端突然断开会怎样5.shutduwn 和 close6.RST包总结参考
最近在学习一些Linux网络编程，这里整理一下TCP相关内容
TCP连接建立
建立连接需要三次握手，对应的socket编程如下(忽略了异常处理):
服务器端
#include &lt;sys/socket.h&gt;
#include &lt;arpa/inet.h&]]></description><category></category></item><item><title><![CDATA[tf2.0 ValueError:You are trying to load a weight file containing 2 layers into a model with 0 layers]]></title><link>https://blog.youkuaiyun.com/laplacebh/article/details/107088656</link><guid>https://blog.youkuaiyun.com/laplacebh/article/details/107088656</guid><author>laplacebh</author><pubDate>Thu, 02 Jul 2020 20:55:28 +0800</pubDate><description><![CDATA[tensorflow2.0版本，通过继承 tf.keras.Model 类自定义网络结构，当加载之前训练过的模型参数时报错 ValueError:You are trying to load a weight file containing 2 layers into a model with 0 layers。
网上有说改成
model.load_weights('model_name.h5',by_name=True)
试了下还是报错。
后来在github的一些demo里发现，在加载权重前将模型运行一遍]]></description><category></category></item><item><title><![CDATA[用python实现DBSCAN]]></title><link>https://blog.youkuaiyun.com/laplacebh/article/details/105489447</link><guid>https://blog.youkuaiyun.com/laplacebh/article/details/105489447</guid><author>laplacebh</author><pubDate>Mon, 13 Apr 2020 16:16:25 +0800</pubDate><description><![CDATA[DBSCAN是比较著名的基于密度的聚类方法，它可以轻松地得到各种形状的簇。
主要有两个参数，邻域半径 ϵ\epsilonϵ 以及邻域内最少数据点数 minptsminptsminpts .
python代码如下：
def dist(a, b): 
    m = a.shape[0]
    n = b.shape[0]
    res = np.zeros((m, n))
    for i i...]]></description><category></category></item><item><title><![CDATA[用python画出逻辑斯蒂映射(logistic map)中的分叉图]]></title><link>https://blog.youkuaiyun.com/laplacebh/article/details/104598545</link><guid>https://blog.youkuaiyun.com/laplacebh/article/details/104598545</guid><author>laplacebh</author><pubDate>Sun, 01 Mar 2020 20:08:08 +0800</pubDate><description><![CDATA[最近沉迷混沌数学
逻辑斯蒂映射在混沌数学中是一个很经典的例子，它可以说明混沌可以从很简单的非线性方程中产生。
逻辑斯蒂映射公式如下：

x_n表示当前人口与最大人口数量的比值，mu为参数，相当于人口增长速率。
分叉图描绘的是不同mu情况下，x收敛的值的分布图。
参考地址
python代码如下：
from tqdm import tqdm
import matplotlib.pyplot as pl...]]></description><category></category></item><item><title><![CDATA[使用MTCNN进行人脸检测]]></title><link>https://blog.youkuaiyun.com/laplacebh/article/details/104418690</link><guid>https://blog.youkuaiyun.com/laplacebh/article/details/104418690</guid><author>laplacebh</author><pubDate>Fri, 21 Feb 2020 18:04:07 +0800</pubDate><description><![CDATA[人脸检测是人脸识别中重要的一环，MTCNN是比较常用的人脸检测算法，这里主要介绍测试过程。
论文地址
主要流程：

1.做图片金字塔，即将图片resize成不同大小
2.将不同大小的图片输入PNet，得到候选框的偏移值，映射到原图得到许多候选框，做非极大值抑制（nms）去掉部分候选框
3.去原图截取候选框的图像（要截取覆盖这个候选框的最大正方形框），resize成24x24，输入RNet，得到候选...]]></description><category></category></item><item><title><![CDATA[kaggle:手写数字识别--pytorch搭建简单的cnn]]></title><link>https://blog.youkuaiyun.com/laplacebh/article/details/97648824</link><guid>https://blog.youkuaiyun.com/laplacebh/article/details/97648824</guid><author>laplacebh</author><pubDate>Mon, 29 Jul 2019 17:22:42 +0800</pubDate><description><![CDATA[题目地址
之前学svm时候就做了一下，pca+svm也有0.98左右，这次试试cnn吧。在本地跑完提交需要搭梯子，就直接在kaggle的kernel上运行了，kernel上也有很多大佬分享自己的代码，可以学到很多。
先导入一堆包进来：
import numpy as np # linear algebra
import pandas as pd # data processing, CSV fil...]]></description><category></category></item><item><title><![CDATA[使用视频下载工具 you-get 下载视频]]></title><link>https://blog.youkuaiyun.com/laplacebh/article/details/97507320</link><guid>https://blog.youkuaiyun.com/laplacebh/article/details/97507320</guid><author>laplacebh</author><pubDate>Sat, 27 Jul 2019 14:04:13 +0800</pubDate><description><![CDATA[最近需要帮我妈下载一些爱奇艺上的视频，找到了you-get这个下载神器
该工具的github主页
安装you-get
该工具是基于python的，因此需要先装python，版本需要python3.2以上。
安装成功后在cmd上输入下面命令安装you-get
pip install you-get

安装成功后按照github上文档提示，随便找个b站视频下一个看看
 you-get https://...]]></description><category></category></item><item><title><![CDATA[如何把在matlab上用libsvm训练出来的模型保存为.model]]></title><link>https://blog.youkuaiyun.com/laplacebh/article/details/89460340</link><guid>https://blog.youkuaiyun.com/laplacebh/article/details/89460340</guid><author>laplacebh</author><pubDate>Mon, 22 Apr 2019 20:39:11 +0800</pubDate><description><![CDATA[用matlab中libsvm进行svm训练后，需要将模型文件保存下来，网上找了好久终于找到一个能用的了。
主要参考：https://www.tuicool.com/articles/QvAr22
本人版本：MATLAB R2016a，libsvm3.23
该版本输出的模型结构体域有11个，因此不需要像原博客修改代码。可直接使用svm_savemodel.c，如下：
#include "../svm...]]></description><category></category></item><item><title><![CDATA[2019-PAT春季考试小结]]></title><link>https://blog.youkuaiyun.com/laplacebh/article/details/88088239</link><guid>https://blog.youkuaiyun.com/laplacebh/article/details/88088239</guid><author>laplacebh</author><pubDate>Sun, 03 Mar 2019 14:56:46 +0800</pubDate><description><![CDATA[第一次参加pat考试，大概准备了一两个月这样，主要还是参考算法笔记，然后就是狂刷模拟题，各种题型都熟悉一遍（个人感觉二叉树的建树、并查集、dfs、dijkstra比较重要一点）。
进入考场后直到1点半老师才让我们动鼠标，我先试试IDE，codeblocks不知为什么找不到编译器路径，心态有点崩，最后用了dev，建议各位把考场有的ide都熟悉一下。先把字体调成自己喜欢的加上各种头文件开始答题了。第一...]]></description><category></category></item></channel></rss>