高并发网课的笔记(一)

CH01

  • 并发:多个线程操作相同的资源,保证线程安全,合理使用资源
  • 高并发:服务能同时处理很多请求,提高程序性能

CH02

  • CPU中有多级缓存(CPU远比主存快),可保证是时间局部性和空间局部性
  • 多级缓存的缓存一致性(MESI):四个状态
    • Modified: 被修改过的,需要在未来某个时刻重新写回主存,在这之间允许其他CPU读取
    • Exclusive: 未被修改的,与主存状态一致
    • Shared: 共享状态,可能被多个CPU进行缓存,与主存数据一致
    • Invalid: 当有CPU修改该缓存行时,进入此无效态
  • 多级缓存的乱序优化: 处理器为提高运算速度而做出违背代码原有顺序的优化
  • JMM: 每个线程都拥有数据的私有拷贝
  • JMM同步八种操作:
    1. 锁定: 作用于主内存的变量,标示为线程独占
    2. 解锁: 作用于主内存的变量
    3. 读取: 作用于主内存,从主内存输送到工作内存
    4. 载入: 作用于工作内存, 放入到变量副本中,与读取必定顺序
    5. 使用: 输送给执行引擎
    6. 赋值: 从执行引擎到工作内存
    7. 存储: 工作内存到主内存
    8. 写入: 工作内存写入主内存,与存储必定顺序

CH03

  • 并发模拟工具:
    1. Postman: Http请求模拟工具。在Collection的run中测试
    2. Apache Bench: 测试网站性能, terminal工具。用法: ab -n 1000 -c 50 http://localhost:8080/test
    3. JMeter(首选): Apache组织开发的压力测试工具
    4. 代码: Semaphore

CH04

  • 线程安全性:
    1. 原子性: 互斥访问. e.g. Atomic包
    2. 可见性: 一个线程对主内存的修改可以及时的被其他线程看到
    3. 有序性: 一个线程观察其他线程中的指令执行顺序, 由于指令重排, 该观察结果一般杂乱无序
  • Atomic里面unsafe类, 提供了 getAndAddInt() 方法, 具体实现使用了compareAndSwapLong()方法, 是Java的native方法. 整个getAndAddInt()方法的关键是不停判断从主存读回来的值和当前主存的值相同, 才写入新的值(CAS操作), 否则循环. 当CAS操作失败几率高时, 性能会下降
  • Atomic里面的LongAdder比AtomicLong高效, 思想是把64位int转成Cell数组, 降低对value更新的并发数,也就是将对单一value的变更压力分散到多个value值上,降低单个value的“热度”.
  • 锁:
    • synchronized: 以来JVM
    • Lock: 依赖特殊的CPU指令
  • synchronized:
    1. 修饰代码块: 作用于调用的对象, 实验结果是不同实例调用该方法是非同步的
    2. 修饰方法: 作用于调用的对象, 实验结果是不同实例调用该方法是非同步的
    3. 修饰静态方法: 作用于所有对象, 实验结果是不同实例调用该方法是同步的
    4. 修饰类: 括号括起来的部分, 作用于所有对象, 实验结果是不同实例调用该方法是同步的
  • synchronized是不能继承的, 子类想要有必须自己显式写明
  • 可见性:
    • 不可见的原因(结合JMM模型理解):
      1. 线程交叉执行
      2. 重排序结合线程交叉执行
      3. 共享变量更新后的值没有在工作内存与主存及时更新
    • synchronized的可见性:
      1. 线程解锁前, 必须把共享变量的最新值刷新到主内存
      2. 线程加锁时, 将清空工作内存中共享变量的值, 从而使用共享变量时需要从主内存中重新读取最新的值
      • PS: 这里说的锁是同一把锁, 因此不同类之间不会相互影响
    • volatile保证可见性
      1. 加入内存屏障和禁止重排序
      2. volatile的读写操作直接与主存相关(但还是会有工作内存, 只是修改完直接刷新)
      • PS: 更适合用来做判断标记量
  • 有序性: happens-bofore原则
    • 含义: 指定某些规则来规定某个线程修改的变量何时对其他线程可见
    • 作用: 在JMM中,如果一个操作执行的结果需要对另一个操作可见,那么这两个操作之间必须存在happens-before关系。
