自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【MySQL 06】表的增删查改

这种语句非常有用,特别是当你需要将一个表中的数据复制到另一个表中,或者需要将多个表的数据合并到一个表中时。如果你不指定更新的字段,那么就是用之前的值,在这里并没有指定sn,那么sn就使用原来的值。建议:对未知表进行查询时,最好加一条 LIMIT 1,避免因为表中数据过大,查询全表数据导致数据库卡死。将表中所有数据全部读出来,但在数据庞大的场景下不会这么使用,如公司的数据库中。注意:没有 ORDER BY 子句的查询,返回的顺序是未定义的,永远不要依赖这个顺序。像这样,不进行分组,查的就是全公司的情况了。

2024-10-02 17:43:39 611 1

原创 【MySQL 05】表的约束

换句话说,主键列的值必须是唯一的,不能重复,并且表中的每一行都必须有一个主键值(尽管这个值可以是NULL,但在实际使用中,通常不会将主键设置为允许NULL,因为这样会失去主键的唯一性意义)。默认值:某一种数据会经常性的出现某个具体的值,可以在一开始就指定好,在需要真实数据的时候,用户可以选择性的使用默,使用关键字default。我们可以简单理解成,主键更多的是标识唯一性的。给student插入数据,我们选择课程id为1,2的时候,是可以插入成功的,插入其它id号,就会发生外键约束,MySQL拦截此操作。

2024-09-25 15:14:14 850 4

原创 【MySQL 04】数据类型

而且出于效率考虑,这些值实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,4,8,16,32,....最多64个。在不同的编码下,字符所占的字节数都是不固定的:UTF-8 编码的字符可能占用1到4个字节,而 GBK 编码的字符大多数情况下占用2个字节,但也可能占用更多或更少的字节。有一个调查表votes,需要调查人的喜好, 比如(登山,游泳,篮球,武术)中去选择(可以多选),(男,女)[单选]类型提供精确的小数表示,这意味着它可以存储的数值具有完全的可预测性和准确性,不会有。

2024-09-24 16:18:12 824 5

原创 【MySQL 03】表的操作

这样我们就创建好了一张表,我们可以进入hellosql目录下进行查看:所以在数据库内建立表,本质就是在Linux下创建对应的文件。不同的存储引擎,创建表的文件不一样。因为这样改是覆盖之前的,所以在修改的时候记得重新加上描述。实际就是先删除整张表,然后重新创建这个表,以达到清空数据的效果。存储引擎不同,表结构数量也不一样,未来会对索引和事务造成影响。这样的显示看着很不舒服,;after 后面表示放在指定字段的后面。

2024-09-22 22:22:59 548 1

原创 【MySQL 02】库的增删查改及备份还原

可以告诉我们当前有哪些用户连接到我们的MySQL,如果查出某个用户不是你正常登陆的,很有可能的数据库被人入侵了。如果备份一个数据库时,没有带上-B参数, 在恢复数据库时,需要先创建空数据库,然后使用数据库,再使用source来还原。选择合适的字符集可以确保数据库能够支持所需的字符范围,而选择合适的校验规则则决定了数据库中字符数据的排序和比较方式。将指定数据库备份到指定的路径下,该操作不仅备份数据,而且将该数据库下进行的所有的有效操作都进行了备份。如果备份的不是整个数据库,而是其中的一张表,怎么做?

2024-09-22 16:14:33 1316

原创 【MySQL 01】数据库基础

数据库管理系统(如MySQL)提供了一套高级接口(如SQL语言),mysqld就会根据SQL语言,在数据库文件中给用户做增删查改,最后将结果返回给mysqld,mysqld再将结果交给用户。(eg:比如我想在百万行的IP地址中,找出所有以127开头的IP地址,这种情况下,数据库只需要给出指定的命令就可以了,但是文件操作并没有这么方便)MySQL的默认端口号是3306,如果您使用的是默认端口号,也可以省略这个选项。一般指的是,在磁盘或者内存中存储的特定结构组织的数据--将来在磁盘上存储的一套数据库方案。

