- 博客(36)
- 收藏
- 关注
原创 nginx内存池——palloc函数
ngx_palloc.hstruct ngx_pool_s { ngx_pool_data_t d; //内存池的数据区域 size_t max; //一次可以分配的最大空间 ngx_pool_t *current; //指向当前内存地址,ngx_chain_t最后一个节点 ngx_chain_t *chain; //缓冲区链表 ngx_pool_large_t *large;
2021-09-20 23:46:15
444
原创 剪绳子问题
给出一段长度为n的绳子,将其剪成m端,要求剪出的长度的乘积最大。首先,我们得想到,只要绳子开始大于四,所有的绳子为了乘积最大都会被剪切,所以,我们可以先将小于4的绳子乘积保存下来,接下来继续求目标绳子的最大乘积。将每一个结果保存在数组中,绳子长度那一位对应的数据便是我们需要的数据。func MaxCutting(length int) int { if length < 2 { return 0 } if length == 2 { return 1 } if length ==
2021-09-14 00:24:02
153
原创 动态规划常见问题
动态规划就是把一个大问题分解为多个小问题,然后一个个去解决。Fibonacci:直接输出最后的结果,不保存中间的数据。func Fibonacci(n int) int { if n <= 1 { return n } i, j := 0, 1 for p := 2; p <= n; p++ { tmp := i + j i = j j = tmp } return j}func main() { //fun(0) i := Fibonacci(4)
2021-09-13 19:30:31
246
原创 KMP算法
给你一个文本串S,一个非空模板串T,问S在T中出现了多少次,时间复杂度要求O(n*m),如果我们用暴力法解决的话,会因为超时失败。KMP算法的核心在于构造next数组,当我们构造出next数组,问题就会迎刃而解,所谓next数组,就是文本串S每一个位置前的最长公共前缀的结束的下标,这样说可能还是有点晦涩,即数组i位置的值即为i位置之前的字符串头尾相同的字符的数量。首先构造next数组,如图func MakeNext(s string) []int { next := make([]int, len
2021-09-12 23:06:15
222
原创 不得不了解的操作系统
1、进程和线程的区别进程是操作系统对一个正在运行的程序的抽象。是系统进行资源分配的基本单位。一个系统上可以同时运行很多个进程,而每个进程都好像在独占的使用硬件,而并发运行是说一个进程的指令和另一个进程的指令交替执行。操作系统保持跟踪进程运行所需的所有状态信息。这种状态就叫上下文;线程是进程内部的一条执行路径,是系统进行调度的基本单位。在现代操作系统中,一个进程可以由多个被称为线程的执行单元组成,每个线程都运行在进程的上下文中,并共享代码和全局数据。2、孤儿进程和僵死进程僵死进程:子进程先于父进程运行结
2021-08-30 18:38:42
69
原创 应该熟知的网络基础
OSI七层模型自下而上:物理层、数据链路层、网络层、运输层、会话层、表示层、应用层TCP/IP四层模型自下而上:网络接口曾、网际层、运输层、应用层五层协议物理层、数据链路层、网络层、运输层、应用层物理层、数据链路层MAC地址:在局域网中的硬件地址,IEEE802标准为局域网规定了一种48位的全球地址,值局域网上的每台计算机固化在适配器的ROM中的地址。以太网采用的是具有冲突检测的载波监听多点接入CSMA/CD。该协议要点是:发送前先监听,边发送边监听,一旦发现总线出现了碰撞,就立即停止发送。
2021-08-28 15:20:18
169
原创 GO学习——反射
文章目录前言一、类型1.命名类型与未命名类型2.底层类型3.类型相同和类型赋值二、类型查看1.reflect.Type2.reflect.Value与Kind方法三、反射1.反射的API2. 反射三定律四、inject库1.对函数的反转调用2.结构的依赖注入五、反射的最佳实践前言维基百科中写道:反射是指计算机程序运行时可以访问、检测和修改本身状态或行为的一种能力。通俗来说,反射就是程序能够在运行时动态的查看自己的状态,并且允许修改自身的行为。一、类型首先,Go语言是强类型语言,不同类型是无法比
2021-08-14 14:16:13
127
原创 Gin学习(六)
Cookie使用文章目录Cookie使用一、cookie是什么?二、Cookie使用总结一、cookie是什么?Cookie实际上就是服务器保存在浏览器上的一段信息。浏览器有了Cookie之后,每次向服务器发送请求时都会同时将该信息发送给服务器,服务器收到请求后,就可以根据该信息处理请求。二、Cookie使用使用cookie验证用户是否登录成功func MiddleWare() gin.HandlerFunc { return func(c *gin.Context) { if co
2021-08-13 18:02:46
56
原创 Gin学习(五)
中间件的使用文章目录中间件的使用一、中间件是什么?二、自定义中间件1.全局中间件2.局部中间件3.Next()方法一、中间件是什么?gin中间件可以在处理具体的route请求时,提前做一些业务。比如用户有效性的校验,特定日志格式的打印,错误日志的打印等等。二、自定义中间件1.全局中间件func MiddleWare() gin.HandlerFunc { return func(c *gin.Context) { fmt.Println("Middleware run") }}
2021-08-13 17:14:13
865
原创 Gin学习(四)
Gin渲染文章目录Gin渲染一、json、结构体、XML、YAML数据响应二、HTML页面三、重定向四、同步异步一、json、结构体、XML、YAML数据响应func main() { engine := gin.Default() engine.GET("/login", func(c *gin.Context) { //1.JOSN格式 // c.JSON(200, gin.H{ // "username": "duty", // "password": "1234
2021-08-13 16:05:26
90
原创 Gin学习(三)
Gin路由文章目录Gin路由一、基本路由二、Context方法1.API参数2.URL参数3.表单参数4.路由组总结一、基本路由创建一个引擎之后,可以使用它的各种方法,如GET,POST,DELETE等func main() { engine := gin.Default() engine.GET("/hello", func(c *gin.Context) { c.Writer.WriteString("Hello World") }) engine.POST("login"
2021-08-13 13:57:03
210
原创 GIn学习(一)
Let’s GO: 第一章 GIN入门文章目录Let's GO: 第一章 GIN入门前言一、Gin是什么?二、使用步骤1.安装Gin2.导入框架3.Hello World总结前言Gin是Golang的一个微框架,具有封装优雅,Api良好,可扩展多种中间件的特点,我们可以通过简单的几行Go代码搭建出一个简单的web服务器。一、Gin是什么?Gin是一个Go语言的框架,基于这个框架,我们可以快速的搭建一个web服务器。二、使用步骤1.安装Gingo get -u github.com/g
2021-08-13 12:41:59
94
原创 Linux线程
线程概念:线程是进程内部的一条执行路径或执行序列。线程的量级很小,一切的进程都至少有一条线程,隶属于一个进程的多个线程指向同一块地址空间,但有自己的线程ID。进程和线程的区别进程是资源竞争的基本单位。 Linux下没有真正的线程,因为Linux下没有给线程设计专有的结构体,它的线程是由进程模拟的,是多个进程共享一块地址空间模拟而来。 创建线程的资源成本小,工作效率高。 Linux下CPU能够看见的所有线程都可以看成轻量级的进程。 进程是承担分配系统资源的基本实体,进程具有独立性,但进程间
2021-04-09 22:59:53
182
原创 Linux进程间通讯的方式
管道当一个进程连接数据流到另一个进程时,我们就会用到管道。我们通常把一个进程的输出连接到另一个进程的输入。管道的本质是内核提供的一段内存。popen()函数和pclose()函数popen()函数允许一个程序将另一个程序作为新进程来启动,返回一个文件流指针,第一个参数是程序名和对应的参数,另一个是“r”或“w”。pclose()函数关闭popen()函数对应的进程与之关联的文件流,成功返回文件流对应的退出码,失败返回-1,并设置errno。FILE* read;read = popen(
2021-04-09 14:59:56
87
原创 Linux信号
信号机制是一种使用信号来进行进程之间传递消息的方法,信号的全称为软中断信号,简称软中断。信号的本质是软件层次上对中断的一种模拟(软中断)。它是一种异步通信的处理机制,事实上,进程并不知道信号何时到来。通俗来讲,信号就是系统响应某些条件而产生的一个事件。信号的产生有以下几种方式:用户按下某些终端按键后引发终端产生信号,如“CTRL+C”。 硬件产生的异常信号,如无效的内存访问, 这些信号通常由硬件检测并通知Linux内核,然后内核产生信号发送给相关进程。 进程使用系统调用函数kill给一个进程
2021-04-07 22:39:17
80
原创 Linux文件操作
文件描述符每个运行中的程序被称为进程,它有一些与之关联的文件描述符,这些是一些小值整数,可以通过它们访问打开的文件或设备。当一个程序开始运行,它一般会有三个已打开的文件描述符:0:标准输入、1:标准输出、2:标准错误Linux下文件描述符的限制有两个方面:一是用户级限制,二是系统级限制,它们限制了进程能打开文件的数量。命令:sysctl -a | grep fs.file-max 可以查看当前的系统级限制能够打开的最大文件数。修改:通过 sysctl -w fs.file-max=文件数 命令修
2021-04-07 21:50:18
121
原创 Linux进程
fork复制进程fork创建一个进程时,子进程只是完全复制父进程的资源,复制出来的子进程有自己的任务结构和PID,同时复制父进程的其他资源(用户空间、文件描述符)。实现方式:调用fork()函数,成功在子进程返回0,父进程返回子进程PID,失败返回0。共享代码段:fork后,父进程和子进程都会继续执行fork调用之后的指令,子进程是父进程的副本,获得父进程的数据空间、堆、栈、缓冲区的副本,这些都是副本,父子进程不共享这部分的内存,但是父子进程共享程序的正文段,正文存放CPU执行的机器指令,通常是
2021-04-06 22:32:00
52
原创 C++设计模式
讲起设计模式,首先得谈及面对对象的七个原则面对对象的七大原则开放封闭原则:对扩展开放,对修改关闭,模块应该在尽量不修改源代码的情况下扩展。 单一职责原则:一个类只做一件事。 依赖倒换原则:程序要依赖于抽象接口,而不是具体实现,降低客户与实现模块之间的耦合。 迪米特原则,也称最小知识原则:高内聚,低耦合。 接口隔离原则:客户端不要依赖它不需要的接口上,类间的依赖关系建立在最小的接口上。 合成复用原则:尽量使用合成,尽量不要使用继承。 里氏代换原则:子类不能去修改父类的内容。面对对象的设计
2021-03-31 19:45:56
169
2
原创 STL——容器及容器适配器
Listlist是序列荣容器,它允许在序列的任何位置执行固定O(1)时间的插入和删除操作,由双向链表实现,但不能通过位置直接访问元素,需要用迭代器,而需要一些额外的内存空间来保持与其他元素相关联的链接信息。使用需要添加头文件#include<list>1. 定义与初始化list<int> list1;//创建空的listlist<int> list2(2);//创建含有两个元素的listlist<int> list3(4,2);//创建含有4个元素的
2021-03-30 20:32:03
125
原创 智能指针
auto_ptr这个智能指针已经被C11标准弃用,C98中它的作用是:动态分配对象以及在对象不需要时自动执行清理。auto_ptr在构造时获取某个对象的所有权,在析构时释放该对象,所以我们不用担心它在何时释放该对象,也不用担心发生异常产生内存泄露。但要注意:一个萝卜一个坑,两个auto_ptr不能同时拥有同一个对象。不能用auto_ptr来管理数组。构造函数的explicit关键字有效阻止从一个“裸”指针隐式转化为auto_ptr类型。auto_ptr的拷贝构造和赋值函数强调“所有权的转移
2021-03-28 21:23:53
122
原创 继承和多态
继承(inheritance) 机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础.上进行扩展,增加功能。这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构。体现了由简单到复杂的认识过程。多态性(polymorphism) 多态性是考虑在不同层次的类中,以及在同一类中,同名的成员函数之间的关系问题。函数的重载,运算符的重载,属于编译时的多态性。以虚基类为基础的运行时的多态性是面向对象程序设计的标志题。函数的重载,运算符的重载,属于编译时的多态性。以虚基类为基
2021-03-27 14:51:03
2400
2
原创 类和对象
面对对象的思想从世界观的角度可以认为:面向对象的基本哲学是认为世界是由各种各样具有自己的运动规律和内部状态的对象所组成的;不同对象之间的相互作用和通讯构成了完整的现实世界。因此,人们应当按照现实世界这个本来面貌来理解世界,直接通过对象及其相互关系来反映世界。这样建立起来的系统才能符合现实世界的本来面目。从方法学的角度可以认为:面向对象的方法是面向对象的世界观在开发方法中的直接运用。它强调系统的结构应该直接与现实世界的结构相对应,应该围绕现实世界中的对象来构造系统,而不是围绕功能来构造系统。封装的思
2021-03-26 20:51:15
244
2
原创 C/C++的区别
1、new和malloc区别:1、new是关键字,malloc是函数2、new返回值类型安全,malloc返回值类型不安全3、new不需要计算开辟内存大小,malloc需要4、new开辟失败会抛出异常,malloc开辟失败会返回NULL。5、new可以初始化6、new开辟的内存在自由存储区域,malloc在堆上开辟。7、new用delete释放,malloc用free释放。为什么不能直接操作堆内存,而是用指针间接操作?堆内存没有变量名,堆内存的所有权交给上一个有变量名的指针来管理。2、函
2021-03-25 15:22:38
69
原创 UDP协议&IP协议&HTTP协议
UDP协议:无连接,不可靠的数据报服务服务器编程:socket()、bind()(服务器地址信息与socket绑定)、recvfrom()(接收数据报)、sendto()(发送数据报)、close()客户端编程:socket()、sendto()、recvfrom()、close()1、一次sendto对应一次recvfrom。2、一次sendto对应一个UDP数据报。3、一次recvfrom只能处理一个UDP数据报,如果没有将一个数据报里的数据处理完,剩余的会被丢弃。如不及时接收会丢包。IP
2021-03-10 23:07:07
310
原创 TCP协议
TCP协议是一项面向连接的、可靠的、基于字节流的传输层通信协议。TCP/IP模型自上向下:应用层、传输层、网络层、数据链路层。数据链路层:通过各种控制协议,将有差错的物理信道变为无差错的、能可靠传输数据帧的数据链路。IP协议无连接、无状态、不可靠传输层:为两台主机上的应用程序提供端对端的通信。传输层协议:TCP协议、UDP协议、SCTP协议应用层:负责处理应用程序的逻辑。“hello”发送的过程:TCP服务端编程:socket()、bind()、listen()、accept()、recv
2021-03-10 22:09:35
176
原创 杂乱无章的Linux——进程和信号
进程每一个运行着的程序实例就叫做进程,每一个进程都会被分配一个唯一的数字叫做进程标识符或PID。操作系统通过进程表对进程进行管理。在命令行输入ps -ef就可以查看当前所有进程。运行一个新进程,即在一个程序中启动另一个程序,可以使用system库函数,运行以字符串参数传递给它的命令并等待该命令的完成。system("ps ax");相当于在命令行输入ps ax,但如果想让这个进程后台运行,可以把上述函数代码改成system("ps ax &");。system函数在每次运行时都需要启动一个
2021-02-25 17:23:27
99
原创 杂乱无章的Linux
时间与日期time函数:1970年1月1日至今的秒数。difftime函数:计算两个time_t值之间的秒数,并以double类型返回。gmtime函数:把底层函数分解为一个结构,localtime函数:当地时间,使用和gmtime一样。mktime函数:将已分解的tm结构在转换为原始的time_t值,失败返回-1。asctime函数和ctime函数:前者返回一个字符串,包含时间日期的信息的一个字符串,后者转化为更易读的本地时间。其他:临时文件:tmpnam函数:生成一个唯一的文件名,(基
2021-02-22 21:41:54
74
原创 杂乱无章的Linux——流
标准i/o库全部保存在《stdio.h》库中。fopen函数:主要用于文件和终端的输入输出,成功返回FILE*指针,失败返回NULL,如果需要对设备进行明确的控制,建议用open系统调用。fread函数:fwrite函数:从指定的数据缓冲区中取出数据记录,并把他们写到输出流中。fclose函数:关闭指定的文件流stream,是所有尚未写出的数据都写出。fflush函数:把文件流中所有未写出的数据全部写出。fclose函数隐含执行了一次flush操作。fseek函数
2021-02-20 08:30:06
287
1
原创 杂乱无章的Linux——文件
首先,我们要明确一个概念:Linux中,一切(几乎一切)都是文件。Write系统调用:把缓冲区buf的前nbytes个字符写入与文件描述符fildes关联的文件中,返回实际写入的字节数。read系统调用:从与文件描述符fildes相关联的文件里读入nbytes个字节的数据,并把它们放在数据区buf中,返回实际读入的字节数。Open系统调用:Close系统调用:终止文件描述符fildes与其对应文件的关联,成功返回0,出错返回-1。ioct1系统调用:提供了一个用于控制设备及其描述符行
2021-02-20 05:46:34
126
原创 杂乱无章的Linux—shell(一)
Liunx复习(一)管道与重定向:1、重定向输出(入):$ 1s -1 > lsoutput. txt将ls的输入结果全部保存到 lsoutput. txt文件中,但要注意,如果已经存在这个文件,那么将会把原文件覆盖,如果不想覆盖掉,可以用$ 1s -1 >> lsoutput. txt将输出结果附在原文件后面。$ kill -HUP 1234 >killout .txt 2>killerr . txt将标准错误输出保存在killerr . txt文件,也可以用
2021-02-18 14:56:16
142
原创 2021-01-30
小伟的C+日常C++与线程之间擦出的火花(三)今天说的是信号量有关的概念然后写出一个简单的生产者消费者模型。首先,谈及信号量,肯定要先知道信号量的概念:信号量是在多线程环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被并发调用。在进入一个关键代码段之前,线程必须获取一个信号量;一旦该关键代码段完成了,那么该线程必须释放信号量。其它想进入该关键代码段的线程必须等待直到第一个线程释放信号量。这是我在百度上搜索的关于信号量的定义。简言之,信号量,就是线程可用资源的数量,当一个线程要运行前,
2021-01-30 20:37:16
88
原创 2021-01-28
小伟的刷题日常(一)纠缠了三天的单链表(一)用了三天来消化的单链表,终于有了起色,说实话,主要在家打扰自己的事情太多了自己又无法沉下心来,原本一天解决的事,用了三天。闲话少说,直接上题今天写的事三个对于单链表变化的问题,所以,首先构造一个简单的单链表,这东西没啥好说的,直接上代码:#include<stdio.h>#include<stdlib.h>typedef struct node { int data; struct node* next;}N
2021-01-28 19:00:57
64
原创 2021-01-24
小伟的C+日常C++与线程之间擦除的火花(二)上文说到了thread对象的一些函数,本文主要讲述一下互斥量以及上文匆忙未说的在线程里面的一些函数。sleep_for函数: 阻塞当前线程的执行,直至规定的时间结束后,也有可能比规定的时间长,因为调度或资源争议延迟。后面可以加上数字加时间单位,如2000ms,也可以加上固定的时间函数加数字:std::chrono::nanoseconds 纳秒std::chrono::microseconds 微秒std::chrono::milliseconds 毫
2021-01-24 22:27:05
123
1
原创 2021-01-23
小伟的C+日常C++与线程之间擦除的火花我的能力让我自己有自知之明,我的文章可能有很多不是我自己的东西,还有些可能就是对于老师告诉我的知识的一些誊抄,我的日的是为了可以温故,而我自己对于这个方面的理解,可能不是很多,我只能说尽我所能。首先,我们聊起线程,肯定要先理解线程是个什么东西,这段是我在写这篇博文之前觉得自己可能不能很好的解释线程这个东西,所以,我选择了度娘,以下是我在知乎上照搬过来的,我认为很形象也很容易理解。作者:pansz链接:https://www.zhihu.com/questio
2021-01-23 21:32:52
90
原创 递归
定义:自己直接或者间接调用自己注意: 避免递归次数太多(出现栈溢出)或者死递归原理:例:求n的阶乘int Fac(int n){ if(n==0 || n==1) return 1; else return Fac(n-1)*n;//(n-1)!}最适合用递归的问题汉诺塔,将n个盘子从a,通过b移到cvoid Move(char x,char y)//模拟移动...
2020-03-16 20:14:54
87
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人