Linux Kernel

JVM 源码分析之一个 Java 进程究竟能创建多少线程

拥有回忆 提交于 2020-10-26 23:15:12
本文来自: PerfMa技术社区 PerfMa(笨马网络)官网 概述 虽然这篇文章的标题打着JVM源码分析的旗号,不过本文不仅仅从 JVM 源码角度来分析,更多的来自于 Linux Kernel 的源码分析,今天要说的是 JVM 里比较常见的一个问题。 这个问题可能有几种表述 一个Java进程到底能创建多少线程? 到底有哪些因素决定了能创建多少线程? java.lang.OutOfMemoryError: unable to create new native thread 的异常究竟是怎么回事 不过我这里先声明下可能不能完全百分百将各种因素都理出来,因为毕竟我不是做 Linux Kernel 开发的,还有不少细节没有注意到的,我将我能分析到的因素和大家分享一下,如果大家在平时工作中还碰到别的因素,欢迎在文章下面留言,让更多人参与进来讨论 从 JVM 说起 线程大家都熟悉, new Thread().start() 即会创建一个线程,这里我首先指出一点 new Thread() 其实并不会创建一个真正的线程,只有在调用了 start 方法之后才会创建一个线程,这个大家分析下 Java 代码就知道了,Thread 的构造函数是纯 Java 代码,start 方法会调到一个 native 方法 start0 里,而 start0 其实就是 JVM_StartThread 这个方法。

【转载】漫画赏析:Linux 内核到底长啥样

烂漫一生 提交于 2020-10-25 11:26:25
漫画赏析:Linux 内核到底长啥样 今天,我来为大家解读一幅来自 TurnOff.us 的漫画 “InSide The Linux Kernel” 。 TurnOff.us 是一个极客漫画网站,作者Daniel Stori 画了一些非常有趣的关于编程语言、Web、云计算、Linux 相关的漫画。今天解读的便是其中的一篇。 在开始,我们先来看看这幅漫画的全貌! 这幅漫画是以一个房子的侧方刨面图来绘画的。使用这样的一个房子来代表 Linux 内核。 地基(底层) 作为一个房子,最重要的莫过于其地基,在这个图片里,我们也从最下面的地基开始看起: 文件系统 地基(底层)由一排排的文件柜组成,井然有序,文件柜里放置着“文件”——电脑中的文件。 进程 左上角,有一只胸前挂着 421 号牌的小企鹅,它表示着 PID(Process ID) 为 421 的进程,它正在查看文件柜中的文件,这代表系统中正有一个进程在访问文件系统。 看门狗 在右下角有一只小狗,它是看门狗(watchdog),这代表对文件系统的监控。 一层(地面层) 看完了地基,接下来我们来看地基上面的一层,都有哪些东西。 进程表 在这一层,最引人瞩目的莫过于中间的一块垫子,众多小企鹅在围着着桌子坐着。这个垫子的区域代表进程表。 左上角有一个小企鹅,站着,仿佛在说些什么这显然是一位家长式的人物,不过看起来周围坐的那些小企鹅不是很听话—

VDP时间不同步连接错误解决

不打扰是莪最后的温柔 提交于 2020-10-10 01:55:49
VDP时间不同步连接错误解决 系统时钟(System Clock)是指当前Linux Kernel中的时钟,硬件时钟(Real Time Clock)是存储在CMOS里的时钟,关机后该时钟依然运行,由主板的电池为它供电。 硬件时钟它依照主板石英晶体振荡器频率工作,在启动系统后,系统从该时钟读取时间信息,之后独立运行。两种不同的时钟会带来一些问题,比如即使系统时钟设置与Internet同步,它也不会主动的去修改硬件时钟,这会导致下次启动后,系统时间又会变成硬件时钟的时间。 若系统未正常关机,这在vSphere 环境下就会导致VDP服务器NTP时间不同步错误: 首先我们需要在vCenter 和VDP所在的宿主ESXi上手动配置时间,禁用掉NTP 客户端的自动同步,避免干扰手工校对时间: 连接vCenter和VDP的CLI控制台: 使用date命令分别查看vCenter和VDP的Linux系统时间: date 再分别查看硬件时间: clock --show 修改系统时间,如2020年8月31日下午18点16分(月/日/年 时间): date --set="08/31/20 18:16" 时间还可以精确到秒: date --set="08/31/20 18:16:59" 为了避免以后出现问题,可以同时修改硬件时间: clock --set="08/31/20 18:16"

Linux下的I/O复用与epoll详解

