自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Boost搜索引擎-无微不至的细节讲述

①获得Boost库内容②遍历文件获取文件所在的路径③读取文件的内容④提取之间的title,提取content 拼接url,这三个内容构成结构体的成员 放入vector中⑤对存放html内容文件进行写入,每个html的内容为一行⑥读取每行内容进行分割,每个title contenr url写入结构体 该结构体由vector来维护⑦将每个title与content进行分词,统计其中分词之后每个词出现的词频,建立词与权重的对应的关系⑧根据文档id、权重、word建立倒排结

2023-03-03 00:03:34 1000 1

原创 HTTPS协议原理---详解六个加密方案

数据摘要(数据指纹)这是通过利用单向散列函数(Hash函数)对信息进行运算,生成一段固定长度的数据摘要。摘要常见算法:有MD5、SHA1、SHA256、SHA512等。摘要特征:和加密算法的区别是,摘要严格意义不是加密,因为没有解密,只不过从摘要很难反推 原信息,通常⽤来进⾏数据对⽐。这个摘要就像这个资源的身份证号一样,相同的几率微乎其微,我们可以通过数据摘要来比对判断不同资源是否相同。因为更改一个标点符号就会导致前后数据摘要不一样。

2023-02-16 12:59:15 3345 2

原创 初识Protobuf与Protobuf的安装

Protocol Buffers 是 Google 的⼀种语⾔⽆关、平台⽆关、可扩展的序列化结构数据的⽅法,它可⽤ 于(数据)通信协议、数据存储等。

2023-12-05 20:06:32 223

原创 如何理解MySQL隔离性---3个记录隐藏字段、undo日志、Read View

Read View就是事务进行 快照读 操作的时候生产的 读视图 (Read View),在该事务执行的快照读的那一 刻,会生成数据库系统当前的一个快照,记录并维护系统当前活跃事务的ID(当每个事务开启时,都会被分配一个ID, 这个ID是递增的,所以最新的事务,ID值越大)但如果是快照读,读取历史版本的话,是不受加锁限制的。该事务执行的快照读的那一 刻,会生成数据库系统当前的一个快照,记录并维护系统当前活跃事务的ID,其中最小的id放在up_limit_id中,最大的id放在low_limit_id中。

2023-08-10 17:10:59 1402 1

原创 MySQL事务

事务就是一组DML语句组成,这些语句在逻辑上存在相关性,这一组DML语句要么全部成功,要么全部 失败,是一个整体。这句话是不是很熟悉,这不就是原子性吗,一个操作要么做完要么不做,不存在做了一部分的情况。上面的概念可以理解为:一个SQL语句或者多个SQL语句的集合,就是集合。原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中 间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个 事务从来没有执行过一样。

2023-08-09 14:32:06 174

原创 MySQL索引特性

可是,貌似这样也有效率问 题,在Page之间,也是需要 MySQL 遍历的,遍历意味着依旧需要进行大量的IO,将下一个Page加载到 内存,进行线性检测。当我们强制的展示所有的数据时,mysql会被操作系统kill掉,因为mysql检索数据需要将文件中的数据加载到内存中,当操作系统检测到mysql占用太多内存资源,就会将mysql这个进程终止。1.二叉搜索树,深度过深,意味着内存中要加载的数据就会很多,所以系统和硬盘的IO的次数增多,并且有可能退化成线性结构,效率更低。

2023-08-04 10:01:53 162

原创 MySQL表的增删改查

所以这样的语句可以执行,order by语句是最后执行的,前面的语句已经执行过english+math+chinese as total,所以这里的total就是english+math+chinese。我想显示ename但是我没有group by后跟ename,这样是错的。排序,基本是在select的最后才做的,尽管他的sql语句写在比较靠后的位置。当不指明插入哪一列时,默认是全列插入,所以value必须一一对应,不能省略。一般的场景中用到的最多的是insert与repalce。

2023-06-04 17:34:53 587

原创 MySQL表的约束

当定义外键后,要求外键列数据必须在主表的主键列存在或为null。案例:如果将班级表中的数据都设计在每个学生表的后面,那就会出现数据冗余,所以我们只要设计成让stu->class_id和myclass->id形成关联的关系=>外键约束.对上面的示意图进行设计:先创建主键表和从表:我们可以看见约束的体现。主表myclass中没有213班级,从表这时要插入213班级的同学,MySQL就会阻止插入。

