<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Lyinj的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/Lyinj</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Lyinj]]></copyright><item><title><![CDATA[netty是如何在启动时调用epoll_ctl的]]></title><link>https://blog.youkuaiyun.com/Lyinj/article/details/158384217</link><guid>https://blog.youkuaiyun.com/Lyinj/article/details/158384217</guid><author>Lyinj</author><pubDate>Thu, 19 Mar 2026 16:38:49 +0800</pubDate><description><![CDATA[类的关系是eventloop是继承group的。ctl不是马上进行的而是回滞后的在之后的select的过程中通过扫描队列方式动态新增的。第二段则是一个随便写写的handler用以模拟我们通常使用mvc架构中的service中的业务代码逻辑。然后这里创建新线程是通过一个叫做newchild的方法来创建的。然后group是一个定长度的线程池并且具备某些时间性质相关的方法的线程池。我们发现第十次打印总是1这并非是巧合这是因为group基于这种预先分配的机制得以实现一个“比较公平”的任务分配。是一个特殊的线程池。]]></description><category></category></item><item><title><![CDATA[并发考古（三）以及一些其他方向的东西]]></title><link>https://blog.youkuaiyun.com/Lyinj/article/details/157394914</link><guid>https://blog.youkuaiyun.com/Lyinj/article/details/157394914</guid><author>Lyinj</author><pubDate>Mon, 26 Jan 2026 14:55:23 +0800</pubDate><description><![CDATA[在本文中，我们考虑一个无限类的可满足性问题，其中包含这两个特殊问题作为特例，并证明该类的每一个成员要么在多项式时间内可判定，要么是NP完全的。但是我们要意识到当我们论证到图灵完备本身就是在讨论一种机械上的假设，而当你意思到需要回答这一个点又是对什么问题的继承......（有意思的是神经网络模型也曾被证明有某种区分于离散状态机的性质并且仅在一定条件可表达图灵完备的范畴，这是否可以说明神经网络模型本身就是就挑战机械挑战我们的直觉呢？图灵的论证思路是提出一个在我们认知的数的范畴中还存在着一种可计算数的范畴。]]></description><category></category></item><item><title><![CDATA[从一个编辑校验问题谈接口设计的边界]]></title><link>https://blog.youkuaiyun.com/Lyinj/article/details/155892579</link><guid>https://blog.youkuaiyun.com/Lyinj/article/details/155892579</guid><author>Lyinj</author><pubDate>Sat, 13 Dec 2025 21:02:10 +0800</pubDate><description><![CDATA[都是这个2乘2的状态内在的矛盾去发散开来的。重点是我们如何发现这种内在的矛盾。这样解决破坏了这种机制的什么东西。唯一判断的基础建设。你只能利用一个根据城市名查询相关记录是否存在的方法。且你不能要求新增其他的数据库交互手段以及和前端的动作。当输入到语义的映射不可逆时，不存在完备校验函数。层尽可能通过一个接口，一个方法来解决。奇怪的校验（城市和图片配置的校验）状态空间的维度 < 语义空间的维度。证明检查语义坍缩说明矛盾的机制？异常（不发生数据库变更）的。违反了自反推导的命题和状态。这是一个“非函数性问题”]]></description><category></category></item><item><title><![CDATA[并发考古二（可见性）]]></title><link>https://blog.youkuaiyun.com/Lyinj/article/details/154962303</link><guid>https://blog.youkuaiyun.com/Lyinj/article/details/154962303</guid><author>Lyinj</author><pubDate>Mon, 17 Nov 2025 23:34:33 +0800</pubDate><description><![CDATA[我才确定了可靠的关键在于操作同步的反馈和持久化技术的写入。而在非顺序机器中，相当一部分事件之间不可比，我们判断的是一种类似“机械结构传导”的关系——也就是说，我们通过观察传播、延迟、确认这些外部证据来推断顺序，而非通过运算本身。这种不可比性本质上与“最终一致性”有某种形而上的共性：我们讨论的不是严格的先后，而是“何时认为状态已经稳定”。我们知道现代的编程语言提供了原子操作这样的方式来确保某些原子操作的变量的可靠性。真正让我看到偏序价值的，是一个看似简单的时延处理问题——在本地运算与传输之间的取舍。]]></description><category></category></item><item><title><![CDATA[考古并发历史（1）]]></title><link>https://blog.youkuaiyun.com/Lyinj/article/details/153932563</link><guid>https://blog.youkuaiyun.com/Lyinj/article/details/153932563</guid><author>Lyinj</author><pubDate>Sun, 26 Oct 2025 21:06:14 +0800</pubDate><description><![CDATA[在顺序机器中，比较事件之间全序（total order）；然后还有就是当时这个算法的提出是没有考虑死锁。算法他自己也强调了两个前提即对称和循环。引入顺序，使每个进程在尝试进入临界区时。而这个维护轮次的变量是安全的吗？在非顺序机器中，比较事件之间不可比；的或者说这个假设的场景太过于理想。Dekker 算法（1959）一次只有一个进程可以进入临界区。按照固定顺序检查前面的进程。]]></description><category></category></item><item><title><![CDATA[读读线程池的代码]]></title><link>https://blog.youkuaiyun.com/Lyinj/article/details/152666618</link><guid>https://blog.youkuaiyun.com/Lyinj/article/details/152666618</guid><author>Lyinj</author><pubDate>Tue, 07 Oct 2025 20:23:13 +0800</pubDate><description><![CDATA[我们要关注的是钩子是怎么触发的？而在liunx中的epoll所谓的事件驱动则和一些驱动层的信号紧密相关。而netty难学就难在你在应用层编码的每个任务的提交时机和触发时机并非像线程池那样明确都是不确定的。某种程度上这种依赖于方法签名决定类型而非手动声明类型的写法与泛型和函数式的用法有深刻的关系。这个是因为callable要考虑返回的类型所以要求这边泛型声明以支持返回不同类型的返回结果。返回值的存在与否 + 方法参数类型，共同决定了 Lambda 实现的是 Runnable 还是 Callable。]]></description><category></category></item><item><title><![CDATA[springboot源码学习。（SPI和自动装配）]]></title><link>https://blog.youkuaiyun.com/Lyinj/article/details/151234456</link><guid>https://blog.youkuaiyun.com/Lyinj/article/details/151234456</guid><author>Lyinj</author><pubDate>Sat, 06 Sep 2025 00:36:14 +0800</pubDate><description><![CDATA[起因事情的起因是这样的题主最近在研究spring amQP 的源码有个博主写的特别好我在这里面其实看到不少熟悉的知识点。这里就是spring自动装配的流程，其完整流程就是SpringBoot启动->@SpringBootApplication->@EnableAutoConfiguration->AutoConfigurationImportSelector扫描META-INF/spring.factories->加载RabbitAutoConfiguration->创建RabbitMQ相关Bean。]]></description><category></category></item><item><title><![CDATA[jdk1.8 nio相关。java对象和epoll三大函数怎么关联的？（有点乱有点跳）]]></title><link>https://blog.youkuaiyun.com/Lyinj/article/details/149308789</link><guid>https://blog.youkuaiyun.com/Lyinj/article/details/149308789</guid><author>Lyinj</author><pubDate>Sun, 13 Jul 2025 13:09:58 +0800</pubDate><description><![CDATA[SelectableChannel的每个子类都定义了一个validOps（）方法，该方法返回一组标识通道支持的操作的集合。（tip， 我们讨论流的时候不要狭隘的认为是一种传统的字节流。我们可以看到实现这个抽象类的两个类是两个mpl 还有一个带有明显的windowsselectorProvider相关的类。注意这里是mpl和上文的windowmpl是一个层级和windowprovider相关的类是不相属的。我们追入一程可以看到是当前的selctroprovidew的provider相关的方法只返回的。]]></description><category></category></item><item><title><![CDATA[tomcat的websocket协议升级。如何从报文交换变成全双工通信？session对象的注册和绑定？]]></title><link>https://blog.youkuaiyun.com/Lyinj/article/details/148557388</link><guid>https://blog.youkuaiyun.com/Lyinj/article/details/148557388</guid><author>Lyinj</author><pubDate>Tue, 10 Jun 2025 11:44:35 +0800</pubDate><description><![CDATA[get/setDefaultMaxSessionIdleTimeout() 设置 WebSocket 会话的最大空闲时间（毫秒）get/setDefaultMaxBinaryMessageBufferSize() 设置默认二进制消息的缓冲区大小（字节）get/setDefaultAsyncSendTimeout() 设置异步发送消息的最大等待时间（毫秒）来实现异步操作的结果等待（阻塞等待），从而兼顾了非阻塞 I/O 和流程控制的需求。）WebSocket POJO，交由容器（Tomcat）自己去实例化它。]]></description><category></category></item><item><title><![CDATA[io多路复用的三种方式]]></title><link>https://blog.youkuaiyun.com/Lyinj/article/details/148445357</link><guid>https://blog.youkuaiyun.com/Lyinj/article/details/148445357</guid><author>Lyinj</author><pubDate>Thu, 05 Jun 2025 10:31:16 +0800</pubDate><description><![CDATA[所以本质epoll相对于poll和select最大的优势还是省下那个对文件描述符轮询的资源和一个搜索上的数据结构的优化。因为 epfd1 发生事件了，epfd2 会被唤醒，epoll_wait 返回，告诉你 epfd1（你看到的数字5，就是 epfd1 的文件描述符）发生了事件。可以看到获取文件描述符的过程是不会阻塞的。所以这个文件描述符的状态是一个维护在vfs中的。我们可以看看到不同于poll使用封装的poll_fd及对应的List select直接用一个fd_bits相关的数据结构来表示文件描述符。]]></description><category></category></item><item><title><![CDATA[网络研究角度下的文件系统（学习）]]></title><link>https://blog.youkuaiyun.com/Lyinj/article/details/148305921</link><guid>https://blog.youkuaiyun.com/Lyinj/article/details/148305921</guid><author>Lyinj</author><pubDate>Thu, 29 May 2025 10:58:15 +0800</pubDate><description><![CDATA[VFS文件系统题主本来的初衷是研究netty而去研究liunx的部分源码。所以在研究到vfs文件系统的话如果从流和通信这些可靠性的讨论似乎就已经到了尽头了。无非是看下数据结构。然后上层统一的暴漏了什么样的接口。并不值得成文。所以题主在看在学的时候一直在思考如何去描述这么一个事物。市面上对于文件系统的描述几乎都是侧重于说明文件系统的寻址算法或者文件系统在操作系统层面的抽象。都不能够让我比较满意。我本身对于复杂的寻址算法本身不感兴趣。也对抽象那一套所谓的拆分和中间层，提升复用性的思路不感冒。]]></description><category></category></item><item><title><![CDATA[文件系统与反思（随笔）]]></title><link>https://blog.youkuaiyun.com/Lyinj/article/details/148118964</link><guid>https://blog.youkuaiyun.com/Lyinj/article/details/148118964</guid><author>Lyinj</author><pubDate>Wed, 21 May 2025 16:22:35 +0800</pubDate><description><![CDATA[回到开篇的引子，可能连我自己觉得第一句话读上去有点拽拽的感觉除此之外沉思过后，就会去想，为什么可接发达这个大家都能够说的明白的事实，还要想茴香豆的写法那样，刻意的去刁钻和为难？题主有记日志的习惯，对于市面上各种各样的文档工具由于工作的原因总能接触到，但是随着需求的提升，我希望一个日志里面能够有图片能够有文件。能够协作和格式传输。但是当我换位思考的时候，我才发现本质上我需要一种支持通用文件传输（word pdf txt png）和保存和管理软件的时候的开发时，我意识到了自己不是需要一个所谓个人数据库的概念。]]></description><category></category></item><item><title><![CDATA[linux 流是可靠的吗？内核有对串口通信做可靠性的保障吗？liunx源码调试以及对串口数据从环形缓冲区到编码全链路分析。]]></title><link>https://blog.youkuaiyun.com/Lyinj/article/details/148084888</link><guid>https://blog.youkuaiyun.com/Lyinj/article/details/148084888</guid><author>Lyinj</author><pubDate>Tue, 20 May 2025 12:00:43 +0800</pubDate><description><![CDATA[题主在读大一的时候那会由于家里的原因，曾把学习的重心放在单片机上。说来惭愧，刚接触技术。很多步骤都只能按部就班。不了解通信原理，也不了解什么参数的数据含义。照着网上的代码一顿乱写。然后不断测试调整，勉强还看的过去。当时又有恐学之疑。害怕自己进度太慢？害怕自己学了好久好久一事无成？跟着视频勉强把该跑的几个模块跑通之后，由于学校资源的问题，便跑去学那java，前后端那些东西了。当时物理现象总是不可靠的。]]></description><category></category></item><item><title><![CDATA[liunx源码探索。文件描述，流，tty,UART,port,dirver]]></title><link>https://blog.youkuaiyun.com/Lyinj/article/details/147995007</link><guid>https://blog.youkuaiyun.com/Lyinj/article/details/147995007</guid><author>Lyinj</author><pubDate>Fri, 16 May 2025 00:28:56 +0800</pubDate><description><![CDATA[Linux 中“文件”（“文件描述符”）和“流”的行为之所以一致，是因为 Linux 内核在驱动层（tty）实现流行为的时候已经关联了文件结构体。这些功能主要由 drivers/tty/n_tty.c 文件中的 n_tty_ldisc_ops 结构体实现，该结构体定义了一系列操作函数，用于处理上述功能。所以流的有效性和可靠性是依赖于tty的tty和设备中间的行为又是依赖于uart的也就是说本质上是uart协议保证了流的有效性。上网查了下，这边给出来的判断是通过一个seek 的行为去区分的。]]></description><category></category></item><item><title><![CDATA[镜像的创建方法(收尾)]]></title><link>https://blog.youkuaiyun.com/Lyinj/article/details/147950715</link><guid>https://blog.youkuaiyun.com/Lyinj/article/details/147950715</guid><author>Lyinj</author><pubDate>Wed, 14 May 2025 11:46:03 +0800</pubDate><description><![CDATA[题主这边想趁热打铁想对Liunx这一快的io模型和网络这部分的东西再像一段功夫。在学习这些源码的过程中。但是越研究越是对lilunx和一些现代容器编排工具的设计感概其精妙。我这边源码看的也差不多了。网络部分的东西就不好放了。因为大量的图片和敏感信息这边做起处理来太累了。：在 Kubernetes 集群中安全构建镜像的工具，不依赖 Docker Daemon。但容器中原始的服务主进程（通常是 PID 1），它的环境变量在容器创建时就固定了。你启动的是一个新的 shell 进程，它拥有自己的环境变量副本。]]></description><category></category></item><item><title><![CDATA[容器信息与容器指令的实现。]]></title><link>https://blog.youkuaiyun.com/Lyinj/article/details/147851436</link><guid>https://blog.youkuaiyun.com/Lyinj/article/details/147851436</guid><author>Lyinj</author><pubDate>Sat, 10 May 2025 13:08:42 +0800</pubDate><description><![CDATA[因此，需要在这段C代码前面一开始的位置就指定环境变量，对于不使用exec功能的Go代码，只要不设置对应的环境变量，那么当C程序检测到没有这个环境变量时，就会直接退出，继续执行原来的代码，并不会影响原来的逻辑。可以看到，这段程序还是很怪异的，和普通的Go代码是不一样的。这里主要使用了构造函数，然后导入了C模块，一旦这个包被引用，它就会在所有Go运行的环境启动之前执行，这样就避免了Go多线程导致的无法进入mnt Namespace的问题。所以在docker也好更成熟的商业的应用就需要对这方面做更严谨的处理。]]></description><category></category></item><item><title><![CDATA[容器后台托管以及生命周期管理（回收）]]></title><link>https://blog.youkuaiyun.com/Lyinj/article/details/147775316</link><guid>https://blog.youkuaiyun.com/Lyinj/article/details/147775316</guid><author>Lyinj</author><pubDate>Wed, 07 May 2025 22:06:01 +0800</pubDate><description><![CDATA[在Docker早期版本，所有的容器init进程都是从docker daemon这个进程fork出来的，这也就会导致一个众所周知的问题，如果docker daemon挂掉，那么所有的容器都会宕掉，这给升级docker daemon带来很大的风险。这就是父进程退出而容器进程依然运行的原理。虽然容器刚开始是由当前运行的mydocker进程创建的，但是当mydocker进程退出后，容器进程就会被进程号为1的init进程接管，这时容器进程还是运行着的，这样就实现了mydocker退出、容器不宕掉的功能。]]></description><category></category></item><item><title><![CDATA[容器初始化（根路径重定向以及内存文件系统挂载）]]></title><link>https://blog.youkuaiyun.com/Lyinj/article/details/147742997</link><guid>https://blog.youkuaiyun.com/Lyinj/article/details/147742997</guid><author>Lyinj</author><pubDate>Tue, 06 May 2025 21:55:48 +0800</pubDate><description><![CDATA[pivot_root（解除根路径依赖）在编写应用时，我们经常会涉及路径依赖，比如读取配置文件、写日志、加载资源等。这些路径通常是相对于根目录（）或某个固定路径写死的。当应用运行在容器环境中时，为了让这些路径操作不会访问宿主机的文件系统，我们需要“切换”进程所看到的根目录。这个时候，就需要用到rootfs的操作 —— 也就是通过pivot_root系统调用来改变进程的根文件系统。pivot_root的作用是将当前进程的根目录切换为指定的新根目录new_root，并将旧的根目录移动到。]]></description><category></category></item><item><title><![CDATA[通过系统调用实现进程隔离？（初学用）]]></title><link>https://blog.youkuaiyun.com/Lyinj/article/details/147646452</link><guid>https://blog.youkuaiyun.com/Lyinj/article/details/147646452</guid><author>Lyinj</author><pubDate>Thu, 01 May 2025 12:36:53 +0800</pubDate><description><![CDATA[接着，使用 cmd.SysProcAttr 来设置进程的命名空间标志，如 CLONE_NEWUTS、CLONE_NEWPID、CLONE_NEWNS、CLONE_NEWNET 和 CLONE_NEWIPC，这些标志确保容器内的进程能够创建并隔离所需的命名空间，保证进程的资源不与宿主机共享。它会继承父进程的环境，包括文件描述符、内存映像等，这样有时会导致子进程继承父进程的资源，可能不适用于隔离环境（比如容器化的需求）。可以完全替换当前进程的映像，使得新的进程与父进程完全隔离，避免了不必要的资源继承。]]></description><category></category></item><item><title><![CDATA[Nignx 负载均衡能否解决公网宽带问题？关于nginx 七层和四层负载的抓包实验]]></title><link>https://blog.youkuaiyun.com/Lyinj/article/details/147221298</link><guid>https://blog.youkuaiyun.com/Lyinj/article/details/147221298</guid><author>Lyinj</author><pubDate>Mon, 14 Apr 2025 13:47:28 +0800</pubDate><description><![CDATA[我们现在一个虚拟机中跑一个nc 命名来模拟一个http服务器发一个请求然后手写一个请求头成功测试到我们的http服务器返回了数据。]]></description><category></category></item></channel></rss>