把部署在github page上的博客从jekyll转到hexo时遇到了一点点的麻烦。

  1. hexo的deploy和我的一开始的git产生了冲突,hexo deploy后直接重写了我的远程仓库history,导致无法merge(远程仓库只有deploy的两个commit,而本地有博客的所有commit)。最后我把.git删了,用deploy部署(它会生成一个./deploy_git文件夹,然后push这个文件夹到远端),这样就只需要hexo deploy而不用我手动同步了,但git那里会显示“发布到branch”,一点小小的不足。
  2. 在repo里设置readme,需要先在_config.yml中设置skip_render: README.md,否则会转成html格式。

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start

Create a new post

1
$ hexo new "My New Post"

More info: Writing

Run server

1
$ hexo server

More info: Server

Generate static files

1
$ hexo generate

More info: Generating

Deploy to remote sites

1
$ hexo deploy

More info: Deployment

剑指offer 15——二进制中1的个数

  1. 逐位判断
  2. n=10101000,n-1=10100111;当n不为0时,执行n&(n-1),循环次数即是1的个数

剑指offer 65——不用加减乘除做加法

位运算

3.2 虚拟内存管理

3.2.1 基本概念

传统:一次性全部装入,一直驻留

局部性原理

时间局部性:当前执行的指令不久后可能再次执行

空间局部性:当前访问的数据不久后可能访问其邻近的数据

虚拟存储器

基于局部性原理,仅将少量页面存入内存

3.2.2 请求分页管理方式

页表机制

页表项结构:页号,物理块号,状态位,访问字段,修改位,外存地址

缺页中断机构

产生缺页中断

地址变换机构

从快表到页表再到外存

3.2.3 页框分配

驻留集大小

太小缺页率高

太大没意义

内存分配策略

固定分配局部置换:所有进程块数一样,自己换自己的

可变分配全局置换:

可变分配局部置换:

物理块调入算法

固定分配时有以下几种物理块分配算法

平均分配算法:

按比例分配算法:

优先权分配算法:

调入页面的时机

预调页策略

请求调页策略

从何处调入页面

如何调入页面

缺页中断

3.2.4 页面置换算法

最佳置换算法(OPT)

最长时间不被访问

先进先出置换算法(FIFO)

可能导致Belady异常(物理块增多,缺页数也增多)

最近最久未使用置换算法(LRU)

时钟置换算法

简单CLOCK

也叫最近未用算法(NRU):新增访问位,被访问时访问位设置为1。缺页时若为1则置为0,若为0则置换。

改进CLOCK

新增修改位。优先换未访问且未修改的页,其次换未访问但修改过的页。

3.2.5 抖动和工作集

抖动

抖动:频繁的页面调度行为,刚换入就要换出,刚换出就要换入。

抖动原因:进程太多,物理块太少

工作集

工作集:某段时间内,进程要访问的页面集合。

3.2.6 内存映射文件

内存映射可用于共享文件or进程通信

3.2.7 虚拟存储器性能影响因素

缺页率——页面大小,物理块数,置换算法和程序本身

页面大小

优点:内存碎片少,内存利用率高

缺点:缺页率高,页表长

优点:缺页率低,页表短

缺点:内部碎片大

物理块数

达到一定程度后增长不明显

置换算法

写回

把脏块存在一个链表上,到一定数量后一起写回磁盘,其他进程可直接从链表上读取

程序

局部化

3.2.8 地址翻译

略,从逻辑地址到物理地址的整个流程

剑指offer 7——重建二叉树

题目:给定前序遍历和中序遍历,要求重建出该树

思路:根据前序遍历可以找出当前根节点,接着可以以此在中序遍历中找出左右子树,最后在前序遍历中找到左右子树的根节点,迭代下去即可。

剑指offer 16——数值的整数次方

快速幂

剑指offer 33——二叉搜索树的后序遍历序列

题目:给出一个后序遍历,要求判断是否是二叉搜索树

思路1:

后序遍历序列顺序为左子树,右子树,根节点

先检查左子树和右子树是否分别小于和大于根节点,接着递归判断左子树和右子树。

思路2:

单调栈(没看明白)

3.1 内存管理概念

3.1.1 基本原理与要求

主要功能:

