自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 hexo+github搭建个人blog,欢迎探讨哈!

2021.3.4日一直就想搭建一个自己的网站,毕竟总是看到大佬们的,萌生了这个想法。地址:www.lienguang.com搭建很简单,基于hexo+github,读者可以自行百度,教程很多。就是主题配置改起来有点复杂,如果有问题欢迎和我探讨哈。建议使用vscode,各种格式文档都可写,什么后缀js、md都没问题,方便很。后期写文章的话,用markdown写好,直接放到vscode就能看到。管理网站只需用那个git bash就可,几句命令的事。网上教程实在太多了!域名的话,腾讯云、阿里云、华

2021-03-06 22:54:42 35

原创 【操作系统原理】学习笔记-进程相关

进程和线程进程什么是进程  在操作系统中,操作系统需要对各种资源进行管理,大概可以分为以下几类:内存,文件,磁盘,进程。所谓进程就是操作系统有序管理应用程序的执行的方式,来保证以下几点:  1、所有资源对多个应用程序是可用的。  2、物理处理器在多个应用程序中切换,保证所有程序都在执行中。  3、处理器和I/O设备都能得到充分的利用。  因此所有现代操作系统都依赖于一个模型,在该模型中,一个应用程序对应一个或多个进程。进程的定义有以下几条:  1、一个正在执行的程序。  2、一个正在计算机

2021-02-22 14:00:38 1050 5

原创 【Linux系列】进程PCB控制管理详解

进程概念1.什么是进程2.PCB3.进程查看4.进程创建5.进程状态6.进程优先级7.环境变量8.程序地址空间1.什么是进程进程:进行中的程序。是操作系统分配资源的基本单位,计算机系统通过一个叫进程控制块的东西进行描述和组织一个个进程,也就是task_struct结构体,简称PCB。而在Linux上PCB是一个结构体,这个结构体中保存着一个个进程的信息。因此对于操作系统来说一个PCB就是一个进程,系统在管理进程实际上就是在管理一个个PCB,这是系统管理进程的媒介。2.PCB一般情况下,PCB中包含4

2020-12-31 17:09:24 790

原创 【Linux系列】线程控制管理、线程安全-同步与互斥

Linux下的多线程一、线程的概念1.什么是线程?线程就是进程中的一条执行流,是cpu调度的基本单位(而进程是cpu资源分配的基本单位),在linux下是一个轻量级进程。linux下的线程是通过pcb实现,是程序运行的动态描述,通过这个描述 操作系统实现程序运行的调度,一个进程中可以有多个线程,这些线程共享进程中大部分资源,相较于传统pcb更加轻量化,因此也成为轻量级进程。2.线程的独有与共享线程共享的环境包括:进程虚拟地址空间(利用这些共享的数据,线程很容易的实现相互之间的通讯)、进程打开的文

2020-11-25 18:29:40 722

原创 【Linux系列】进程间通信方式-共享内存、消息队列、信号量

进程间通信(二)——共享内存,消息队列,信号量共享内存消息队列信号量

2020-11-17 18:23:49 771

原创 【Linux系列】进程间通信方式-管道详解

进程间通信(一)简而言之就是操作系统为上层提供的进程间通信的方式为什么要操作系统提供呢?每个进程具有独立性,每个进程访问的都是自己的虚拟地址空间的虚拟地址因此需要操作系统提供一个进程间都可访问的区域来实现通信因为应用场景不同,因此提供的方式也多种多样文章目录进程间通信(一)管道1. 匿名管道2.管道的特性3.命名管道4.命名管道的特性管道管道 :用于实现进程间的数据传输功能本质就是内核中的一块缓冲区管道的种类 :匿名管道和命名管道1. 匿名管道:概念:在内核中申请一块固定

2020-11-14 19:36:04 910

原创 【MySQL系列】表的常见约束