### 光流法C++源代码解析与应用 #### 光流法原理 光流法是种在计算机视觉领域中用于追踪视频序列中运动物体的方法。它基于亮度不变性假设,即场景中的点在时间上保持相同的灰度值,从而通过分析连续帧之间的像素变化来估计运动方向和速度。在数学上,光流场可以表示为像素位置和时间的阶导数,即Ex、Ey(空间梯度)和Et(时间梯度),它们共同构成光流方程的基础。 #### C++实现细节 在给定的C++源代码片段中,`calculate`函数负责计算光流场。该函数接收个图像缓冲区`buf`作为输入,初始化了几个关键变量:`Ex`、`Ey`和`Et`分别代表沿x轴、y轴和时间轴的像素强度变化;`gray1`和`gray2`用于存储当前帧和前帧的平均灰度值;`u`则表示计算出的光流矢量大小。 #### 图像处理流程 1. **初始化和预处理**:`memset`函数被用来清零`opticalflow`数组,它将保存计算出的光流数据。同时,`output`数组被填充为白色,这通常用于可视化结果。 2. **灰度计算**:对每像素点进行处理,计算其灰度值。这里采用的是RGB通道平均值的计算方法,将每个像素的R、G、B值相加后除以3,得到个近似灰度值。此步骤确保了计算过程的鲁棒性和效率。 3. **光流向量计算**:通过比较当前帧和前帧的灰度值,计算出每个像素点的Ex、Ey和Et值。这里值得注意的是,光流向量的大小`u`是通过`Et`除以`sqrt(Ex^2 + Ey^2)`得到的,再乘以10进行量化处理,以减少计算复杂度。 4. **结果存储与阈值处理**:计算出的光流值被存储在`opticalflow`数组中。如果`u`的绝对值超过10,则认为该点存在显著运动,因此在`output`数组中将对应位置标记为黑色,形成运动区域的可视化效果。 5. **状态更新**:通过`memcpy`函数将当前帧复制到`prevframe`中,为下次迭代做准备。 #### 扩展应用:Lukas-Kanade算法 除了上述基础的光流计算外,代码还提到了Lukas-Kanade算法的应用。这是种更级的光流计算方法,能够提供更精确的运动估计。在`ImgOpticalFlow`函数中,通过调用`cvCalcOpticalFlowLK`函数实现了这算法,该函数接受前帧和当前帧的灰度图,以及窗口大小等参数,返回像素级别的光流场信息。 在实际应用中,光流法常用于目标跟踪、运动检测、视频压缩等领域。通过深入理解和优化光流算法,可以进步提升视频分析的准确性和实时性能。 光流法及其C++实现是计算机视觉领域的个重要组成部分,通过对连续帧间像素变化的精细分析,能够有效捕捉和理解动态场景中的运动信息
微信小程序作为腾讯推出的种轻型应用形式,因其便捷性与效性,已广泛应用于日常生活中。以下为该平台的主要特性及配套资源说明: 特性方面: 操作便捷,即开即用:用户通过微信内搜索或扫描二维码即可直接使用,无需额外下载安装,减少了对手机存储空间的占用,也简化了使用流程。 多端兼容,统开发:该平台支持在多种操作系统与设备上运行,开发者无需针对不同平台进行重复适配,可在个统的环境中完成开发工作。 功能丰富,接口完善:平台提供了多样化的API接口,便于开发者实现如支付功能、用户身份验证及消息通知等多样化需求。 社交整合,传播效:小程序深度嵌入微信生态,能有效利用社交关系链,促进用户之间的互动与传播。 开发成本低,周期短:相比传统应用程序,小程序的开发投入更少,开发周期更短,有助于企业快速实现产品上线。 资源内容: “微信小程序-项目源码-原生开发框架-含效果截图示例”这资料包,提供了完整的项目源码,基于原生开发方式构建,确保了代码的稳定性与可维护性。内容涵盖项目结构、页面设计、功能模块等关键部分,配有详细说明与注释,便于使用者迅速理解掌握开发方法。此外,还附有多个实际运行效果的截图,帮助用户直观了解功能实现情况,评估其在实际应用中的表现与价值。该资源适用于前端开发人员、技术爱好者及希望拓展业务的机构,具有较的参考与使用价值。欢迎查阅,助力小程序开发实践。资源来源于络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
<think>我们正在设计个Obsidian笔记模板。Obsidian是个基于Markdown的知识管理工具,支持双向链接、图谱视图等特性,非常适合构建个人知识库。笔记需要结构化地记录程信息、知识点、重点难点等,能够方便地与其他笔记建立联系。 设计思路: 1. 模板应包含程基本信息(如程名称、讲师、日期等) 2. 记录每节的核心内容,包括知识点、公式、案例等 3. 利用Obsidian的特性,建立笔记内部的链接(如链接到相关概念)和外部链接(如链接到参考文献或资源) 4. 预留总结和复习区域,如后总结、疑问记录等 5. 支持数学公式(使用LaTeX) 以下是个基本的模板设计,使用YAML frontmatter存储元数据,然后分章节记录内容。 注意:在Obsidian中,我们可以使用模板插件(如Templater)来快速生成这样的笔记。 模板示例: ```markdown --- 程名称: 讲师: 日期: YYYY-MM-DD 时: 第X讲 程资料: [链接描述](链接地址) 相关程: [[相关笔记]] tags: #程/ --- # {{程名称}} - 时{{时}} ## 程基本信息 - **讲师**: [[讲师姓名]] <!-- 如果讲师有单独的笔记,可以链接 --> - **日期**: {{date}} - **程资料**: [程资料名称](链接地址) - **相关程**: [[相关笔记1]], [[相关笔记2]] ## 程目标 <!-- 本节的主要目标,讲师在程开始时提到的 --> 1. 目标1 2. 目标2 ## 核心知识点 <!-- 记录程中的核心知识点,每个知识点单独个标题,尝试建立链接 --> ### 知识点1 - 描述 - 公式(如果有): 例如,勾股定理:$$a^2 + b^2 = c^2$$ - 相关链接: [[其他笔记]] ### 知识点2 ... ## 重点与难点 - **重点**: - **难点**: - **突破方法**: ## 案例/练习 <!-- 记录程中提到的案例或练习 --> 1. 案例描述 2. 解决方法 ## 疑问记录 1. 疑问1? 2. 疑问2? ## 后总结 <!-- 程结束后,用自己的话总结本节内容 --> ## 行动项 - [ ] 复习知识点: [[知识点1]] - [ ] 完成后作业 - [ ] 补充相关资料 ``` 说明: 1. 使用`---`包围的YAML frontmatter用于存储元数据,便于后期检索。 2. 使用二级标题`##`来组织大节,三级标题`###`组织小节。 3. 核心知识点部分,每个知识点用三级标题,鼓励使用双向链接(`[[笔记名称]]`)链接到其他笔记,形成知识络。 4. 数学公式使用`$$...$$`表示独立公式,行内公式使用`$...$`。 5. 疑问记录和行动项帮助后续复习和跟进。 此外,为了充分利用Obsidian的特性,建议: - 为每个程创建个单独的文件夹。 - 使用标签(如`#程/`)进行分类。 - 定期复习笔记利用笔记中的疑问和行动项进行知识巩固。 相关问题: 1. 如何利用Obsidian的双向链接功能来增强笔记的效果? 2. 在Obsidian中,如何效地复习笔记? 3. 除了基础模板,Obsidian还有哪些插件适合笔记管理?</think>以下是针对Obsidian笔记模板的设计方案,结合知识管理最佳实践和Obsidian特性实现效学习: ### 、核心模板结构 ```markdown --- 程名称: 《》 授平台: 讲师: 日期: YYYY-MM-DD 时: 第X讲 程链接: []( ) 前置知识: [[相关笔记]] tags: #程/ --- # {{程名称}} - 时{{时}} ## 程目标 <!--- 本讲核心学习目标 ---> 1. 目标1 2. 目标2 ## 核心概念 <!--- 用双链构建知识络 ---> - **[[概念1]]**:定义描述(使用`![]()`嵌入件截图) > 关键特性:特性1 | 特性2 > 关联公式:$E=mc^2$(重要物理公式) - **[[概念2]]**:与[[概念1]]的关系 → ![[关系图谱.png|200]] ## 知识图谱 ```mermaid graph LR A[核心概念1] --> B(应用场景) A --> C{关联概念} C --> D[子概念1] C --> E[子概念2] ``` ## 难点解析 <!--- 记录理解障碍点 ---> 1. **[[复杂推导过程]]** - 卡点:$$ \nabla \times \mathbf{E} = -\frac{\partial \mathbf{B}}{\partial t} $$ - 突破方法:通过[[参考视频]] 03:15处动画演示理解 ## 实践案例 <!--- 记录程中的代码/实验 ---> ```python # 示例代码(Python实现) def quick_sort(arr): if len(arr) <= 1: return arr pivot = arr[0] left = [x for x in arr[1:] if x < pivot] right = [x for x in arr[1:] if x >= pivot] return quick_sort(left) + [pivot] + quick_sort(right) ``` ## 复习测试 <!--- 主动回忆区 ---> - Q:麦克斯韦方程组的物理意义? A:<!-- 折叠答案 -->^quiz1 ## 行动项 - [ ] 整理[[概念1]]的3个应用实例 - [ ] 完成后练习Page 45 - [ ] 补充[[前置知识]]笔记 ``` ### 二、关键功能设计 1. **双向链接系统** - 使用`[[ ]]`链接内部概念(如`[[分布式系统]]`) - 外部资源链接:`[Git手册](https://git-scm.com/book)` - 自动生成知识图谱(需安装[Juggl插件](https://juggl.io)) 2. **公式支持** - 行内公式:$ \delta = b^2 - 4ac $ - 独立公式: $$ \frac{\partial u}{\partial t} = \alpha \nabla^2 u $$ 3. **复习增强** - 间隔重复:配合[Spaced Repetition插件](https://github.com/st3v3nmw/obsidian-spaced-repetition) - 问题卡片:`> [!question] 什么是CAP定理?` ### 三、推荐工作流 1. **前准备** - 在YAML区填写程元数据 - 链接前置知识笔记 2. **中记录** - 核心概念区:用`![[截图.png]]`插入件重点 - 实时添加`#疑问`标签标记难点 3. **后处理** - 用Mermaid绘制知识图谱 - 将行动项同步到每日笔记 - 添加复习日期:`review: 2023-10-15` > 实践案例:计算机笔记通过链接[[TCP/IP协议]]→[[三次握手]]→[[Wireshark抓包]]形成知识链[^1] ### 四、模板优化建议 1. **插件扩展** - Dataview:自动生成程进度表 - Excalidraw:手绘示意图 - Templater:快速创建标准笔记 2. **视觉优化** ```css /* 添加obsidian.css */ .course-note { --h1-color: #3498db; --quiz-bg: #f9f9f9; } ``` 3. **移动端同步** - 通过[Obsidian Sync](https://obsidian.md/sync)实现手机实时查看 - 使用`{{DATE}}`宏自动插入日期
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值