从 0 配置 Neovim

🚀 从 0 配置 Neovim 成为 VSCode 替代开发环境(v0.9.5) ✅ 环境说明 Neovim 版本:v0.9.5(Ubuntu 默认仓库版本) 系统平台:WSL / Ubuntu 插件管理器:packer.nvim 🧱 第一步:安装 Neovim sudo apt update sudo apt install neovim -y 确认版本: nvim --version 输出应为: NVIM v0.9.5 📦 第二步:安装 git 和 node(供 LSP 和插件使用) sudo apt install git curl -y # 安装 nodejs(供 pyright 使用) curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - sudo apt install nodejs -y 📁 第三步:安装插件管理器 packer.nvim git clone --depth 1 https://github.com/wbthomason/packer.nvim \ ~/.local/share/nvim/site/pack/packer/start/packer.nvim ⚙️ 第四步:创建 Neovim 配置文件 mkdir -p ~/.config/nvim nvim ~/.config/nvim/init.lua 🧠 第五步:粘贴完整配置(适配 v0.9.5) -- 基础设置 vim.opt.number = true vim.opt.relativenumber = true vim.opt.tabstop = 4 vim.opt.shiftwidth = 4 vim.opt.expandtab = true vim.opt.termguicolors = true -- 插件加载 require('packer').startup(function(use) use 'wbthomason/packer.nvim' use 'nvim-lualine/lualine.nvim' use 'nvim-tree/nvim-tree.lua' use 'nvim-tree/nvim-web-devicons' use 'folke/tokyonight.nvim' use 'nvim-lua/plenary.nvim' use 'nvim-telescope/telescope.nvim' use { 'nvim-treesitter/nvim-treesitter', run = ':TSUpdate' } use 'neovim/nvim-lspconfig' use 'hrsh7th/nvim-cmp' use 'hrsh7th/cmp-nvim-lsp' use 'L3MON4D3/LuaSnip' use 'saadparwaiz1/cmp_luasnip' end) -- 启用主题 vim.cmd[[colorscheme tokyonight]] -- UI 插件初始化 require('lualine').setup() require('nvim-tree').setup() -- Treesitter 配置 require('nvim-treesitter.configs').setup { highlight = { enable = true } } -- LSP 配置 local lspconfig = require('lspconfig') lspconfig.pyright.setup {} lspconfig.lua_ls.setup {} -- 自动补全 local cmp = require'cmp' cmp.setup({ snippet = { expand = function(args) require('luasnip').lsp_expand(args.body) end }, mapping = cmp.mapping.preset.insert({ ['<Tab>'] = cmp.mapping.select_next_item(), ['<S-Tab>'] = cmp.mapping.select_prev_item(), ['<CR>'] = cmp.mapping.confirm({ select = true }), }), sources = { { name = 'nvim_lsp' }, { name = 'luasnip' } } }) 🧪 第六步:同步插件 重启 Neovim,然后执行: ...

June 1, 2025

二维卷积实现

二维卷积操作:原理解析 + C语言与Python手写实现 一、什么是二维卷积? 二维卷积(2D Convolution)是图像处理中最基础也最重要的操作之一,广泛应用于: 图像模糊 边缘检测 卷积神经网络(CNN)特征提取 通俗地讲: 把一个小的“滤波器”(也叫“卷积核”)放在图像上一个位置,对应区域的值和卷积核每个位置相乘后加总,结果作为输出图像的一个像素值,然后不断滑动这个核,得到整张图的新图像。 二、卷积的操作步骤(滑动 + 乘加) 假设你有: 原始图像(5×5) 卷积核(3×3) 操作过程如下: 卷积核放在图像左上角,和 3x3 区域重叠 对应位置相乘,然后求和 得到的结果就是输出图像对应位置的像素值 卷积核向右移动一格,重复以上过程 到右边边缘后,向下一行移动,从左往右继续滑动 示例计算: 图像窗口: 1 2 3 4 5 6 7 8 9 卷积核: 1 0 -1 1 0 -1 1 0 -1 计算: = 1×1 + 2×0 + 3×(-1) + 4×1 + 5×0 + 6×(-1) + 7×1 + 8×0 + 9×(-1) = 1 - 3 + 4 - 6 + 7 - 9 = -6 输出图像中对应位置的值就是 -6。 ...

