- 博客(160)
- 资源 (2)
- 收藏
- 关注
原创 Go编译原理系列10(逃逸分析)
在上一篇文章中分享了编译器的优化方法之一:函数内联,本文分享编译器的另一个优化方法:逃逸分析。逃逸分析是Go语言编译过程中比较重要的一个优化阶段,它主要用于标识变量应该被分配到栈上还是堆上...
2022-08-11 11:14:40 572 1
原创 Go编译原理系列9(函数内联)
在前一篇文章中分享了编译器优化的变量捕获部分,本文分享编译器优化的另一个内容—函数内联。函数内联是指将将较小的函数内容,直接放入到调用者函数中,从而减少函数调用的开销
2022-08-05 09:45:25 969
原创 Go编译原理系列8(变量捕获)
前言在前边的几篇文章中已经基本分享完了编译器前端的一些工作,后边的几篇主要是关于编译器对抽象语法树进行分析和重构,然后完成一系列的优化,其中包括以下五个部分:变量捕获函数内联逃逸分析闭包重写遍历函数后边的五篇文章主要就是上边这五个主题,本文分享的是变量捕获,变量捕获主要是针对闭包场景的,因为闭包函数中可能引用闭包外的变量,因此变量捕获需要明确在闭包中通过值引用或地址引用的方式来捕获变量变量捕获概述下边通过一个示例来看一下什么是变量捕获package mainimport (
2022-08-04 09:45:53 382
原创 Go编译原理系列7(Go源码调试)
在前边几篇文章中分享了Go编译过程中的源码实现,本文主要是想分享一下我是怎么调试Go的源代码的(如果你很熟悉的话,可以跳过本文)。本文主要是分享两种Go源码的调试方法
2022-08-03 21:16:25 2739
原创 Go编译原理系列6(类型检查)
在前边的一篇文章中分享了抽象语法树的构建,下边的一个阶段就是类型检查,它会遍历每一个抽象语法树的结点,会按照如下步骤对不同类型的结点进行类型检查(静态类型检查)
2022-08-02 17:26:05 608
原创 Go编译原理系列4(语法分析)
在上一篇文章中,分享了Go编译器是如何将源文件解析成Token的。本文主要是分享,语法分析阶段是如何根据不同的Token来进行语法解析的
2022-01-08 12:19:34 623
原创 Go编译原理系列3(词法分析)
前言在上一篇文章中,介绍了词法分析中的核心技术,有穷自动机(DFA),以及两个常见的词法分析器的使用及工作原理。在这个基础上去看Go的词法分析源码会轻松许多本文主要包含以下内容:Go编译的入口文件,以及在编译入口文件中做了哪些事情词法分析处在Go编译的什么位置,以及详细过程是什么样的写一个测试的go源文件,对这个源文件进行词法分析,并获取到词法分析的结果源码分析Go的编译入口为了能更清楚的了解Go的编译过程是如何走到词法分析这一步的,这里先介绍Go的编译入口文件在什么地方,以及大致做了哪
2022-01-02 11:53:17 895
原创 还热乎的面经
非常普通的二本菜鸟一枚(去年毕业),也一直有个大厂梦回看2020,自己也确实比较结结实实的补了一波基础,虽然枯燥,但是过程中带来的成就感还是满满的。组内的几次分享,也让我对这些基础理解的较深刻这也让我有了底气,在参加完好未来的PHP技术技术大会之后,决定尝试去面试大厂,检测一下自己的成果吧从12.10~12.27,一共面了大概5家(包含好未来和百度),很幸运的都通过了所有技术面试,简直不敢相信(没见过世面的样子!-_-)好了,下边才是本文主题,好未来和百度的面经(脑子容量有限,大概就记住下边这些。顺
2021-01-22 16:41:25 226 2
原创 2020年终总结:回顾、反思、期待
直到开始写年终总结的时候才发现,记日报的习惯,真的太好了,哈哈哈。因为这一年的所有事情都有迹可循,但是,记的太乱,整理起来是真的痛苦我对2020的感觉就一个字:快。真的莫名其妙感觉这一年过的飞快,2020对大多数人来说都是非常难的一年吧,只想说:乌云遮不住太阳,阴霾终究将散开,唯努力不会被辜负下边开始我的叨叨叨工作因为年初疫情非常严重,所以年初的两个月左右都是在家办公。因为我在公司主要做的业务是TO B的,其实影响还是挺大的,基本上没什么新的商户接入进来,算是比较闲吧但是年初因为出现了一个事故,也
2021-01-22 11:09:09 273 3
原创 计算机网络基础(十八)---传输层-TCP的流量控制
文章内容概览TCP协议的流量控制流量控制是TCP协议特有的功能,对于UDP或者其它的一些协议,是没有流量控制流量控制,简单的来说就是,接收方希望发送方将数据发送的慢一些。一般来说,我们是希望越快越好,但是,还是需要考虑一些实际的情况。比如接收方不能那么快的去接收很大的流量,所以希望发送方的流量慢一些。这就是流量控制流量控制指让发送方发送速率不要太快流量控制是使用滑动窗口来实现的在TCP首部中有窗口这个字段,它占16个比特位,用来指明允许对方发送的数据量。在可靠传输的基本原理这篇文章中有结合
2020-08-13 10:06:41 750
原创 计算机网络基础(十七)---传输层-TCP的可靠传输
文章内容概览建议结合我的上一篇文章来看本篇内容:可靠传输的基本原理TCP协议的可靠传输TCP的可靠传输是基于连续ARQ协议的(关于ARQ协议,可以看我的上一篇文章)ARQ协议中有两个重要的概念:滑动窗口和累计确认。这两个概念在TCP的可靠传输中同样适用TCP的滑动窗口以字节为单位假设有一段的字节流需要传输,滑动窗口的大小为7,这里是为了方便理解,所以窗口设的很小,实际情况下的窗口是很大的。窗口中的7个字节表示都是可以传输的,窗口左边的是已经确认的字节序号,窗口右边的是不允许发送的字节序号。
2020-08-11 10:24:39 258
原创 计算机网络基础(十六)---传输层-可靠传输的基本原理
文章内容概览停止等待协议假设现在将计算机分为发送方和接收方,之前的文章中有说到TCP是全双工通道的协议,也就是同一时刻计算机可以当做发送方,也可以当做接收方。下边是发送方计算机和接收方计算机的时间轴,停止等待协议的工作原理如下:发送方生成TCP数据(消息1),然后将其发送出去,经过一段时间之后,到达接收方接收方在接收到之后,再发送一个确认的消息,表示发送方发送的消息,它收到了接收方将确认消息发送给发送方,一段时间后,发送方接收到确认消息。这样发送方就知道接收方接收到了它的消息发送方生成消息2
2020-08-10 08:48:38 533
原创 计算机网络基础(十五)---传输层-TCP协议详解
文章内容概览TCP协议简介TCP(Transmission Control Protocol:传输控制协议)TCP协议是计算机网络中非常复杂的一个协议TCP数据报所处的位置TCP协议的特点TCP是面向连接的协议在上一篇UDP协议详解中有对面向连接进行了介绍,也就是在通信之前会先建立连接TCP的一个连接有两端(点对点通信)A和B要进行电话通信,那么A和B就是两个端点TCP提供可靠的传输服务后边会对TCP实现可靠的传输做详细的介绍TCP协议提供全双工的通信全双工在网络概览中有提
2020-08-07 11:02:46 501 3
原创 计算机网络基础(十四)---传输层-UDP协议详解
文章内容概览UDP协议简介UDP(User Datagram Protocol:用户数据报协议)UDP相对于TCP来说,是一个非常简单的协议数据报:指的就是应用层所传输过来的一个完整的数据,UDP不会对这个完整的数据进行处理,不会进行拆分,也不会进行合并了再传输从数据报的定义可以看出,UDP协议的数据长度,主要由应用层传输的数据长度所决定的,应用层传的数据越长,UDP数据报文就越长UDP数据报的数据所处的位置UDP首部端口号:端口号在之前的文章中有提到,它标记的是使用网络的进程(
2020-08-05 07:42:04 521
原创 计算机网络基础(十二)---网络层-外部网关路由协议
文章内容概览BGP协议BGP(Border Gateway Protocol:边际网关协议)BGP协议是运行在自治系统(AS)之间的一种协议(在一个网络管理机构下边的网络,都可以看做是一个AS。比如:公司网络、学校网络)为什么在AS之间需要使用BGP协议?1、互联网的规模很大使得在AS之间路由的选择困难。如果在AS之间使用链路状态协议,每个路由器都要存储很多的链路状态的数据,并且,如果使用迪杰斯特拉算法计算最短路径,也会运行很慢。因此,需要BGP协议解决此问题2、AS内部使用不同的路由协
2020-08-04 08:38:00 764
原创 计算机网络基础(十一)---网络层-OSPF协议
文章内容概览链路状态(LS)协议链路状态协议特点特点一:向所有的路由器发送消息(一传十,十传百,最终把消息传递到整个网络中去。在前边的文章中有说到rip协议,rip协议只和相邻的路由器交换信息)特点二:这个消息描述该路由器与相邻路由器的链路状态(链路状态就包括与相邻路由器的距离、时延、带宽等,这些可以描述链路状态的一些指标,这些指标可以更加客观的描述该路由器和相邻路由器的链路状态)特点三:只有链路状态发生变化时,才发送更新消息(这个也是和RIP协议是不一样的,RIP协议是每隔30s
2020-08-03 10:08:59 518
原创 LeetCode002-两数相加-medium
题目:给出两个非空的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字0之外,这两个数都不会以0开头示例:输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 -> 8原因:342 + 465 = 807解题思路:题中说各自的位数是按照逆序的方式存储到链表中,其实这降低了难度,因为刚.
2020-07-31 09:09:06 166
原创 计算机网络基础(十)---网络层-迪杰斯特拉算法
文章内容概览迪杰斯特拉算法Dijkstra(迪杰斯特拉)算法是著名的图论算法Dijkstra算法解决有权图从一个节点到其它节点的最短路径问题特点:“以起点为中心,向外层层扩展”最短路径问题假设有下图这样的一个网络,该网络有A、B、C、D、E、F这几个节点和若干条边,每条边都有相应的距离。假设此时要求A到E的最短路径下边列出由A到E的所有可能的路径以及路径长度A->B->C->E = 13A->C->E = 11A->D->C->E
2020-07-28 12:48:53 914
原创 LeetCode001-两数之和-easy
题目:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍示例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]方法一:暴力解法思路:将数组中的所有可能的两两组合进行相加,然后和目标数字比较,如果相等,那么这两个元素所对应的下标就是我们.
2020-07-24 11:02:39 155
原创 一文吃透时间复杂度和空间复杂度
学习数据结构和算法的第一步时间复杂度最常见的时间复杂度有哪几种O(1):Constant Complexity 常数复杂度O(log n):Logarithmic ComPlexity 对数复杂度O(n):Linear ComPlexity 线性时间复杂度O(n^2):N square ComPlexity 平方O(n^3):N cubic ComPlexity 立方O(2^n):Exponential Growth 指数O(n!):Factorial 阶乘分析时间复杂度的时候是不考
2020-07-23 10:36:24 529
原创 计算机网络基础(九)---网络层-内部网关路由协议
文章内容概览内部网关路由协议之RIP协议距离矢量(DV)算法在介绍RIP协议之前,先了解一下DV算法,因为该协议是通过DV算法进行实现的该算法是运行在图中的每一个节点使用两个向量Di和SiDi描述的是当前节点到别的节点的距离Si描述的是当前节点到别的节点的下一个节点对于该算法,它是如何运行的?每一个节点和相邻的节点交换向量Di和Si的信息每一个节点根据交换的信息,更新自己的节点信息Di1表示从节点i到节点1的距离Si1表示从节点i到节点1的下一个节点n表示节点的数量
2020-07-22 15:51:26 380
原创 计算机网络基础(八)---网络层-路由概述
文章内容概览在之前的文章中有了解到跨设备传输时,需要借助路由表来知道数据报下一跳的IP在路由表中有两列重要的信息,分别是:目的IP地址和下一跳IP地址,这两个IP形成映射的关系。在前边了解数据报转发时,都是直接使用的路由表,这样就会存在几个疑问路由表中的下一跳地址是怎么来的?下一跳地址是唯一的吗?下一跳的地址是最佳的吗?路由器这么多,他们之间是怎么协调工作的?这些问题就是网络层路由需要解决的问题,其实也就是需要一个好的算法去解决这些问题。所以,了解网络层的路由就是了解里边的一些算法在前
2020-07-21 11:52:05 280
原创 计算机网络基础(七)---网络层-ICMP协议
文章内容概览ICMP协议详解网际控制报文协议(Internet Control Message Protocol)该协议主要是用于辅助IP协议进行数据传输的ICMP协议可以报告错误信息或者异常情况ICMP的报文数据是通过封装在IP数据报中进行数据传输的。ICMP的报文分为两个部分:ICMP报文首部和ICMP报文数据ICMP报文首部类型:主要指的是ICMP报文的种类(主要有两大类,后边会进行说明)代码:主要是指,不同的ICMP报文种类具体有哪些错误校验和:主要是校验报文在整个传输
2020-07-20 10:42:18 517
原创 计算机网络基础(六)---网络层-网络地址转换NAT技术
文章内容概览因为IP地址不够用了,所以才使用到了网络地址转换NAT技术IPv4最多有40+亿个IP地址(如果合理使用,一般是不会不够用的)早期IP地址的不合理规划导致IP号浪费在之前的文章中介绍到,网络的边缘部分有家庭网络,有终端设备、路由器、网关、地区ISP在实际情况下,其实很多的家庭只有一个外网的IP地址。那么,很多的内网设备是如何进行通信的?因为我们知道网络层在进行通信的时候,需要有一个唯一的IP地址,这个时候,一个家庭如果只有一个IP地址,是如何使那么多的终端设备都连接到互联网的?
2020-07-19 17:23:40 820
原创 计算机网络基础(五)---网络层-IP地址的子网划分
文章内容概览前边的文章中介绍到IP地址长度为32位,常分成4个8位IP地址常用点分十进制来表示(0255.0255.0255.0255)32位的IP地址一共可以表示42亿个IP,如果没有一个合理的分配IP的方式,整个分配是非常麻烦的。因此需要对IP地址进行一个合理的规划和分配分类的IP地址将一个IP地址分为两个部分,分别是网络号和主机号。这两部分加起来是32位。根据网络号和主机号长度的不同,又可以将IP地址分为以下几类:分为A、B、C这三类之后,就可以更好的去分配这42亿的IP地址了
2020-07-17 12:51:07 1505
原创 计算机网络基础(四)---网络层-ARP协议与RARP协议
文章内容概览还是看在上一篇文章中提到的这张图,计算机A将数据跨设备传输给C。A发出目的地为C的IP数据报,查询路由表发现下一跳为E,A将IP数据报交给数据链路层,并告知目的MAC地址是E。那么A是如何知道E的MAC地址的?这个是本文要介绍的ARP协议ARP(Address Resolution Protocol)地址解析协议作用:把网络层32位的IP转换成数据链路层48位的MAC地址,在这个过程中有一个很重要的表,ARP缓存表该表的形式如下,也是一个映射:对于ARP缓存表的使用,有两种情况
2020-07-16 13:47:11 651
原创 计算机网络基础(三)---网络层-IP协议的转发流程
文章内容概览在上一篇文章中提到,计算机A在给计算机B发送数据的时候,数据的路径,可能是通过中型网络、大型网络、中型网络、小型网络,然后到达计算机B现在把这条路径抽取出来并且将其压平,可以看到计算机A通过中间的3个网络和路由器,将数据报文传输给了B关于数据的转发过程,有一个概念叫:逐跳(hop-by-hop)。意思就是计算机A发送的报文是一跳一跳的来到计算机B的,网络1==》路由器1==》网络2==》路由器2==》网络3==》计算机B路由表简介在前边介绍数据链路层的时候,有提到过一个MAC
2020-07-15 10:44:10 1628 1
原创 计算机网络基础(二)---网络层-IP协议详解
文章内容概览虚拟互联网络从上一篇文章最后提到的一个问题来引出虚拟互联网络对这个网络拓扑,上篇文章中提出了一个非常重要的问题:计算机A如何跨设备传输数据到计算机C?其实可以把这个小的网络拓扑放大在这个大型网络拓扑中,计算机A如何将数据传输给计算机B,这个的性质和上边那个简单的网络拓扑的性质是一样的。这个网络其实有很多的路径可以把计算机A的数据传输给计算机B,比如:计算机A的数据先经过中型网络、大型网络、中型网络、小型网络,然后到达计算机B。除了上图的这条路径以外,还可以画出别的很多路径。通
2020-07-14 14:01:55 614
原创 计算机网络基础(一)---计算机网络概览篇
文章内容概览了解计算机网络及其分类什么是计算机网络计算机网络主要由一些通用的、可编程的硬件互联而成,通过这些硬件,可以传送不同类型的数据,并且可以支持广泛和日益增长的应用计算机网络不仅仅是软件的概念,它还包含硬件设备(网卡、网线、路由器)计算机网络不仅仅是信息通信,还可以支持广泛的应用计算机网络的分类1、按照网络作用的范围,可以将计算机网络分为广域网(WAN)城域网(MAN)局域网(LAN)2、按照网络作用的使用者,可以将计算机网络分为公用网络(所有愿意付费、或者愿意加
2020-07-13 16:37:14 2122
原创 计算机操作系统基础(十七)---进程同步之Unix域套接字
引言本篇为第十七篇,进程同步之Unix域套接字。上一篇介绍了通过共享内存处理进程同步的问题,本文是实现进程同步的另一个方法—Unix域套接字Unix域套接字域套接字是一种高级的进程间通信的方法Unix域套接字可以用于同一机器进程间通信套接字(socket)原是网络通信中使用的术语Unix系统提供的域套接字提供了网络套接字类似的功能在前边了解到,共享内存需要额外的同步机制,来同步多个进程间的通信。Unix域套接字就不需要额外的机制来保证多个进程间通信的问题(其实我们在部署Nginx的时候,就
2020-07-11 10:47:25 334
原创 还在划水?这个SQL你能写出来吗?
磕了一个季度的MySQL,居然被这道SQL题给搞崩了今天朋友在群里发了一个SQL题,我蒙圈了,半天没思路。我磕了整个Q2的MySQL,看各种索引优化、MVCC、锁、B+树,此时心里就只有”花里胡哨,心里没点B树?“题目:有一张表b字段包括:用户id,年,月,请查询在2020年每个月都有记录的用户id?且不讨论有没有什么场景会用到这样的一张表以及其合理性。请用SQL实现上边的问题我看到的时候,第一个想到的就是用group byselect user_id from b where year=2
2020-07-10 12:58:50 128
原创 计算机操作系统基础(十六)---进程同步之共享内存
引言本篇为第十六篇,进程同步之共享内存。前边介绍到的都是解决线程同步的方法,本文为处理进程同步的方法—共享内存共享内存线程同步每个进程可能会有一个或多个线程,线程是共享进程资源的,线程之间也需要通信,又或者说线程之间需要同步一些进程资源的状态,此时就需要线程之间的信息同步进程同步一个操作系统中可能有一个或多个进程,进程是共享计算机资源的(包括内存、磁盘等都是共享的),因此在进程之间也同样需要信息同步。在之前的文章中提到的生产者-消费者问题,以及哲学家进餐问题都是进程同步的原因在学习本篇的共享内
2020-07-09 12:34:54 2046
原创 计算机操作系统基础(十五)---使用fork系统调用创建进程
引言本文为第十五篇,使用fork系统调用创建进程。创建进程属于非常重要的内容,无论是哪种语言,底层在创建进程的时候都是使用fork函数,本文使用C语言来熟悉fork系统调用创建进程使用fork系统调用创建进程fork系统调用是用于创建进程的fork创建的进程初始化状态是和父进程一样的(进程有进程空间、内存、内存态等)系统会为fork的进程分配新的资源(包括内存资源、CPU资源等)fork系统调用无参数fork会返回两次,分别返回子进程id和0(第一次是由父进程返回的,第二次由子进程所返回的,
2020-07-08 12:43:10 2821
原创 计算机操作系统基础(十四)---线程同步之条件变量
引言本文为第十四篇,线程同步之条件变量,在上一篇文章是介绍了读写锁,读写锁在多读少写的情况下,性能要强于互斥量。本篇再介绍一种重要的处理线程同步的方法—条件变量条件变量条件变量是一种相对复杂的线程同步方法条件变量允许线程睡眠,直到满足某种条件当满足条件时,可以向该线程发送信号,通知唤醒线程对于前边所介绍的生产者-消费者模型,其实是有一定的漏洞的当缓冲区小于0时,不允许消费者消费,消费者必须等待当缓冲区满时,不允许生产者往缓冲区生产,生产者必须等待在前边的文章中并没有对这个进行约束,
2020-07-07 12:34:43 180
原创 计算机操作系统基础(十三)---线程同步之读写锁
引言本文为第十三篇,线程同步之读写锁,读写锁也是解决线程同步的方法之一,在前边的两篇文章中国已经介绍了互斥量和自旋锁两种方法。读写锁的原理也和前边两种锁类似,但是读写锁做了一些改进读写锁读写锁的改进是从以下几个点进行考量的,其中最重要的是对临界资源的考量。在复杂的开发环境中,很可能会出现对临界资源多读少写的情况。比如说一个数据库中的表,存储的主要是一些历史数据,对于这些历史数据,一般都是进行查询,很少进行修改,那么这个存储历史数据的表就属于多读少写的临界资源。对于读取的时候并不会改变临界资源的值,如果
2020-07-06 12:43:50 432
原创 计算机操作系统基础(十二)---线程同步之自旋锁
引言本文为第十二篇,线程同步之自旋锁,在上一篇文章介绍了互斥量,通过互斥量解决线程同步的问题。本文是另一个解决线程同步的方法—自旋锁自旋锁自旋锁的工作原理跟互斥量的工作原理其实是一模一样的,它也是在访问临界资源之前加一个锁,完成之后再将锁给释放掉。但是互斥量和自旋锁还是有一点区别的自旋锁也是一种多线程同步的变量使用了自旋锁的线程会反复检查锁变量是否可用,如果不可用就会循环反复的检查因此自旋锁不会让出CPU,是一种忙等待状态因此自旋锁其实就是:死循环等待锁被释放自旋锁好处自旋锁避免了进
2020-07-05 19:28:34 459
原创 计算机操作系统基础(十一)---线程同步之互斥量
引言本文为第十一篇,线程同步之互斥量,在前边的《计算机操作系统基础(四)—进程管理之进程同步》中提到了进程同步和线程同步的方法,本篇为线程同步方法之一—互斥量。建议重新回顾一下《计算机操作系统基础(四)—进程管理之进程同步》这篇文章,方便理解后边的几篇关于线程同步和进程同步的知识互斥量在进程同步的那篇文章中有介绍到生产者和消费者模型,该模型中有两个线程,分别充当生产者和消费者的角色,在并发的情况下,这两个线程很有可能同时去操作临界资源,如果同时去操作临界资源就有可能造成线程同步的问题,互斥量就是解决线
2020-07-04 13:52:51 655 1
原创 计算机操作系统基础(十)---存储管理之虚拟内存
引言本文为第十篇,存储管理之虚拟内存,在正式了解之前,有一个问题,一个游戏十几G,物理内存只有4G,那么这个游戏是怎么运行起来的呢?为了解决这个问题,就需要本篇中介绍到的虚拟内存的知识虚拟内存概述有些进程实际需要的内存很大,超过物理内存的容量多道程序设计,使得每个进程可用物理内存更加稀缺不可能无限增加物理内存,物理内存总有不够的时候这些原因就促使虚拟内存技术的产生虚拟内存是操作系统内存管理的关键技术使得多道程序运行和大程序运行成为现实把程序使用内存划分,把部分暂时不使用的内存放置在辅
2020-07-03 13:03:57 336
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人