好好学习,天天向上

问题描述 假设我们有一组观测值: \[ \underline{y_0} = \begin{bmatrix}y_{01}\\...\\y_{0i}\\...\\y_{0m}\end{bmatrix} \in \mathbb{R}^m \] 观测值之间相互独立。 我们想从中估算出一组未知参数: \[ \underline{x} = \begin{bmatrix}x_1\\...\\x_i\\...\\x_n\end{bmatrix} \in \mathbb{R}^n \quad (n \le m \text{ for redundancy}) \] 最小二乘估计(Least Squares E
阅读全文 »

数据模拟 模拟一个信号 \( S(\underline{t}_N, \overline{w})\),其中,\(\underline{t}_N \) 是一个规律性分布的点的集合,点集大小为 \(N\)。 \[\begin{equation} \underline{t}_N = \begin{bmatrix} 0\\ 1\\ ...\\ N-1 \end{bmatrix} \end{equation}\] 1 2 3 4 # sample size N = 1000 # observation epochs (we assume to sample the signal on a regula
阅读全文 »

基于 Go 1.14 应用程序的内存分为: * 堆区。程序在运行期间可以主动向堆区申请内存,这些内存由内存分配器分配并由垃圾收集器负责回收。 * 栈区。由编译器自动进行分配和释放,存储函数的入参以及局部变量。这些参数会随着函数的创建而创建,函数的返回而消亡。 Go 语言使用 goroutine 作为执行上下文,而 goroutine 的初始栈内存时 2KB,比线程小很多。 分段栈 连续栈 Go 1.3 开始使用的栈策略,不再将栈分段。 参考 * 栈内存管理 by draveness
阅读全文 »

基于 Go 1.14 概述 用户程序(Mutator)通过内存分配器(Allocator)在堆(Heap)上申请内存空间,而垃圾收集器(Collector)则负责回收不再使用的对象和内存空间。 标记清除(Mark-Sweep)算法 标记清除算法是最常见的垃圾收集算法,分为标记阶段和清除阶段。在整个垃圾收集的过程中,用户程序都是处于暂停(Stop the world, STW)状态。 三色标记法 为了解决原始的标记清除算法带来的长时间 STW 问题,三色标记法应运而生,它能缩短 STW 的时间。 增量垃圾收集和并发垃圾收集 为了减少应用程序暂停的最长时间以及垃圾收集的总暂停时间,
阅读全文 »

基于 Go 1.14 Golang 的内存分配器借鉴了 TCMalloc,在多级缓存的基础上,根据对象大小所属类别,实施不同分配策略。 内存管理 管理组件 * 内存管理单元 runtime.mspan:Go 语言内存管理的基本单元,管理多个页 * 页大小:8KB * 线程缓存 runtime.mcache:与线程上的处理器一一绑定,无需锁 * 中心缓存 runtime.mcentral:需要锁 * 页堆 runtime.mheap:一个 Go 语言程序只会存在一个全局的页堆 管理 从线程缓存到操作系统内存,遵循一种模式: * 如果在当前内存管理组件获取不到可
阅读全文 »

以下基于 Go 1.14 Go 程序中,在下面几种情况下都有可能触发调度(即调用 runtime.schedule()): * 创建一个新的线程时 * goroutine 执行结束的时候 * 主动挂起 * 协作式调度 * 基于函数调用的抢占式调度 * 基于信号的抢占式调度(Go 1.14 新特性) * 系统调用 前面已经提到过前面两种,下面看下其他几种情况的行为方式。 主动挂起 当有诸如 time.Sleep()、锁、channel 之类的操作时,就会主动挂起 goroutine。而 goroutine 的主动挂起和唤醒分别是通过 runtime.gopark() 和 runtime.g
阅读全文 »

启动调度器 Go 程序启动之后,在进入 main() 之前,会调用 runtime.schedinit() 启动调度器: 调度循环 调度器启动后,Go 运行时就会调用 runtime.mstart() 初始化一个新线程,然后调用 runtime.schedule() 进入调度循环(永不返回)。调度循环会查找一个可运行的 goroutine,然后在当前线程上执行这个 goroutine。 可运行 goroutine 的来源有: * 全局可运行队列 * 与处理器 P 绑定的本地可运行队列 * netpoll * 从其他处理器 P 的本地可运行队列中窃取 创建 goroutine 在编
阅读全文 »

以下基于 Go 1.14 Golang 中的调度是基于 GMP 模型来实现的: * G:表示 Goroutine,一个待执行的任务。 * 它对于 Go 运行时调度可以看做线程对于操作系统调度 * 在 Go 语言中使用 runtime.g 结构表示 * M:表示操作系统线程,由操作系统调度以及管理 * 调度器最多可以创建 10000 个线程,最多只会有 GOMAXPROCS 个活跃活跃线程 * 在 Go 语言中使用 runtime.m 结构表示 * P:表示处理器 * Go 程序的处理器数量一定是 GOMAXPROCS 个,在调度器启动的时候就会创建 * 在 Go 语言中使用 runtim
阅读全文 »

channel 是 go 语言实现 CSP 并发模型的一个非常重要的要素。 以下基于 Go 1.14 数据结构 runtime.hchan channel 操作 预警!!!!一大批示意图即将来临!!!!!! 创建 channel 发送数据 接收数据 关闭 channel
阅读全文 »