数据库约束真正约束字段的是数据类型,但是数据类型约束很单一,需要有一些额外的约束,更好的保证数据的合法性,从业务逻辑角度保证数据的正确性。主要介绍以下几个:NOT NULL(非空约束) - 指示某列不能存储 NULL 值。UNIQUE(唯一约束) - 保证某列的每行必须有唯一的值。DEFAULT(缺省约束) - 规定没有给列赋值时的默认值。PRIMARY KEY(主键约束) - NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中

2021-07-31 23:56:23 14

原创 【MySQL系列】入门:安装与配置

CentOS 通过 yum 安装 MariaDB安装以下操作都以 root 用户进行操作安装 mariadb 服务yum install -y mariadb-server安装 mariadb 命令行客户端yum install -y mariadb安装 mariadb C libraryyum install -y mariadb-libs安装 mariadb 开发包yum install -y mariadb-devel更改配置更改 /etc/my.cnf.d/

2021-07-30 22:00:19 18

原创 Cmake学习记录

Cmake学习笔记cmake 是 makefile 的上层工具,它们的目的正是为了产生可移植的makefile,并简化自己动手写makefile时的巨大工作量.c/c++ 项目工程部署如上:src : 源码工程目录ext : 第三方依赖库文件与头文件CMakeLists.txt : cmake 构建配置文件简单案例源文件编写 : src/main.cc#include <iostream>int main() { std::cout << "Hel

2021-04-16 16:30:37 9

原创 【C++系列】lambda表达式的使用

sort中的比较器std::sort方法,默认是升序也就是less比较器,传入greater也就是降序。#include <algorithm>#include <functional>using namespace std;int main(){ int array[] = { 4,1,8,5,3,7,0,9,2,6 }; // 默认按照小于比较,排出来结果是升序 std::sort(array, array + sizeof(array) / sizeof(

2021-04-03 21:51:08 30

原创 简单探究一下 HTTP2.0版本对于1.1版本的改进

HTTP/1.1 相比 HTTP/1.0 性能上的改进:使用 TCP 长连接的方式改善了 HTTP/1.0 短连接造成的性能开销。支持管道(pipeline)网络传输,只要第一个请求发出去了,不必等其回来,就可以发第二个请求出去,可以减少整体的响应时间。但 HTTP/1.1 还是有性能瓶颈:请求 / 响应头部(Header)未经压缩就发送,首部信息越多延迟越大。只能压缩 Body 的部分;发送冗长的首部。每次互相发送相同的首部造成的浪费较多;服务器是按请求的顺序响应的,如果服务器响应慢,会

2021-04-02 22:37:45 44 1

原创 深入探讨HTTP的1.1版本:还有哪些优化手段?

早期 HTTP/1.0 性能上的一个很大的问题,那就是每发起一个请求,都要新建一次 TCP 连接(三次握手),而且是串行请求,做了无谓的 TCP 连接建立和断开,增加了通信开销。为了解决上述 TCP 连接问题,HTTP/1.1 提出了长连接的通信方式,也叫持久连接。这种方式的好处在于减少了 TCP 连接的重复建立和断开所造成的额外开销,减轻了服务器端的负载。HTTP1.1支持管道网络传输,在同一个 TCP 连接里面,客户端可以发起多个请求当顺序发送的请求序列中的一个请求因为某种原因被阻塞时,在后面排

2021-04-02 22:12:12 43

原创 【题目记录】巧妙解决 二进制中1的个数

