- 博客(59)
- 收藏
- 关注
原创 Linux 安装MySQL(Cenots版本)
在Linux下安装mysql有很多方法,比如说:压缩包解压(一般为tar.gz)编译好的安装包(RPM、DPKG等)在线安装(YUM、APT等)在centos环境中,我们一般都用yum源安装。
2024-10-29 21:13:57
1070
原创 计算机网络 -- HTTP 协议详解
协议是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则。HTTP 协议 ,全称超文本传输协议 ,顾名思义,他是一种规范了 超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器 的协议。HTTP协议有众多版本,目前使用 最多的是 HTTP/1.1 版本 ,其它版本我们不做解释。(其实目前我们使用最多的是 HTTPS 协议,但其实就是HTTP 加上了加密和认证机制,底层还是HTTP协议,因此我们也不做太多解释,只讲HTTP)
2024-10-28 17:14:32
1380
原创 数据结构 -- 排序算法
所谓排序,就是一种使一串数据记录,按照其中的某个或某些关键字的大小,递增或递减地组织起来的操作。 从排序方式上,排序算法一般被分为比较排序和非比较排序。从比较排序的内容上,它一般被分为插入排序、选择排序、交换排序和归并排序,其中,它们每一种又有更细致的分类。 本文所讲排序除了计数排序,桶排序,基数排序外,其它为比较排序。 稳定性是排序最重要的评价方式。假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]
2024-10-14 16:39:30
928
2
原创 计算机网络 -- 序列化与反序列化
序列化是指将一个或多个需要传递的数据,按照协议的格式,拼接为一条字节流数据,反序列化则是将收到的数据按照格式解析。可见,反序列化和序列化就是协议的一部分。比如主机A想通过两正整数运算协议//1+1int x = 1;int y = 1;可以根据格式(这里使用 (空格))进行序列化// 经过序列化后得到在经过网络传输后,主机B收到了消息,并根据 (空格)进行反序列化,成功获取了主机A发送的信息。// 经过反序列化后得到int x = 1;int y = 1;
2024-05-15 21:01:36
1003
1
原创 Linux -- 日志
在之前的编程经历中,如果我们的程序运行出现了问题,都是通过 标准输出 或 标准错误 将 错误信息 直接输出到屏幕上,以此来排除程序中的错误。这在我们以往所写的程序中使用没啥问题,但如果出错的是一个不断在运行中的服务,那问题就大了,因为服务器是不间断运行中,直接将 错误信息 输出到屏幕上,会导致错误排查变得极为困难。其实,我们可以将各种。
2024-05-10 20:07:02
1273
原创 网络程序 -- TCP版服务器
对于之前编写的来说,如果只有一个客户端进行连接并通信,是没有问题的,但如果有多个客户端发起连接请求,并尝试进行通信,服务器是无法应对的原因在于为什么客户端B会显示当前已经连接成功?这显然是服务器的问题,与应该交给两个不同的执行流完成,可以使用多进程或者多线程解决,这里先采用多进程的方案fork创建子进程使用fork()函数,它的返回值含义如下ret == 0ret > 0ret < 0子进程创建成功后,会继承父进程的文件描述符表,能轻而易举的获取客户端的socket套接字,从而进行网络通信。
2024-04-27 20:04:46
1824
4
原创 网络编程 -- 简易TCP网络程序
字符串回响程序类似于echo指令,客户端向服务器发送消息,服务器在收到消息后会将消息发送给客户端,该程序实现起来比较简单,同时能很好的体现socket套接字编程的流程。
2024-04-20 20:42:54
1337
原创 计算机网络 -- 多人聊天室
这是基于UDP协议实现的一个网络程序,主要功能是这个程序由一台服务器和n个客户端组成,服务器扮演了一个接受信息和分发信息的角色,将信息发送给所有已知的用户主机。
2024-04-20 10:58:42
2548
4
原创 计算机网络 -- 网络编程基础
在 前文中我们提到过:,使用IP地址来标识公网环境下主机的唯一性,我们可以根据进行跨路由器的远端通信。但是我们也提到了,通过 IP 地址,只能寻找到目标主机,难道我们的网络通信,是主机与主机之间互相通信吗?显然不是这样的。我们要让主机接收到任务,并且还需要解包执行任务,主机中什么事物能做这一步呢?答案是,进程。目标主机中存在很多进程,网络通信实际是不同主机中的进程在进行通信,并非主机与主机直接通信。在通过IP 地址定位到 目标主机后,我们通过端口号,定位到需要进行通信的进程。
2024-04-18 19:21:49
1296
原创 Linux -- 线程互斥与同步
大部分情况,线程使用的数据都是局部变量,变量的地址空间在线程栈空间内,这种情况,变量归属单个线程,其他线程无法获得这种变量。但有时候,很多变量都需要在线程间共享,这样的变量称为,可以通过数据的共享,完成线程之间的交互。多个线程并发的操作共享变量,会带来一些问题。例如下面我们模拟一个多线程抢票的程序。使用一个全局变量我们运行起来之后,会看到线程抢到了负数的票!为什么会出现这种情况呢?这种情况我们称为共享数据在无保护的情况下,被多线程并发访问,造成了数据不一致问题!
2024-03-13 20:01:57
1083
原创 Linux -- 线程概念和控制
那么有了上面的基础,我们现在重新定义线程和进程的概念:线程—— CPU调度的最小单位所以什么到底什么是进程呢?我们以前说的进程等于描述进程的结构体+ 代码数据,但是今天很显然已经有分歧了,因为它只是地址空间的一个执行分支,一个执行分支不能代表整个进程!那么我们现在需要重新理解一下了,全部执行流都叫做进程执行流,地址空间都叫做进程所占有的资源,页表和该进程所占用的物理内存,我们把这一整套才称之为进程!如下图:进程—— 操作系统分配资源的最小实体那么执行流是资源吗?是的!
2024-03-11 19:03:31
964
原创 Linux系统 -- 信号
信号是 Linux 操作系统中用于进程间通信、处理异常等情况的一种机制。它是由操作系统向一个进程或者线程发送的一种异步通知,用于通知该进程或线程某种事件已经发生,需要做出相应的处理。
2024-03-07 17:21:03
891
转载 进程间的通信 -- 共享内存
之前我们学过管道通信,分为匿名管道和命名管道,匿名管道通过父子进程的属性继承原理来完成父子进程看到同一份资源的目的,而命名管道则是通过路径与文件名来唯一标识管道文件,来让不同的进程之间进行通信。而共享内存也是同理, 就是允许两个或多个不相关的进程访问同一段物理内存空间。
2024-03-02 17:11:19
1080
原创 进程间的通信-- 管道
管道通信是半双工的,有固定的读端和写端。管道通信是先进先出的,数据被进程从管道读出后,在管道中该数据就不存在了。管道通信是基于文件操作的,需要使用文件描述符来管理管道的读写。管道通信是阻塞式的,当进程去读取空管道或者写入满管道时,进程会阻塞。管道通信分为匿名管道和命名管道,匿名管道只能用于具有亲缘关系的进程间通信,命名管道可以用于任何进程间通信。一般而言,进程退出,管道释放,所以管道的生命周期随进程一般而言,内核会对管道操作进行同步与互斥。
2024-02-24 12:19:01
620
原创 C++ 特殊类的实现
以及赋值运算符重载,在C++98中:将拷贝构造函数与只声明不定义,并且将其访问权限设置为私有即可禁止拷贝。C++11做法C++11扩展delete的用法,delete除了释放new申请的资源外,如果在默认成员函数后跟上=delete,表示让编译器删除掉该默认成员函数。
2024-02-14 14:35:58
1871
原创 C++ list的模拟实现
list相当于,我们定义节点时要用类模板参数,同时定义_next、_prev指针和数据_data,使用struct定义节点类,因为节点类要能够被访问,而struct的默认访问权限就是public(当然手动更改权限为public也可),构造函数缺省值要使用匿名对象,保证无论是自定义类型还是内置类型都能够构造成功。
2023-12-27 16:26:27
1285
原创 理解文件系统
文件系统是中的一个核心组件,用于管理计算机中的文件和文件夹。它提供了一种组织和访问计算机存储设备上数据的方式。文件系统使用户能够创建、修改、删除和查找文件,以及组织文件和文件夹的层次结构。ps: linux一共有五大子系统:1进程调度 2 进程通信 3 内存管理 4 网络接口 5 文件系统。
2023-12-27 16:25:49
1120
原创 C++ String的模拟实现
string类的成员变量分别是存储字符串的一段空间_str,表示字符串的有效字符个数_size和表示存储有效字符空间的_capacity。还有一个string类的特殊成员,npos表示size_t的最大值,一般表示表示string的结束位子。-1也可以表示size_t类型的最大值。注意: 首先,string类的有参构造函数其实可以设计为全缺省函数,缺省值设置为空串,当没有传入参数时使用缺省值,将_str设置为空串,这样就可以不需要定义无参构造函数了。其次,如果传入了参数,就将_si
2023-12-23 11:52:31
1025
原创 C++ vector的模拟实现
vector的成员变量不再是我们熟悉的size,capacity,而是变成了功能一致的三个指针:_start,_finish,_endofstorage,三个指针的作用如下:同时,因为其本身指针的特性,其迭代器也是返回其内部的指针就可以了,因此我们可以直接定义迭代器。
2023-12-23 11:52:18
843
原创 数据结构 -- 堆
堆是一棵(近乎)满二叉树,我们可以用数组来实现这棵二叉树(因为如果是满二叉树的话,其极其符合数组的形式,并且节点也可以用下标来表示,下面会证明)。堆中的数据是局部有序的。我们使节点储存的值和它的子节点之间存在某种关系,从而利用数组模拟出堆这种形式。
2023-12-19 19:38:38
1660
原创 C++ 11 异常
实际使用中很多公司都会自定义自己的异常体系进行规范的异常管理,进行异常模块划分,因为一个项目中如果大家随意抛异常,那么外层的调用者基本就没办法玩了,所以实际中都会定义一套继承的规范体系。这样大家抛出的都是继承的派生类对象,捕获一个基类就可以了。最基础的异常类至少需要包含错误编号和错误描述两个成员变量// 服务器开发中通常使用的异常继承体系public:, _id(id){}protected:int _id;
2023-12-12 18:59:52
1122
原创 C++ 11 初识
在2003年C++标准委员会曾经提交了一份技术勘误表(简称TC1),使得C++03这个名字已经取代了C++98称为C++11之前的最新C++标准名称。不过由于C++03(TC1)主要是对C++98标准中的漏洞进行修复,语言的核心部分则没有改动,因此人们习惯性的把两个标准合并称为C++98/03标准。从C++0x到C++11,C++标准10年磨一剑,第二个真正意义上的标准珊珊来迟。
2023-12-11 19:50:51
987
原创 位图和布隆过滤器
我们先来看一道题:给定40亿个不正整数,如何快速判断一个数组是否在这40亿个数中。以我们目前的思维,我们肯定是只能想到以下几种方法:一 直接遍历,时间复杂度O(n)二 二分查找,时间夫复杂度O(nlogn)三 放入某种数据结构,如红黑树等等,时间复杂度最好O(logn)但是无论是哪种方法,对空间的需求都是极大的, 40亿个整数 ≈ 14个g的内存 ,像我们平常电脑内存也就是16个 g或者说 32个g的内存,并且还有很多小内存电脑,可能很难应对如此大的空间需求。
2023-12-10 14:42:52
1117
原创 C++ - 哈希
这样可以方便我们进行删除和修改 (修改 key 对应的 value) – 查找到之后直接通过指针解引用来修改 value 与 state;哈希表经过不断插入删除,最终可能会出现一种极端情况 –
2023-12-08 16:38:17
997
原创 C++ 红黑树的封装
我们该如何适配map和set的底层,来让其匹配红黑树呢?在这里,我建议让其内部的模板,暂时先有两个数据类型,第一个为 K 模型,第二个为 T模型,也就是说 当为map时,传入map时,底层实际传入RBTree,传入set时,底层实际传入RBTree。这样有什么好处呢?
2023-11-28 20:57:43
1211
原创 Linux进程控制
这些函数看似容易混淆,其实隐藏着见名知意的规律l(list):表示采用参数列表,比如"ls",“-a”,“-l”,"-i"这样传参v(vector):表示参数采用数组p(path):有p自动搜索环境变量的PATHe(env):表示自己维护的环境变量。
2023-11-21 17:10:22
64
原创 Linux 进程概念
一般课本上对进程是这样定义的:一个可执行程序被执行后就变成了一个进程。站在操作系统的角度则得出:进程是担当分配系统资源的实体。而如果让我给进程一个定义,我应该会给出这个:进程 == 内核数据结构( PCB) + 该进程对应的代码和数据。
2023-10-23 20:34:39
75
原创 C++ 实现AVL树
我们在使用二叉搜索树时,假如往树中插入的元素有序或者接近有序,二叉搜索树就会退化成单支树,时间复杂度会退化成O(N),因此在一些场景中,二叉搜索树的效率是极其低下的,因此我们引出了AVL树。
2023-10-07 20:51:59
91
1
原创 C++ stack和queue
是不是刚看见这个容器适配器,还以为是个新东西,其实并不是,它的名字叫做优先级队列,它类似于我们在之前数据结构中学到的堆。优先级队列是一个拥有权值的queue,其内部元素按照元素的权值排列。权值较高者排在最前优先出队。其中缺省情况下系统是通过一个max-heap以堆实现完成排序特性,表现为一个以vector表现的完全二叉树,也就是堆。其构造函数为:它有三个模板参数:元素类型、容器类型和比较函数类型(可选)。默认情况下,它使用vector作为其底层容器。
2023-10-02 20:25:34
103
2
原创 Linux 环境变量
当我们在执行Linux系统的时候,使用的一些命令其实都是一些可执行程序,但是当我们执行自己编译的程序的时候,则需要带上路径,那么,为什么呢?因为环境变量,已经把那些可执行命令的路径加载到系统中了。
2023-09-17 10:09:21
87
原创 gdb调试工具
GDB是GNU开源组织发布的一个强大的Linux下的程序调试工具。一般来说,GDB可以替代你平时使用的编译器中关于程序调试这一部分的所有功能。注意:一般来说我们Linux自带gdb,如果没有的话需要下载,centos下载代码为。
2023-09-16 15:25:31
99
原创 C++ 实现二叉搜索树
可以说,二叉搜索树在查找上面的进步是很大,他的平均查找速度为O(logN),最坏查找情况为O(N)。(N为树的高度)为什么呢,其实类似于二分查找,它每次在查找的时候都只会前往左右区间,也就是直接剔除一半的值,最后便得出平均查找速度。最坏查找是因为有特殊情况,(一般是有序)使二叉树退化成单子树,从而大幅降低了查找效率。
2023-09-13 16:15:21
308
2
原创 C++ 多态
多态,顾名思义,就是多种形态,再具体一点就是 对于某些事情,不同的人去完成时体现出不同的状态。在C++种 ,我们把不同类中的函数实现出这一特性,也就是一个函数,在不同类中将发挥不一样的作用,这就是多态。定义: 多态大多是指不同继承关系的类对象,调用同一函数时产生了不同的行为。比如 :学生和社畜都属于人,但是他们如果去买火车票,学生就会有学生票,但是社畜就得买成人票。
2023-09-10 15:43:31
273
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人