2023-05-16 20:31:19 423 2

原创 MySQL的数据类型

当我们的表的编码是utf8时,varchar(n)的参数n最大值65532/3=21844[因为utf中,一个字符占用3个字节],如果编码是gbk,varchar(n)的参数n最大是65532/2=32766(因为gbk中,一个字符占用2字节)。而且出于效率 考虑,这些值实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,4,8,16,32,.... 最多64个。如果M被忽略,默认为1。char(L): 固定长度字符串,L是可以存储的长度,单位为字符,最大长度值可以为255。

2023-05-06 21:02:51 955

原创 MySQL表的操作

如果该列的数据类型的大小是20字节,想改成10字节,那数据怎么截取,这都是问题,所以我们在建表的时候就要考虑周全。在项目实际开发中,经常修改某个表的结构,比如字段名字,字段大小,字段类型,表的字符集类型, 表的存储引擎等等。collate 校验规则,如果没有指定校验规则,则以所在数据库的校验规则为准。突然,因为我们增加了个新用户,名字比较长,我们需要修改下name的数据类型。文件系统中当前的数据库的目录之下,会有刚创建的表的相应的文件。这样看是改好了,但是查看建表细节,就会发现name没有了注释。

2023-05-05 20:28:28 434

原创 MySQL库的操作

MySql对大小写不敏感实际上我们应该打大写,库的名字加上``,我们使用的场景是一般在该名字与MySql中的关键字起冲突的情况下。至于修改数据库的名字在Mysql中是被禁止的,这是有他自己的考量。我们知道这些数据库都是以目录形式存在于我们的文件系统中,通常数据库的数据默认存储在/var/lib/mysql中。我们建立一个默认的database,在该数据库的目录下的dp.opt文件中,我们看到该数据库的字符集和检验规则。对数据库的修改主要指的是修改数据库的字符集,校验规则。

2023-05-05 16:27:37 517

原创 I/O多路转接——epoll服务器代码编写

在LT模式中,当我们想写时只需要将对应的文件描述符所对应的EPOLLOUT添加事件中,在我们今天的编写代码中,在whlie循环中的事件检测中,当检测到是EPOLLOUT事件时,我们就可以在回调函数中调用send函数。我们的代码耦合度太高了,数据处理的函数放在了源文件中,我们另起一个头文件,将处理函数放到该头文件中,这样业务处理是业务处理,网络服务是网络服务。

2023-05-01 23:56:54 1326

原创 I/O多路转接——select服务器代码编写

以读的文件描述符集合为例,用户传入0111 0111,表示要关注0、1、2、4、5、6这几个描述符对应的读事件,系统返回0110 0000,表示当前5、6对应的读事件就绪。我们当前只是对listensock进行select,进行等待,select成功只是说明listensock对应的读事件就绪表示有连接到来,而accept上来的文件描述符对应的读事件不代表就就绪了,还需要将这个文件描述符放入select中。我们的处理方式,不止要处理listensock,还要处理其他的文件描述符对应的事件。

2023-04-06 17:35:23 470

原创 通俗理解五种IO模型---五个钓鱼佬的故事

在异步IO模型中,进程只需要告诉OS它要读取数据就立即返回,当数据就绪之后,OS会自动的将数据从内核空间拷贝到用户空间。

2023-03-29 17:20:04 313

原创 数据链路层——以太网、ARP

当ARP协议层获得报文时,说明得到了MAC帧层的筛选,有可能为ARP请求目的地址为全F,可能为ARP应答目的地址和当前主机对应上了,所以这是就要看OP选项,去查看是应答还是请求,是应答就获取想知道的目的IP地址;是请求的话,提取目的IP地址查看是否与当前主机的IP地址相同,如果相同,构建应答将本主机MAC地址填入,并发送。而不具有明确MAC地址时,此时目的地址填的是全F,表示广播, 在此局域网中的主机都要受到,传到不是目的主机的主机时,会继续提取目的IP地址,来判断是否是目的主机,不是在丢弃。

2023-03-25 16:41:54 975

原创 网络层——IP协议