2024-09-21 23:30:20 1243 5

原创 Linux--IO模型_多路转接

1. 阻塞IO模型特点:在阻塞IO模型中,应用程序发起一个IO请求后会一直阻塞等待操作完成,直到数据准备好或者超时才返回结果。在等待IO完成期间,应用程序会处于阻塞状态,无法执行其他任务。典型应用:阻塞socket、Java BIO等。优点:实现难度低,开发应用较容易。缺点:不适用并发量大的应用,因为每个请求IO都会阻塞进程,需要为每个请求分配一个处理进程(线程),系统开销大。2. 非阻塞IO模型特点:应用程序发起一个IO请求后会立即返回,无需等待操作完成。

2024-08-30 17:51:10 1200 2

原创 Linux——IO模型_多路转接(epoll)

一旦网卡中有数据了,网卡同个中断交给OS,接着网络协议栈就拿到数据了,所以在输入和输出缓冲区里有没有数据,OS是很清楚的,OS在缓冲区中设置回调方法,该回调方法就是epoll_ctl构建的。底层一旦有数据就绪并且是用户关心的,此时OS就会调用回调方法构建就绪队列的结点,填充清楚,是哪一个fd的什么事件已经就绪了,并连入就绪队列。只能循环读取,知道读不到数据,循环读取肯定是会遇到阻塞问题的,epoll当然是不敢阻塞的,否则进程会被挂起,因此fd必须是非阻塞的。进行增加,删除,修改操作。

2024-08-30 17:50:29 1142 3

原创 Linux--NAT,代理服务,内网穿透

