自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(80)
  • 收藏
  • 关注

原创 goroutine 调度

Go 的调度器模型一开始是一个简单的模型:G-M 模型,后来因为性能的问题被弃用了,现在的调度器模型是 G-P-M 模型。

2022-08-04 18:55:01 411 9

原创 数据结构——跳跃表

跳跃表介绍跳跃表(skiplist)是一种随机化的数据结构,是一种可以与平衡树媲美的层次化链表结构——查找、删除、添加等操作都可以在对数期望时间下完成,以下是一个典型的跳跃表例子:到底有多随机,我们看了原理就知道了。跳跃表原理这里借助(1条消息) 跳跃表的原理和实现(Java)_CoderLucas的博客-CSDN博客_跳跃表原理和实现 中的图来讲解。查找假设当前我们要查找 39,我们要先从 head (第一层的第一个元素)开始查找:39 > 负无穷,继续往后查找39 >

2022-05-24 18:51:03 1237 36

原创 C语言可变参数

可变参数可变参数顾名思义,就是函数参数列表的参数数量是可变的,我们常见的使用可变参数的函数有 scanf 和 printf可变参数的使用我们先看一个带有可变参数的函数:void func(int num, ...){ ;}第一个参数 num 还是一个固定参数,后面的 ... 就表示可变参数。通常来说,我们需要在传参时传一个固定参数,来标识可变参数的个数,这对我们使用可变参数的宏是很重要的。下面是使用可变参数的几个相关宏:typedef char * va_list; // 可变参

2022-05-10 09:30:47 438 12

原创 Reactor 和 Proactor 模式