分配与回收,地址转换(逻辑地址物理地址),扩充(虚拟技术),共享,存储保护(互不干扰)

创建进程

步骤:编译,链接与载入

链接:

静态链接,载入时链接,运行时链接

载入:

绝对载入(单道程序,绝对地址),

可重定位载入(载入前程序中为相对地址,载入时一次性重写为绝对地址),

动态运行时载入(在重定位寄存器中保存基地址,真正执行时转换为绝对地址)

地址

逻辑地址:相对地址,虚拟地址

物理地址:实际地址,通过MMU转换(页表中的结构,这操作叫地址重定位)

内存映像

代码段,数据段,PCB,

堆(存动态分配的变量,向高地址增长),栈(实现函数调用,向低地址增长)

内存保护

互不干扰

  1. 上下限寄存器
  2. 重定位寄存器(基地址)和界地址寄存器:先和界地址比较,,再映射物理地址;(要进内核空间)

3.1.2 覆盖与交换

覆盖(已成为历史):部分常驻于内存,部分则可替换;当需要调用时替换掉原有的段

交换:将等待队列中的程序暂时移出内存(中级调度)

3.1.3 连续分配管理

固定分区

问题:

  1. 程序可能过大
  2. 程序过小导致内部碎片

动态分区

可能导致外部碎片——紧凑技术可处理

分配策略:

首次适应:从头开始顺序查找,第一个大小合适的空闲分区(效果最好)

邻近适应:从上次查找结束的位置开始,第一个大小合适的空闲分区

最佳适应:大小最合适的空闲分区(外部碎片多)

最差适应:从最大的分区中分一部分(无大分区)

3.1.4 基本分页存储管理

页:大小相等且固定

页,帧和块

页表项和地址结构第一部分都是页号,页表项的第二部分是块号(物理内存),地址中的第二部分是页内偏移。

用逻辑地址计算物理地址:略(一套流程,感觉他没说明白)

注意有的以字节为编址单位

?P168和P169没细看

快表TLB:有的可以同时查快表和页表

二级页表的优劣点

3.1.5 基本分段存储管理

按照自然段划分逻辑空间

段表:段号+段长

也有从逻辑地址到物理地址的一套操作,略

3.1.6 段页式管理

分页提高内存利用率,分段反映逻辑结构而且有利于段的共享和保护

先分段,段中再分页

逻辑地址:段号,页号和页内偏移量

一个进程中只有一个段表,可能有多个页表

反馈

工作量太低了,不是时间没给够,

是专注不下来,效率太低了,一天就整理了os的一节和leetcode的5道题。

纠正

得想个办法

未完

得想办法量化每天任务

剑指offer 64——求1+2+...+n

不让用+-*/,和if,switch,while,for等等。

有+=可以用

  1. 可尝试try-exception代替if
  2. 声明一个arr[1+n][n],arr的大小就是n*(n-1)
  3. 利用逻辑运算符的短路效应实现if,比如n&&func(n-1);,若n为0则会跳过func(n-1),直接执行下一个语句
  4. 用位运算实现俄罗斯农民乘法(二进制乘法)

剑指offer 68.1——二叉搜索树的最近公共祖先

1.并查集

二叉搜索树的结构可以降低时间复杂度

2.假如p和q分别在当前节点的左右儿子中,则说明当前节点就是最近公共祖先,递归or迭代都可以实现

剑指offer 68.2——二叉树的最近公共祖先

  1. 并查集,但太慢了

  2. 下面代码的思路:假如在当前节点的左右子树都没找到p或q,则返回nullptr;当左右两个子树返回的都不是nullptr时,说明当前节点是最近公共祖先

image-20230405232813379

剑指offer 55.1——二叉树的深度

深度优先遍历:递归or栈实现

广度优先遍历:队列实现

剑指offer 55.2——平衡二叉树

  1. 深度优先遍历+剪枝:若左右子树高度差大于1,则直接返回-1;若有子树返回-1,则直接返回-1。
  2. 广度优先遍历+判断深度:时间复杂度高;

课程作业:

科目 作业 ddl
电子商务安全 none
人工神经网络 none
网络协议逆向 第三章 4.12
云计算技术 none
网络安全技术 hw3(还有final exam) 4.15
计算机视觉 hw1 4.30
专业综合实践 html8 4.8
0%