自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 mysql索引详解

索引简介索引是对数据库表中一列或多列的值进行排序的一种数据结构。其可以快速访问数据库表中的特定信息。索引一般以文件形式存在磁盘中(也可以存储在内存中),存储索引的原理即以空间换时间,数据库在未添加索引时是对表进行全局扫描,建立索引后,会将索引的key放在某种数据结构上(B树,B+树)索引的优缺点优点:建立索引的列可以保证行的唯一性,生成唯一的rowid建立索引可以有效的...

2020-03-20 21:41:33 168

原创 mysql查询执行过程

mysql的查询执行过程查询缓存在执行一个查询语句前,若查询缓存打开,则mysql会检查这个查询语句是否命中查询缓存中的数据。若命中,则在检查一次权限后,返回查询结果查询缓存实际是一个key-value形式的缓存,通过一个哈希索引作为key(通过查询语句本身等计算出来)查询缓存在对应表作了变化后就会被清空,例如,如果向A表中插入数据,则和A表相关的缓存全部被清空查询缓存可能也会影响性...

2020-03-20 21:40:47 173

原创 数据库范式

范式第一范式 :设计数据库时,数据库的列属性不可再分,即列属性只能有一种值。如果不满足则需要将列分解,但是在构建数据库时,一定是满足第一范式第二范式:非属性完全依赖于任何一个(候选)码,即完全依赖于主键依赖:若在一张表中,在属性(或属性组)X的值确定的情况下,必定能确定属性Y的值,那么就可以说Y函数依赖于X,即X->Y码,可以是一个属性列,也可以是一个属性列组,对于码K,假...

2020-03-20 21:40:16 215

原创 mysql中的MVCC

MVCC多版本控制,提高并发的一种技术,可以保证读读、读写、写读并发,只有写写阻塞。其实现可以通过乐观锁和悲观锁来实现,其中innodb的MVCC是通过版本号来实现,通过在每行记录后面保存两个隐藏的列来实现,具体实现见书。多版本控制一般用在读已提交和可重复读中,其保证了读读、读写、写读并发,但是写写则需要加锁阻塞,MVCC是一种乐观锁的实现方法MVCC最主要的作用即解决了读写重复,提供了并发...

2020-03-20 21:39:37 130

原创 数据库事务