May 31, 2025

LRU 页面置换算法

🚀 LRU 页面置换算法 在操作系统内存管理中,除了 FIFO,另一种更聪明且常用的页面置换策略是 —— LRU 页面置换算法 📌 一、什么是 LRU 页面置换算法? LRU(Least Recently Used,最近最少使用)页面置换算法是这样一种策略: 淘汰最近最久未被访问过的页面。 直白地说:如果一个页面很久没用了,那么它以后可能也不怎么用,所以优先把它换出去。 ✅ 特点: 需要记录页面最近的访问历史 淘汰“最久没用”的页面,而不是最早进入的 通常使用栈(Stack)、链表(List) 或 **时间戳(Timestamp)**结构实现 ❗ 二、缺页中断机制简介(同样适用 LRU) 当访问一个不在内存中的页面时: 触发缺页中断 如果内存满了,选择最近最久未使用的页面进行置换 加载新页面并恢复执行 💡 缺页次数依然是评估 LRU 表现的关键指标,通常 比 FIFO 更少的缺页次数。 🧪 三、LRU 算法示例分析 假设页面访问序列为: [7, 0, 1, 2, 0, 3, 0, 4] 帧数 3,使用 LRU 策略: 步骤 页面访问 内存状态 缺页? 1 7 7 ✅ 2 0 7 0 ✅ 3 1 7 0 1 ✅ 4 2 0 1 2(7 最久未用,被换出) ✅ 5 0 0 1 2(已存在) ❌ 6 3 1 2 3(0 最久未用,被换出) ✅ 7 0 2 3 0(1 最久未用,被换出) ✅ 8 4 3 0 4(2 最久未用,被换出) ✅ 缺页次数:6 ...

April 26, 2025

FIFO 页面置换算法

学习 FIFO 的总结 🧠 理解 FIFO 页面置换算法 在操作系统的内存管理中,页面置换算法起着至关重要的作用。当物理内存不足以容纳所有需要的页面时,系统必须选择一部分页面“换出去”,以便为新的页面腾出空间。 📌 一、什么是 FIFO 页面置换算法? FIFO(First-In, First-Out)页面置换算法是一种遵循“谁先进来谁先出去”的策略: 最早进入内存的页面,会最先被淘汰。 这就像排队买票,先排队的先服务,后来的人必须等队列的前面腾出位置。 ✅ 特点: 实现简单 使用队列(Queue) 结构模拟 不考虑页面是否常用 ❗ 二、缺页中断机制简介 当一个进程访问某个页面时: 如果该页面已经在内存中 ✅ → 正常访问 如果该页面不在内存中 ❌ → 触发 缺页中断(Page Fault) 系统将: 从磁盘中加载页面 如内存已满,使用页面置换算法(如 FIFO)决定淘汰哪个页面 更新内存状态,继续执行程序 💡 缺页中断数就是衡量页面置换算法好坏的指标之一。 🧪 三、FIFO 算法示例分析 假设页面访问序列为: [7, 0, 1, 2, 0, 3, 0, 4] 内存帧数为 3。 使用 FIFO 策略处理: 操作 内存状态 缺页? 7 7 ✅ 0 7 0 ✅ 1 7 0 1 ✅ 2 0 1 2 ✅ 0 0 1 2 ❌ 3 1 2 3 ✅ 0 2 3 0 ✅ 4 3 0 4 ✅ 缺页次数 = 6 ...

April 24, 2025

Test

这是测试文章。

April 4, 2025