对于我这种普通程序员来说,Linux 内核是神秘而高贵的,轻易我们不敢去说内核相关的事情。不过,有时候逼不得已,也得硬着头皮对内核进行一些调试。(比如发现一些异常现象,怀疑是某个系统调用的异常行为在作祟时)为此,学习一些内核调试技术也是有必要的。
限于个人水平,此篇以操作指南为主,不涉及过多的理论知识——其实是我不懂。
对于我这种普通程序员来说,Linux 内核是神秘而高贵的,轻易我们不敢去说内核相关的事情。不过,有时候逼不得已,也得硬着头皮对内核进行一些调试。(比如发现一些异常现象,怀疑是某个系统调用的异常行为在作祟时)为此,学习一些内核调试技术也是有必要的。
限于个人水平,此篇以操作指南为主,不涉及过多的理论知识——其实是我不懂。
VSCode 是微软主导开发的新一代编辑器。自其开发之初,就与 Sublime Text 以及 GitHub 主导开发的 Atom 对标。几年前,VSCode 中的 LaTeX 支持还很不完善,考虑到我个人对 LaTeX 的强需求,当时没有从 Sublime Text 切换到 VSCode 上。时至今日,VSCode 发展得已经很不错。前些日子,东升在他的新主页上发布了一篇博文,讲解如何在当前的 VSCode 上配置 LaTeX IDE。看过之后,我就心动了,立即配置好来使用。
不过,由于东升不在 macOS 下工作,他的博文中没有提到如何让 VSCode 在 macOS 上与诸如 Skim 的外部 PDF 浏览器配合工作——特别是 LaTeX 的正反跳转。检索互联网之后,也没有完整可用的方法。甚至 LaTeX workshop 官方的说法也是不支持,需要用户自己想办法绕过。故此有这篇文章。
今天在讨论神经网络中的激活函数时,陆同学提出 Sigmoid 函数的输出不是以零为中心的(non-zero-centered),这会导致神经网络收敛较慢。关于这一点,过去我只是将其记下,却并未理解背后的原因。此篇谈谈背后的原因。
SSH 最基本的用法相信你已经了解。这次我们要用 SSH 来做一些特别的事情:建立正反 SSH 隧道,穿透防火墙,访问本不可见的内网服务器。
Linux 的线程设计十分优美:线程只不过是共享虚拟地址空间和文件描述符表的进程而已。由某一进程产生的线程是该主线程(父进程)的子进程。除了少数线程相关的系统调用,操作线程的系统调用与操作进程的系统调用完全相同。这种优美与文件描述符的优美异曲同工。
通常来说,在类-Unix 的系统上,进程是通过 fork()
来生成的。新生成的进程的虚拟内存空间是原进程的拷贝,但具有独立的地址空间和文件描述符表。(Linux 使用写时拷贝技术提升了这一步骤的效率)不过,对于创建线程来说,这种做法太高级(high-level)了;因此 Linux 还有名为 clone()
的系统调用。它与 fork()
的行为大致相同,只不过它能通过一系列参数控制其行为:主要是控制子进程与父进程之间共享那些运行时上下文。
在进程的栈上创建一个新的线程非常简单——只需要 15 条命令,而无需任何库,特别是不需要调用 pthread
库!本文中,我将以 x86-64 平台为例。所有代码均以 NASM 语法写就,因为,依我愚见,它是至今为止最好的(参见:这里)。
此处是完整的示例代码:Pure assembly, library-free Linux threading demo。