自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(41)
  • 问答 (1)
  • 收藏
  • 关注

原创 操作系统笔记之内核初始化

title: 操作系统笔记之内核初始化date: 2021-08-22 17:24:57category: 操作系统tags:CPU内核态用户态OS图文地址内核的初始化内核初始化,就是我们操作系统的内核初始化。那么操作系统初始化需要初始化哪些东西?是按照什么步骤进行的?带着孜孜不倦的态度去探索了…先来个大概的印象:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wdMbrpdO-1631605844326)(操作系统笔记之内核初始化/内核初始化内.

2021-09-14 15:51:35 394

原创 操作系统笔记之CPU的认知

title: 操作系统笔记之CPU的认知category: 操作系统date: 2021-08-21 15:34:15tags:CPU寄存器处理器OS本篇主要介绍CPU的组成以及记录下其中关于寄存器的知识。以x86为例进行说明。图文地址CPU的组成我们知道现在的电脑组成一般包含CPU、内存、USB、硬盘、网卡、显卡、声卡等等,其中CPU和内存较为重要,CPU(Central Processing Unit,中央处理器)是一台电脑的核心,可以视作一个人的大脑,可以说所有设备都是围.

2021-09-14 15:49:44 896

原创 HTTP协议笔记

title: HTTP协议笔记category: 网络协议date: 2021-08-10 00:35:11tags:面试HTTPHTTPS图文地址HTTP协议概念HTTP是一种超文本传输协议,也就是Hyper Text Transfer Protocl。协议:它是一个在计算机中的协议,它使用计算机能够识别的语言确立了一种计算机之间可以交流(通信)的规范,以及相关的各种控制和错误等处理方式(行为约定、规范)。传输:从一个点到另一个点。说明HTTP是一个双向协议,并且允许传输过.

2021-08-10 01:10:35 189

原创 redis笔记

title: redis笔记category: redisdate: 2021-08-03 23:08:40tags:redis主从复制redis高可用redis集群redis数据类型redis编码redis持久化图文地址redis的主从复制当存在多台redis服务器的时候,会有一台主服务器master,以及若干台从服务器slaves。一般说,都是master进行写操作,slaves进行读操作。那么,master与slaves之间是怎么进行数据同步的呢?这就是redis主从.

2021-08-10 01:09:39 210

原创 go内存分配原理

title: go内存分配原理category: Goroutinedate: 2021-07-25 22:06:18tags:GolangHeapStackMemory图文地址堆栈与逃逸分析堆栈定义Go 有两个地方可以分配内存:一个全局堆空间用来动态分配内存,另一个是每个 goroutine都有的自身栈空间。栈栈区的内存一般由编译器自动进行分配和释放,其中存储着函数的入参以及局部变量,这些参数会随着函数的创建而创建,函数的返回而销毁。(通过 CPU push & .

2021-08-10 01:08:26 509

原创 Goroutine原理

title: Goroutine原理category: Goroutinedate: 2021-07-25 22:19:29tags:GolangGMPAlgorithm有图文地址Goroutine定义“Goroutine 是一个与其他 goroutines 并行运行在同一地址空间的 Go 函数或方法。一个运行的程序由一个或更多个 goroutine 组成。它与线程、协程、进程等不同。它是一个 goroutine” —— Rob PikeGoroutines 在同一个用户地址空.

2021-08-10 01:07:45 352

原创 go-GC原理

title: go_GC原理category: Goroutinedate: 2021-07-25 22:23:06tags:GolangGC有图文的博客地址Mark & SweepCarbage Collection现代高级编程语言管理内存的方式分为两种:自动和手动,像 C、C++ 等编程语言使用手动管理内存的方式,工程师编写代码过程中需要主动申请或者释放内存;而 PHP、Java 和 Go 等语言使用自动的内存管理系统,有内存分配器和垃圾收集器来代为分配和回收内存,其中.

2021-08-10 01:06:51 313

原创 过载保护和限流笔记

过载保护令牌桶算法是一个存放固定容量令牌的桶,按照固定速率往桶里添加令牌。令牌桶算法的描述如下:假设限制2r/s,则按照500毫秒的固定速率往桶中添加令牌。桶中最多存放 b 个令牌,当桶满时,新添加的令牌被丢弃或拒绝。当一个 n 个字节大小的数据包到达,将从桶中删除n 个令牌,接着数据包被发送到网络上。如果桶中的令牌不足 n 个,则不会删除令牌,且该数据包将被限流(要么丢弃,要么缓冲区等待)。token-bucket rate limit algorithm: /x/time/

2021-05-23 17:18:01 701

原创 工程中的隔离建议

隔离隔离,本质上是对系统或资源进行分割,从而实现当系统发生故障时能限定传播范围和影响范围,即发生故障后只有出问题的服务不可用,保证其他服务仍然可用。服务隔离动静分离、读写分离轻重隔离核心、快慢、热点物理隔离线程、进程、集群、机房服务隔离动静隔离小到 CPU 的 cacheline false sharing、数据库 mysql 表设计中避免 bufferpool 频繁过期,隔离动静表,大到架构设计中的图片、静态资源等缓存加速。本质上都体现的一样的思路,即加速/缓存访问变换

2021-05-23 17:17:25 196 2

原创 负载均衡笔记

负载均衡数据中心内部的负载均衡在理想情况下,某个服务的负载会完全均匀地分发给所有的后端任务。在任何时刻,最忙和最不忙的节点永远消耗同样数量的CPU。目标:均衡的流量分发。可靠的识别异常节点。scale-out,增加同质节点扩容。减少错误,提高可用性。发现在 backend 之间的 load 差异比较大:每个请求的处理成本不同。物理机环境的差异:服务器很难强同质性。存在共享资源争用(内存缓存、带宽、IO等)。性能因素:FullGC。JVM JIT。参考JSQ

2021-05-23 17:16:52 186

原创 项目中的超时控制笔记

超时控制超时控制,我们的组件能够快速失效(fail fast),因为我们不希望等到断开的实例直到超时。没有什么比挂起的请求和无响应的界面更令人失望。这不仅浪费资源,而且还会让用户体验变得更差。我们的服务是互相调用的,所以在这些延迟叠加前,应该特别注意防止那些超时的操作。网路传递具有不确定性。客户端和服务端不一致的超时策略导致资源浪费。“默认值”策略。高延迟服务导致 client 浪费资源等待,使用超时传递: 进程间传递 + 跨进程传递。超时控制是微服务可用性的第一道关,良好的超时策略,可以尽

2021-05-23 17:16:23 361

原创 go工程项目配置管理

Configuration环境变量(配置)Region、Zone、Cluster、Environment、Color、Discovery、AppID、Host,等之类的环境信息,都是通过在线运行时平台打入到容器或者物理机,供 kit 库读取使用。静态配置资源需要初始化的配置信息,比如 http/gRPC server、redis、mysql 等,这类资源在线变更配置的风险非常大,我通常不鼓励 on-the-fly 变更,很可能会导致业务出现不可预期的事故,变更静态配置和发布 bianry app

2021-05-23 17:14:44 285

原创 工程项目结构

Standard Go Project Layouthttps://github.com/golang-standards/project-layout/blob/master/README_zh.md如果你尝试学习 Go,或者你正在为自己建立一个 PoC 或一个玩具项目,这个项目布局是没啥必要的。从一些非常简单的事情开始(一个 main.go 文件绰绰有余)。当有更多的人参与这个项目时,你将需要更多的结构,包括需要一个 toolkit 来方便生成项目的模板,尽可能大家统一的工程目录布局。/cmd本

2021-05-23 17:13:46 379

原创 golang中包管理笔记

Go Package 管理发展史Go 依赖管理是通过 Git 仓库模式实现,并随着版本的更迭已经逐渐完善GOPATH 模式GOPATH 目录是所有工程的公共依赖包目录,所有需要编译的 go 工程的依赖包都放在 GOPATH 目录下。Vendor 特性为了解决 GOPATH 模式下,多个工程需要共享 GOPATH 目录,无法适用于各个工程对于不同版本的依赖包的使用,不便于更新某个依赖包。 go 1.6 之后开启了 vendor 目录。Go Module 包管理从 Go1.11 以后开始支持 M

2021-05-23 17:11:23 191 2

原创 函数API设计笔记

API projecthttps://github.com/googleapis/googleapishttps://github.com/envoyproxy/data-plane-apihttps://github.com/istio/api为了统一检索和规范 API,可以内部建立一个统一的 (如叫bapis) 仓库,整合所有对内对外 API。API 仓库,方便跨部门协作。统一做版本管理,基于 git 控制。规范化检查,API lint。API design review,变更 dif

2021-05-23 17:09:20 125

原创 Go语言之context包

channelschannels 是一种类型安全的消息队列,充当两个 goroutine 之间的管道,将通过它同步的进行任意资源的交换。chan 控制 goroutines 交互的能力从而创建了 Go 同步机制。当创建的 chan 没有容量时,称为无缓冲通道。反过来,使用容量创建的 chan 称为缓冲通道。要了解通过 chan 交互的 goroutine 的同步行为是什么,我们需要知道通道的类型和状态。根据我们使用的是无缓冲通道还是缓冲通道,场景会有所不同,所以让我们单独讨论每个场景。Unbuffer

2021-04-30 10:56:53 665

原创 Go语言之sync包

Share Memory By Comunication传统的线程模型(通常在编写 Java、C++ 和Python 程序时使用)程序员在线程之间通信需要使用共享内存。通常,共享数据结构由锁保护,线程都将争用这些锁来访问数据。在某些情况下,通过使用线程安全的数据结构(如 Python 的Queue),这会变得更容易。Go 的并发原语 goroutines 和 channels 为构造并发软件提供了一种优雅而独特的方法。Go 没有显式地使用锁来协调对共享数据的访问,而是鼓励使用 chan 在 gorout

2021-04-29 00:21:32 438

原创 08Go内存模型Memory module

Memory modulehttps://golang.org/ref/mem如何保证在一个 goroutine 中看到在另一个 goroutine 修改的变量的值,如果程序中修改数据时有其他 goroutine 同时读取,那么必须将读取串行化。为了串行化访问,请使用 channel 或其他同步原语,例如 sync 和 sync/atomic 来保护数据。Happen-Before在一个 goroutine 中,读和写一定是按照程序中的顺序执行的。即编译器和处理器只有在不会改变这个 goroutin

2021-04-27 21:13:52 292

原创 07并发编程Goroutine

Processes and Threads操作系统会为该应用程序创建一个进程。作为一个应用程序,它像一个为所有资源而运行的容器。这些资源包括内存地址空间、文件句柄、设备和线程。线程是操作系统调度的一种执行路径,用于在处理器执行我们在函数中编写的代码。一个进程从一个线程开始,即主线程,当该线程终止时,进程终止,这是因为主线程是应用程序的原点。然后主线程可以依次启动更多的线程,而这些线程可以启动更多的线程。无论线程属于哪个进程,操作系统都会安排线程在可用处理器上运行,每个操作操作系统都有自己的算法来作出这

2021-04-27 15:48:00 200 1

原创 06 Errors For Go1.13

Errors before For 1.13最简单的错误检查:if err != nil { // sth went wrong}有事我们需要对sentinel error进行检查:var ErrNotFound = errors.New(" not found")if err != ErrNotFound { // sth wasn‘t found}实现了error interface的自定义error struct,进行断言使用获取更丰富的上下文:type No

2021-04-24 15:33:13 118

原创 05 Go处理错误--Handing Error

Indented flow is for erroes无错误正常流程代码,将成为一条直线,而不是缩进代码:package main// 建议stylef, err := os.Open(path)if err != nil { // handle error 将错误的代码在这里提前处理掉}// do stuff 做一些事情// 不建议的stylef, err := os.Open(path)if err == nil { // do stuff}// handle err

2021-04-23 22:57:56 235 2

原创 05Golang之Error Type

Sentinel Error预定义的特定错误,我们称之为sentinel error,这个名字来源于计算机编程中使用一个特定值来表示不可能进行进一步处理的做法。所以对于Go,我们使用特定的值来表示错误。if err == ErrSomething{...}类似的io.EOF,更底层的syscall.ENOENT。使用sentinel值是最不灵活的错误处理策略,因为调用方必须使用 == 讲结果于预先声明的值进行比较。当使用者想要提供更多的是上下文时,就会出现一个问题:返回一个不同的错误讲破坏相等性检查

2021-04-21 23:34:47 496

原创 04Golang的Error vs Exception

ErrorGo error就是一个普通的接口,普通的值。http://golang.org/pkg/builtin/#errortype error interface { Error() string}我们常用一个errors.New()来返回一个error对象。http://golang.org/src/pkg/errors/errors.gotype errorString struct { s string}http://golang.org/src/pk

2021-04-21 21:56:29 216

原创 leetcode寻找峰值&寻找旋转数组中最小值

寻找峰值题目峰值元素是指其值大于左右相邻值的元素。给你一个输入数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。你可以假设 nums[-1] = nums[n] = -∞ 。Codefunc findPeakElement(nums []int) int { n := len(nums) for i:=0;i<n;i++ { if i -1 == -1 || nums[i-1] < nums

2021-04-20 23:34:11 96

原创 03gRpc & 服务发现

服务与服务之间通信的核心就是RPC框架异步通信偏消息队列gRPCgRPC用官网一句话概括“A high-performance, open-source universal RPC framework"多语言:语言中立,支持多种语言轻量级、高性能:序列化支持PB(Protocal Buffer,Protocol buffers 是一种语言中立,平台无关,可扩展的序列化数据的格式,可用于通信协议,数据存储等。),和Json,PB是一种语言无关的高性能序列化框架可插拔:支持内部各种各样的插件,如扩

2021-04-17 23:18:39 739

原创 02微服务设计

API Gateway在进行了SOA服务化架构演进后,将局势架构按照功能进行了垂直拆分,直接对外暴露一批微服务接口,但是却因为缺乏统一的出口面临一些困难:客户端到微服务直接进行通信,导致强耦合出现—导致随着时间的推移,历史的API需要保留,需要维护历史的API接口一个功能/页面需要多次请求,客户端聚合数据,工作量变得巨大、延迟变高。多服务可能由多部门进行提供,部门之间的接口规范存在差异、协议不利于统一,需要端来兼容。若每一个微服务都直接对外,意味着每一个微服务都需要考虑面向不同的移动端、web端

2021-04-17 17:36:54 132

原创 01微服务概览

微服务起源早期有一种面向服务的架构模式,也就是SOA–可以将微服务理解成轻量级SOA的一种最佳实践。从单一的“全家桶”架构,其拥有单一的数据库,需要考虑非常清晰的模块划分以及依赖等等。通过化繁为简、分而治之,将原来“全家桶”架构演进到分布式的一个微服务的模型。不同的服务存在很强的隔离性和独立部署性。特点:小即是美:小的服务代码量少,bug也会少,易于测试,也更容易不断迭代完善进而趋近完美。单一职责:一个服务也只需要做好一件事情,专注才能做得更好。----借鉴《代码整洁之道》尽可能早的

2021-04-16 00:13:52 130

原创 LeetCode接雨水和动物收容所

接雨水题目给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。COde// 接雨水func trap(height []int) int { n := len(height) if 0 == n { return 0 } leftMax := make([]int, n) leftMax[0] = height[0] for i:=1;i<n;i++ { leftM

2021-04-12 23:06:15 88

原创 LeetCode汉诺塔和排序链表

汉诺塔问题题目在经典汉诺塔问题中,有 3 根柱子及 N 个不同大小的穿孔圆盘,盘子可以滑入任意一根柱子。一开始,所有盘子自上而下按升序依次套在第一根柱子上(即每一个盘子只能放在更大的盘子上面)。移动圆盘时受到以下限制:(1) 每次只能移动一个盘子;(2) 盘子只能从柱子顶端滑出移到下一根柱子;(3) 盘子只能叠在比它大的盘子上。请编写程序,用栈将所有盘子从第一根柱子移到最后一根柱子。codefunc hanota(A []int, B []int, C []int) []int {

2021-04-06 22:56:27 161

原创 LeetCode滑动窗口最大值&队列最大值

队列的最大值题目请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。若队列为空,pop_front 和 max_value 需要返回 -1Code// 队列最大值type MaxQueue struct { doubleQue []int maxQue []int}func Constructor() MaxQueue { return MaxQue

2021-03-29 21:08:19 96

原创 leetcode计算器和每日温度

计算器题目给定一个包含正整数、加(+)、减(-)、乘()、除(/)的算数表达式(括号除外),计算其结果。表达式仅包含非负整数,+, - ,,/ 四种运算符和空格 。 整数除法仅保留整数部分。Code// 计算器// 讲字符串中空格去掉后,讲字符串中的数字存入栈中,有*/的将结果计算出来存入栈中// 之后将栈累加求和func calculate(s string) int { s = "+" + s // 第一位的符号 // 去掉字符串s中空格 for i:

2021-03-23 23:58:43 250

原创 两数相加与反转链表

文章目录题目1 两数链表相加代码1题目2 反转单向链表代码2题目1 两数链表相加给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。代码1/** * Definition for singly-linked list. * type ListNode struct { * Val int * Ne

2021-03-18 22:24:43 130

原创 Go语言之函数

前言:文本首先介绍在Go中函数的定义、调用、参数、返回值,之后将对函数的应用进行说明,最后简单介绍下内置函数函数在Go中,支持函数、匿名函数和闭包。函数的定义Go语言中,定义函数需要用到关键字func,其格式如下:func 函数名(参数列表)(返回值列表){ 函数体}函数名:由字母、下划线、数字组成,规定开头第一个字母不能是数字,同时在同一个包内函数名不能重名。参数列表:参数由参数变量 参数类型格式组成,多个参数之间用逗号,隔开。返回值列表:返回值由返回值变量 返回值类型组成,规定可

2020-08-29 17:42:51 181 1

原创 Go语言之map

前言:本文主要介绍了map的定义、判断键值存在与否、map遍历、删除键值对。map的定义Go语言中映射关系容器为map,其内部使用散列表实现map是一种无序的基于键值key-value的数据结构,其跟切片一样是引用类型,必须要经过初始化才能使用在Go中map的定义如下:map[keyType]ValueTypekeyType:表示键的类型Valuetype:表示键对应的值的类型map类型的变量的初始值为nil,需要使用make函数来分配内存,其语法如下:make(map[keyTyp

2020-08-18 22:58:14 120

原创 Go语言之切片

前言:本文主要记录了切片的定义、切片的比较、切片的拷贝、遍历,以及如何给切片追加元素。切片的定义由于数组长度固定、类型局限性大、无法追加元素等缺陷存在,在Go中引入了切片(slice)。切片的底层是数组,它是一个拥有相同类型元素的可变长度的序列,支持新元素的添加,可用于快速的操作一块数据的集合。切片是引用类型,改变切片会改变底层数组,其包含了地址、长度、容量属性。切片的基本语法如下所示:// var 关键字//name 变量名//T 数据类型var name []T//声明示例fun

2020-08-17 22:35:03 296

原创 Go语言之数组

前言本文主要记录了数组的定义、初始化、遍历以及二维数组做简单介绍。数组的定义数组是同一类的数据类型元素的集合。在Go语言中,数组在声明时大小就确定了,并且不可改变,只能修改其数组的元素。其基本语法如下:var 数组变量名 [元素数量]T//示例,其中数组的元素数量必须为常量,并且不可省略,一旦定义其大小不可改变。var array [5]int注意:在Go中,数组元素数量(也叫长度)为数组类型的一部分,也就是说长度不同的两个数组一定不是同一类型。比如[5]int与[6]int是不同的类型,

2020-08-12 22:50:58 577

原创 Go语言之流程控制

在Go语言中,总结后的流程控制语句主要有if、for、switch、goto。其中常用的为if、for。接下来讲依次记录这几种流程控制,并以代码进行说明。if流程控制if条件语句的一般格式如示例所示:/*当第一个表达式为true时,执行第一个逻辑块,否则判断第二个表达式;第二个表达式为true时执行第二个逻辑块,否则执行第三个逻辑块。*/if 表达式 { 逻辑块} else if 表达式 { 逻辑块} else { 逻辑块}注意:在Go中关于if有个硬性规定,与if匹配的{必

2020-08-11 23:49:04 97

原创 Go语言之运算符总结

在Go语言中内置的运算符有5种,分别为算术运算符、关系运算符、逻辑运算符、位运算符和赋值运算符。接下来会依次记录,并以表格形式列出来进行说明。算术运算符需要注意的是:在Go中自增++和自减--是单独的语句,并不是运算符。运算符说明+相加-相减*相乘/相除%求余关系运算符运算符说明==检查两个值是否相等,如果相等则返回True,否则返回False!=检查两个值是否不相等,如果不相等则返回True,否则返回Fal

2020-08-10 22:48:40 330

原创 Go语言之数据类型

Go语言中,除了常见的整形、浮点型、布尔类型、字符串基本数据类型之外,还包括数组、切片、结构体、函数map、通道等。基本数据类型在go中整型分为无符号整型、和有符号整型。按长度分为int8、int16、int32、int64,其对应的无符号整型为uint8、uint16、uint32、uint64。类型说明int8有符号8位整型,- 2^7 +1到2^7 - 1int16有符号16位整型,- 2^15 +1到2^15- 1int32有符号32位整型,- 2^31

2020-08-09 22:39:01 116

原创 Go语言之变量

YouSec前言标识符关键字变量变量的声明变量标准声明批量声明初始化变量短变量声明匿名变量欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入前言在了解变量之前,应该对标识符和关键字有一定的了解

2020-08-09 14:38:42 143

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除