应用层协议具有读取完整报文&序列化&协议处理的能力。 传输层协议解决的是可靠性问题。报文完整到达,如何不给网络造成过大的压力等更多的是策略。 而网络层协议解决如何将数据从A主机发送到B主机的能力。 传输层协议加网络层协议 —— >TCP/IP协议可靠的将数据从A主机发送到B主机。

2023-03-20 21:20:53 347

原创 TCP、UDP协议---协议端格式、三次握手四次挥手等传输层协议的策略

为什么不是两次挥手?你向我发FIN,我接收,再发送ACK+FIN,这样只用两次挥手。如果使用两次挥手,客户端只要发送FIN,服务端就只能回复FIN。当客户端发来FIN,服务端不想断开连接,因为还要业务没有完成,无法用其他的方法拒绝FIN。一般情况下,客户端发送FIN,到服务端发送FIN,会有一段时间间隔来使服务端完成它的任务。

2023-03-16 12:19:39 453

原创 Linux做选择题时的要点

与线程相比,LWP有它自己的进程标识符,优先级,状态,以及栈和局部存储区,并和其他进程有着父子关系另外,线程既可由应用程序管理,又可由内核管理,而LWP只能由内核管理并像普通进程一样被调度。1.线程独有:栈,寄存器,信号屏蔽字,errno...等信息,因此各个线程各自有各自的栈区,但是堆区共用。5.进程是资源的分配单位,所以线程并不拥有系统资源,而是共享使用进程的资源,进程的资源由系统进行分配。16.OSI模型分为 7层,自下而上为,物理层,数据链路层,网络层,传输层,会话层,表示层,应用层。

2023-02-03 16:32:09 628 1

原创 HTTP协议---详细讲解

上篇文章我们体验了定制协议的繁琐,这次我们来讲述下真正成熟的有很多人使用的协议,例如:http、https、smtp、dns等。 Http协议:超文本传输协议。 客户端通过使用Http协议来向服务端获取资源。 我们俗称的“网址”就是url。协议方案名:上例是http://,表示使用http协议。后面我会讲到https,这是http协议的加密版本,现在多数都使用的都是https。登录信息:我们这次不考虑,一般会省略掉,在正文中携带登录信息。服务器地址:是资源所在的网站

2023-01-30 23:02:26 10433 4

原创 TCP网络编程

1.基本系统socket套接字的使用(listen等) 2.基本的协议定制(序列化等) 3.业务的实现(计算器等)

2023-01-18 16:59:29 1782

原创 Udp网络编程

上篇我们讲到,就是数据与数据的交互,那数据之间的交互又是用户与用户之间的交互的体现,但本质上还是用户通过来进行与对面用户的。但是每个主机上的进程成千上百哪能对应准确的进程来通信?需要两个数据就可以准确定位。IP:标识主机的唯一性;端口号(port):标识主机内的进程的唯一性;IP + port = socket ->全网唯一一个进程。一个进程可以和多个端口号绑定,但一个端口号只能和一个进程绑定。

2023-01-05 20:04:04 1034

原创 网络初认识——整体宏观结构

这个快递单就是类似于协议上面记载了从哪里发,到哪里,快递单号,发快递时间等等一系列数据,这些数据就是协助这个物品从商家到买家手里的不可获取的辅助手段,这就是快递到家的协议。数据和数据之间的交互其实就是人与人之间的交互。TCP/IP是一组协议的代名词,它还包括许多协议,组成了TCP/IP协议簇. TCP/IP通讯协议采用了5层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求.我们有自己特色的广域网,美国有自己特色的广域网,但对整个宇宙这么大的幅度来讲,我们也可以把地球上的网络都看成一个局域网。

2022-12-25 21:04:34 302 2

原创 linux线程(3)——线程池、线程安全与可重入与死锁

信号量是一个计数器,描述临界资源数量的计数器。通常操作为++,--,这两个操作都是原子的。加加代表归还资源,减减代表申请资源。信号量你一旦申请成功,就会获得指定资源。接,我们谈到基于阻塞队列的生产者消费者模型,其中为了防止一个线程恶意竞争锁而导致其他线程饥饿,我们采用了线程同步的方式来解决问题。这次了解到了信号量我们是否也可以用它来解决上面的问题。

2022-12-22 21:00:10 274

原创 linux线程 (2)——互斥、同步、基于Blockqueue的生产者消费者模型