时光怂恿深爱的人放手 提交于 2020-09-30 06:55:46
前言 I/O多路复用有很多种实现。在linux上,2.4内核前主要是select和poll,自Linux 2.6内核正式引入epoll以来,epoll已经成为了目前实现高性能网络服务器的必备技术。尽管他们的使用方法不尽相同,但是本质上却没有什么区别。本文将重点探讨将放在EPOLL的实现与使用详解。 为什么会是EPOLL select的缺陷 高并发的核心解决方案是1个线程处理所有连接的“等待消息准备好”,这一点上epoll和select是无争议的。但select预估错误了一件事,当数十万并发连接存在时,可能每一毫秒只有数百个活跃的连接,同时其余数十万连接在这一毫秒是非活跃的。select的使用方法是这样的: 返回的活跃连接 ==select(全部待监控的连接)。 什么时候会调用select方法呢?在你认为需要找出有报文到达的活跃连接时,就应该调用。所以,调用select在高并发时是会被频繁调用的。这样,这个频繁调用的方法就很有必要看看它是否有效率,因为,它的轻微效率损失都会被“频繁”二字所放大。它有效率损失吗?显而易见,全部待监控连接是数以十万计的,返回的只是数百个活跃连接,这本身就是无效率的表现。被放大后就会发现,处理并发上万个连接时,select就完全力不从心了。 此外,在Linux内核中,select所用到的FD_SET是有限的,即内核中有个参数__FD

Linux Swap交换分区介绍总结【靠谱,查看解释】

浪子不回头ぞ 提交于 2020-09-28 17:45:28
Swap使用建议物理内存的0.75 ------------------------------ Swap交换分区概念 什么是Linux swap space呢?我们先来看看下面两段关于Linux swap space的英文介绍资料: Linux divides its physical RAM (random access memory) into chucks of memory called pages. Swapping is the process whereby a page of memory is copied to the preconfigured space on the hard disk, called swap space, to free up that page of memory. The combined sizes of the physical memory and the swap space is the amount of virtual memory available. Swap space in Linux is used when the amount of physical memory (RAM) is full. If the system needs more memory resources and the RAM

Linux Kernel 5.8 发布,华为内核代码贡献全球持续领先

耗尽温柔 提交于 2020-09-24 16:20:23
近日, Linux Kernel 5.8 版本正式发布,Linus 表示 Linux Kernel 5.8 是“有史以来最大的发行版之一”。Linux Kernel 5.8 在 ARM64 架构特性方面,有不少的更新,华为92个社区内核工程师贡献了包括:ARM64 SPE perf event、ACPI CPPC 支持 ARM64 CPU 超频,以及虚拟化热迁移页标脏优化(128G 4K 页标脏从 650ms 优化到 1.8 ms),CPU休眠调控器默认可根据场景调整等等特性, 与此同时,华为在 Linux Kernel 5.8 中的代码贡献(changesets)、代码修改行(line changed)和内核缺陷发现方面,都交出了一份亮眼的答卷。 华为工程师郭寒军回忆到:“还记得十年前合入第一个 patch 的激动, 一转眼十年的时间,华为在社区已经拥有 20+ Maintainer,覆盖了:容器所使用的核心功能 Cgroup,软硬件解耦ACPI on ARM64,文件系F2FS/EROFS,RAS EDAC框架,Media子系统,IIO 子系统,以及 Perf on ARM64 等子系统上。这也是华为基础软件技术实力的体现。 内核代码贡献,华为排名全球第二 从公司贡献角度来说,华为提交的补丁数量位列第二名,占比 8.6%,代码修改行位列第一,占比 27.8%。

5分钟实现无密码电脑访问!英特尔雷电接口爆出七类漏洞,波及三大操作系统

依然范特西╮ 提交于 2020-08-19 19:52:08
  荷兰埃因霍温理工大学的安全研究人员近日公布, 在英特尔 2011 年推出的 Thunderbolt 接口(雷电接口)标准中发现了多个安全漏洞,最新的第三代雷电接口标准也未能幸免。    研究报告列举了七类漏洞和与之配套的攻击手段 ,比如固件验证机制不完善,脆弱的设备认证机制,使用未经身份验证的设备元数据和使用未经身份验证的控制器配置等等。    这些漏洞可能影响到 2019 年之前所有配有雷电接口的电脑 ,包括兼容第三代雷电接口标准的 USB Type-C 接口。三大主流 PC 操作系统 Windows、Linux 和 MacOS 都受到波及,其中 MacOS 受到的影响最小,只有小部分攻击方式对其“部分有效”。   在能够物理接触设备的前提下,即使用户未登录操作系统,电脑处于密码保护状态,甚至是硬盘经过加密,也无济于事——滥用漏洞的黑客可以在 5 分钟内跳过笔记本的密码登录界面,实现无密码访问。      图 | 报告列举七类漏洞是否会影响三个系统(来源:Bjrn Ruytenberg)   这种攻击方式可以被归类为 “邪恶女仆(Evil Maid)” 攻击的一种,主要针对已经关机但无人看管的计算机,利用 U 盘,bootloader 引导程序和键盘记录器等工具进行非盗窃式入侵,以获取登录信息和其他机密数据为目的。   除了要求攻击者能够物理访问目标设备以外

