- 博客(88)
- 收藏
- 关注
原创 MySQL:表的约束和基本查询
表的约束——为了让插入的数据符合预期。表的约束很多,这里主要介绍如下几个: null/not null,default, comment, zerofill,primary key,auto_increment,unique key。
2023-08-09 15:28:29 701
原创 网络层:IP协议/Mac协议
主机: 配有IP地址, 但是不进行路由控制的设备;路由器: 即配有IP地址, 又能进行路由控制;节点: 主机和路由器的统 称;IP = 目标网络(前半部分) + 目标主机(后半部分)
2023-08-01 11:55:50 787 1
原创 网络传输层协议:UDP和TCP
端口号(Port)标识了一个主机上进行通信的不同的应用程序;在TCP/IP协议中, 用 "源IP", "源端口号", "目的IP", "目的端口号", "协议号" 这样一个五元组来标识一个通信(可以通过 netstat -n查看);
2023-07-27 11:22:32 732
原创 MySQL:环境安装和数据库基础
一般文件提供了数据存储能力,但管理能力不足。数据库是在磁盘或内存中以特定结构组织的数据。C(client) MySQL数据库客户端S(server)MySQL数据库服务端MySQL是基于CS模式的网络服务,对外提供一套存储解决方案。
2023-06-24 16:11:59 253
原创 leetcode:最大的亦或
第二步:x = x* 2 + 1 ,只要判断是否在哈希结构中有x = a ^ b就行,第一步:先将32位的数字分为前后两个部分,k分别取2,3...... 32。以此类推,最终得到x为前32位的最大异或,就是最终答案。还有一个字典树解法:官方写的题解比较详细就不多说了。使用哈希结构将数组中的数字的前K位全部储存起来。x为数组前K位的最大异或,一开始是0。如果有x = x * 2 + 1;否则x = x * 2。
2023-06-02 11:40:02 102
原创 网络通信:http协议
虽然我们说, 应用层协议是我们程序猿自己定的. 但实际上, 已经有大佬们定义了一些现成的, 又非常好用的应用层协议, 供我们直接参考使用. HTTP(超文本传输协议) 就是其中之一.
2023-06-01 17:33:30 2651
原创 网络通信的序列化和反序列化
由于在系统底层,数据的传输形式是简单的字节序列形式传递,即在底层,系统不认识对象,只认识字节序列,而为了达到进程通讯的目的,需要先将数据序列化,而序列化就是将对象转化字节序列的过程。相反地,当字节序列被运到相应的进程的时候,进程为了识别这些数据,就要将其反序列化,即把字节序列转化为对象无论是在进程间通信、本地数据存储又或者是网络数据传输都离不开序列化的支持。而针对不同场景选择合适的序列化方案对于应用的性能有着极大的影响。
2023-05-31 15:12:17 1246
原创 tcp套接字的应用(内含守护进程)
fg + 作业号(切到前台) bg + 作业号(启动暂停的作业号)3. 守护进程是脱离终端的,关闭或者重定向以前进程默认打开的文件。setsid: 中间新建一个会话,必须不是作业的组长才能使用。2. 如何让自己不是组长,setsid且创建子进程。ctrl + z将前台引用放到后台(暂停)守护进程,精灵进程的本质是孤儿进程。1. 让调用进程忽略掉异常的信号。jobs 查看作业。
2023-05-24 16:48:27 809
原创 Linux:网络套接字
想象一下发qq消息的例子, 有了IP地址能够把消息发送到对方的机器上, 但是还需要有一个其他的标识来区分出, 这个数据要给哪个程序进行解析。为使网络程序具有可移植性,使同样的C代码在大端和小端计算机上编译后都能正常运行,可以调用以下库函数做网络 字节序和主机字节序的转换。因此,网络数据流的地址应这样规定:先发出的数据是低地址,后发出的数据是高地址.ip地址(主机全网唯一性)+ 该主机上的端口号,标识该服务器上进程的唯一性。IP地址 + 端口号能够标识网络上的某一台主机的某一个进程;
2023-04-30 19:43:14 892
原创 Linux:网络基础1
所有网络问题,本质都是通信距离变长了,为了尽可能减少通信成本,定制了协议。协议分层的优势:软件设计方面的优势 - 低耦合一般我们的分层依据: 功能比较集中,耦合度比较高的模块-- 一层 , 高内聚每一层都要解决特定的问题!
2023-04-30 11:51:25 1580
原创 悲观锁、乐观锁、自旋锁和读写锁
在每次取数据时,总是担心数据会被其他线程修改,所以会在(读锁,写锁,行 锁等),当其他线程想要访问数据时,被阻塞挂起。(互斥锁就是一种悲观锁):每次取数据时候,总是乐观的认为数据不会被其他线程修改,因此。但是在更新数据前, 会判断其他数据在更新前有没有对数据进行修改。。(C++原子操作是基于CAS的乐观锁)
2023-04-25 16:46:19 499
原创 C++:IO流
在程序中如果想要使用stringstream,必须要包含头文件。在该头文件下,标准库三个类: istringstream、ostringstream 和 stringstream,分别用来进行流的输入、输出和输入输出操 作,本文主要介绍stringstream。// 序列化和反序列化// 名字int _id;// 时间// 聊天信息int main()
2023-04-24 10:33:21 481
原创 C++关于线程的一些操作
std::this_thread::get_id()获取当前线程的线程IDstd::this_thread::yield()让步结束当前线程的时间片。
2023-04-23 17:20:07 624
原创 C++:特殊类设计
拷贝只会放生在两个场景中:拷贝构造函数以及赋值运算符重载,因此想要让一个类禁止拷贝,。将拷贝构造函数与赋值运算符重载只声明不定义,并且将其访问权限设置为私有即可。C++11扩展delete的用法,delete除了释放new申请的资源外,如果在默认成员函数后跟上 =delete,表示让编译器删除掉该默认成员函数。
2023-04-23 10:06:52 379
原创 C++:智能指针(auto_ptr/unique_ptr/shared_ptr/weak_ptr)
C++没有垃圾回收机制。在多次new时有可能抛异常,就需要一层一层捕获异常并释放资源还需要条件判断,非常麻烦,否则抛异常之后delete多了或者少了都不行。一不小心就内存泄露了。
2023-04-19 22:08:57 438
原创 C++:异常
1. 终止程序,如assert,缺陷:用户难以接受。如发生内存错误,除0错误时就会终止程序。2. 返回错误码,缺陷:需要程序员自己去查找对应的错误。如系统的很多库的接口函数都是通 过把错误码放到errno中,表示错误 实际中C语言基本都是使用返回错误码的方式处理错误,部分情况下使用终止程序处理非常严重的 错误。
2023-04-17 22:20:00 314
原创 C++11: lambda、包装器、模板参数包和线程库
在C++98中,如果想要对一个数据集合中的元素进行排序,可以使用std::sort方法。随着C++语法的发展,人们开始觉得上面的写法太复杂了,每次为了实现一个algorithm算法, 都要重新去写一个类,如果每次比较的逻辑不一样,还要去实现多个类,特别是相同类的命名, 这些都给编程者带来了极大的不便。因此,在C++11语法中出现了Lambda表达式。
2023-04-17 17:29:25 383
原创 Linux线程:互斥锁、条件变量和信号量
生产者和消费者彼此之间不直接通讯,而 通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者 要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。当队列满时,往队列里存放元 素的操作也会被阻塞,直到有元素被从队列中取出(以上的操作都是基于不同的线程来说的,线程在对阻塞队列进程 操作时会被阻塞)大部分情况,线程使用的数据都是局部变量,变量的地址空间在线程栈空间内,这种情况,变量归属单个线程,其他线程无法获得这种变量。
2023-04-17 17:24:13 451
原创 Linux线程基础:控制和封装
1. 了解线程概念,理解线程与进程区别与联系。2. 学会线程控制,线程创建,线程终止,线程等待。3. 了解线程分离与线程安全概念。
2023-04-11 21:49:55 494
原创 Linux:多级页表
3、合理的对地址空间+页表进行资源划分,我们就可以对一个进程所有的资源进行分类。2、页表决定,进程真正拥有资源的情况。1、地址空间是进程能看到的资源窗口。
2023-04-09 21:32:53 119
原创 volatile、可重入和不可重入函数以及SIGCHILD信号
main函数调用insert函数向一个链表head中插入节点node1,插入操作分为两步,刚做完第一步的 时候,因 为硬件中断使进程切换到内核,再次回用户态之前检查到有信号待处理,于是切换 到sighandler函 数,sighandler也调用insert函数向同一个链表head中插入节点node2,插入操作的 两步都做完之后从 sighandler返回内核态,再次回到用户态就从main函数调用的insert函数中继续 往下执行,先前做第一步 之后被打断,现在继续做完第二步。
2023-04-03 17:00:25 356
原创 C++:右值引用详解
传统的C++语法中就有引用的语法,而C++11中新增了的右值引用语法特性,所以从现在开始我们 之前学习的引用就叫做左值引用。无论左值引用还是右值引用,都是给对象取别名。什么是左值?什么是左值引用?左值是一个表示数据的表达式(如变量名或解引用的指针),我们。定义时const修饰符后的左 值,不能给他赋值,但是可以取它的地址。左值引用就是给左值的引用,给左值取别名。右值等等,右值可以出现在赋值符号的右边,但是不能出现出现在赋值符号的左边,右值。右值引用就是对右值的引用,给右值取别名。
2023-03-31 20:54:52 609
原创 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年磨一剑,第二个真正意义上的标准珊珊来迟。C++11增加的语法特性非常篇幅非常多,我们这里没办法一 一讲解,所以本节课程 主要讲解实际中比较实用的语法。
2023-03-30 10:57:24 213
原创 Linux:进程信号
以下课铃为例:人是能够识别下课铃的(认识 -> 产生行为(下课))1.你为什么能识别下课铃呢?有人教育过你(手段) -- 让你在大脑中记住了对应的下课铃属性或者行为2.当信号到来的时候,我们不一定立马处理这个信号,引号可以随时产生(异步),你可能做着更重要的事情(拖堂)3.信号到来---时间窗口(必须的记住这个信号)---->信号被处理4.产生的动作:默认动作自定义动作忽略动作。
2023-03-30 09:29:34 785
原创 C++:哈希结构(内含unordered_set和unordered_map实现)
1. unordered_map是存储键值对的关联式容器,其允许通过keys快速的索引到与 其对应的value。2. 在unordered_map中,键值通常用于惟一地标识元素,而映射值是一个对象,其内容与此 键关联。键和映射值的类型可能不同。3. 在内部,unordered_map没有对按照任何特定的顺序排序, 为了能在常数范围内 找到key所对应的value,unordered_map将相同哈希值的键值对放在相同的桶中。
2023-03-15 16:49:59 470
原创 C++:set和map(模拟实现)
1. set是按照一定次序存储元素的容器2. 在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。3. 在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行 排序。4. set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对 子集进行直接迭代。
2023-03-06 14:42:00 751 3
原创 Linux:进程间通信
管道是Unix中最古老的进程间通信的形式。我们把从一个进程连接到另一个进程的一个数据流称为一个“管道”管道文件是一个内存级文件(即只存在于内存中,没有对外设IO的过程)。
2023-03-03 19:45:50 704
原创 文件基础IO
在我们了解基础文件IO时,我们首先需要接受下列事实:任何语言都有进行文件操作的函数,不管是C/C++还是python、shell都有自己的库函数进行文件操作,但是我们知道文件操作的实质是对磁盘进行操作,这是操作系统做的是,所以不管是什么语言,文件操作都是调用的系统文件操作的接口。 如图可以看出,进程想要管理被打开的文件,在PCB中有指针指向一个结构体——文件描述符表,内部包含一个指针数组指向打开文件的属性结构体,实现对文件的操作。文件描述符(fd)分配规则:从小到大,按照循序寻找最小且没有被占用的fd。
2023-02-25 21:21:50 1346 4
原创 二叉树前中后序遍历的非递归版本
非递归遍历二叉树的思路有很多,这里用到的思路有一个优点,前中后序遍历的思路大差不差。我们这里用到的思路就一条,将任何一棵树分为两个部分:1.左路节点2.左路节点的右子树。
2023-02-08 21:45:48 122
原创 二叉搜索树(Binary Search Tree)
二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点的值它的左右子树也分别为二叉搜索树。
2023-02-07 21:21:21 879
原创 C++的多态
多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了 Person。Person对象买票全价,Student对象买票半价。那么在继承中要构成多态还有两个条件1. 必须通过基类的指针或者引用调用虚函数2. 被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写public:// 虚函数virtual void BuyTicket() { cout
2023-02-06 16:57:01 413
原创 C++的继承
继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保 持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象 程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。
2023-02-05 20:53:37 393
原创 模板进阶(包含特化)
模板参数分类类型形参与非类型形参。类型形参即:出现在模板参数列表中,跟在class或者typename之类的参数类型名称。非类型形参,就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用。以上是利用类封装的静态数组。1. 浮点数、类对象以及字符串是不允许作为非类型模板参数的。2. 非类型的模板参数必须在编译期就能确认结果。
2023-02-03 21:34:23 417
原创 STL模拟实现——stack、queue和priority_queue(适配器、仿函数、反向迭代器)
适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总 结),该种模式是将一个类的接口转换成客户希望的另外一个接口。下列的这些stack、queue和priority_queue以及反向迭代器都是适配器。
2023-02-02 21:00:07 371
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人