- 博客(98)
- 收藏
- 关注
原创 Golang深入理解GPM模型
1.goroutine简介多进程、多线程已经提高了系统的并发能力,在高并发场景下,如果一个线程阻塞cpu,那就需要切换其他线程中去执行,为每个任务都创建一个线程成本比较高,因此又衍生出协程。我们知道一个线程分为“内核态“线程和”用户态“线程,goroutine是Go语言实现的用户态线程, 协程跟线程是有区别的,线程由CPU调度是抢占式的,协程由用户态调度是协作式的,一个协程让出CPU后,才执行下一个协程。思考为什么协程和线程是M:N映射关系?M个协程可以在用户态线程即完成切换,不会陷入到内核态
2021-06-19 18:12:04
3832
2
原创 设计模式——状态模式
1.什么是状态模式 状态模式主要解决当一个问题存在很多状态,并且处理操作会随着状态变化而变化,这是就可以使用状态模式,常见的使用状态模式的地方,比如将大量if else 抽象成一个个状态,然后使用状态模式解决。2.状态模式讲解state是状态类,是一个interface,用来承接随着状态变化的子类, 并定义一个与状态相关的处理操作函数 concreteState是状态子类...
2019-08-06 22:34:25
326
原创 python GC RAII GIL
RAII python内存管理 __del__ GILRAIIRAII 是一个资源管理工具,约束在代码执行走出特定作用域之后,不管是正常流程,还是异常流程,都不会漏掉资源的释放,可以极大简化代码编写(不用每个分支都增加资源释放逻辑)和资源管理。多数情况下,都应该尽早释放资源,而不应该依赖垃圾收集不可控的生命周期,比如文件描述符、数据库连接。RAII可以严格绑定资源的有效期与变量的生命周...
2018-10-20 19:27:26
556
原创 VUE学习
学习vue之前最好先对javaScript、html、css有一定的了解,vue是将这三者完美结合的一种框架,例如一个前端功能如导航栏,在很多页面都可能用到,但每个导航栏的信息不一样,也就是说这个导航栏的html和css一样,但js动态渲染的数据不一样,我们可以使用vue将这三者组合起来称为一个组件,在其他页面要用导航栏的时候调用和这个组件,将展示的数据用vue的方法传入这...
2018-10-20 19:24:14
473
原创 MySQL server has gone away解决方法
一、(2006,'MySQL server has gone away') 错误原因 从字面理解,就是你连接的MySQL已经走人了,不在了。相当于你和另外一个人打电话,你一直没有挂电话,但是你把电话放一边了,直到你重新拎起电话想说点啥,才听到里面『嘟,嘟,嘟,嘟...』的挂机声,于是你就知道电话另一头的人已经gone away了。线上碰到这个问题时,通常就是抛一...
2018-10-20 19:19:00
47974
原创 nginx学习
1、nginx做反向代理 反向代理反向代理(Reverse Proxy)方式是指用代理服务器来接受 internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给 internet 上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。既然有反向代理,自然也有正向代理。简单来说,正向代理就像一个跳板,例如一个用户访问不了某网站(例如 www....
2018-10-20 19:07:29
505
原创 pydruid学习
Pydruid支持三种方式的聚合类(Aggregation)查询时间序列查询 TopN查询GroupBy 这里介绍groupby使用方式: DRUID_BROKER_URL = 'http://{ip}:{port}'.format(ip=`druid服务ip`, port=`端口号`)DRUID_DATA_SOURCE = `表名`QUERY_TIMEOU...
2018-07-30 13:18:13
3130
原创 爬虫主要流程
爬虫主要流程调度器主调度程序主要是管理上图中其余几个模块的,然后循环的执行这几个模块进行爬取信息,直到条件达到(爬取够一定数量)跳出循环。URL管理器每爬取一个网页的有用信息后,并把有用的URL爬取下来放入URL管理器中,等下次循环的爬取可以直接从这个管理器中获取URL网页下载器这里用到下载网页的库是urllib2,通过库把url指定的网页的html源代码下载下来,存入urllib2对象以下是几种...
2018-02-13 00:19:32
8990
原创 ARP协议总结
IP地址作用在网络层及上层使用,是一种逻辑地址MAC地址作用在链路层和物理层,网络传输时的下一跳地址,是硬件地址,固定在网卡上。ARP的作用在同一个局域网内,已知一个主机或路由的IP地址,需要根据这个IP地址找出其对应的MAC地址。 解析出下一跳MAC地址后封住成帧,向下层交付,传输给下一跳节点,格式如下:
2017-12-28 21:42:14
2610
3
原创 文件权限
文件权限chmod格式chmod u+w file使用+ 、 - 、= 分别给用户进行增加、减去、赋予相应的权限用户符号u:拥有者g:拥有者组o:其他用户a:所以用户chown修改文件拥有者 格式: chown user namechgrp修改文件所属组 -R 递归修改目录以下的
2017-12-21 19:32:49
582
原创 空间配置器
空间配置器1.存在外碎片问题。(解释外碎片?)2.连续的向系统向系统申请小块内存是效率低。 (进程向操作系统申请内存的过程?) 代码实现:github一级空间配置器其实就是简单对malloc,realloc和free的封装,封装后对内存申请失败的情况做了相应的处理。申请内存allocate封装了malloc申请内存,然后若内存申请失败
2017-12-21 19:25:56
378
原创 迭代器萃取和反向迭代器
迭代器是什么迭代器是一种行为类似指针的对象,通过重载一些操作指针的如++,--,*,->,可以不知道容器的结构来访问容器。为什么每一种容器都提供有专属的迭代器要设计出一个容器的迭代器就必须对这个容器实现的细节非常的了解,既然无法避免曝光容器的细节,那么就把这个工作交给这个容器的设计者,这样一来,容器的所有细节得到了封装,不被使用者看到。第一为了保持数据结构的
2017-12-21 19:21:33
1506
原创 【STL】map与set的使用方法
使用set set 是通过封装红黑树实现的key模型的搜索树,只有一个key值;除了搜索还可以快速的去重和排序; set的key值不能被迭代器修改,但08版编译器有bug定义set对象std::settemplate < class T, // set::key_type/value_type class Compar
2017-11-29 13:22:11
593
原创 快速排序&冒泡排序
【图文】1.冒泡排序2.快速排序(1)左右指针法(2)挖坑法(3)前后指针法3快速排序优化(1)小区间优化(2)三数取中法
2017-11-29 13:14:11
906
2
原创 【经典算法】-算术表达式求值
算术表达式求值中缀表达式我们平时写的计算式的式子一般是这样子格式:"操作数1 操作符 操作数2" 12 * (3 + 4) - 6 + 8 / 2; // 中缀表达式中缀表达式如果要先计算操作符优先级低的两个数,比如上面要优先计算3+4,这里就必须带括号,指明计算的优先级,负责就会按照操作符默认的优先级来计算。后缀表达式(逆波兰表达式)上
2017-09-28 18:20:37
29375
5
原创 迷宫问题
本文解决一下三个问题:1.那么怎样用程序来寻找迷宫的出口呢?2.如果有多个出口,如何寻找一条最短通路?3.如果迷宫里面存在环路,那么又如何寻找最短通路?
2017-09-27 17:50:10
886
原创 【STL】list容器使用与模拟
STL里的list容器里实现了许多接口,list也是我们最常用的容器之一,所以有必要熟练的运用这些接口1.定义链表的几种方式 std::list first; // 构造一个空链表 std::list second (4,100); // 构造一个有四个整形结点的链表 std:
2017-09-25 17:10:43
416
原创 动态库与静态库
动态库与静态库动态库特点总结:动态库把对一些库函数的链接载入推迟到程序运行的时期。可以实现进程之间的资源共享。(因此动态库也称为共享库)将一些程序升级变得简单。 -甚至可以真正做到链接载入完全由程序员在程序代码中控制(显示调用)。Window与Linux执行文件格式不同,在创建动态库的时候有一些差异。在Windows系统下的执行文件格式是PE格式,动态库需要一个DllMain函数做出初始化的入口,通常在导出函数的声明时需要有_declspec(dllexport)关键字。Linux下gcc编译
2017-09-21 00:05:53
756
原创 【C++】多态总结
多态是如何实现绑定的?多态绑定分两种情况,一种是静态绑定即编译时多态,一种是动态绑定即运行时多态所以说,为什么调用普通函数比调用虚函数的效率高?多继承的虚函数对象模型为什么要把基类的析构函数定义为虚函数?抽象类的应用
2017-09-17 14:28:01
735
原创 【C++】模板总结
模板模板是一种泛型编程的机制,也是一种复用的手段。//模板函数的格式:template1,... ,class 形参n>返回值 fun(参数列表){...}//模板类的格式:template1,... ,class 形参n>class A{...};如何实例化编译器调用模板函数时,编译器会根据实参的类型,推演出模板的类型,并再生产相应的代码。
2017-09-17 10:21:44
764
原创 浅析TCP通信原理
TCP通信TCP是面向连接的通信,所以在通信之前,客户端与服务器端必须通过三次握手建立连接,然后在通信完毕,还要通过四次挥手断开连接。(一)相关函数1.创建套接字domain:地址类型,ipv4、ipv6、unix的地址类型分别定义为常数AF_INET、AF_INET6、AF_UNIX.type:socket传输类型,tcp通信是面向字节流的,所以为SOCK_STR
2017-09-10 20:08:37
13518
原创 C++异常总结
C++异常为什么要用c++的异常处理机制? 在我们平时写C语言程序时,经常出现会出现一些错误,有些是我们可以预测到的,这些我们可以通过返回错误码,或者设置回调函数打印错误信息等方法处理。但还有些程错误是我们不好预测的,如断错误,这时产生错误我们没有处理就会终止程序,然而我们经常运行程序后遇到错误不希望终止,如我们进程使用一些垃圾软件会闪退,这就是因为他门的程序异常没有处理好,所以遇到预测范围外
2017-09-10 19:50:57
6956
原创 Liunx下git的安装与上传代码的详细步骤
1.用截图的方式把安装和使用git的方法讲解给大家2.解决github push错误The requested URL returned error: 403 Forbidden while accessing3.git常用命令
2017-09-04 21:17:03
1748
1
原创 剑指:由前序遍历和中序遍历重建二叉树
题目:由前序遍历和中序遍历重建二叉树(前序序列:1 2 3 4 5 6 - 中序序列:3 2 4 1 6 5) 思想:代码如下: Node* Rebuild(T prev[], T in[],int l, int r) //l为数组的开始开始位置的下标,r为数组最尾部数字的下标 { if (_root != NULL) { Destroy(_root);
2017-07-28 23:22:13
701
3
原创 CRC的基本原理详解
CRC(Cyclic Redundancy Check)被广泛用于数据通信过程中的差错检测,具有很强的检错能力。本文详细介绍了CRC的基本原理,并且按照解释通行的查表算法的由来的思路介绍了各种具体的实现方法。1.差错检测数据通信中,接收端需要检测在传输过程中是否发生差错,常用的技术有奇偶校验(ParityCheck),校验和(Checksum)和
2017-06-22 14:20:09
32485
5
原创 Liunx进程间通信—管道
管道管道,顾名思义你可以把它想成一根数据线,连接了两个进程,使他们可以互相通信。更严谨来说,它是一个文件或者一块共享区,一个进程往里面写数据,另一个进程从里面拿数据,以此种方式完成进程间通信。 管道是UNIX系统IPC最古老的形式,所有的UNIX系统都提供此种通信机制(UNIX系统IPC是各种进程通信方式的统称)。 管道在进行通信时,基于字节流。管道是单向的、先进先出的。它将一
2017-06-21 00:36:15
461
原创 Liunx进程间IPC通信—消息队列
1、什么是消息队列 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法。每个数据块都被认为是有一个类型,接收者进程接收的数据块可以有不同的类型值。我们可以通过发送消息来避免命名管道的同步和阻塞问题。 消息队列与管道不同的是,消息队列是基于消息的,而管道是基于字节流的,且消息队列的读取不一定是先入先出。消息队列与命名管道有一样的不足,就是每个消息的最大长度是有上限的(MSG
2017-06-18 13:09:05
412
原创 线程安全与可重入函数
一,什么是线程安全? 当对一个复杂对象进行某种操作时,从操作开始到操作结束,被操作的对象往往会经历若干非法的中间状态。调用一个函数(假设该函数是正确的)操作某对象常常会使该对象暂时陷入不可用的状态(通常称为不稳定状态),等到操作完全结束,该对象才会重新回到完全可用的状态。如果其他线程企图访问一个处于不可用状态的对象,该对象将不能正确响应从而产生无法预料的结果,如何避免这种情况发生是线
2017-06-11 14:01:02
1227
3
原创 Liunx之信号捕捉与模拟sleep函数
信号在未决并且未阻塞状态下被递达的方式有三种:(1)忽略(2)执行默认动作(3)执行用户自定义动作前两个方式的递达都是由内核完成;而第三种处理的动作是用户自定义函数,在信号递达时就调用这个函数,这就称为捕捉信号下面我们用看图来分析捕捉信号的过程:首先我们要知道信号处理的时机是内核态切回到用户态时。1.首先用户主函数里注册了某信号的自定义函数,处理信号的自
2017-06-11 12:03:52
568
原创 Liunx线程(一)
1.线程是系统调用的基本单位,而进程是承担分配资源的基本单位。2.线程属于进程的一个执行分支,则进程可以认为是只有一个执行分支的线程,所以Liunx下进程叫做轻量级进程。3.由于同属一个进程的线程之间的代码和数据段是共享的,则线程之间通信是很容易的。4.由于线程是在一个进程内部运行的,所以线程的pid和组id是相同的,但是线程的id是不同的。5.一般创建出来的线程的优先级都是平等的。6.进程强调独立,线程强调共享。
2017-06-04 23:13:38
685
原创 二叉树递归与非递归遍历
二叉树的遍历常见的二叉树的遍历有三种方式:先序遍历(根结点,左子树,右子树) 中序遍历(左子树,根结点,右子树) 后续遍历(左子树,右子树,根结点)这三种方式有分别可以用递归和非递归来实现先序遍历的主要步骤:(参考下图)1.从根结点开始先压左路结点,并访问结点,直到把根结点和左路结点全部压入栈。2.若左子树和为空,说明左路和根结点已经全部压栈并且已经访问过了,开始取栈顶元素来访问上一层父节点的右子树。把 右子树看成子问题继续进行1步骤。3.依次进行上述1和2
2017-05-30 15:57:11
1505
1
原创 文件描述符与文件指针的区别
文件指针:C语言中使用文件指针做为I/O的句柄。文件指针指向进程用户区中的一个被称为FILE结构的数据结构。FILE结构包括缓冲区和文件描述符。而文件描述符是文件描述符表的一个索引,也就是说c语言的文件指针是Linux系统中对文件描述符的一种封装。 下面看FILE结构体里面都有那些成员上面是文件指针指向的结构体,可以发现文件指针
2017-05-08 20:32:48
4995
1
原创 进程管理(一)
一.进程概念: 程序的一个执行实例 正在执行的程序 能分配处理器并由处理器执行的实体 这三种说法都是对的 那么正式进入进程的认识吧 内核:担当分配和管理系统资源(CPU时间,内存)的实体 管理的两个步骤:描述,组织 操作系统对进程进行管理,都是对结构体数据(PCB(进程描述符,是一个结构体,包含了进程的所有描述信息))进行管理 进程与可执行程序的区别: 1>
2017-04-30 16:51:40
929
3
原创 僵尸进程与孤儿进程解析
我们都知道Linux中的进程可以分有多种状态:R(runing):运行状态S(sleeping):浅度睡眠状态D(disk sleep):磁盘睡眠状态T(stopped):停止进程X(dead):死亡状态Z(zombie):僵尸状态僵尸状态(1)僵尸状态是一个比较特殊的状态,当进程退出父进程(使用wait()系统调用)没有读取到子进程退出的返回代码时就会
2017-04-30 14:54:50
3797
6
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人