代码的品味

懵懂的女人 提交于 2020-08-19 04:32:25
我们经常谈论架构,谈论设计,却甚少关注实现和代码本身,架构和设计固然重要,但要说代码本身不重要,不仅我不同意,Robert C.Martin大叔也不同意,大叔认为“ 源码即是设计 ”。 在讨论具体的实施细则之前,我们不妨讨论一下什么是好代码?萝卜特(Martin)大叔认为:衡量代码质量的唯一标准是:WTF/min,也就是review代码的时候每分钟说“握草”的次数。这个定义虽有辱斯文,但粗野中不失调皮,调皮中又蕴含哲理。 好的代码如同文笔优美的散文,行云流水,如沐春风,阅读的时候,赏心悦目,带给人愉悦与启迪。 好的代码犹如构思精巧的小说,它或许不够平铺直述,但足够引人入胜,读到最后,你会豁然开朗,哦,原来是这样的啊,那一刻,你会觉得过程中的曲折和探索都是值得的。 好的代码,透过一个个函数,你仿佛可以窥视到作者有趣的灵魂,透过一行行代码,你仿佛在与一个充满智慧的朋友聊天,她总是思路清晰,逻辑严谨,娓娓道来。 而坏的代码,就像一个泥团,或者像一摊屎,阅读的时候,你仿佛被困于黑暗的迷宫,又仿佛在跟一个絮絮叨叨的人交谈,她的脑回路经常短路,说话含混不清,主次不分,叨逼半天,你依然get不到她的中心思想,你感觉智商受到了莫大的侮辱,甚至感觉像被人喂吃shit,你面露艰难神色,心中万马奔腾。 有很多区分好代码坏代码的规则,网上的文章也很多,我也看过不少,对于文章中提到的一些守则

带你遨游USB世界

﹥>﹥吖頭↗ 提交于 2020-08-19 00:59:55
1、什么是USB USB的全称是Universal Serial Bus,通用串行总线。它的出现主要是为了简化个人计算机与外围设备的连接,增加易用性。USB支持热插拔,并且是即插即用的,另外,它还具有很强的可扩展性,传输速度也很快,这些特性使支持USB接口的电子设备更易用、更大众化。 本文将从USB协议、枚举流程、host和device驱动等各方面,全面介绍Linux USB模块的工作原理和代码流程,下面就请随我一起,遨游多姿多彩而又复杂严谨的USB世界吧~ 2、USB传输基础知识介绍 2.1、USB金字塔型拓扑结构 2.1.1、USB协议基础 塔顶为USB主控制器和根集线器(Root Hub),下面接USB集线器(Hub),集线器将一个USB口扩展为多个USB口,USB2.0规定集线器的层数最多为6层,理论上一个USB主控制器最多可接127个设备,因为协议规定USB设备具有一个7 bit的地址(取值范围为0~127,而地址0是保留给未初始化的设备使用的)。 2.1.2、NRZI编码 USB采用差分信号传输,使用的是如上图所示的NRZI编码方式:数据为0时,电平翻转;数据为1时,电平不翻转。如果出现6个连续的数据1,则插入一个数据0,强制电平翻转,以便时钟同步。上面的一条线表示的是原始数据序列,下面的一条线表示的是经过NRZI编码后的数据序列。 2.1.3、包(packet)格式

6、Linux发行版组成与初识

冷暖自知 提交于 2020-08-18 06:50:40
一、Linux发行版 1、从1992年linux诞生至今产生了数百种之多的Linux发行版,1992-2013期间诞生的各发行版之间的关系如下图所示 2、但距今为止,主流的发行版、二次发行版乃至三次发行版它们之间的关系如下图所示。 二、Linux发行版的组成部分 我们常用广义上的Linux指代Linux的发行版,但从狭义上来说Linux仅仅是指代Linux内核(Linux kernel)。 完整的Linux发行版由应用程序(Application) + Linux Kernel组成。 开源程序通常以 源码 (文本格式)方式提供,这样带来的好处是可以自由、灵活的使用。 一般情况下,源代码通过 编译器 编译成可执行二进制程序在电脑中运行 CPU架构 CPU指令架构 操作系统 指令集 生产厂商 备注 x86 CISC intel x64 CISC intel 又称作AMD64 第一款x64指令架CPU由amd研发 m68000 = m68k 摩托罗拉 早期摩托罗拉CPU指令架构 ARM RISC ARM 移动终端设备主流CPU指令架构 Ultrasparc solaris SUN Power AIX IBM powerpc = pcc Apple、IBM、摩托罗拉 alpha Hp-Unix HP MIPSalpha DEC 指令集分为 复杂指令集(Complex Instruction