- 博客(48)
- 收藏
- 关注
原创 IO的多路转接
文章目录什么是IO??五种IO模型的基本概念非阻塞IOfcntl实现函数SetNoBlockIO多路转接(高级IO/高效IO)selectselect 就绪条件select特点pollepoll总结select,poll,epoll的优缺点使用场景什么是IO??IO分两步:等+数据拷贝举例:读IO就是:等待读事件就绪+将内核数据拷贝至用户空间写IO就是:等待写事件就绪+将用户空间数据拷贝至内核空间五种IO模型的基本概念阻塞IO:在内核将数据准备好之前,系统调用会一直等待。所有的套接字,默认都
2021-08-05 14:36:17 718
原创 智能指针- 原来如此
文章目录为什么需要智能指针内存泄漏什么是内存泄漏以及内存泄漏的危害内存泄漏分类智能指针的使用及原理RAII几种智能指针auto_ptrunique_ptrshared_ptrweak_ptr为什么需要智能指针当程序员手动malloc或new出来的空间没有手动释放。存在异常安全问题。如果new和delete之间如果存在抛异常,那么还是有内存泄漏。这种问题就叫异常安全。内存泄漏什么是内存泄漏以及内存泄漏的危害什么是内存泄漏: 内存泄漏是指,在内存不使用的情况下,由于疏忽或错
2021-08-04 13:57:04 231
原创 基于HTTP协议实现的自主web服务器
为什么要做这个项目??答: 我想从服务器后台开发角度深入了解一个简单的http服务器的运行原理,并从本质上理解http协议的特征,掌握该协议的定制过程。什么是http服务器??答:通过浏览器(客户端)对服务器的访问,连接远程的http服务器,服务器通过分析http请求,构建http响应,将解析出来的数据返回给客户端,从外在表现就是得到一个相对应的web页面。做这个项目我们最终达成的目标:实现一个基于HTTP/1.0版本的web服务器,客户端能使用GET、POST方法请求资源服务器通..
2021-08-01 21:37:28 735
原创 左值引用与右值引用
左值与右值概念左值与右值是C语言中的概念,但是C标准并没有给出严格的区分方式,一般认为:可以放在 = 左边的(一般是可以修改的值) 或者 能取地址的称为左值, 只能放在 = 右边(一般是不可修改的一些值),或者不能取地址的值称为右值。(如:常量、临时变量、表达式的返回值)具体解释:普通类型的变量,因为有名字,可以取地址,都认为是左值。const修饰的常量,不可修改,只读类型的,理论上应该按照右值对待,但因为其是可以取地址的,C++1认为其是左值。如果表达式的运行结果是一个临时变量或对象,认为是
2021-07-21 20:08:39 570 1
原创 高并发内存池
什么是内存池??内存池是一种动态内存分配与管理技术。通常情况下,程序员习惯直接使用new、delete、malloc、free等API申请分配和释放内存,这样导致的后果是:当程序长时间运行时,由于申请内存块的大小不定,频繁使用会造成大量的内存碎片从而降低程序和操作系统大的性能。内存池则是在真正使用内存之前,先申请分配一大块内存(内存池)留作备用,当程序员申请内存时,从池中取出一块动态分配,当释放时,将要释放的内存再放入池中,再次申请时可以从池中再取出来使用,放回后尽量与周边的空闲内存块合并。若内存池不够时
2021-07-14 17:34:05 255
原创 网络层与数据链路层--一看便知
文章目录网络层作用IP协议与IP协议有关的一些概念协议头网络层作用在复杂的网络环境中确定一个合适的传输路径。IP协议与IP协议有关的一些概念IP协议是TCP/IP协议簇中的核心协议,也是TCP/IP的载体。所有的TCP,UDP,ICMP及IGMP数据都以IP数据报格式传输。主机:配有IP地址,但是不进行路由控制的设备。路由器:既配有IP地址又能进行路由控制。节点:主机和路由器的统称。协议头...
2021-07-11 23:08:57 1987 4
原创 了解传输层---UDP和TCP(满满的细节)
文章目录UDP协议UDP协议端格式UDP的特点面向数据报UDP缓冲区基于UDP的应用层协议TCP协议TCP协议端格式各字段的含义ACK机制超时重传机制UDP协议UDP协议端格式注意: UDP协议首部中有一个16位的最大长度. 也就是说一个UDP能传输的数据 最大长度是64K(包含UDP首部).UDP的特点无连接:知道对端的IP和端口号就直接进行传输, 不需要建立连接;不可靠: 没有确认机制, 没有重传机制; 如果因为网络故障该段无法发到对方, UDP协议层也不会给应用层返回任何错误信息;面
2021-06-05 17:06:50 313 3
原创 红黑树其实也简单
文章目录红黑树的概念红黑树的性质红黑树节点的定义红黑树的插入操作红黑树的概念红黑树:是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。红黑树的性质1. 根节点必须是黑色的。2. 每个节点不是黑色就是红色。3. 没有连续的红色节点。(如果一个节点是红色的,则它的两个孩子结点是黑色的)4. 每条路径上的黑色节点的数目是相同的。5. 所以的
2021-06-02 09:54:00 812
原创 了解HTTP和HTTPS协议
HTTP的引入在当今社会我们已经离不开网络了,基本上我们随时随地都能上网,那你知道上网的实质是干啥吗?其实很简单:我们所做的所有互联网行为都是两种操作:把服务器上的数据拿下来。把自己的数据传到服务器上去。当然上网必不能缺少HTTP协议了,我们知道了HTTP是位于传输层的协议,接下来让我们具体来学习HTTP的内容吧!认识URL平时我们所说的“网址”,指的就是URL,是用来定位互联网上的资源的,通常以路径的形式展现(资源所处的路径)。urlencode和urldecode这俩的作用相当于
2021-05-29 14:35:45 473 2
原创 AVL树
AVL树概念AVL树节点的定义AVL树的插入AVL树的旋转概念由于二叉搜索树的缺陷(如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下),两位俄罗斯的数学家G.M.Adelson-Velskii和E.M.Landis便在1962年发明了一种解决上述问题的方法: 当向二叉搜索树中插入新结点后,如果能保证每个结点的左右子树高度之差的绝对值不超过1(需要对树中的结点进行调整),即可降低树的高度,从而减少平均搜索长度。首先要明确的一点是,AVL树也是一颗二叉搜索树了解二
2021-05-26 16:05:35 168 2
原创 map和set
文章目录1. 关联式容器2. 键值对 (KV模型)3. 树形结构的关联式容器3.1 set介绍使用3.2 map1. 关联式容器像我们所了解的STL中的部分容器,比如:vector、list、dequeue、forward_list(c++11)等这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身。那么什么又是关联式容器呢??两者之间又有什么区别呢??关联式容器也是用来存储数据的, 和序列性容器不一样的是,关联式容器是非线性的树结构,更准确的说是二叉树结构。各元素之间没有严
2021-05-25 12:20:17 231 4
原创 二叉树的最近公共祖先
题目链接 Leetcode 236.二叉树的最近公共祖先题目描述:给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”思路分析:假设找a,b这两个节点的公共祖先要是a,b这两个节点其中一个等于树的根,那么这个根就是它俩的公共祖先。要是a在这个根的左子树,b在这个跟的右子树,(或者a在右子树,b
2021-05-18 17:47:27 101
原创 二叉搜索树
文章目录概念二叉搜索树的操作查找插入模拟实现应用概念二叉搜索树也叫二叉排序树(其中序遍历是有序的),它具有以下性质:在左子树不为空的情况下,左子树上的所有节点的值都小于根节点的值右子树不为空的情况下,右子树上所有节点的值都大于根节点的值它的左右子树也分别是二叉搜索树就该二叉搜索树而言我们来看一看它中序遍历(访左,访根,访右)的结果:[0,1,2,3,4,5,6,7,8,9]二叉搜索树的操作查找由于二叉搜索树的性质,它的查找较为简单:它的查找在不同情况下效率还不一样:插入模拟
2021-05-18 15:14:41 392
原创 网络套接字---TCP
文章目录简单认识TCP协议socket编程接口详解socket函数bind函数listen函数accept函数connect函数recv函数和send函数基于TCP的客户端和服务器端通信的流程图一个简单的TCP通信简单认识TCP协议在上文中网络套接字—UDP我们认识了UDP之后,在此基础上再来了解TCP。IP和端口号的概念和作用这里不在赘述,不了解的朋友请参考上文。这里主要说一下TCP的特点,与UDP的对比。socket编程接口详解socket函数和bind函数在上文中有详解:上文中网络套
2021-05-15 19:02:14 313
原创 网络套接字---UDP
文章目录预备知识IP和端口号端口号和进程ID简单认识UDP协议网络字节序socket编程接口(本文主要围绕UDP)本文主要用到的APIsocket函数bind函数recvfrom函数和sendto函数(用于UDP中接收和发送数据)一个简单的UDP通信预备知识IP和端口号总体概述一下:就是网络通信本质上还是进程间通信只不过该通信需要跨网络和跨主机,因此我们就要明确要将数据发给谁,收到数据的进程要知道是谁给他发的数据,确保能够及时做出回应。这样就引出了以下的概念:IP:用来标识全公网唯一一台主机,端口
2021-05-13 12:58:25 360 5
原创 C++里的多态
文章目录什么是多态静态多态动态多态定义和简单实现构成条件抽象类定义和特点接口继承域实现继承多态的原理虚函数表什么是多态多态顾名思义就是同一事物在不同的情况下表现出不同的形态。例如:买票这个行为,当普通人购票时,买的是全价票,学生购票时买的是优惠票。多态分静态多态和动态多态。我们重点讲动态多态。静态多态静态多态是在程序编译期间就确定了程序行为,比如:函数重载,泛型编程。下面简单理解一下: (注:本文中的代码都是在vs2013下完成的)int Add(int x, int y){
2021-05-10 20:40:27 176 4
原创 网络基础
文章目录对局域网和广域网的基本认识局域网和广域网OSI七层模型与TCP/IP四层(五层)模型OSI七层模型TCP/IP五层模型两者之间的区别网络传输基本流程相关概念图解网络中的地址管理IP地址MAC地址对局域网和广域网的基本认识局域网和广域网就是将多台计算机互联,实现计算机与计算机之间的通信与资源共享。两者的区别:所谓的局域网与广域网只是相对的概念,其实就是覆盖范围的不同。OSI七层模型与TCP/IP四层(五层)模型OSI七层模型OSI (Open System Interconnect
2021-05-08 23:11:25 113
原创 简单认识进程
文章目录基本概念怎样描述进程--PCBtask_struct组织进程查看进程进程状态都有哪些状态怎样查看进程状态僵尸进程与孤儿进程进程优先级概念查看PRI&&NI更改进程的nice其他概念基本概念简单理解:程序的一个执行实例,正在执行的程序。内核观点:担当分配系统资源(CPU,内存)的实体。怎样描述进程–PCBPCB(process control block):进程控制块,可以简单理解为进程属性的集合。Linux 操作系统下的PCB是:task_structtask_
2021-05-03 13:46:12 161
原创 快排详解
文章目录快排介绍效果演示(先来体会一下)将区间按照基准值划分为左右两半部分的方法:(推荐挖坑法)挖坑法思想:图画演示(第一趟)选取基准值的优化代码展示快排递归非递归快排介绍快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其基本思想为:任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两个子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后左右子序列重复该过程,直到所有元素都排在相应位置上为止。效果演示(先来体会一下)那么我们是怎样将其
2021-05-02 13:56:45 4190
原创 C++里面的继承
C++中的继承1.什么是继承以及怎样继承1.1 概念1.2 继承格式与方式2. 基类和派生类对象赋值转换3. 继承中的作用域4. 派生类的默认成员函数5. 继承与友元,继承与静态成员6. 菱形继承和菱形虚拟继承7. 组合和继承区别1.什么是继承以及怎样继承1.1 概念继承机制是面型对象程序设计使代码复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称为派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用
2021-05-01 15:17:58 618 3
原创 POSIX信号量&&生产者消费者模型&&线程池
生产者消费者模型1.概念的引入在日常生活中,当我们缺少生活用品是,我们会去超市购物,当我们买走超市货架上的东西,超市则会补充货架上的货物,那么超市的货物是从哪来的呢?不错,他们会有自己的供货商。那么我们是以怎样的身份进入超市呢?相信每个人都知道自己是以消费者的角色去的,生产者毫无疑问就是供货商,那么将我们与供货商这二者联系到一起的超市在这里面又扮演了什么样的角色呢?仔细想想便不难得出超市就是交易场所。2.为什么要使用生产者消费者模型3. 生产者消费者模型的理解原则POSIX信号量1.作用2.相
2021-04-30 15:17:15 268
原创 Linux线程
Linux线程线程概念,线程与进程的区别和联系线程概念线程与进程的区别线程的共享资源独有资源线程控制1.线程的创建线程概念,线程与进程的区别和联系线程概念线程是一个进程内部的控制序列(即一个执行流)。线程在进程的内部运行,本质是在进程地址空间内运行。在Linux中线程是用进程来模拟实现的有时也被称为轻量级进程。线程与进程的区别进程是资源分配的基本单位。线程是CPU或操作系统调度的基本单位。进程是承担分配系统资源的基本实体,进程具有独立性。(进程间通信打破了这种独立性)在一个
2021-04-22 14:00:48 166 1
原创 容器适配器
容器适配器1.什么是适配器2. stack和queue(栈和队列)2.1 stack和queue2.2 deque的简单介绍2.3 deque的缺陷2.4 为什么选择deque作为stack和queue的底层默认容器2.5 stack和queue的模拟实现(容器适配器)3.priority_queue(优先级队列)3.1 简介3.2 模拟实现3.2.1 仿函数3.2.2 代码展示1.什么是适配器适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的,经过分类编目的,代码设计经验的总结),该种模
2021-04-17 18:31:19 139
原创 进程信号
进程信号1.信号概念2. 系统定义的信号列表3.信号的产生3.1 通过终端按键产生信号3.2 通过调用系统函数向进程发信号3.3 由软件条件产生信号3.4 硬件异常产生信号4. 信号的保存----阻塞-未决4.1 什么是未决4.2 信号在内核中的表示示意图4.3 几个关于信号的操作函数4.3.1 信号集(sigset_t)4.3.2 信号集操作函数4.3.3 sigprocmask4.3.4 sigpending4.3.5 对上面所介绍的函数应用5. 信号的处理----递达捕捉信号1.信号概念信
2021-04-13 18:36:53 136
原创 list的模拟实现
list的模拟实现简单介绍list迭代器失效问题list的模拟实现list与vector的对比简单介绍list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。list的底层是双向链表结构:本文中我们使用双向带头循环链表来模拟实现。list迭代器失效问题迭代器失效即迭代器所指向的节点无效,即该节点被删除了,因为list底层结构为带头结点的双向循环链表,因此在list中进行插入时是不会导致list的迭代器失效的,只有再删除时才会失效,并且失效的只是被删除节点
2021-04-12 21:01:46 107
原创 vector 的模拟实现
vector 的模拟实现1.示意图:2. 代码实现1.示意图:2. 代码实现//vector.h#pragma once#include<iostream>#include<vector>#include<assert.h>namespace guokk{ template<class T> class vector { public: //vector的迭代器是一个原生指针 typedef T* iterator;
2021-04-07 19:05:28 117
原创 进程间通信——管道和共享内存
详解管道和共享内存管道什么是管道匿名管道匿名管道实现进程间通信原理命名管道管道的特点共享内存管道什么是管道管道是Unix中最古老的进程间通信的形式。我们把从一个进程链接到另一个进程的一个数据流称为一个“管道”管道有:匿名管道和命名管道匿名管道匿名管道是一个特殊的文件,在文件IO中创建或打开一个文件用open函数来实现,但是open函数不能创建匿名管道文件,只能用pipe函数来创建#include<unistd.h>int pipe(int fd[2]);功能:创建
2021-04-07 15:50:43 496
原创 进程控制
进程概念进程创建认识fork函数fork函数返回值fork常规用法fork调用失败的原因进程终止进程退出场景进程退出常见方法_exit函数和exit函数return退出进程等待进程的方法wait方法waitpid方法进程创建认识fork函数它是从已经存在的进程中创建一个新进程。新进程为子进程,原进程为父进程。#include<stdio.h>pid_t fork(void);返回值:子进程中返回0,父进程返回子进程id,出错返回-1进程调用fork,当控制转移到内核中的for
2021-04-01 21:13:36 119
原创 深入理解文件系统和文件描述符以及动静态库
IO1.文件描述符fd1.1 0&1&21.2 理解文件描述符的本质1.3文件描述符分配规则2. 重定向2.1 什么是重定向2.2 重定向的本质2.3 使用dup2系统调用3.理解文件系统3.1 简单了解文件系统4. 软硬连接4.1 硬连接4.2软连接5 动态库和静态库5.1 概念:5.2 生成动静态库5.2.1 静态库5.2.2 动态库生成动态库使用动态库运行动态库1.文件描述符fd1.1 0&1&2Linux进程默认情况下会有3个缺省打开的文件描述符,分别是
2021-03-31 21:45:36 273 2
原创 string的OJ练习
习题练习1. 找出字符串中第一个出现一次的字符2.反转字符串中的单词3.字符串相乘1. 找出字符串中第一个出现一次的字符>代码展示:#include<iostream>using namespace std;int main(){ string s; while(cin >>s) { int count[26]={0};//定义一个计数数组 for(auto& i:s)//遍历字符串将出现的数字次数
2021-03-31 14:31:46 117
原创 模板初阶
模板初阶1.函数模板1.1 概念1.2 格式1.3 原理1.4 实例化1.4.1 隐式实例化1.4.2 显式实例化2.类模板2.1类模板定义格式1.函数模板1.1 概念函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。1.2 格式template <typename T1,typename T2,…,typename Tn>返回值类型 函数名(参数列表){}template <typename T>voi
2021-03-15 12:30:49 98
原创 C/C++内存管理
C/C++内存管理1.C/C++内存分布2.C语言中动态内存管理2.1malloc/calloc/realloc和free3.C++中动态内存管理4.operator new与operator delete函数5.new和delete的实现原理6.定位new表达式(palancement-new)1.C/C++内存分布你能知道下面一段代码中的变量分别在内存当中的那个区域吗?int globalVar = 1;static int staticGlobalVar = 1;void Test()
2021-03-14 22:20:41 82
原创 类和对象
类和对象1.再谈构造函数1.1构造函数题赋值1.2初始化列表1.3 explicit关键字2.友元2.1概述2.2友元函数2.3友元类3.static成员3.1概念3.2特性4.内部类4.1概念及特性1.再谈构造函数1.1构造函数题赋值在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值.class Date{public: Date(int year, int month, int day) { _year = year; _month = month;
2021-03-10 22:35:41 109
原创 环境变量和进程地址空间
环境变量基本概念环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性常见的环境变量PATH:指定命令的搜索路径HOME:指定用户的主工作目录(即用户登录到Linux系统中时,默认目录)SHELL:
2021-03-07 20:06:02 207
原创 构造函数、析构函数和拷贝构造函数
1.构造函数1.1 定义构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,保证每个数据成员都有 一个合适的初始值,并且在对象的生命周期内只调用一次。1.2 特性构造函数是用来初始化对象的其特征如下:函数名与类名相同。无返回值。对象实例化时编译器自动调用对应的构造函数。构造函数可以重载。class Date{public : // 1.无参构造函数 Date () {} // 2.带参构造函数 Date (int year, int
2021-02-22 12:47:09 237
原创 类和对象基本了解
类和对象1.类的定义2.类的作用域3.类的访问限定符和封装3.1访问限定符3.2封装4.类成员函数的this指针1.类的定义class className{// 类体:由成员函数和成员变量组成}; // 一定要注意后面的分号class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号。类中的元素称为类的成员:类中的数据称为类的属性或者成员变量; 类中的函数称为类的方法或者成员函数。类的两种定义方式:声明和定义全部放在类体中,需要注意:成员函数如
2021-02-22 11:39:14 146
原创 初识C++
文章目录1.C++关键字2.命名空间2.1命名空间的定义2.2命名空间的使用3.C++的输入&输出4.缺省参数4.1缺省参数概念4.2缺省参数分类5.函数重载5.1函数重载概念5.2 为什么c语言不支持函数重载,而C++支持?1.C++关键字C++总计63个关键字,C语言32个关键字2.命名空间2.1命名空间的定义在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地
2021-01-31 18:55:51 133
原创 经典Leetcode 110 平衡二叉树 和 二叉树的构建和遍历
1.题目分析先说说什么是高度平衡二叉树一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。注意:是每个结点下来我们来看具体的代码解析:/** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; *///先计算二叉树的高度int TreeDe
2021-01-31 16:28:42 144
原创 Linux编译器-gcc 的使用以及 make/Makefile的用法
1.gcc是如何完成的1.预处理(进行宏替换)预处理功能主要包括宏定义,文件包含,条件编译,去注释等。预处理指令是以#号开头的代码行。实例: gcc –E hello.c –o hello.i选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。选项“-o”是指目标...
2021-01-29 17:35:03 4209
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人