为了实现互斥锁操作,大多数体系结构都提供了swap或exchange指令,该指令的作用时把寄存器和内存单元的数据相交换,由于只有一条指令,保证了原子性。

2022-12-14 19:49:03 356 1

原创 linux线程 (1)——初始线程与线程控制

健壮性降低:编写一个多线程需要更全面的更深入的思考,在一个多线程程序中,因时间分配的细微差异,而导致了线程之间共享了不该共享的变量而造成不良影响的可能性很大,说明线程之间是缺乏保护的。pthread_join函数会阻塞,知道线程thread终止,将线程例程返回的通用(void *)指针赋值为reval指向的位置,然后回收终止线程占用的所有内存资源。同基于I/O多路复用的流一样,多个线程运行在同一个进程的上下文中,因此共享这个进程虚拟地址空间的所有内容,包括它的代码、数据、堆、共享库和打开的文件。

2022-11-28 15:37:52 552

原创 对linux页表的进一步认识

实际我们在将'a'写入内存时,页表中有对应的条目,其他的数据在访问内存时的权限是R/W,既可以写也可以读。但是当'a'写入内存时,页表会发现该数据的权限是R,不可修改,mm_struct和页表则会发生异常,向进程发送信号,使进程终止。由前10位比特位在页目录中找到对应页表,于是在这个页表中,由中间10位比特位找到物理内存中page的起始地址,再由后12位比特位找到物理内存中的页框中的对应准确地址。32位系统下,我们的虚拟内存空间大小是4GB,一共有2^32个字节。这样做有什么好处呢?

2022-11-25 12:41:03 202

原创 Linux信号

生活中的信号有:红绿灯、下课铃声、女朋友的眼神...等等都是信号。linux中的信号是:更高层的软件形式的异常,它允许进程和内核中断其他进程。一个信号就是一条小消息,它通知进程系统发生了一个某种类型的事件。我们可通过kill -l 查看我们linux系统上支持不同类型的信号。信号提供了一些机制,通知用户进程发生了这些异常。比如:如果,如果一个进程试图除以0,那么内核就发送给一个SIGFPE信号。如果一个进程执行一条非法指令,那么内核就发送给他一个SIGILL信号。

2022-11-21 21:53:47 1034

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

这是我们所创建共享内存的权限,与对操作的文件的权限相同,避免我们一会使用共享内存出现问题,所以我们现在在flag后面要"|"上对共享内存操作的权限。建议传(页)4KB的整数倍,因为磁盘和操作系统IO的基本单位是4KB,所以磁盘在将数据拷贝到内存时,会以4KB整数倍的大小来占用内存。假设:a进程和b进程要通信,a进程向shmget传入一个key值,b进程通过这个key值访问这块共享内存,这就实现了进程间通信。因为文件的inode编号是唯一的与你给的数值,依据算法,会给出一个key值。

2022-11-13 00:54:12 1397

原创 匿名管道要点与用法

管道的本质是内核中的缓冲区,通过内核缓冲区实现通信,命名管道的文件虽然可见于文件系统,但是只是标识符,并非通信介质。pipefd是个文件描述符数组,其中pipefd[0]代表读端的fd,pipefd[1]代表写端的fd。缓冲区有具体大小,当缓冲区写满之后,写入就会堵塞。7.若管道所有写段关闭,则从管道中读取完所有数据后,read会返回0。从键盘读取数据,写入管道,读取管道,写到屏幕。3. 管道是半双工通信,是可以选择方向的单向通信。9.管道是文件,它的生命周期随进程的退出,而退出。8.管道是面向字节流的。

2022-11-07 21:12:25 413

原创 制作动静态库并使用动静态库

目录1.制作静态库2.形成动态库3.使用静态库①将自己库中头文件和.o文件拷贝到系统头文件下。②指定头文件搜索路径 4.使用动态库①如同上文-L -I -l 静态库,程序在编译链接的时候把库中的代码的链接到可执行文件中。 库名规则:libxxx.a 我们先写两个头文件和两个源文件。 写完这四个文件,我们怎样制作静态库。 首先,将这两个源文件翻译成.o文件。 在进行下一步之前,我们要搞明白 我们把.o文件发给其他人,其他人

2022-10-31 20:59:02 688

原创 文件的软硬连接