题目链接输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。方法一:二进制移位法让一个数0x01从右向左与val的每一位进行&操作来判断class Solution {public: int NumberOf1(int n) { int ans = 0; int mark = 0x01; while (mark != 0) { if (mark & n) ++ans;

2021-03-29 16:32:29 12

原创 【算法题记录】实现一下 Pow(x, n)

实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,x的n次方)。示例 1:输入:x = 2.00000, n = 10输出:1024.00000示例 2:输入:x = 2.10000, n = 3输出:9.26100示例 3:输入:x = 2.00000, n = -2输出:0.25000解释:2-2 = 1/22 = 1/4 = 0.25暴力是会超时的,这个过不了double myPow(double x, int n) { double tmp=1;

2021-03-28 00:20:13 11

原创 编译的整个过程:预编译、编译、汇编、链接

预处理, 展开头文件/宏替换/去掉注释/条件编译 (test.i main .i)编译, 检查语法,生成汇编 ( test.s main .s)汇编, 汇编代码转换机器码 (test.o main.o)链接 链接到一起生成可.

2021-03-24 19:35:31 47 1

原创 哈希索引、B+树索引(聚集,非聚集,联合,覆盖)

在数据库中,表、数据、索引之间的关系就类似于书籍、书籍内容、书籍目录。什么是索引倘若不使用索引,则MySQL必须遍历整个表,直到找到数据,而表越大,查询的时间则越长,则数据库的效率也就越低。而索引就类似于书籍的目录,可以帮助我们快速的定位、检索到需要的数据行,对提高数据库的性能有着很大的帮助。索引优缺点与适用场景优点大大加快了数据检索的速度所有的列类型都可以被索引,也就是可以给任意字段设置索引缺点索引需要占用物理空间,建立的索引越多则需要的空间越大创建和维护索引需要耗费时间,并

2021-03-24 18:15:17 74 2

原创 【网络】再谈Socket模型与TCP的连接管理

Socket 模型服务器端服务器端和客户端首先创建socket,服务器调用bind,绑定指定端口和IP。绑定端口主要是为了内核收到数据包知道交给哪个进程,绑定IP主要是因为机器可能有多个网卡,需要选择监听哪个网卡。然后服务器调用listen,将套接字转成被动套接字。接下来服务器就阻塞在accept等待客户端的请求到来。客户端客户端调用完socket后,就需要调用connect向服务器发起连接请求。其中,发起connect,就是主动发起三次握手,三次握手完成。客户端和服务器随

2021-03-17 23:37:41 34

原创 【Linux系列】多路复用IO,从底层理解select

网络数据是怎么接收到的网卡收到网线传送过来的数据,经过硬件电路传送到内存,将数据写在内存的某个地址中。网卡将数据写入内存后,网卡产生一个中断,通过总线把电信号发送给中断控制器。中断控制器把中断发送给处理器,也就是通过电信号给处理器特定的管脚发送一个高电平。处理器立即停止它正在做的事,然后跳转到内存中预定义的位置开始执行那里的代码,这个预定义的位置由内核设置的,是中断处理程序的入口点。对于每个中断线,处理器会跳到对应的一个唯一的位置,这样,内核就知道接收中断的IRQ号,然后调用函数do_IRQ(),

2021-03-16 15:31:47 51

原创 【Linux系列】从本质上理解五种IO模型的区别

IO模型输入操作通常包括两个不同的阶段:(1)等待数据准备好;(2)从内核向进程复制数据。对于一个套接字上的输入操作,第一步通常涉及等待数据从网络中到达。当所等待分组到达时,它被复制到内核中的某个缓冲区。第二步就是把数据从内核缓冲区复制到应用进程缓冲区。根据各自的特性不同,IO模型被分为阻塞IO、非阻塞IO、信号驱动IO、异步IO、多路复用IO五类。最主要的两个区别就是阻塞与非阻塞,同步与异步。阻塞与非阻塞阻塞与非阻塞最主要的区别就是程序在等待调用结果时的状态。阻塞:为了完成一个功能发起调

2021-03-16 14:50:58 16

原创 【UNIX环境高级编程】—《文件IO》读书笔记

【UNIX环境高级编程】——《文件IO》读书笔记UNIX环境下的文件共享文件描述符用来表征一个文件,但是为什么操作系统要用这么一个整数来表征一个文件呢?这就操作系统底层实现有莫大的关系。  在进程PCB中有着这么一个部分,IO状态信息,说的再具体点,在PCB中存在着一张表,我们可以叫它文件描述符表也可以叫做打开文件描述符表,这张表每个进程都会有且为进程独有,所以它是进程级的。这张表上的每一个表项都有两个部分组成,文件描述符标志以及一个文件指针。其中文件描述符标志也就是我们所使用的文件描述符fd,当然我

2021-03-16 00:06:59 6

原创 【Linux系列】深入理解task_struct结构体

什么是进程进程是分配系统资源的单位。当一个程序被加载到内存之后并为他分配一个PCB(进程控制块),这时候就称为进程了。在linux中PCB就是一个名字叫做task_struct的结构体,我们叫他”进程描述符”。它里面有进程执行的所有信息,所以CPU对task_struct进行管理就相当于在对进程进行管理。PCB叫做进程控制块,它用来维护进程相关的信息,每个进程都有一个PCB。task_structtask_struct是Linux内核的一种数据结构,它会被装载到RAM里并包含进程的信息。每个进程都把它

2021-03-15 14:34:29 43

原创 C++/Linux 知识学习框图总结

2021-03-14 22:53:50 14

原创 一致性哈希算法 consistent hashing

一致性哈希算法 consistent hashing在了解一致性哈希算法之前,最好先了解一下缓存中的一个应用场景,了解了这个应用场景之后,再来理解一致性哈希算法,就容易多了,也更能体现出一致性哈希算法的优点,那么,我们先来描述一下这个经典的分布式缓存的应用场景。场景描述假设,我们有三台缓存服务器,用于缓存图片,我们为这三台缓存服务器编号为0号、1号、2号,现在,有3万张图片需要缓存,我们希望这些图片被均匀的缓存到这3台服务器上,以便它们能够分摊缓存的压力。也就是说,我们希望每台服务器能够缓存1万张左右

2021-03-14 12:14:53 15

原创 位图与布隆过滤器的原理及实现

位图在谈什么是位图之前我们先来看一道"非常简单的题":有40亿个无符号的整型数据,现在给定一个目标数字,判断这个数字是否在这40亿数据中。遍历,时间复杂度O(N)排序(O(NlogN)),利用二分查找: logN位图解决数据是否在给定的整形数据中,结果是在或者不在,刚好是两种状态,那么可以使用一个二进制比特位来代表数据是否存在的信息,如果二进制比特位为1,代表存在,为0代表不存在。比如:位图的实现class Bitmap{public: Bitmap(size_t range)

2021-03-13 22:07:05 56

原创 还不会哈希吗?快进来一探究竟

Hash目录一. 无序系列关联式容器1. 对比2. unordered_map3. unordered_set4.小总结二. 哈希表1. 哈希函数直接定址法除留余数法平方取中法2. 哈希冲突闭散列闭散列的模拟实现开散列三. 模拟实现1. 模板参数列表2. 迭代器,哈希表的实现3. 无序的map实现4. 无序的 set 实现四. 应用1. 位图2. 布隆过滤器3. 哈希切割一. 无序系列关联式容器1. 对比什么是unordered系列unordered系列的关联式容器有unordered-map/un

2021-03-12 18:27:57 1954 7

原创 经典面试题:你能讲讲class与struct的区别吗?

首先比较一下C中的结构体和C++中的结构体区别C++中的struct是对C中的struct进行了扩充,所以增加了很多功能,主要的区别如下图所示:上面罗列了在声明时的区别,在使用的过程中也有区别:在C中使用结构体时需要加上struct,或者对结构体使用typedef取别名,而C++可直接使用,例如:结构体声明,C和C++使用同一个struct Student{ int iAgeNum; string strName;}typedef struct Student Student2;//

2021-03-10 14:39:18 31 1

原创 【Linux系列】再谈僵尸进程的产生与避免

僵尸进程是怎么产生的首先内核会释放终止进程(调用了exit系统调用)所使用的所有存储区,关闭所有打开的文件等,但内核为每个终止子进程保存了一定量的信息。这些信息至少包括进程ID,进程的终止状态,以及该进程使用的CPU时间。所以当终止子进程的父进程调用wait或waitpid时就可以得到这些信息。一个进程执行了exit系统调用退出,其父进程并没有为它收尸(调用wait或waitpid来获得它的结束状态),另外子进程退出的时候会向其父进程发送SIGCHLD信号,父进程默认忽略SIGCHLD信号不进行处理,那

2021-03-09 20:22:59 45

原创 【Linux系列】硬核图解多路IO复用-select、poll、epoll

多路IO复用select函数函数参数详解poll函数函数参数详解epoll函数epoll函数三部曲形参详解select、poll、epoll函数的优缺点select函数函数参数详解#include <sys/select.h>int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout);1.形参(后四个参数均是输入输出型参数):①nfds:被监听的

2021-02-26 21:41:35 51

原创 【牛客刷题系列】二分查找常见面试题总结

题目描述在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。示例1输入 7,[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]返回值 true实现方法1.暴力搜索:时间复杂度O(n^2),直接全部遍历,因为最坏情况下,数组中的元素都需要遍历一次class Solution {public: bool

2021-02-24 20:07:06 38

原创 【牛客刷题系列】栈和队列常见面试题总结

题目描述用两个栈来实现一个队列, 完成队列的Push和Pop操作 队列中的元素为int类型链接:题目牛客链接思路因为栈是后进先出,而队列是先进先出,因此,如果想把入了一个栈(1号栈)的元素按照队列那样先出最前面的元素,就要借助另一个栈(2号栈),先把1号栈的所有元素全部导入到2号栈,pop的时候就出2号栈的元素,这样就实现了队列。可以这样做,首先1号、2号全部为空的入队的操作全部在1号完成,就比如入栈 数字1、2、3如果出队,肯定先出的是1,就要先把1号里的全部导入到2号,也就是数字3先出

2021-02-24 18:43:47 30

原创 【牛客刷题系列】链表常见笔试题总结

题目描述输入一个链表,反转链表后,输出新链表的表头示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL牛客——反转链表实现思路class Solution {public: ListNode* ReverseList(ListNode* pHead) { ListNode* newhead=nullptr; ListNode* tmp=nullpt

2021-02-23 23:15:28 60

原创 【排序算法系列】常见排序算法总结,复杂度分析

快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其基本思想为:任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后最左右子序列重复该过程(递归的过程),直到所有元素都排列在相应位置上为止。实现原理void quicksort(int begin,int end){ if (begin >= end) //只有一个元素 return; //划分当前区间 int pos=pa

2021-02-22 22:18:22 40

原创 【操作系统原理】学习笔记-线程相关

多线程多线程是指操作系统允许在单个进程内有多个并发执行路径,一个并发执行路径又被成为一个线程。早期各个版本的操作系统他们支持多用户进程,即允许一个任务内拥有多个进程进行并发处理,但是每个进程内部只允许有一条执行路径,也就是只允许拥有一个线程,而如今的现代操作系统中绝大多数操作系统支持多线程方法,其中的差别可用下图表示:在多线程的基础上程序并发将会更容易实现,因为线程是一个轻量级进程因此切换和调度的消耗会更少,并且同一进程内的线程之间共享虚拟地址空间,因此通讯会更加方便。在多线程环境中,进程定义为资源分

2021-02-22 21:45:24 47

原创 【C++系列】C++11语法新特性,快来get一下

初始化列表如何使用  在Cpp11中允许使用初始化列表初始化任何类型,不论是内置类型还是自定义类型都可以使用初始化列表进行初始化,而在Cpp98的版本中是不能初始化自定义类型的。#include <iostream>#include <vector>class Test{public: Test(int a, int b) :_a(a) ,_b(b) { } void Print() {

2021-02-22 00:31:00 103

原创 【网络系列】图文并茂解释网络层-IP、ARP、ICMP、DNS协议

网络层功能网络层主要负责地址管理以及路由选择。在网络中我们从一个ip到另一个ip有很多条路可以走,而网络层则是帮我们规划我们传输数据的最佳路线。ip协议协议字段  1、4位版本:当前的协议是IPV4还是IPV6,由socket创建时传入的地址域决定。  2、4位首部长度:决定了头部有多长,以4个字节为单位。  3、8位服务类型:3位优先权字段(已弃用),1位保留字段必须置0,4位TOS字段分别表示最小延时,最大吞吐量,最高可靠性,最小成本。这四者互相冲突,只能选择一个,根据场景选用合理的服务类型

2021-02-19 22:33:07 178

原创 【C++系列】C++中的异常处理机制

传统C中处理错误的方式以往我们在写C语言程序时,当用户的错误输入或者非期望结果发生时我们的程序有可能就会开始不正确的走向,此时我们为了程序的可靠性和健壮性往往需要对结果进行判断,并且防止一些非预期行为的发生。在C语言中我们程序在发生错误时我们往往会通过以下几种方式来阻止程序继续向错误方向执行,并且向外返回错误。1.返回错误码  返回错误码就是我们常说的返回值,每个函数都有一个返回值,我们可以返回一个整形数据来告知外部执行的函数发生了什么问题。可是这样的返回错误码的方式不便于使用,我们为了搞懂错误是什

2021-02-19 20:34:42 71 1

原创 【网络系列】TCP到底是怎么保证可靠性的?快来get一下!

TCP协议协议字段  1、16位源端口:标识数据从哪个进程来。  2、16位目的端口:标识数据到哪个进程去。  3、32位序号:用于进行包序管理。  4、32位确认序号:用于进行包序管理。  5、4位首部长度:用于描述头部信息长度,单位是4个字节。tcp协议头部长度最小为20字节,最大为当4位首部长度最大时即为15 * 4 = 60字节。  6、6位保留:用于保留下来存储新的属性和数据。  7、6位标志位:用于标志当前tcp信息的属性和类型,常见的有URG/ACK/PSH/RST/SYN/F

2021-02-08 22:00:44 102

原创 【设计模式】单例模式的两种实现以及特殊类的设计

实现单例模式单例模式是一种设计模式,在实战中经常会用到。其意思是创建一个类这个类只能唯一的创建一个对象,如果之后还想用这个类创建新对象的时候都会返回最开始创建的呢个对象。要实现这一点有两种思路,分别成为懒汉模式和饿汉模式。饿汉模式  饿汉模式是在程序启动时就夹在所有需要资源的设计模式,不涉及线程安全的问题,用这种思想实现单例模式时需要在程序一开始就直接声明对象,需要使用对象就返回对象即可。但是坏处是程序启动时会消耗时间可能会造成程序启动缓慢。以空间换时间的思想。成员变量静态化——资源共享;构造函数

2021-02-06 14:57:12 120 1

原创 【C++系列】内存管理-new与delete的使用以及实现原理

C++内存管理  在C语言中,我们想要动态分配内存空间需要使用到malloc,calloc,realloc函数,malloc函数申请空间失败返回指针空值,成功返回空间首地址。  在C++中我们同样有动态进行内存管理的方式,并且与C语言中的内存管理有着一些区别。new/delete  在C++中我们使用new进行内存的申请,用delete进行内存的释放。他们的使用比malloc和free更加简单方便。内置类型的内存分配与释放#include <iostream>using names

2021-02-06 14:39:05 222

原创 【网络系列】传输层协议UDP头部解析、网络通信编程实现

传输层协议传输层负责端与端之间的数据传输,其中典型协议为TCP协议和UDP协议。  TCP协议是TCP/IP协议栈中的传输层的典型协议,叫传输控制协议,面向连接,可靠传输,提供字节流服务。  UDP协议是TCP/IP协议栈中的传输层的典型协议,叫用户数据报协议,无连接,不可靠,提供数据报传输服务。UDP协议协议字段  协议字段都包含在UDP协议数据报的报头中,每次发送数据都会将这些信息和数据一起发出。  1、16位源端口:标识数据从哪个进程来。  2、16位目的端口:描述数据到哪个进程去。

2021-01-31 21:01:49 257

空空如也

空空如也

空空如也

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

TA关注的人 TA的粉丝

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