- 博客(52)
- 收藏
- 关注
原创 深入协议栈了解TCP的三次握手、四次挥手、CLOSE-WAIT、TIME-WAIT。
1、深入connect、listen、accept系统调用,进一步理解TCP的三次握手2、深入TCP的四次挥手原理,进一步理解time_wait/close_wait状态
2023-09-05 11:53:16 655 1
原创 深入理解Reactor模型的原理与应用
Reactor意思是“反应堆”,是一种事件驱动机制。和普通函数调用的不同之处在于:应用程序不是主动的调用某个 API 完成处理,而是恰恰相反,Reactor逆置了事件处理流程,应用程序需要提供相应的接口并注册到 Reactor 上,如果相应的时间发生,Reactor将主动调用应用程序注册的接口,这些接口又称为“回调函数”。
2023-08-27 18:16:06 1476 1
原创 如何预防内存泄漏
一、内存泄漏的原因我们的程序向系统申请分配了一块内存(new/malloc)给对象使用,程序使用完这块内存后没有释放(delete/free),导致这个不使用的对象一直占据内存单元,造成系统将不能再把它分配给需要的程序。内存泄露简单来说就是,内存分配与内存释放没有做到一对一的匹配。二、内存泄漏的危害堆内存被不断的分配使用,没有及时回收,随着程序的运行,堆内存会慢慢的被消耗殆尽,当其他程序需要内存时,系统无法及时的分配合适的内存供其使用,将会造成程序崩溃。三、如何预防内存泄漏1、规范动态内存的使用
2022-04-01 16:31:50 4465
原创 线程池的原理剖析与代码实现
一、线程池的作用1、降低资源消耗:通过重复利用已创建的线程降低线程创建和销毁造成的消耗;2、提高响应速度:当任务到达时,可以直接抛给线程池处理,不用等待线程创建;3、异步解耦的作用。例:高性能服务器在处理高并发的链接时,每建立一个连接,都要将这个连接的信息进行存储,这样就会大大降低服务器处理客户端连接的能力,因此引入一个线程池,主线程只处理连接工作,将存储(写盘)的工作全部抛给线程池进行处理,这样将大大提高服务器的qps。二、工作原理1、线程池的核心API:1、创建/初始化:create
2021-12-08 22:07:32 796
原创 深入了解多路IO复用(select、poll和epoll)
单线程模型中,所有的操作都是按照顺序执行,但是由于一般情况下 I/O 操作是阻塞的,往往不能直接返回,这会导致某一文件的 I/O 阻塞导致整个进程无法对其它客户提供服务; - 在高性能服务器中,不可能一个I/O操作分配一个线程进行操作,因而就出现了这种在单线程中可以同时监测多个文件描述符的I/O多路复用方法(select/poll/epoll)
2021-08-17 22:39:40 262
原创 Linux————系统调用与库函数
库函数:库函数用于提供用户态服务,在用户态用户自己实现的方法。它可能调用封装了一个或几个不同的系统调用(printf调用write),也可能直接提供用户态服务(atoi不调用任何系统调用)。系统调用:1、基本概念及内容:所谓系统调用就是用户在程序中调用操作系统所提供的一些子功能(内核实现的一些方法),系统调用可以被看做特殊的公共子程序。系统中的各种共享资源都由操作系统统一掌管,因此在用户程...
2021-08-13 21:13:20 590
原创 Linux系统编程————线程同步之互斥锁
什么是线程同步 首先我们说一个生活中的现象来类比线程同步,城市的每个十字路口都会设置有红绿灯,设置红绿等的作用就是为了让十字路口这个资源在一定时间内,只能被一个方向往来的车辆使用,以避免交通事故的发生,我们就可以理解为十字路口被同步了;这样我们就可以将这个例子类比到我们的线程同步,十字路口的红路灯就相当于我们的同步机制(互斥锁),东西、南北方向的行车就相当于两一条线程。 ...
2019-08-14 22:08:05 258
原创 c++(基础)————智能指针
什么是智能指针? 1、智能指针本质上是一个类,它封装了一个原始的c++指针; 2、它是为了确保动态内存的安全性而产生的,作用类似于常规指针; 3、它主要负责自动释放内存,释放时机也是非常有考究的,多次释放同一块内存会造成程序崩溃,这些都可以通过智能指针来解决。智能指针的种类及其原理: 原理:用一个对象存储需要被自动释放的...
2019-08-13 17:05:07 235
原创 Linux系统编程————线程及其相关函数
一、线程相关概念:什么是线程: 1>线程就是进程的一条执行路径,每一个进程都有一条线程,称之为主线程。 2>在Linux系统下:线程就是轻量级的进程; 3>在Linux内核看来,线程就是进程;因为linux系统早期是没有线程概念的,只有pcb表示的进程,而在后来发展中,程序员用进程的方式封装了线程,所以每个线程都有独立的p...
2019-08-11 17:06:03 380 1
原创 Linux操作系统下git的使用方法
Linux命令行下使用GitHub:注册GitHub账号和Linux系统下的git安装这里就不说了,直接演示在Linux系统下如何使用git命令。第一部分:创建SSH密钥1、在本地创建与你的帐户关联的SSH密钥;2、找到存在于.ssh目录下id_rsa.pub文件中的ssh密钥;3、将刚才找到的密钥添加到GitHub云端的SSH密钥列表里;4、测试一下刚才...
2019-08-06 22:29:20 791 1
原创 Linux系统编程————守护进程
守护进程: 独立于控制终端,在后台周期性的执行某些操作的进程。特点: 不受用户登录/注销影响; 一般采用以d结尾的名字。作用: 1、避免进程在执行过程中的信息在任何终端上显示; 2、避免进程被任何终端所产生的终端信息所打断。 通俗的说就是,想让某个进程不因为用户或终端或其他的变化而受到影...
2019-08-04 20:12:26 215
原创 Linux系统编程————进程间通信--共享内存
共享内存又称内存映射什么是共享内存 共享内存就是多个进程将一块物理内存分别映射到自己的虚拟空间地址上,最终实现多个进程共享同一块物理内存。创建共享内存/内存映射区: mmap———创建内存映射 作用:将磁盘文件映射到内存,用户通过修改内存就能修改磁盘文件,mmap既可以单纯的操作文件,也可以进行进程间通信。 函数原...
2019-08-02 21:57:48 177
原创 Linux系统编程————进程间通信--管道
管道分为有名管道和无名管道。原理: 内部实现是环形队列,遵循先进先出的原则。 环形队列的头和尾是相对的,可以移动,可以保证读取的效率。 比如原队头的数据被读出,对头就会向后移,后写入的数据就会覆盖掉原队头。特点: 分为读端和写端,数据从写端流入,读端流出; 管道是半双工通信,数据只能在一个方...
2019-07-31 18:21:09 162
原创 Linux系统编程————wait进程回收
进程回收 进程回收函数wait只要是为了防止出现僵尸进程进程回收函数:wait(阻塞函数)函数原型:pid_t wait(int* status); 返回值: =-1:返回失败,已经没有子进程了; >0:回收的是子进程对应的pid。参数:判断子进程是如何死的(正常退出/被信号杀死) 正常结束: ...
2019-07-30 21:08:50 218
原创 Linux系统编程————孤儿进程与僵死进程
孤儿进程父进程先于子进程结束,子进程则称为孤儿进程。原因: 1、进程结束后,都会释放自己所占的用户空间; 2、但是进程的pcb必须由父进程来释放; 3、孤儿进程被系统进程init领养,释放孤儿进程的pcb。孤儿进程例子:int main()//孤儿进程{ pid_t pid; pid = fork(); i...
2019-07-30 20:57:32 229
原创 Linux系统编程————exec进程替换
exec函数族:进程替换函数1、何为进程替换:1、让父子进程执行不相干的操作;也就是说,在一个运行的程序a中,调用另外的应用程序b。2、换核不换壳;exec族函数,能够替换进程地址空间中的代码段.text段(对应的堆、栈中的数据都会改变),重新填充新的代码。2、函数原型:execl系列是变参函数int execl(const char* path,const char* ...
2019-07-25 21:20:16 308
原创 网络基础————TCP协议
TCP协议的基本属性1、什么是TCP协议:TCP是传输层最重要和最常用的协议;它提供一种面向连接的、可靠的、字节流数据传输服务。2、TCP协议的特性:面向连接: 使用TCP进行数据传输的客户/服务器之间,首先要建立一个TCP连接,数据传输完成后断开连接;全双工: 建立连接后,两个进程之间的数据传输是双向的。可靠: TCP提供了流量控制、拥塞控制、差错控制等保证数据传输的可靠性。基于...
2019-06-16 15:49:08 1542
原创 网络基础————IP协议
IP协议的基本属性:1、什么是IP协议?IP协议是网络层协议,是为了在分组交换计算机通信网络的互联系统中使用而设计的,它为网络数据传输和网络互联提供最基本的服务。IP协议使用以下4个主要的机制来提供服务:服务时间:用来指示要求的服务质量。生存时间:数据包生存时间的上限。选项:提供在某些情况下需要或有用的控制功能。首部校验和:提供对IP首部内容进行出错检测功能。网络层通过IP地址实...
2019-05-26 21:52:10 1096
原创 网络基础————TCP/IP协议
TCP/IP协议基础TCP/IP协议是目前最完整的、被普遍接受的通信协议标准。它可以使不同的硬件结构、不同操作系统的计算机之间相互通信。TCP/IP协议族包括TCP(传输层协议)、Ip(网络层协议)和其他协议。TCP/IP协议只是习惯叫法,更专业的叫法是Internet协议。无论是局域网还是广域网,TCP/IP都是使用最广泛的协议。TCP/IP协议的层次结构1、TCP/IP与OSI的...
2019-05-26 21:36:44 751
原创 BF算法与KMP算法
这两种算法都是字符串匹配算法,通俗来说,就是得到子串在主串中的位置。BF算法:BF算法是普通(简单)的查找算法,就是我们常说的暴力破解法。基本思想:将目标串(主串)S的第一个字符与模式串(子串)T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符;若不相等,则比较S的第二个字符和T的第一个字符,依次比较下去,直到得出最后的匹配结果。图示:分析:从BF算法...
2019-05-21 20:40:44 1256
原创 c++(练习题)————两数之和
题目描述:给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。示例:输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0...
2019-05-16 22:37:26 1080
原创 c++(练习题)————无重复字符的最长子串
题目描述:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入: “abcabcbb”输出: 3解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。示例 2:输入: “bbbbb”输出: 1解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。示例 3:输入: “pwwkew”输出: 3解释: 因为无重复字符的最长...
2019-05-16 22:33:50 629
原创 c++(练习题)————删除单链表倒数第k个结点
题目描述:给定一个链表,删除链表的倒数第 k 个节点,并且返回链表的头结点。示例:给定一个链表: 1->2->3->4->5, 和 n = 2.当删除了倒数第二个节点后,链表变为 1->2->3->5.说明:给定的 n 保证是有效的。进阶:你能尝试使用一趟扫描实现吗?题目分析:不使用额外空间,且一次遍历删除节点;使用双指针,...
2019-05-08 20:36:03 1260
原创 Linux系统编程————信号与信号量的区别
这两个名词只有一字之差,所以有时候我们会很容易联想到这两个东西是不是一个东西,然而他们却是完全不同的两个概念。今天在复习时,看到这两个概念时,发现自己已经将这两个概念混为一谈了……信号:是由用户、系统或者进程发送给目标进程的信息,以通知目标进程某个状态的改变或系统异常。 信号量:信号量是一个特殊的变量,它的本质是计数器,信号量里面记录了临界资源的数目,有多少数目,信号量的值就为多少,进程...
2019-04-27 22:43:48 8779 1
原创 c++(练习题)————0到整数n之间,对应二进制数是回文的整数的个数
题目描述:输入一个整数n,判断从0到这个整数n之间,有多少个整数对应的二进制数是回文的示例:输入:7输出:5题目分析:方法一:看到这个题,我们首先想到的是整数回文或者字符串回文,所以我们就会用最简单粗暴的办法,求出每个整数的二进制数,然后判断它是不是回文(时间复杂度是O(n^2))。方法二:上述方法时间复杂度是偏大的,在考试中是不可能100%通过的,所以我们就要找出这些回文二进制数的...
2019-04-18 17:32:35 777
原创 c++(基础)————模板(函数模板与类模板)
一、模板是干什么的?比如实现一个简单的比较大小的函数,如果要比较int、double、char等多种类型的数据,那么有多少中数据类型,我们就得实现多少个比较函数,然而这些函数除了类型不同之外,其他代码都是一样的(也就是代码实现的功能都相同,只是类型不同)。所以为了解决这种问题,我们就引入了模板,模板就是为了代码重用而生的二、函数模板:函数模板提供了一种函数行为,该函数行为可以用多种不同的类型...
2019-04-15 16:52:14 306
原创 c++(练习题)————罗马数字与整数的相互转换
一、题目描述:罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。字符与数值的对应关系如下:I -> 1, V -> 5, X -> 10, L -> 50, C -> 100, D -> 500, M -> 1000例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 ...
2019-04-08 21:31:51 4155 3
原创 c++(练习题)————逆置单链表(原地逆置)
题目描述:输入一个链表,反转链表后,输出新链表的表头。题目分析:方法一:利用栈先进后出的特性,将单链表逆置;方法二:利用指针,将单链表原地逆置;代码实现:/* struct ListNode {int val;struct ListNode *next;ListNode(int x) : val(x), next(NULL) {}};*/class So...
2019-04-08 21:22:15 2078 1
原创 c++(练习题)————合并单链表(输入两个单调递增的链表,输出两个链表合成后的链表)
题目描述:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。题目分析:两个递增的单链表结点,用类似于插入排序的方法,找到单链表1结点在单链表2中合适的位置,然后插入。代码实现:/*struct ListNode {int val;struct ListNode *next;ListNode(int x) : val(x),...
2019-04-08 20:57:31 745
原创 c++(练习题)————构建二叉树(给出二叉树的前序遍历和中序遍历的结果,请重建出该二叉树)
题目描述:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。题目分析:1、由题目可知,用前序序列和中序序列来确定出二叉树的结构;2、前序序列的第一个结点一定为根节点,所以在中序序列中,此根节点的左边都在二叉...
2019-04-08 20:52:01 366
原创 排序算法————简单选择排序、堆排序
一、简单选择排序:1、算法描述:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始(末尾)位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾(开头)。以此类推,直到所有元素均排序完毕。2、算法步骤:1、取出第一个元素(i=0),假设它是最小值;2、用它和待排序列中所有元素(i+1~n)比较,找出最小值,放在第一个元素的位置(i),则第一个元素有...
2019-03-17 22:18:21 406
原创 排序算法————冒泡排序、快速排序
一、冒泡排序:1、算法思想:冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。2、算法步骤:1、比较相邻的元素。如果第一个比第二个大,就交换它们两个;2、对每一对相邻元素作同样的工...
2019-03-17 20:05:30 374
原创 排序算法————插入排序、希尔排序
一、插入排序:直接插入排序的基本原理是,通过构建有序列,对于未排序数据,在已排序序列中从后往前扫描,找到相应为位置并插入。1、算法思想:1、从第一个元素开始,假设该元素已被排序;2、取出下一个元素,在已排序的元素序列中从后向前扫描;3、如果小于前一个有序元素,则将有序元素后移一位,重复此步,直到大于等于前一个有序元素为止;如果大于,则该元素位置不变;4、重复2-3步,直到整组数据...
2019-03-17 19:02:13 240
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人