Linux内核的netfilter详解Linux内核的netfilter是一个强大的网络数据包过滤和处理框架,它是Linux内核网络栈的核心组件之一。
🔍 什么是netfilternetfilter是Linux内核中的一个框架,它提供了一系列的钩子(hooks)来允许内核模块在网络栈的不同位置注册回调函数,从而实现对网络数据包的拦截、修改、过滤和处理。
🏗️ netfilter架构核心组件
钩子点(Hook Points): 在网络栈的关键位置设置的拦截点
钩子函数(Hook Functions): 注册在钩子点上的处理函数
优先级系统: 决定多个钩子函数的执行顺序
返回值机制: 控制数据包的后续处理流程
五个主要钩子点123451. NF_INET_PRE_ROUTING # 路由决策前2. NF_INET_LOCAL_IN # 本地输入3. NF_INET_FORWARD # 转发4. NF_INET_LOCAL_OUT # 本地输出5. NF_INET_POST_ROUTING # 路由决策后
📊 数据包处理流程
flo ...
JDK 线程池里真的区分 核心线程与非核心线程吗?不少校招小伙伴对于线程池的了解,大概就是如下图:
当核心线程数未满,则新建核心线程执行任务
当核心线程数满了,队列未满,则将任务放在等待队列里,等待核心线程去执行
当核心线程数满了(但未达最大线程数),队列也满了,新建非核心线程执行任务
如果已经达到最大线程数,且队列也满了,则执行饱和策略。
但是这样的了解,可能是不够的。因为这只是一个基础的流程,稍微问细一点、深一点就不够用了。比如,我可能会问下面这些问题:
都是知道核心线程默认是不销毁的,那么核心线程在队列中没有任务时,它是什么状态(线程状态),对于操作系统来说会不会分配时间片给它?
我们一般自己新创建一个线程,可能使用 new Thread,然后 执行一下 start 方法,然后这个线程 执行完run方法内代码,就销毁了。线程池 ThreadPoolExecutor 中是如何实现 线程复用的?
线程池中 区分 核心线程与非线程线程吗?他们数据结构上以及行为上有什么不同。
非核心线程是不是只执行 新提交的任务,不消费等待队列中的任务。
这里我详细说说问题3:线程池中 区分 ...
MySQL 索引失效场景
索引列参与计算或进行函数操作
使用OR,并且OR的两边存在< 或者 > 的时候
使用like操作,但是不满足左匹配,例如:”%java”
隐式类型转换,比如一个string类型列,使用数字来查询。这种情况有一个特列,如果字段类型为int类型,而查询条件添加了单引号或者双引号,则Mysql会参数转化为int类型,这种情况也可以走索引。
不等于比较。这种情况也是有可能会走索引的,比如用id进行!=,是可能走索引的。
使用is not null时不走索引,使用 is null 走索引
order by。如果order by的时候数据量很小,数据库可能直接在内存中进行排序。
in。一般在in中的值比较少的时候可能会走索引优化,但如果选项比较多,可能不走索引。
联合索引失效。比如联合索引(a,b,c),进行查询时没有满足最左匹配(查b,查c,查b c)
存储引擎不能使用索引范围条件右边的列
两列做比较。如果两个列数据都有索引,但是在查询条件中对两列数据进行了对比操作,则会导致索引失效。
查询条件是用no in时,如果是主键则走索引。如果是普通索引, ...
Redis 底层数据结构原文拷贝:https://pdai.tech/md/db/nosql-redis/db-redis-x-redis-ds.html
1. 底层数据结构引入在对对象机制(redisObject)有了初步认识之后,我们便可以继续理解如下的底层数据结构部分:
简单动态字符串 - sds
压缩列表 - ZipList
快表 - QuickList
字典/哈希表 - Dict
整数集 - IntSet
跳表 - ZSkipList
2. 简单动态字符串 - sdsRedis 是用 C 语言写的,但是对于Redis的字符串,却不是 C 语言中的字符串(即以空字符’\0’结尾的字符数组),它是自己构建了一种名为 简单动态字符串(simple dynamic string,SDS)的抽象类型,并将 SDS 作为 Redis的默认字符串表示。
2.1. SDS 定义这是一种用于存储二进制数据的一种结构, 具有动态扩容的特点. 其实现位于src/sds.h与src/sds.c中。
SDS的总体概览如下图:
其中sdshdr是头部, buf是真 ...
Redis学习笔记 Redis诞生于2009年,作为一个基于内存的键值型NoSQL数据库。其有如下特点
键值(key-value)型,value支持多种不同数据结构,
单线程,每个命令具有原子性。不存在很多并发带来的问题。但是此单线程只是指代命令是但线程执行的,其他模块还有各自的线程。6.0版本中引入了多线程,但指代的是 IO多线程,如:网络数据的读写和协议解析时多线程。
低延迟、速度快(基于内存、IO多路复用、良好的编码)
支持数据持久化
支持主从集群、分片集群
支持多语言客户端
一、Redis 的安装1.1 Redis 安装(window)下方提供 Redis 各个版本的下载页面,我这里下载的是 3.2.100 版本。
https://github.com/microsoftarchive/redis/releases
将下载包 解压到本地目录,然后在 redis目录下进行 cmd ,输入不同的命令进行不同的安装方式:
临时服务安装如果你仅仅是用作学习使用,可以选择此安装方式。在 redis目录下 使用cmd 执行以下命令:redis-server.exe redis.wi ...
指令重排 真的有点阴在 Java 中,指令重排(Instruction Reordering) 是编译器、处理器或内存系统为了提高执行效率而对指令顺序进行的优化。这种优化在单线程环境下是透明的(遵循 as-if-serial 语义),但在多线程环境中可能导致 可见性 和 有序性 问题。以下是 Java 中可能被指令重排的典型操作和场景,以及对应的解决方案:
——s
一、可能被指令重排的操作及场景1. 普通变量赋值(非 volatile)
场景:多个线程对同一非 volatile 变量进行读写。
示例:
1234567891011int a = 0;boolean flag = false;// 线程1a = 1; // 可能被重排到 flag 赋值之后flag = true;// 线程2if (flag) { System.out.println(a); // 可能输出 0(未观察到 a=1)}
问题:线程1的 a = 1 和 flag = true 可能被重排,导致线程2看到 flag 为 true 时,a 仍为 0。
2. 对象初 ...
JVM新生代只有一个Eden+S0 可以吗
先直接说答案:理论上可以,也能实现标记-复制算法。但工程上不可以,因为会大大浪费空间。
标记-复制算法下,新生代三个区域是怎么使用的:
初始时,Eden、S0、S1 都是空
对象都分配在 Eden区,如果Eden区快满了就触发垃圾回收,把 Eden区中的存活对象转移到一个块空的survivor区(S0),然后 Eden区清空。(一次youngGC结束)
再次分配新对象到 Eden,再次触发垃圾回收(此时不光标记 Eden,还需要标记S0了),然后将这两个区域存活的转移到 另一块空的survivor区(S1),清理S0、Eden区(一次youngGC结束)
再次分配新对象到 Eden,再次触发垃圾回收(此时不光标记 Eden,还需要标记S1了),然后将这两个区域存活的转移到 另一块空的survivor区(S0)
因此采用 Eden+S0+S1(8:1:1),可以保证JVM正常运行时,新生代的空间有9成可以存放对象,1成是空着的。
如果说只有两个区域,比如 Eden区和S0。那么由于标记复制算法的限制(必须由一块区域是空的)。每次只有一个区域 ...
Spark集群架构与组件详解:从Driver到Executor的解析引言在分布式计算的世界里,Spark以其优雅的架构设计和强大的计算能力脱颖而出。当我们谈论Spark集群时,实际上是在讨论一个由多个组件协同工作的复杂系统。这些组件各司其职,却又紧密配合,共同完成大规模数据处理任务。
本文将深入剖析Spark集群的架构设计,从Driver程序的启动到Executor的执行,从资源调度到任务分配,我们将逐一揭开这些组件的神秘面纱。这不是一篇官方文档的翻译,而是基于实际开发经验的深度技术解析。
Spark集群架构概览整体架构设计Spark集群采用了经典的Master-Slave架构,但这种架构在Spark中有着独特的实现方式。整个集群由以下几个核心组件构成:
graph TB
subgraph "Driver Program"
D[Driver]
D --> D1[SparkContext]
D --> D2[DAG Scheduler]
D --> D3[Task Sche ...
mac安装 picgo 报错 文件损坏picgo下载地址:https://github.com/molunerfinn/picgo/releases
mac安装报错不是因为 picgo版本问题。而是mac的原因:苹果自macOS Sierra 10.12版本起,去除了允许“任何来源”的选项(参考苹果官方文档关于系统安全性与隐私设置部分,具体链接:苹果官方文档相关页面 )。这一系统安全策略变化,使得像PicGo这样的第三方未认证软件受到限制,即便软件本身未损坏,也可能因来源未被系统认可而无法正常打开
解决办法:
给文件赋予安全性设置:首先,在“访达”(Finder)中进入“应用程序”目录,将PicGo软件图标拖至终端窗口,获取其完整路径。然后,在终端执行如下命令(这里软件路径为/Applications/PicGo.app):1sudo xattr -r -d com.apple.quarantine /Applications/PicGo.app