文章目录服务器框架Reactor模式Proactor 模式模拟 Proactor 模式同步 IO 模型通常用来实现 Reactor 模式,异步 IO 模型通常用来实现 Proactor 模型服务器框架首先我们了解一下服务器的基本框架:I/O 处理单元是服务器管理客户连接的模块。它通常完成以下工作:等待并接受新的客户连接,接受客户数据,将服务器响应的数据返回给客户端。但数据的收发也不一定是由 I/O 处理单元完成的,也有可能是逻辑单元完成的,这取决于事件处理模式(Reactor 还是 Proacto

2022-05-06 09:25:47 818 20

原创 DNS域名解析过程

DNS域名解析过程首先我们知道,DNS协议是用来完成域名到 IP 地址的转换的。DNS 服务器大致分为三种类型:根域名服务器、顶级域名服务器(Top-Level Domain, TLD)以及权威 DNS 服务器。这些服务器的关系如下如所示:那么这些服务器是怎么共同协作的呢?比如我们现在要访问一个域名 www.amazon.com,首先我们的浏览器会使用 DNS 协议来获取该域名对应的 IP 地址。该过程大概如下:我们的主机上运行着 DNS 客户端,客户端首先与根域名服务器之一联系,期望获取.c

2022-04-30 22:44:14 1571 16

原创 静态链接与动态链接

文章目录静态链接动态链接说起静态链接和动态链接,大家肯定都不陌生。静态链接与动态链接的差别顾名思义,动态链接使动态库中的函数在程序运行后,才被用到;而静态链接则在运行前,就将所需函数合并了。我们来看看两者在 Linux 下的定义:静态链接静态链接:Linux 下的静态链接器(static linker)以一组可重定位目标文件和命令行参数作为输人,生成一个完全链接的、可以加载和运行的可执行目标文件作为输出。所有的编译系统都提供一种机制,将所有相关的目标模块打包成为一个单独的文件,称为静态库(stat

2022-04-19 19:08:14 2527 20

原创 在多文件中C语言中全局变量的重定义

首先我们看一下下面这两个代码:test.c 中:test1.c中:此时我们编译并运行:编译通过,并且打印出了10,这是为什么呢?这就涉及到了链接器解析多重定义的全局符号了。Linux 链接器处理多重定义的符号的规则上述结果是我们在 VS2019下测试的, Linux 链接器处理多重定义的符号的规则为:不允许有多个同名的强符号如果有一个强符号和多个弱符号同名,选择强符号如果有多个弱符号同名,则从这些弱符号中随机选择一个首先,什么是强符号,什么是弱符号?强符号:函数和已初始化的全

2022-04-18 13:05:40 2931 28

原创 C++智能指针

为什么需要智能指针?下面我们先分析一下下面这段程序有没有什么内存方面的问题?提示一下:注意分析MergeSort函数中的问题#include <vector>void _MergeSort(int* a, int left, int right, int* tmp){ if (left >= right) return; int mid = left + ((right - left) >> 1); // [left, mid] // [mid+1,

2022-02-22 09:38:36 131 15

原创 C++11的新鲜事儿~

C++11简介在2003年C++标准委员会曾经提交了一份技术勘误表(简称TC1),使得C++03这个名字已经取代了C++98称为C++11之前的最新C++标准名称。不过由于TC1主要是对C++98标准中的漏洞进行修复,语言的核心部分则没有改动,因此人们习惯性的把两个标准合并称为C++98/03标准。从C++0x到C++11,C++标准10年磨一剑, 第二个真正意义上的标准珊珊来迟。相比于C++98/03,C++11则带来了数量可观的变化,其中包含了约140个新特性,以及对C++03标准中约600个缺陷的

2022-02-20 10:20:53 452 13

原创 TCP/IP协议簇之数据链路层

文章目录数据链路层认识以太网以太网帧格式认识MAC地址对比理解MAC地址和IP地址认识MTUMTU对IP协议的影响MTU对UDP协议的影响MTU对于TCP协议的影响查看硬件地址和MTUARP协议ARP协议的作用ARP协议的工作流程ARP数据报的格式数据链路层用于两个设备(同一种数据链路节点)之间进行传递.真正实现“跳”是由数据链路层完成的。认识以太网“以太网” 不是一种具体的网络, 而是一种技术标准; 既包含了数据链路层的内容, 也包含了一些物理层的内容. 例如: 规定了网络拓扑结构, 访问控

2022-02-18 10:10:54 1454 17

原创 TCP/IP协议簇之网络层

文章目录网络层IP协议基本概念协议头格式IP中的分片分片与组装的需求如何分片与组装路径MTU发现网段划分特殊的IP地址IP地址的数量限制私有IP地址和公网IP地址路由网络层在复杂的网络环境中确定一个合适的路径IP协议基本概念主机: 配有IP地址, 但是不进行路由控制的设备; 路由器: 即配有IP地址, 又能进行路由控制; 节点: 主机和路由器的统称;IP协议给通信双方提供了一种能力,从A主机将数据跨网络送到B主机的能力。但IP协议不保证可靠性,IP包丢了由上层的TCP重发。协议头格式I

2022-02-16 08:34:01 1121 16

原创 TCP/IP协议簇之传输层

文章目录传输层再谈端口号端口号范围划分认识知名端口号(Well-Know Port Number)两个问题netstatpidofUDP协议长链接与短链接UDP协议端格式UDP的特点面向数据报UDP的缓冲区UDP使用注意事项基于UDP的应用层协议TCP协议TCP协议段格式确认应答(ACK)机制超时重传机制连接管理机制如何理解链接?为什么一定要是三次握手?理解TIME_WAIT状态解决TIME_WAIT状态引起的bind失败的方法理解 CLOSE_WAIT 状态TCP以段为单位发送数据滑动窗口流量控制拥塞控制

2022-02-14 08:32:46 676 10

原创 TCP/IP协议簇之应用层

应用层我们程序员写的一个个解决我们实际问题, 满足我们日常需求的网络程序, 都是在应用层.再谈 “协议”协议是一种 “约定”. socket api的接口, 在读写数据时, 都是按 “字符串”(字符串描述不准确) 的方式来发送接收的. 如果我们要传输一些"结构化的数据" 怎么办呢?通过序列化与反序列化实现,我们发送数据至网络要进行序列化,将“结构化的数据”合为一个整体,网络发送数据给另一端接收时,要进行反序列化,将整体数据又转化为“结构化数据”。进行序列化的工具有json,xml网络版计算器例如

2022-02-12 09:31:39 953 24

原创 哈希应用及海量数据面试题

文章目录哈希的应用位图位图概念位图的实现位图的应用位图的优缺点布隆过滤器布隆过滤器提出布隆过滤器概念布隆过滤器的插入布隆过滤器的查找布隆过滤器实现(主要针对string类型)布隆过滤器删除布隆过滤器优点布隆过滤器缺陷海量数据面试题哈希切割位图应用布隆过滤器哈希的应用位图位图概念面试题给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。遍历,时间复杂度O(N)排序(O(NlogN)),利用二分查找: logN用set/unorder

2022-02-10 10:53:52 433 20

原创 哈希及unordered系列实现

unordered_map/unordered_set底层结构unordered系列的关联式容器之所以效率比较高,是因为其底层使用了哈希结构哈希概念顺序结构以及平衡树中,元素关键码与其存储位置之间没有对应的关系,因此在查找一个元素时,必须要经过关键码的多次比较。顺序查找时间复杂度为O(N),平衡树中为树的高度,即O( log2N),搜索的效率取决于搜索过程中元素的比较次数。理想的搜索方法:可以不经过任何比较,一次直接从表中得到要搜索的元素。 如果构造一种存储结构,通过某种函数(hashFunc)使元

2022-02-09 11:25:52 604 8

原创 unordered_map系列关联式容器

unordered系列关联式容器在C++98中,STL提供了底层为红黑树结构的一系列关联式容器,在查询时效率可达到O(log2N) ,即最差情况下需要比较红黑树的高度次,当树中的节点非常多时,查询效率也不理想。最好的查询是,进行很少的比较次数就能够将元素找到,因此在C++11中,STL又提供了4个unordered系列的关联式容器,这四个容器与红黑树结构的关联式容器使用方式基本类似,只是其底层结构不同,本文中只对unordered_map和unordered_set进行介绍,unordered_multi

2022-02-08 08:12:27 780 11

原创 AVL树的性质及插入实现

底层结构前面对map/multimap/set/multiset进行了简单的介绍,在其文档介绍中发现,这几个容器有个共同点是:其底层都是按照二叉搜索树来实现的,但是二叉搜索树有其自身的缺陷,假如往树中插入的元素有序或者接近有序,二叉搜索树就会退化成单支树,时间复杂度会退化成O(N),因此map、set等关联式容器的底层结构是对二叉树进行了平衡处理,即采用平衡树来实现AVL 树AVL树的概念二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中

2022-02-07 09:24:53 316 17

原创 map和set等关联式容器的使用

2022-02-05 09:01:19 240 15

原创 初识网络及socket编程基础

2022-02-04 10:35:32 2177 6

原创 二叉搜索树

二叉搜索树概念二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点的值它的左右子树也分别为二叉搜索树int a [] = {5,3,4,1,7,8,2,6,0,9};仔细观察这颗搜索二叉树,它的中序遍历实际上是构成一个升序的排序的,所以二叉搜索树也叫二叉排序树二叉搜索树操作二叉搜索树的查找二叉搜索树的插入插入的具体过程如下:树为空,则直

2022-02-03 14:50:57 2662 12

原创 C++多态

多态的概念概念多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态比如买票,不同的身份票价是不同的。多态分为静态的多态和动态的多态静态的多态就是函数重载,比如库提供的swap动态(运行时)的多态:a、派生类继承父类,完成虚函数的重写 b、基类的指针或者引用才能调用这个重写的虚函数基类的指针或引用指向基类对象,调用基类的虚函数基类的指针或引用指向派生类对象,调用派生类的虚函数效果:调用函数与对象有关,指向哪个对象就调用哪个虚函数多态的定义及实

2022-02-01 22:26:13 1621 6

原创 C++继承

继承的概念及定义继承的概念继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用class Person{public: void Print() { cout << "name:" << _name <&l

2022-01-31 14:42:34 797 14

原创 多线程(下)

Linux线程同步条件变量当一个线程互斥地访问某个变量时,它可能在其它线程改变状态之前,什么也做不了。例如一个线程访问队列时,发现队列为空,它只能等待,直到其它线程将一个节点添加到队列中。这种情况就需要用到条件变量。pthread库中,条件变量的类型是pthread_cond_t同步概念与竞态条件同步:在保证数据安全的前提下,让线程能够按照某种特定的顺序访问临界资源,从而有效避免饥饿问题,叫做同步竞态条件:因为时序问题而导致程序异常,我们称之为竞态条件。在线程场景下,这种问题也不难理解条

2022-01-28 15:45:15 895 9

原创 多线程(上)

文章目录Linux线程概念什么是线程线程的优点线程的缺点线程异常线程用途Linux进程VS线程进程和线程关于进程线程的问题Linux线程控制POSIX线程库创建线程进程ID和线程ID线程ID及进程地址空间布局线程等待 为什么需要线程等待?线程终止分离线程Linux线程互斥进程线程间的互斥相关背景概念互斥量mutex互斥量的接口初始化互斥量销毁互斥量mutex的理解互斥量实现原理探究可重入VS线程安全概念常见的线程不安全的情况常见的线程安全的情况常见不可重入的情况常见可重入的情况可重入与线程安全联系可重入与线

2022-01-25 08:39:54 1149 21

原创 进程信号——阻塞与捕捉信号

文章目录阻塞信号1.信号其他相关常见概念2.在内核中的表示总结信号从产生到递达3. sigset_t4. 信号集操作函数sigprocmasksigpending捕捉信号1. 内核如何实现信号的捕捉用户态和内核态的切换2. sigaction可重入函数volatileSIGCHLD信号阻塞信号1.信号其他相关常见概念实际执行信号的处理动作称为信号递达(Delivery)信号从产生到递达之间的状态,称为信号未决(Pending)进程可以选择阻塞 (Block )某个信号被阻塞的信号产生时将保持

2022-01-24 09:15:37 1513 14

原创 进程信号初识

文章目录信号入门1.生活角度的信号2. 技术应用角度的信号3.注意4. 信号概念5.用kill -l命令可以察看系统定义的信号列表6. 信号处理常见方式概览产生信号1.通过终端按键产生信号2. 调用系统函数向进程发信号3. 由软件条件产生信号4.硬件异常产生信号信号捕捉初识模拟一下野指针异常总结思考一下信号入门1.生活角度的信号你在网上买了很多件商品,再等待不同商品快递的到来。但即便快递没有到来,你也知道快递来临时,你该怎么处理快递。也就是你能“识别快递”当快递员到了你楼下,你也收到快递到来的

2022-01-23 09:13:52 339 16

原创 进程间通信——共享内存

system V共享内存共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据共享内存示意图理解:共享内存是物理内存中开辟给进行通信的进程之间的共享内存,这样一个进程向内存里写了什么,另一个进程就能马上看到,因为它们都把共享内存当成了自己应有的内存,所以能够进行通信,并且减少了拷贝次数。共享内存数据结构struct shmid_ds {struct ipc_perm shm_per

2022-01-22 19:56:46 328 8

原创 进程间通信——管道

文章目录进程间通信介绍进程间通信目的进程间通信发展进程间通信分类管道什么是管道匿名管道实例代码用fork来共享管道原理站在文件描述符角度-深度理解管道站在内核角度-管道本质管道读写规则命令行中的 `|` 管道中,进程间是兄弟关系管道特点命名管道创建一个命名管道匿名管道与命名管道的区别命名管道的打开规则用命名管道实现server&client通信进程间通信介绍进程间通信目的数据传输:一个进程需要将它的数据发送给另一个进程资源共享:多个进程之间共享同样的资源。通知事件:一个进程需要向另一个

2022-01-22 11:50:13 2581 27

原创 进程等待与程序替换

进程等待子进程被创建,谁先运行谁先退出?谁先运行,是由调度器说了算那谁先退出呢?一般来说,我们通常要让子进程先退出。因为父进程可以很容易对子进程进行管理(垃圾回收).子进程处理业务,需要让父进程帮我们拿到子进程执行的结果所以,一般子进程是需要被等待的,具体是被父进程等待进程等待必要性之前讲过,子进程退出,父进程如果不管不顾,就可能造成‘僵尸进程’的问题,进而造成内存泄漏。另外,进程一旦变成僵尸状态,那就刀枪不入,“杀人不眨眼”的kill -9 也无能为力,因为谁也没有办法杀死一个已

2022-01-21 08:00:00 409 14

原创 理解文件系统及动静态库

理解文件系统我们使用ls -l的时候看到的除了看到文件名,还看到了文件元数据[root@localhost linux]# ls -l总用量 12-rwxr-xr-x. 1 root root 7438 "9月 13 14:56" a.out-rw-r--r--. 1 root root 654 "9月 13 14:56" test.c每行包含7列:权限硬链接数文件所有者组大小最后修改时间文件名ls -l读取存储在磁盘上的文件信息,然后显示出来其实这个信息除了通过这

2022-01-20 19:03:37 1429 8

原创 Linux文件接口及文件描述符

系统文件I/O操作文件,除了C接口(当然,C++也有接口,其他语言也有),我们还可以采用系统接口来进行文件访问写文件:#include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>#include <string.h>int main(){ umask(0); int

2022-01-20 19:00:40 1089 6

原创 进程的创建与终止

文章目录进程创建fork函数初识fork函数返回值#fork为什么有两个返回值写时拷贝写时拷贝的触发如何理解子进程的创建fork常规用法fork调用失败的原因进程终止进程退出场景进程常见退出方法exit函数_exit函数exit和_exit的工作:return退出exit() vs return进程创建fork函数初识在linux中fork函数是非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。#include <unistd.h>pid_t fork(

2022-01-18 20:28:14 893 20

原创 初始进程2.0

文章目录进程优先级基本概念优先级 vs 权限(自己的理解)查看系统进程PRI and NI查看进程优先级的命令用top命令更改已存在进程的nice:进程相关的其他概念环境变量基本概念常见环境变量查看环境变量方法测试PATHHOMEUSERHISTSIZESHELL和环境变量相关的命令环境变量的组织方式通过代码如何获取环境变量通过系统调用获取环境变量 ——getenv环境变量通常是具有全局属性的程序地址空间研究背景程序地址空间进程地址空间那么为什么需要虚拟空间呢?管理地址空间先描述再组织进程重定义补充tas

2021-12-21 21:46:17 953 8

原创 初识进程1.0

文章目录进程基本概念描述进程-PCBtask_struct——PCB的一种task_ struct内容分类组织进程查看进程通过系统调用获取进程标示符通过系统调用创建进程-fork初识理解进程创建fork父子执行顺序,及代码和数据复制的问题fork为什么有两个返回值进程状态看看Linux内核源代码怎么说进程状态查看Z(zombie)-僵尸进程僵尸进程危害孤儿进程进程基本概念课本概念:程序的一个执行实例,正在执行的程序等内核观点:担当分配系统资源(CPU时间,内存)的实体。自己的理解:程序

2021-12-21 21:32:07 368 6

原创 经典字符串匹配算法——KMP算法

KMP算法KMP算法是一种高效的字符串匹配算法,在传统暴力遍历匹配的基础上做了一定的优化。首先KMP算法的实现也是使用了回退思想,不过与暴力遍历不同,KMP的回退,是让子串进行匹配,而不是主串。KMP示例首先我们来看两个例子来理解KMP算法:例1:分别从str的i和sub的j位置处开始匹配:此时a与c不匹配,如果暴力遍历的话,是i回到到b,j也回到a,重新一轮匹配。而KMP算法,是将子串的j回到第二个a,str[i]与sub[j]重新开始匹配。原因很明显,第二个ab与第一个ab是相同的,因

2021-12-17 21:45:57 9250 42

原创 C++stack和queue及适配器的学习使用

文章目录stack的介绍和使用stack的介绍stack的使用stack的模拟实现queue的介绍和使用queue的介绍queue的使用queue的模拟实现priority_queue的介绍和使用priority_queue的介绍priority_queue的使用在OJ中的使用priority_queue的模拟实现容器适配器什么是适配器STL标准库中stack和queue的底层结构deque的简单介绍deque的原理介绍deque的缺陷为什么选择deque作为stack和queue的底层默认容器STL标准库

2021-11-26 20:49:13 503 28

原创 Linux开发工具使用

文章目录Linux编译器-gcc/g++使用背景知识gcc如何完成预处理(进行宏替换)编译(生成汇编)汇编(生成机器可识别代码)链接(生成可执行文件或库文件)函数库静态函数库与动态函数库gcc选项Linux调试器-gdb使用背景使用Linux项目自动化构建工具-make/Makefile背景实例代码依赖关系依赖方法原理项目清理多文件的make以及makefileLinux编译器-gcc/g++使用背景知识预处理(进行宏替换)编译(生成汇编)汇编(生成机器可识别代码)连接(生成可执行文件或库文

2021-11-14 09:08:10 3063 33

原创 C++list

文章目录list的介绍及使用list的介绍list的使用list的构造list iterator的使用list capacitylist element accesslist sortlist modifierslist的迭代器失效list的模拟实现模拟实现list对模拟的list进行测试list的介绍及使用list的介绍list的文档介绍list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。list的底层是双向链表结构,双向链表中每个元素存储在互不相关的

2021-11-12 20:46:10 1372 16

原创 C++vector

文章目录vector的介绍及使用vector的介绍vector的使用vector的定义vector的遍历vector iterator 的使用vector 空间增长问题vector 增删查改vector 迭代器失效问题vector 在OJ中的使用vector深度剖析及模拟实现模拟实现vector使用memcpy拷贝问题对vector核心接口的测试vector的介绍及使用vector的介绍vector的文档介绍 vector是表示可变大小数组的序列容器。就像数组一样,vector也采用的连续存

2021-11-09 21:22:21 2068 7

原创 Linux权限

文章目录Linux权限的概念Linux权限管理文件访问者的分类(人)文件类型和访问权限(事物属性)文件权限值的表示方法1)字符表示方法2)8进制数值表示方法文件访问权限的相关设置方法a)chmodb)chown关于sudoc)chgrpd)umaskfile指令:目录的权限粘滞位关于权限的总结Linux权限的概念Linux下有两种用户:超级用户(root)、普通用户。超级用户:可以再linux系统下做任何事情,不受限制普通用户:在linux下做有限的事情。超级用户的命令提示符是“#”,普通用户的命

2021-11-06 11:15:47 717 9

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除