在公司内服务器部署了一个登录服务,端口22,此时我也在中转服务器上也部署了一个服务端口8888,只不过小李访问服务器的xxx:8888服务,服务器会直接寻找并启动公司内部的shh:22的登录服务。左侧在内网中唯一的,右侧则是在公网中唯一,那么左侧和右侧是互为键值的,服务器做应答的时候就可以反向查表,发送给内网中的主机。),因为服务器可以向对应的客户端发消息,此时又拿到了两个客户端的信息,那么服务器是否能作为中转站将两个客户端的IP和port,分别发给对方,那么两个客户端就都知道对方的IP和port了(

2024-08-24 22:52:07 865

原创 Linux--数据链路层(mac&&arp)

若此时A向E发送了消息,F向C发送了消息,那么交换机不会把交给E的消息给i1一侧了,交给F的消息也不会被转发给i0一侧了,这样就避免了两台主机的数据碰撞了,因为他们两个的数据在不同的区域内,在发送数据的时候,(src会带上自己的mac地址,dst是目的机的mac地址,data:发送的数据)会将发送的通过数据网络协议栈变成数据帧,然后通过局域网发送到局域网中,局域网的主机都能收到,主机会通过mac地址判断是不是自己的消息,如果是自己的消息,就会接收处理消息,最终以同样的方式发送回去。

2024-08-24 13:29:31 1245

原创 Linux--网络层 IP协议

经过精心的设计,合理的划分,可以高效支未来的报文路径查找,大大提高查找目标主机的效率:将网络划分为多个子网后,每个子网内部的通信不需要经过路由器(在广播域内),这样可以减少路由器上需要维护的路由表项数量。找不到偏移量为0的(没有前面部分),找不到更多分片==0的(没有后面部分),中间部分:将收到的片报文进行排序,因为第一分片的偏移量+自己的长度(除去报头:1500-20)=下一个分片的偏移量,如果没有对应的偏移量,那么就证明丢失了,而且丢失了哪一片也能知道。IP标识网络中主机的唯一性,指的是公网IP;

2024-08-22 23:19:41 1178 9

原创 Linux--传输层协议TCP

如果说有人把建立连接设置成一次握手,那么如果有一台机器给服务器发送大量的SYN报文(一个客户端给服务器发送大量的SYN,我们称为SYN洪水),对于客户端来说几乎没什么成本,此时服务器就被挂满了大量的连接,而且这些连接不会被使用,一次连接占一点资源,多次下来,导致服务器的资源越来越少,这就会导致资源的浪费。如果发送了1000个报文只接受了1个报文,丢了999个报文,因为TCP有滑动窗口的机制,他知道服务器能接收多少报文,所以不可能是服务器的问题,一定是网络出现了很大的问题。那么接收方ACK的确认序号怎么填?

2024-08-19 17:05:44 1146

原创 Linux--传输层协议UDP

负责数据能够从发送端传输接收端.

2024-08-15 16:12:03 1250 1

原创 Linux--应用层协议HTTP协议(http服务器构建)

GET方法也可以向服务器发送数据。在HTTP的URL中,端口号通常是不显示的,因为HTTP有一个默认的端口号80。服务器给我一个请求,我给他应答:首先进行服务列表构建,一个方法对应一个服务,如果客户端的请求存在参数,他就会调用外部方法,将参数传给外部方法处理,放回结果。所谓的URL域名就是服务器地址,就是唯一的一台主机,端口号对应唯一的服务进程,文件路径标明该主机上的唯一的文件资源。总的来说,这段代码实现了一个简单的HTTP服务器,它监听指定端口,并能够处理简单的登录请求,返回一个固定的HTML响应。

2024-08-14 23:48:01 1126 1

原创 Linux--应用层自定义协议与序列化(例子:网络计算器)

tcp服务器(Tcpserver)处理请求,会做IO,那么就调用IO服务(Service),IO服务处理做序列化和反序列化,还要处理业务,这时就会调用业务处理服务(NetCal网络计算器)。整体而言,这段代码展示了如何在C++中使用JSON进行简单的序列化和反序列化操作,以及如何设计一个简单的文本基通信协议来传输结构化数据。通信协议的设计是基于文本的,使用特定的格式来传输数据,包括长度字段和实际的JSON字符串。类,它负责处理客户端的连接请求,并对接收到的数据进行处理后再发送回客户端。

2024-08-12 12:16:26 1076 5

原创 Linux--Socket 编程 TCP(Echo Server)

如果读取到0字节(表示客户端关闭了连接),或者发生读取错误,循环会终止,并且会关闭与客户端的socket连接。它首先创建一个socket,然后将其绑定到服务器的地址和端口上,并监听连接请求。然而,在这个例子中,socket是默认创建的,因此它是阻塞的,所以这些错误不太可能发生。函数尝试连接到服务器。(尽管在这个示例中没有显示直接设置它的代码,但在实际应用中可能需要某种方式来优雅地关闭服务器),则循环会终止。• connect 和 bind 的参数形式一致, 区别在于 bind 的参数是自己的地址, 而。

2024-07-29 14:46:57 688 3

原创 Linux--Socket 编程 UDP(简单的回显服务器和客户端代码)

但如果你的服务器上有很多的ip地址,一个ip1,一个ip2,(如内网ip,回环ip)而我们上层的端口号为:8888。如果你的服务器bind ip1和8888,未来你的服务器收到各种报文都是发给8888的。有ip1的也有ip2的,但服务器只会接收ip1的报文,但如果服务器bind的ip为0,就意味着不管发送的ip是谁,只要是发给端口号为:8888的,服务器都会接收!(在做本地测试的时候,你也可以使用公网ip向你的服务器发消息,能不能成功,就看你的云服务器是怎么设定的了)函数等待并接收来自服务器的响应。

2024-07-26 17:11:03 1142 3

原创 Linux--Socket编程预备

程, 但是这样做, 会让系统进程管理和网络强耦合(pid每次启动的时候都会发送变化,那么两者之间有联系,意味着网络部分也要发送变化), 实际设计的时候, 并没有选择这。虽然 socket api 的接口是 sockaddr, 但是我们真正在基于 IPv4 编程时, 使用的数据结。0 - 1023: 知名端口号, HTTP, FTP, SSH 等这些广为使用的应用层协议, 他们的。种 sockaddr 结构体的首地址,不需要知道具体是哪种类型的 sockaddr 结构体,就可。

2024-07-24 22:54:47 1080

原创 Linux--网络基础

TCP/IP 协议的本质是一种解决方案,为了解决上面的问题然而上面的问题性质不同,种类不同,导致协议的性质不同,种类不同,所以协议是要分层处理的。TCP/IP 协议能分层, 前提是因为问题们本身能分层。

2024-07-24 15:52:57 1264

原创 Linux--实现线程池(万字详解)

IT行业这么火, 涌入的人很多. 俗话说林子大了啥鸟都有. 大佬和菜鸡们两极分化的越来越严重. 为了让菜鸡们不太拖大佬的后腿, 于是大佬们针对一些经典的常见的场景, 给定了一些对应的解决方案, 这个就是 设计模式。

2024-07-19 18:14:23 948 1

原创 Linux--信号量

由于环形队列的下标也是属于临界资源的,如果不维持关系内部的互斥关系,是一定会破坏环形队列结构的。当一个线程(或进程)获取了信号量(将其值从1减为0),它便获得了对某个共享资源的独占访问权,其他试图获取该信号量的线程将被阻塞,直到信号量被释放(其值从0加回1)。sem_post函数用于信号量的V操作,主要作用是给信号量的值加上一个“1”,并可能唤醒一个或多个在该信号量上等待的线程。该函数用于信号量的P操作,从信号量的值中减去1,如果信号量的值变为0,则当前线程将被阻塞,直到信号量的值被其他线程通过。

2024-07-18 15:16:24 1181

原创 C++11 线程库

在C++11之前,涉及到多线程问题,都是和平台相关的,比如windows和linux下各有自己的接口,这使得代码的可移植性比较差。C++11中最重要的特性就是对线程进行支持了,使得C++在并行编程时不需要依赖第三方库。而且在原子操作中还引入了原子类的概念。要使用标准库中的线程,必须包含< thread >头文件。函数名功能thread()构造一个线程对象,没有关联任何线程函数,即没有启动任何线程thread(fn,...)

2024-07-18 11:26:28 783

原创 C++11 包装器

function包装器 也叫作适配器。C++中的function本质是一个类模板,也是一个包装器。用来包装可调用对象function类重载operator(),本质上也是一个仿函数。

2024-07-17 10:45:06 522

原创 Linux--线程同步

当队列满时,往队列里存放元素的操作也会被阻塞,直到有元素被从队列中取出(以上的操作都是基于不同的线程来说的,线程在对阻塞队列进程操作时会被阻塞)线程同步同样是需要互斥锁来实现的,但不同的是:线程同步,程之间所具有的一种制约关系,一个线程的执行依赖另一个线程的消息或状态。同步的目的是确保线程之间。由于生产者和消费者之间的解耦和并行处理能力,生产者消费者模型可以很容易地扩展到处理更多的数据或更复杂的任务。1.这两个的顺序是没有关系,因为无论是消费过程,还是生产过程,都是要持有锁的,唤醒后是要重新申请锁的。

2024-07-17 10:35:15 829 3

原创 Linux--线程互斥(加锁)

(即它在编译时就已经分配了内存空间)

2024-07-15 23:10:21 1015 2

原创 C++11 新的类功能&&可变参数模板

0.上篇文章C++11 右值引用和移动语义-CSDN博客1.新的类功能默认成员函数原来C++类中,有6个默认成员函数:1. 构造函数2. 析构函数3. 拷贝构造函数4. 拷贝赋值重载5. 取地址重载6. const 取地址重载最后重要的是前4个(属于深拷贝,后两个用处不大。默认成员函数就是我们不写编译器会生成一个默认的。C++11 新增了两个:移动构造函数和移动

2024-07-13 23:45:02 1041 1

原创 C++11 lambda表达式

捕捉列表描述了上下文中那些数据可以被lambda使用,以及使用的方式传值还是传引用。

2024-07-12 15:24:12 848

原创 Linux--线程ID&&封装管理原生线程

我们生成的可执行程序在没运行的时候,当然也是在磁盘中的。当运行的时候,我们的可执行程序要加载到内存中,程序要变成一个进程的时候,它的PCB和内核数据结构要被创建出来,通过页表映射到可执行程序的代码和数据。库中创建一个线程,会为线程申请一个内存块(每创建一个线程申请一个内存块),所有的块都是连续存储的,内存块就是一个大号的结构体,内存块中存在线程在用户及最基本的属性和线程栈,这个栈是线程独立的栈结构。所以线程的概念,只是在库中表现出来的,所以我们把Linux中的线程称之为:用户级线程。

2024-07-10 15:46:39 940

原创 Linux--线程的控制

线程的创建,终止,等待,分离新线程如何终止?1. 线程函数 return3. main thread call pthread_cancel, 新线程退出结果是-1。

2024-07-09 17:15:19 1111 3

原创 Linux--线程(概念篇)

我们都知道系统和磁盘文件进行IO的基本单位是内存块4KB--8个扇区。我们以4GB大小的物理内存为例,物理内存被分为一个一个的页框,一个页框的大小也就是4KB,那么我们也就清楚了,磁盘加载到物理内存,操作系统会从磁盘中读取该页面并将其加载到物理内存中的一个页框/页帧中。在父子进程进行共享内存的全局变量int只占四个字节,我对他写入时要发生写时拷贝,写时拷贝的本质就让操作系统重新申请内存,那么拷贝的时候是拷贝四个字节还是4kb呢?对于全局变量int的写入操作,通常不会触发写时拷贝。

2024-07-08 22:41:28 1374 2

原创 Linux--信号(万字详解!超完整!)

我们都知道,在管道通信时,读端关闭,写端一直进行,写就没有意义了,这时候操作系统,就会向进程发送SIGPIPE(13号信号),终止进程。

2024-07-05 20:39:01 1175 4

原创 C++11 右值引用和移动语义

左值是一个表示数据的表达式(如变量名或解引用的指针),

2024-06-21 19:28:44 671

原创 Linux--进程间通信(system V共享内存)

这意味着,我们给两个进程使用同样的pathname和同样的id,调用同样的ftok,就能形成同样的key了。当多个进程都映射了同一块共享内存到各自的地址空间后 ,进程A可以将数据写入共享内存,然后进程B可以从共享内存中读取这些数据,从而实现进程间的数据交换。因为即使其他进程知道了你的共享内存段的键,它们也无法直接访问或修改你的共享内存段,除非它们也通过。key:属于用户形成,内核使用的一个字段,用户不能使用key来进行shm的管理,是给内核用来区分shm唯一性的(用户给操作系统用的)来指示具体的错误原因。

2024-06-07 16:02:15 955 8

原创 C++ map&&ste的封装

关于map和set的封装,底层都是红黑树。C++ 红黑树-CSDN博客RED,BLACK, _kv(kv){}public:else// 新增节点给红色else// parent的颜色是黑色也结束// 关键看叔叔// 叔叔存在且为红,-》变色即可// 继续往上处理else // 叔叔不存在,或者存在且为黑// g// p u// celse// g// p u// cbreak。

2024-06-01 15:59:21 641 1

原创 Linux--进程间通信(2)(有名管道)

这使得任何进程都可以通过该名称来访问管道,而不必是创建管道的进程的子进程。有名管道支持不同进程间的通信,甚至支持跨计算机(网络)的通信。有名管道的生命周期由创建它的进程控制,但即使创建它的进程终止,只要还有进程连接着管道,管道就会继续存在。命名管道在操作系统中表现为一种特殊类型的文件,它存在于系统的命名空间中,可以像打开文件那样被打开和读写。一旦创建,命名管道就可以在不同的进程中被打开多次,允许单向或双向的数据流传输。提供一个namepipe的类,它封装了命名管道的创建、打开、读写和删除的逻辑。

2024-05-28 13:43:46 769 2

原创 Linux--构建进程池

如果我们是关一个等待一个,那么第一个信道,只会关闭一个读端,但还有其它的读端,这就会发生进程阻塞,导致管道文件一直在等待读取,无法被释放;如果统一的关闭读端,那么当关闭到最后一个信道的时候,最后一个信道读端只有一个,管道文件会被释放,然后就会递归式的逆向关闭其它信道的所有读端,最后将所有的管道文件释放,父进程只需要一 一等待,就能回收所有子进程了。下面函数的主要逻辑是创建多个管道和相应的子进程,每个子进程都将从它自己的管道中读取数据,而父进程则保留管道的写端以便后续向子进程发送数据。,然后关闭读端并退出。

2024-05-28 13:43:13 1105 2

原创 Linux--进程间通信(1)(匿名管道)

我们通过文件的原理理解了管道,但是不能用文件的接口了,因为文件的接口没法让内存级缓冲区的数据不往磁盘刷新的,所以工程师做了一个专门的接口:pipepipe()系统调用pipe()系统调用用于在调用进程中创建一个管道(pipe创建的管道就是一个文件,但它不是普通文件,而是单独构成一种文件系统,他没有名字,故又称为匿名管道,并且只存在于内存中。它接受一个文件描述符数组作为参数,并在这个数组中填充两个文件描述符:一个用于读(pipefd[0]),另一个用于写(pipefd[1]这个管道只是让。

2024-05-28 13:42:14 1052 5

原创 C++ 红黑树

RED,BLACK, _kv(kv){}private:成员变量:_left_right和_parent分别指向节点的左子节点、右子节点和父节点。_kv是一个pair<K, V>,存储节点的键和值。_col表示节点的颜色,可以是RED或BLACK。构造函数:接收一个pair<K, V>作为参数,初始化节点的键值对,并将节点的颜色初始化为RED。其他指针成员初始化为nullptr。

2024-05-26 12:03:19 1096 1

原创 C++ 实现AVL树

int _bf;// 平衡因子, _kv(kv), _bf(0){}模板参数K和V是两个类型参数,分别表示节点中键(Key)和值(Value)的类型。成员变量_left:指向左子节点的指针。_right:指向右子节点的指针。_parent:指向父节点的指针。注意,有些AVL树实现可能不包括此成员,但在某些情况下,如需要快速向上遍历树时,它是有用的。_kv:一个pair,包含键和值。_bf(平衡因子):用于表示该节点左子树和右子树的高度差。平衡因子的值可以是-1、0或1。

2024-05-21 09:11:49 804 8

原创 Linux--动静态库制作使用及使用

我们在执行这段代码的时候,调用了里面的函数,我们没有该函数的实现,但可以使用它,是因为我们链接了它们的库,有gcc编译器完成链接,ldd可以查看当前可执行程序链接了上面库。综上所述,动态库和静态库各有优缺点,适用于不同的场景和需求。静态库在编译期间,就把库中的方法拷贝到了程序当中,未来加载就只谈论程序加载,与库没有关系,所以我们再谈库的加载时,不考虑 静态库,只考虑动态库。既然系统找不到我们的库文件,那么我们直接将库文件拷贝到系统共享的库路径下,这样一来系统就能够找到对应的库文件了。选项表示创建一个库。

2024-05-19 14:14:00 749 8

空空如也

空空如也

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

TA关注的人

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