事务什么是事务?Transaction 一个__最小__的,__不可再分__的工作单元。通常一个事务对应的是一个完整的业务。 例如银行转账语句而一个完整的业务需要批量的DML语句共同联合完成。事务只和DML语句有关系、或者说只有DML语句才有事务(insert 、update、delete)业务逻辑不同DML语句的个数也不同,具体多少条和具体的业务逻辑有关(可以是一...

2020-03-20 21:39:06 153

原创 数据库中的一些基本概念

键主键:主键是能够确定一条记录的唯一标识,其为一个属性或者一个属性组外键用于与另一张表的关联(即和另外一张表的主键相关联),是能够确定另外一张表记录的字段,用于保持数据的一致性主键和外键是把多个表组织成一个有效的关系数据库的粘合剂主键、外键和索引的区别?主键是唯一标识一条记录,不能够有重复,不允许为空,其用来保证数据的完整性,主键只能有一个外键是另外一个表的主键,在本表中外键是可...

2020-03-20 21:38:26 571

原创 muduo库学习笔记-IO模型

粘包问题 解决粘包问题最常见的方法是设计一个应用层的传输协议,在接收数据的时候根据协议来判定当前的请求是否已经接收完毕。只有长连接要考虑粘包问题。接收逻辑与线程池的异步IO 所谓线程池的异步IO是指将由IO线程负责收发数据,而让线程池来负责对收到的数据进行计算(包括对接收到的请求,进行数据库操作,或者进行磁盘操作,或者一些复杂的计算操作等),那么一般在什么时候将任务投...

2020-03-20 21:36:34 354

原创 muduo库学习笔记-如何保证数据成功发送

如何保证数据一定能够被发出去在网络编程中常常利用write将数据拷贝到内核的发送缓冲区,然后由协议将数据发送到对端,但是如何保证一次write能够将所有的数据都拷贝到内核缓冲区呢?如果还有数据没有被拷贝进去怎么办?如果拷贝的过程中内核缓冲区满了怎么办?如果拷贝的过程中write返回-1错误又怎么办?针对这些问题,muduo库都进行了解决。muduo是怎么发送数据的?muduo库并不是将所...

2020-03-20 21:35:24 544 1

原创 muduo库学习笔记-线程安全

muduo库的线程安全问题什么是线程安全 所谓线程安全是指凡是非共享的对象都是彼此独立的,如果一个对象从始至终只被一个线程用到,那么它就是安全的。共享的对象的read-only操作是安全的,前提是不能有并发的写操作。(如果有并发的写操作那么将会是线程不安全的),同样在多线程C++中还要注意多个线程如果都可以访问一个对象时的对象析构问题,所以对于这样的对象最好采取智能指针去管理。...

2020-03-20 21:34:25 424

原创 服务器开发中的错误处理与连接关闭-结合muduo库

服务器开发中的错误处理与连接关闭RST包和IO函数 收到RST包的情况 RST包即复位包,一般在连接发生错误的时候由传输层发送的一个包,R ST用来异常的关闭连接。发送RST包关闭连接时,不必等待缓冲区的数据都发出去(普通的close会先将发送缓冲区中的数据发送完毕后再发送fin包),直接就丢弃缓冲区的包发送RST包,而接收端收到RST后,也不必发送ACK确认。常见的收到RST包的情况有...

2020-03-20 21:33:20 618 2

原创 C++内联函数、宏定义、const类比

内联函数/宏定义/const先搞清楚普通函数的调用过程函数体被编译成对应的一段汇编代码,在符号表中会生成一个函数名指向这段代码的入口地址。所有调用此函数的地方都会被编译成CALL 函数名指令,然后连接时将函数名替换为函数的入口地址内联函数内联函数:即通过inline关键字将一个函数定义为内联函数,当编译器发现某段代码在调用一个内联函数时,其会将该函数的代码整段的插入到当前位置,这样的好处是...

2020-03-10 22:00:22 283

原创 C++智能指针

四大智能指针与RAIIhttps://blog.csdn.net/Ferlan/article/details/86513679RAII即用对象管理资源,在对象的生命周期内,该资源一直有效,当对象被析构时,相应的资源被释放。而智能指针就是基于这个原理,new关键字开辟的内存往往需要手动delete,一旦程序员忘记delete,则会造成内存泄漏,所以引用智能指针,通过智能指针对象来管理该指针,...

2020-03-10 21:59:34 987

原创 C++三大特性

封装继承和多态封装:隐藏实现细节,使得代码模块化,封装就是把过程和数据包装,将客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操纵,对其他信息隐藏。类继承是指C++提供来扩展和修改类的方法,类继承就是从已有的类中派生出新的类,派生类继承了基类的特性,同时可以添加自己的特性,继承又分为单一继承多重继承菱形继承多态是在具有继承关系的类对象中去调用某一虚函数时(使...

2020-03-10 21:57:56 780

原创 C++拷贝控制成员

拷贝控制成员C++中的拷贝控制成员包括:构造函数拷贝构造函数拷贝赋值运算符移动构造函数移动赋值运算符析构函数构造函数构造函数,又分为默认构造函数和自定义构造函数,其中默认构造函数包括:系统自动合成(没有构造函数时)无参构造函数全部带有默认实参的构造函数关于构造函数,这里重点介绍一下隐式类类型转换和显示的类类型转换如果一个构造函数只含有一个参数例如int a,则该...

2020-03-10 21:56:22 876 2

原创 STL总结

STL总结STL包括容器算法迭代器仿函数即函数对象,是一个能够行使函数功能的类,仿函数的语义和普通的函数调用一样,该类内部重载了函数调用运算符,仿函数一般是为了搭配STL算法使用,单独使用仿函数的情况较少,仿函数的好处在于可扩展性比函数指针强,当函数参数有所变化时,即无法兼容旧的代码,但是仿函数则不存在这种情况容器适配器空间配置器:即实现了动态空间配置、管理...

2020-03-10 21:55:32 117

原创 C++中类成员初始化规则

C++中类成员初始化规则类中成员(非静态成员)什么时候被初始化?关于初始化有哪些情况?成员变量在类实例化时被初始化,通过构造函数来进行初始化。关于初始化需要注意的地方有三点:变量在类中有初始值初始化成员列表构造函数类成员初始化的顺序如下:如果类中没有定义任何的构造函数,则编译器将采用合成的默认构造来初始化类中的成员如果成员在类中有初始值,则用此初始值进行初始化如果没有初...

2020-03-10 21:54:45 1117

原创 多线程交替打印题

线程的一些交替执行题目两个线程交替打印1-100使用两个条件变量、一个锁以及一个全局变量flag来实现两个条件变量分别等待flag变为false或者true,初始时flag为false所以初始时线程2会阻塞,当线程1执行后会修改flag为true并唤醒线程2,然后自己阻塞设置一个全局变量,每个线程打印后将其自增注意每个循环的次数为打印的次数#include<iostre...

2020-03-02 16:49:45 283

原创 操作系统-原子性与锁机制

原子性和锁机制所谓原子性和原子操作即一条或者一系列不可以被中断的指令原子性的保证:单核CPU如何保证指令的原子性?单核CPU下各个指令都是串行的,中断只会发生在一条指令执行完毕,那么自然每个指令都是原子的,如果想要实现单核CPU下多个指令的的原子操作,则可以通过关中断实现多核CPU如何保证指令的原子性?多核CPU下由于出现并发问题,所以多个核心可能同时读写同一个内存,所...

2020-03-02 16:48:41 2978

原创 操作系统-线程详解

线程基本知识线程是一种轻量级的进程,其被包含在进程之中,是进程中实际的运作单位,是调度和任务执行的基本单位进程和线程的区别?开销方面:每个进程都有独立的代码和数据空间,进程切换的开销大,线程是轻量级进程,同一个进程的线程共享代码和数据空间,每个线程有自己的栈和寄存器,线程切换的开销小所处环境:在操作系统中可以有多个进程同时执行,而在一个进程中可以有多个线程同时执行内存分配:系统在运行...

2020-03-02 16:48:04 327

原创 操作系统-进程详解

进程进程的基本概念:进程是程序的一次执行过程进程包括:进程控制块(PCB),程序段和数据段,其中PCB是进程存在的唯一标识,创建进程实际就是创建一个PCB,而销毁进程实际就是销毁PCBPCBPCB是一个结构体,在linux中为task_struct结构体,其中包括进程状态,进程标识信息(每个进程有一个唯一的标识符PID),优先级,定时器,寄存器,栈指针等,在linux中将进程控制块组织成一...

2020-03-02 16:46:53 544

原创 惊群现象

惊群所谓惊群即:多个进程/线程同时阻塞等待同一个事件的发生,如果这个事件发生,那么会唤醒所有进程/线程,但是却只有一个进程/线程会对该事件进行处理,那么其他唤醒的进程/线程会继续休眠阻塞,从而造成性能浪费,这种现象即为惊群。accept惊群最常见的即,服务器进程在listen后fork出多个子进程来阻塞accept客户端发起连接,当客户端发起连接时,所有子进程将被唤醒,但是实际上只有一个...

2020-03-02 16:45:39 486 1

原创 TCP异常与处理

TCP中出现的错误及处理首先要明确,TCP连接关闭有两种方法其一是正常的四次挥手,会经历多个状态,最后连接正常关闭,还有一种方法是连接异常关闭,即此时对方希望连接能够尽快关闭,发送RST包后连接会直接关闭,不会再出现上述的状态转换进程正常关闭/进程被杀死/服务器重启这三种情况下,服务器关闭套接字,并发起第一次挥手操作,客户端收到FIN包,并返回ack,此时连接处于半关闭状态,客户端并不知...

2020-03-02 16:44:41 2205

原创 socket网络编程-IO模型

IO模型同步/异步 阻塞/非阻塞阻塞:进程/线程需要访问的资源如果没有就位则进程/线程阻塞非阻塞:进程/线程需要访问的资源如果没有就位则进程/线程不会阻塞,而是继续执行,并会轮询看资源是否就位同步:同步是指当数据准备就绪后,需要主动读写数据,在读写数据的过程中还是会阻塞的异步:异步是指数据准备就绪后,会直接完成IO操作,并不需要去主动读写,由操作系统内核来完成数据的读写阻塞和非阻塞是针...

2020-03-02 16:44:02 463

原创 socket网络编程-epoll/select/poll

epoll/select/pollepollint epoll_create(int size);//这个参数被忽略,只要大于0就行了int epoll_ctl(int epfd, int op, int fd, struct epoll_event* event);int epoll_wait(int epfd, struct epoll_event* events, int maxev...

2020-03-02 16:43:30 199

原创 socket网络编程-常见的函数

几大函数socketint socket(int family, int type, int protocol);//成功则返回非0描述符,失败则返回-1family:表示协议族,IPV4表示AF_INETtype:表示套接字类型,TCP表示SOCK_STREAM,UDP为SOCK_DGRAMprotocol默认为0bindbind函数将一个本地协议地址赋予一个套接字int b...

2020-03-02 16:42:45 481

原创 ping和traceroute

PING和traceroutepingping实际作用是用来查询两个主机之间是否可达,具体过程如下:ping是基于ICMP协议的,首先构建ICMP请求报文(类型为0),IP层协议再以ICMP为数据部分构造IP数据包,如果两台主机在局域网内,则需要查询目的主机的mac地址(通过ARP协议查询),如果是在互联网中,则需要查询相应路由器的mac地址(通过ARP协议)查询到了相应mac地址后,构...

2020-03-02 16:40:44 399

原创 HTTP协议详解

HTTP协议基本概念http协议,即超文本传输协议,是一种应用层协议,其用于浏览器和web服务器之间的通信。http协议定义了客户端如何从web服务器获取web页面,以及服务器如何把web页面传送给客户端http请求的步骤建立TCP连接客户端发送请求服务器响应请求浏览器得到html代码,并解析浏览器请求html代码中的资源(js、css、图片等)浏览器对页面进行渲染呈现给用户...

2020-03-02 16:40:07 424

原创 UDP协议详解

UDP协议UDP即用户数据报协议,是一种无连接的传输层协议,提供面向消息的简单不可靠信息传送服务。报头UDP报头占用8个字节,分别是2个字节长的源和目的端口号,以及2个字节长的数据报长度和2个字节长的校验和UDP和TCP的校验和都是基于包头和数据本身,UDP在计算校验和时会加上12字节的伪头部(包含IP的数据包的信息)TCP和UDP的区别TCP面向连接,UDP无连接,即发送数据之前不...

2020-03-02 16:39:23 857

原创 TCP协议详解

TCP协议传输控制协议,是一种面向连接的、可靠的字节流服务。使用TCP协议通信前需要先建立通信连接,通信双方通过三次握手建立连接,通信结束通过四次挥手释放连接。TCP协议是一个可靠的传输协议,其可靠性体现在检验和、序列号、确认应答机制、超时重传机制、连接管理机制、流量控制、拥塞控制TCP首部TCP首部在没有任何选项的情况下是20字节,其中包括源端口号、目的端口号、序号、确认号、首部长度、6位...

2020-03-02 16:33:55 615

原创 网络编程中的大端和小端

主机字节序主机字节序是指字节序在内存中保存的顺序,这个叫做主机字节序,常见的存储方式分为大端模式和小端模式。两者的区别在于前者将大端(高位字节)存放在低位地址中,而将小端(地位字节)存放在高位地址中;后者则恰好相反。什么是高位字节和低位字节呢?以0x12345678为例,其一共占了四个字节,从0x12到0x78为高字节到低字节。网络字节序网络字节序是TCP/IP规定好的一种数据...

2019-05-21 10:13:03 610

转载 网络编程中常见的错误分析

https://blog.csdn.net/yusiguyuan/article/details/21457963

2019-05-13 16:39:57 328

原创 编程中常用的和时间有关的函数

时间概念UTC:世界标准时间,即格林威治时间。中国内地与UTC的时差为+8.日历时间:从一个标准时间点到此时的时间经过的秒数,通常来说这个标准时间点是1970年1月1日。epoch:时间点。在C/C++中为一个整数,即为此时时间与标准时间所相差的秒数和时间相关的数据结构在C/C++中,我们可以通过tm结构来获取日期和时间,tm结构在time.h头文件中进行定义。定义如下:#...

2019-03-30 11:43:13 631

原创 获取系统时间的函数

最近在写日志,而在写日志的过程中总会用到系统时间,但是由于获取系统时间的函数太多,所以在这里总结几个常见的和常用的函数。time和ctime_r函数的搭配使用time(time_t *t)//获取系统时间,返回的是从1970.1.1来经过的秒数,保存在t中ctime_r(time_t* t,char* c)//将t中保存的系统时间以字符串的形式格式化,并保存到c所指向的空间get...

2019-03-21 09:34:30 12822

原创 Muduo库的连接建立和连接断开流程

Acceptor类该类的主要作用在于创建监听描述符,然后注册并监听此描述符。具体即在构造Accept类时,会创建监听描述符,创建acceptSocket,acceptChannel,并将该监听描述符进行bind,为监听描述符的acceptChannelt注册可读回调,(其可读回调为Acceptor类所提供的handleRead接口)。在创建了Acceptor类之后,即需要向poller注册...

2019-03-17 10:24:57 488

原创 《Linux多线程服务器端编程》8.0-8.3节读书笔记(Muduo库Reactor的关键结构)

EventLoop类对于一个网络库而言,该类是整个程序运行起来的核心,一个EventLoop对象对应于一个循环,每个EventLoop对象只能由一个线程所拥有。当该对象被创建之后,调用其loop()接口即可使整个程序跑起来。该对象中保存了其所属的线程的线程ID,在运行EventLoop对象所提供的接口时,可以判断当前运行此对象的线程是否为该对象所属的线程。理论上了为了防止多线程下的竞争问题...

2019-03-12 20:00:21 137

空空如也

空空如也

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

TA关注的人

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