1:代表该文件的inode编号。2:第一个字母代表文件的类型,例如d就代表direcotry(目录),“-”代表普通文件。剩余的9个字母,分别代表所属用户、所属用户组、其他用户对该文件读写的权限。‘r’ 代表可读 ,‘w’ 代表可写 ,‘x’代表可执行,‘-’则表示不具备相应权限。3. 这是什么,请移步下文观看。4. 代表所属用户。5. 代表所属用户组。6. 代表文件的大小,以字节为单位。7. 代表文件的mtime(Modified time)。

2022-10-28 22:33:38 510

原创 操作系统与磁盘交互的细节

文件=内容+属性,这些都是数据,在linux下采用的是内容和属性数据分开存的策略。

2022-10-28 16:39:56 996

原创 在linux底层环境下理解重定向的本质和缓冲区是什么

让新的fd成为旧的fd的copy,如果必要的话可以先把新的fd关了,但是注意以下情况:如果旧的fd不是有效的文件描述符,这个调用将会失效,新的fd将会被关闭。如果旧的fd是有效的文件描述符,新的fd和旧的fd如果值相同,这个函数将什么也不做,返回新的fd。原先我的文件stdout作为标准输出fd是指向显示器的,我把fd这时关了,将它分给了新的文件,那么这时的fprintf会将输出到显示器的内容输出到了文件内,看看我们的分析对不对。证明同一个结构体中的fd和缓冲区有关联 ,证明了我们上文的一个问题。

2022-10-25 16:58:49 1245

原创 基础IO ——文件描述符

struct task_struct 中有struct files_struct *fs指针,这个指针再指向struct files_struct,这个结构中有一个指针数组struct file*fd_arr[],里面存在着struct file*的指针。

2022-10-22 16:46:34 620

原创 《Effective C++》读书笔记

读《Effective C++》时所做的点点笔记。

2022-10-20 23:01:30 394

原创 特殊的类设计 and 单例模式

饿汉模式:初始化顺序不确定,饿汉初始化慢,且多个饿汉单例对象会影响程序启动。懒汉模式:在第一次调用时初始化,可以控制初始化顺序,延迟初始化,不影响程序启动。

2022-10-10 19:54:26 184

原创 C++11中实用的语法(上)

都说十年磨一剑,C+11像脱胎于C+98的一种新语言。C++11能更好地用于系统开发和库开发、语法更加泛化和简单化、更加稳定和安全。我们来学习下现实中较为实用的语法。内置类型:自定义类型:struct A{int a;int b;};还可以用于new表达式中至于map 等一些容器也可以。

2022-10-07 23:32:29 697

原创 实现二叉搜索树

二叉搜索树1.概念二叉搜索树又称二叉排序树,它或者是一个空树,或者具有以下性质那它的时间复杂度是多少?我们查找7从上图来看,只用4次,看样子只用查找高度次,时间复杂度是不是O(lgn)呢?那是理想情况,那如果这个二叉搜索树是这样呢?那时间复杂度就为n/2了,所以二叉搜索树的时间复杂度是O(N)。2.实现。

2022-10-06 17:37:32 261

原创 进程程序替换((>_<)子进程跑了),模拟编写一个入门shell

先前,我们可以用fork()创建一个子进程,子进程代码继承父进程代码,执行跟父进程相同的代码,我们能不能让子进程离经叛道,另起炉灶干一番事业,脱离父进程的束缚,当然欧克啦。我们可以让它执行c/c++、Java、Php、shell、Python呀什么的...可神奇了。

2022-10-04 23:55:07 183

原创 进程终止、进程等待

在上一篇文章中,我们说了,fork可以创建一个子进程,可以让子进程去干我们要他干的事情,那究竟有没有干好,这个进程退出码由父进程来接受去判断有没有执行成功结果对不对。在先前我们了解到子进程比父进程先退出,如果父进程不管不顾,子进程就会大杀四方,会导致内存泄漏,就算大名鼎鼎的Kill -9都干不掉他,所以我们通过进程等待的方式,来回收子进程的资源,获取子进程的退出信息。当然可以,return 0代表代码跑完了,结果正确。是几,就代表等待的是哪一个子进程,如果是123,就代表的是等待pid为123的子进程。

2022-10-03 19:52:22 454

空空如也

空空如也

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

TA关注的人

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