- 博客(29)
- 收藏
- 关注
原创 【后端修行之Netty】5种I/O模型
进程将一个或多个fd换地给select和poll,阻塞在select操作上,select/poll循序扫描fd是否就绪.Linux还提供了一个epoll系统调用,基于事件驱动代替顺序扫描,性能更高.一旦fd就绪,立即回调函数rollback.:系统调用sigaction执行一个信号处理函数,系统立即返回,进程继续工作.当数据就绪,会为该进程SIGIO信号通知应用程序调用,并读取数据.在这个过程中,所谓的同步是指数据从内核数据缓冲区复制到用户进程缓冲区的过程需要用户进程参与;
2024-08-19 08:08:29
511
原创 【后端修行之Redis】多机数据库的实现-复制SLAVEOF
复制积压缓冲区是一个主服务器维护的一个固定长度和先进先出的队列,默认1MB。主服务器进行命令传播的时候,不仅会给从服务器,还会将命令写入复制积压缓冲区.执行复制的双方——主从服务器会分别维护一个复制偏移量(主服务器向从服务器传播N个字节,偏移量+N;主服务器超过一秒钟没有收到从服务器发来的REPLCONF ACK命令,那么主服务器就知道主从服务器之间的连接出现问题了。从服务器向主服务器发送监听端口,主服务器随后会将其记录在从服务器对应的客户端状态的slave_listening_port属性中。
2024-08-19 08:07:52
374
原创 【后端修行之Redis】AOF持久化
因为服务器在处理文件事件时可能会执行写命令,使得一些内容被追加到aof_buf缓冲区里面,所以在服务器每次结束一个事件循环之前,它都会调用flushAppendOnlyFile函数,考虑是否将aof_buf缓冲区的内容写入和保存到AOF文件里面。Redis的服务器进程就是一个事件循环,这个循环中的文件事件负责接收客户端的命令请求,以及向客户端发送命令回复,而时间时间则负责执行像serverCron函数这样需要定时运行的函数。服务器读入并执行AOF文件保存的写明了,就可以还原到服务器关闭之前的数据库状态。
2024-08-18 17:26:24
870
原创 【后端修行之Redis】RDB持久化
redis的服务器周期性函数操作函数serverCron默认每隔100毫秒执行一次(对正在运行的服务器进行维护,其中一项:检查save选项所设置的保存条件是否满足,满足就执行)RDB持久化可以手动执行/服务器配置选项定期执行,把某个时间点的数据库状态保存到RDB文件(一个经过压缩的二进制文件)。BGSAVE执行期间,对SAVE,BGSAVE和BGREWRITEOF三个命令的处理方式和平时有所不同。根据配置文件的save属性,设置服务器状态redisServer结构的saveparams属性。
2024-08-18 17:22:47
587
原创 【后端修行之HTTP】HTTP 方法(与服务器交互)
发送请求时,在 Max-Forwards 首部字段中填入数值,每经过一个服务器端就将该数字减 1,当数值刚好减到 0 时,就停止继续传输,最后接收到请求的服务器端则返回状态码 200 OK 的响应。但是,鉴于 HTTP/1.1 的 PUT 方法自身不带验证机制,任何人都可以上传文件 , 存在安全性问题,因此一般的 Web 网站不使用该方法。但是,HTTP/1.1 的 DELETE 方法本身和 PUT 方法一样不带验证机制,所以一般的 Web 网站也不使用 DELETE 方法。PUT 方法用来传输文件。
2024-08-18 17:04:19
349
原创 【后端修行之TPC/IP】TCP的拥塞控制
2、由于发送方现在认为网络很可能没有发生特别严重的阻塞(如果发生了严重阻塞的话,就不会一连有好几个报文段到达接收方,就不会导致接收方连续发送重复确认),因此与慢开始不同之处是现在不执行慢开始算法(即拥塞窗口的值不设为1个SSS),而是把拥塞窗口的值设为慢开始门限减半后的值,而后开始执行拥寒避免算法,线性地增大拥塞窗口。为了防止拥塞窗口增长过大引起网络拥塞,还需要维护一个慢开始门限的状态变量,当拥塞窗口的值小于慢开始门限时,使用慢开始算法,一旦拥塞窗口的值大于慢开始门限的值,就改用拥塞避免算法。
2024-08-18 17:01:54
335
原创 【后端修行之TPC/IP】TCP的流量控制&滑动窗口
我们考虑一种特殊情况,如果B在向A发送了零窗口报文段后不久,B的接收缓存又有了一些存储空间,于是B向A发送了一个rwnd=400的报文段,然而这个报文段在传送过程中丢失了,A就一直等待B发送非零窗口的报文通知,而B一直等待A发送数据,如果没有任何措施的话,这话。,对方在收到探测报文段后,在对该报文段的确认洪给出现在的窗口值,如果窗口值仍为零,则收到这个报文段的一方就重新设置持续计时器,如果窗口不为零,那么死锁的僵局就被打破了。发送方数据发送的很快,而接收方来不及接收,就可能造成数据的丢失。
2024-08-18 17:01:17
227
原创 【后端修行之TPC/IP】TCP连接建立和释放
当客户端执行主动关闭并进入TIME—WAIT是正常的,服务端执行被动关闭,不会进入TIME—WAIT状态,这说明,如果终止了一个客户程序,并立即重启该客户程序,则新的客户程序将不再重用相同的本地端口,而是使用新的端口,这不会带来什么问题,因为客户端使用本地端口,而并不关心这个端口是多少。这时B发出的链接释放报文段中,FIN=1,确认号还必须重复上次已发送过的确认号,即ack=u+1,序号seq=w,因为在半关闭状态B可能又发送了一些数据,因此该序号为半关闭状态发送的数据的最后一个字节的序号加1。
2024-08-18 16:55:54
909
原创 【后端修行之TPC/IP】TCP首部数据格式
占4个字节,序号的范围为[0,4284967296]。由于TCP是面向字节流的,在一个TCP连接中传送的字节流中的每一个字节都按顺序编号,首部中的序号字段则是指本报文段所发送的数据的第一个字节的序号。头部长度占4个字节,但它的单位是32位字,即以4字节为计算单位,因此头部长度的最大值为15*4=60个字节,这就意味着选项的长度不超过40个字节。LRG为1时,表明紧急指针字段有效,发送应用进程告诉发送方的TCP有紧急数据要传送,于是发送方TCP就把紧急数据插入到本报文段数据的最前面,而其后面仍是普通数据。
2024-08-18 16:50:45
238
原创 【后端修行之TPC/IP】计算机网络五层模型及介绍
然后,把整个UDP数据包放入IP数据包的”数据”部分,而前面说过,IP数据包又是放在以太网数据包之中的,所以整个以太网数据包现在变成了下面这样。TCP数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常TCP数据包的长度不会超过IP数据包的长度,以确保单个TCP数据包不必再分割。IP数据包是放在以太网数据包里传输的,因此需要知道MAC地址和IP地址,通常情况下IP地址是已知的(通过DNS,域名系统获取),但是MAC地址不知。最简单的实现叫做UDP协议,它的格式几乎就是在数据前面,加上端口号。
2024-08-18 16:45:56
878
原创 【后端修行之JUC】Java内存模型(JMM)相关基础
现代处理器会设计为一个时钟周期完成一条执行时间最长的CPU指令. 每条指令可以划分为一个更小的阶段: 取指令-指令译码-执行指令-内存访问-数据写回.解决不了原子性的问题(指令交错), 只能保证getstatic获得最新的值而已, 该交错还是会交错, 避免不了。读屏障, 保障在该屏障之后的, 对共享变量的读取, 加载的是主存中最新数据.写屏障, 保证在该屏障之前的, 对共享变量的改动, 都同步到主存;写屏障会确保指令重排序时, 不会将写屏障之前的代码排在写屏障之后。JVM会在不影响正确性的前提下, 可以。
2024-08-18 16:20:33
284
原创 【后端修行之JUC】多把锁、活跃性以及ReentrantLock
在活锁中,线程不断地响应其他线程的动作,但是整体上却没有进展。当线程调用条件变量的唤醒方法时,它会选择一个或多个等待在该条件变量上的线程,并使其从等待状态转变为可运行状态。当线程调用条件变量的等待方法时,它会释放持有的锁,并进入等待状态,直到满足某个特定条件(由应用程序定义)或被唤醒。指一个线程如果首次获得这把锁, 那么因为它是这把锁的拥有者, 因此有权利再次获取这把锁, 如果是不可重入锁, 则第二次获取会被自己的锁挡住.一个线程需要获得多把锁, 就容易发生死锁. t1线程获取对象A的锁,需要获取B的锁;
2024-08-18 16:11:32
233
原创 【后端修行之JUC】Java中的线程状态及转换
本文用于记录学习黑马JUC课程后,个人认为有价值的笔记,核心内容均围绕标题展开。既做一个学习的记录,同时也做一个沟通交流,欢迎各位大佬互动~调用t.start()方法时,由New-->RUNNABLE,Java线程对象关联操作系统线程;t线程用synchronized(obj)获得对象锁后,当前线程所有代码运行完毕,进入TERMINATED。与2类似, 仅仅多个了超时转换状态的条件。与3类似, 仅仅多个了超时转换状态的条件。与4类似, 仅仅多个了超时转换状态的条件。
2024-08-18 16:09:00
363
原创 【后端修行之JUC】wait/notify/park/unpark
本文用于记录学习黑马JUC课程后,个人认为有价值的笔记,核心内容均围绕标题展开。既做一个学习的记录,同时也做一个沟通交流,欢迎各位大佬互动~③park和unpark以线程为单位唤醒和阻塞线程,而notify只能随机唤醒,notifyAll是全部唤醒,不能那么精确对线程进行操作;②wait, notify, notifyAll必须配合Object Monitor一起使用,而unpark不必;①先调用unpark,再调用park,恢复暂停的线程。//暂停当前线程(线程状态:WAIT)//恢复某个线程的运行。
2024-08-18 16:05:22
158
原创 【后端修行之JUC】关于重量级锁、轻量级锁和偏向锁
Synchronized, 对象锁, 它采用互斥的方式让同一时刻至多只有一个线程能持有[对象锁], 其他线程想再次获取这个对象锁时,就会被阻塞住. 这样可以保证拥有锁的线程可以安全执行临界区内的度挨骂, 不用担心上下文切换.线程在尝试加轻量级锁的过程, cas无法操作成功, 一种情况就是其他线程为此线程加上了轻量级锁, 这时需要进行锁膨胀, 把轻量级锁变成重量级锁.重量级锁竞争, 还会通过自旋进行优化, 自旋成功(持有锁线程退出同步块, 释放锁), 当前进程可以避免阻塞. 自旋失败则进入阻塞状态.
2024-08-18 16:00:33
820
原创 【后端修行之JUC】一些关于Java线程基础理解
类加载之后,代码缓存在方法区,等待cpu分配时间片,创建相应的线程(线程调度器负责创建和调度),在占用时间片的过程中,线程根据方法执行和调用的情况创建和删除相应的栈帧,期间伴随着或被动或主动的原因进行上下文切换,最终代码执行完毕线程关闭.④线程调用了sleep,yield,wait,join,park,synchronized,lock等方法。默认情况下,java虚拟机需要等待所有线程结束,才会结束. 有一种特殊的线程叫做守护线程,只要其他非守护线程运行结束了,即使守护线程的代码没执行完,也会强制结束.
2024-08-18 15:41:03
745
原创 【后端修行之JUC】JUC并发相关基本概念
再底层一点针对I/O操作而言,一个I/O过程设计两步:①I/O调用;②I/O执行(内核数据缓冲区等待数据+内核数据缓冲区数据复制到用户进程缓冲区)。针对这个层面,所谓的同步是指数据从内核数据缓冲区复制到用户进程缓冲区的过程需要用户进程参与;既做一个学习的记录,同时也做一个沟通交流,欢迎各位大佬互动~线程是进程中的一个实体,是系统独立调度的基本单位. 作用:使多道程序更好的并发执行,提高资源利用率和系统吞吐量,增强操作系统的并发性能。在同一时刻,有多个指令在多个CPU上同时执行。
2024-08-18 15:33:16
173
原创 【后端修行之MySQL】MySQL查询性能优化及方案
本文用于记录苦啃《高性能MySQL(第3版)》后,个人认为有价值的笔记,核心内容均围绕标题展开。从客户端到服务器,服务器上解析,生成执行计划,执行(最重要,包括大量为了检索数据到存储引擎的调用以及调用后的数据处理,包括排序和分组),并返回结果给客户端。,避免一次锁住大量数据,占满整个事务日志,耗尽系统资源,阻塞很多很小的但是很重要的查询,查询优化处理(语法解析器和预处理、查询优化器、数据和索引的统计信息)-执行计划(指令树)响应时间(服务时间、排队时间)、扫描行数、返回的行数(理想情况下两者应该一样)。
2024-08-17 22:47:16
851
原创 【后端修行之MySQL】索引高性能的策略有哪些?
不是所有的索引都能成为覆盖索引,覆盖索引必须存储索引列的值。只有当索引的列顺序和ORDER BY自居的顺序完全一致,并且所有列的方向都一样(正序或倒序),MySQL才能用索引来对结果做排序。为多个列单独建立索引并不能提升查询性能(为WHERE条件都船舰索引,这个模糊建议的误区),而应该采用索引合并策略。不重复的索引值(基数)和数据表的记录总数(#T)的比值,范围从1/#T到1之间。处理索引很长的字符列,通过前缀索引,节约索引空间,提升索引效率,但会降低索引的选择性。和查询条件的具体值(值的分布)有关。
2024-08-17 22:37:47
482
原创 【后端修行之MySQL】有哪些索引类型?优点?
存储了子节点的指针,通过比较节点页的值和要查找的值可以找到合适的指针进入下层子节点。全值匹配、匹配最左前缀(只使用索引的第一列)、匹配列前缀、匹配范围值、精确匹配某一列并范围匹配另外一列、只访问索引的查询。MyISAM使用前缀压缩技术使得索引更小,索引通过数据的物理位置引用被索引的行;,哈希索引将所有哈希码存储在索引中,同时在哈希表中保存指向每个数据行的指针。哈希索引的结构十分紧凑,所以哈希索引查找的速度非常快。三星:索引中的列包含了查询中需要的全部列。他们的指针指向的是被索引的数据。
2024-08-17 22:28:06
362
原创 【后端修行之MySQL】MySQL架构及基本名词解释
分层架构:上层是服务器层的服务和查询执行引擎(核心功能:查询解析、分析、优化、缓存以及内置函数(日期,时间,加密函数和数学函数)),下层是存储引擎(数据的提取和存储)。但是无法解决幻读(读取某个范围的记录时,另外的事务对范围内插入新的记录),在此读取时会产生幻行。优化器不关心表使用的执行引擎,但存储引擎对于优化查询是有影响的(例:某种引擎的索引,对特定的查询有优化)。锁策略,解决锁的开销(锁操作:获得,检查解除,释放)和数据安全性之间的平衡问题。,共享锁,互不阻塞,多个客户同一时刻读取同一资源,互不干扰。
2024-08-17 22:22:50
664
原创 【后端修行之虚拟机】线程安全和锁优化(JUC底层)
如果共享的数据的确被争用,产生了冲突,那再进行其他的补偿措施,最常用的补偿措施是不断地重试,直到出现没有竞争的共享数据为止。,引入了自适应的自旋。在代码即将进入同步块的时候,如果此同步对象没有被锁定(锁标志位为“01”状态),虚拟机首先将在当前线程的栈帧中建立一个名为锁记录(Lock Record)的空间,用于存储锁对象目前的Mark Word的拷贝(官方为这份拷贝加了一个Displaced前缀,即Displaced Mark Word),这时候线程堆栈与对象头的状态如图所示)。互斥是方法,同步是目的。
2024-08-17 22:07:06
550
原创 【后端修行之虚拟机】浅记Java内存模型
每条线程还有自己的工作内存(Working Memory,可与前面讲的处理器高速缓存类比),线程的工作内存中保存了被该线程使用的变量的主内存副本[2],线程对变量的所有操作(读取、赋值等)都必须在工作内存中进行,而不能直接读写主内存中的数据[3]。从更基础的层次上说,主内存直接对应于物理硬件的内存,而为了获取更好的运行速度,虚拟机(或者是硬件、操作系统本身的优化措施)可能会让工作内存优先存储于寄存器和高速缓存中,因为程序运行时主要访问的是工作内存。这里必须强调的是“同一个锁”,而“后面”是指时间上的先后。
2024-08-17 21:09:54
588
原创 【后端修行之虚拟机】运行时栈帧结构
第一种方式是执行引擎遇到任意一个方法返回的字节码指令,这时候可能会有返回值传递给上层的方法调用者(调用当前方法的方法称为调用者或者主调方法),方法是否有返回值以及返回值的类型将根据遇到何种方法返回指令来决定,这种退出方法的方式称为。而对于执行引擎来讲,在活动线程中,只有位于栈顶的方法才是在运行的,只有位于栈顶的栈帧才是生效的,其被称为“当前栈帧”(Current Stack Frame),与这个栈帧所关联的方法被称为“当前方法”(Current Method)。和作用域分配其余的变量槽。
2024-08-17 21:00:48
653
原创 【后端修行之虚拟机】虚拟机类加载机制
这并非是不可能出现的事情,一个典型的例子便是JNDI服务,JNDI现在已经是Java的标准服务,它的代码由启动类加载器来完成加载(在JDK 1.3时加入到rt.jar的),肯定属于Java中很基础的类型了。()方法是由编译器自动收集类中的所有类变量的赋值动作和静态语句块(static{}块)中的语句合并产生的,编译器收集的顺序是由语句在源文件中出现的顺序决定的,静态语句块中只能访问到定义在静态语句块之前的变量,定义在它之后的变量,在前面的静态语句块可以赋值,但是不能访问.
2024-08-17 20:28:56
544
原创 【后端修行之虚拟机】垃圾收集器--整理
使用记忆集避免全堆作为GC Roots扫描,但在G1收集器上记忆集的应用其实要复杂很多,它的每个Region都维护有自己的记忆集,这些记忆集会记录下别的Region指向自己的指针,并标记这些指针分别在哪些卡页的范围之内。负责更新Region的统计数据,对各个Region的回收价值和成本进行排序,根据用户所期望的停顿时间来制定回收计划,可以自由选择任意多个Region构成回收集,然后把决定回收的那一部分Region的存活对象复制到空的Region中,再清理掉整个旧Region的全部空间。
2024-08-17 20:17:04
650
原创 【后端修行之虚拟机】存活判定算法&垃圾回收算法
判定了非GC Roots,实际还不会立刻被收集,还会判断对象是否有必要执行finalize()方法,如果确定要执行,对象会被放进一个F-Queue队列,有一个低优先级的线程去执行.如果还能和引用链上的对象建立关联就会被移除集合,否则就是要被真正回收了.有一系列符合要求的对象作为GC Roots根节点,然后根据他们的引用关系,搜索其他的相关对象.如果有些对象和这些根节点或与根节点有应用关系的对象没有关系,那么这些对象不可达,说明也不会被引用,使用.那些已经死掉的对象,没用的对象就需要回收管理。
2024-08-17 14:28:13
345
原创 【后端修行之虚拟机】Java内存区域和内存溢出异常
在内存划分句柄池,同时句柄池内存储两个指针:对象指针和类型指针. 使用他的好处在于,由于gc存在对象可能会移动,用句柄的话reference存储的数据比较稳定,只有修改对应句柄中的对象地址. 坏处就是访问对比直接指针多一次指针定位时间开销。符号引用转直接引用),字面量和符号引用形式上都是字符串,但语意用途不一样,字面量表示常量的值,符号引用表示符号的名称,运行时解析为实际的或方法.Java程序运行起来,会将内存区域分成几个区域,虚拟机栈\本地方法栈\堆\方法区\程序计数器,不同区域会有。
2024-08-17 14:22:20
557
空空如也
关于python文件数据筛选另存的问题(计算机二级考试)
2022-09-16
TA创建的收藏夹 TA关注的收藏夹
TA关注的人