自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(76)
  • 收藏
  • 关注

原创 Python内核编译

编译环境Windows11,VMware16,Ubuntu20.04,虚拟环境。PC机,内存32G,CPU 16 核心,I7八代。Ubuntu20.04 虚拟机。编译准备下载Python源码,https://www.python.org/downloads/source/新建python文件夹,解压源码sudo tar -zxvf Python-3.10.2.tgz编译源码进入源码目录cd Python-3.10.2初始化编译环境./configure开始编

2022-02-19 10:26:19 1052

原创 Linux虚拟文件系统

在Linux帝国里内存管理系统相当于户部,管理着Linux的土地财政(内存)。而虚拟文件系统相当于工部,管理着Linux的交通水利(设备驱动)。工部的运转需要户部的财政支持,户部的运转需要工部的交通水利。因此系统内部子系统之间是相互依存互为支撑的。Linux内存管理需要虚拟文件系统提供后备存储器来实现内存页缓存(通过address_space),内存系统需要借助虚拟文件系统与外部设备联系(字符设备和块设备)。...

2021-06-22 10:39:41 590

原创 Linux进程虚拟内存

到现在为止我们仍然在讨论Linux内存,最开始内存是一块荒漠,后来我们把Linux这架星际火箭着陆到这块荒漠,并开始对这块荒漠进行地址编排规划,这个规划粒度是细的,是以比特位为基础的划分,每个比特位都对应一个地址。有了这个基础的地址编排,我们开始做减法,我们已地址为基础进行分段分页,这块荒漠慢慢变得规整了。紧接着我们从功能区为出发点将这块规整过的荒漠划分,并创造了空间,节点,域的概念来描述这些功能区,并与内存页进行了映射,把页和区着两个维度联系在一起了。再后来我们组织了基建队(内存分配系统)来供给政府大楼(

2021-05-19 18:30:56 628 3

原创 Linux内存分配系统

上一篇我们从内存结点,内存域的维度查看了Linux内存管理。本篇接着从内存分配的维度来看Linux内存管理。到现在为止,内核建立起了节点,域,页三级管理结构,并完成了页表映射。但是这一切都是在启动期内存管理器的基础上建立的,我们自建的内存管理器只完成了内存映射,还不具备内存分配的功能。为此接下来内核需要建立内存分配系统,Linux从内存分配效率,内存利用率的角度出发在前述管理结构上建立起hubby子系统来对接内存页分配,但是这还不够,考虑到系统中各种可能的对象尺寸和内存分配效率,Linux在hubby子系统

2021-05-14 15:55:37 394

原创 Linux内存域管理

Linux作为通用硬件内核,在内存管理上如何实现通用且高效。在前面Linux内存分段分页一篇我们主要讲解Linux内核进行物理地址逻辑地址线性地址的抽象映射,犹如在蛮荒之地为各家各户划分领土,像极了土地改革。考虑一个国家的土地治理过程,在建国初期,百废待兴,内存资源如同土地资源一样,珍贵有限。如何进行土地改革是国之大事关系到国家的规划建设和发展,内存管理如是,如何进行内存管理规划关系到系统的整体规划和发展。正如土改给每家每户划分土地一样,内核将内存按地址划分,通过虚拟地址编排每个内存地址都被规划到页表当中。

2021-05-03 12:26:31 435 1

原创 Linux内存分段分页

内存是存储体的一种,运行速度较磁盘块。随着集成技术越来越精细,内存存储量从字节,千字节,兆字节,GB,…容量越来越大。如何有效地管理内存是一门艺术。在80X86体系中通过分段部件和分页部件提供内存管理的支持,由此从换分出实地址模式,保护模式。实地址模式下一般是裸机程序,Linux启动起始内核代码载入内存运行并没有内存管理机制,因此内核是以裸机程序运行,接着通过创建自举分配器创建一个零时的内存分配器来支持系统进一步构建内存管理子系统,待内存管理子系统构建完成以后便抛弃这个自举分配器,同时内核由实地址模式进入到

2021-04-18 16:16:36 695

原创 Linux启动流程

上一篇了解了elf文件,本篇继续Linux的征程。Linux的启动过程便是操作系统的构建过程,必须转换视角把Linux看作是一部精密的机器,自然的地Linux分解然后再重构。把Linux的启动过程看作是火箭的发射过程,点火升空,脱离一级助推,脱离二级助推,进入预定轨道,怠速运行…一.构建Linux是宏内核,是一个大型c程序。Linux编译后成为一个bzImage二进制文件,格式为elf。linux-5.4.80/arch/x86/boot/Makefile$(obj)/bzImage: $(obj

2021-03-24 16:05:41 325

原创 Linux ELF文件

ELF全称:可执行链接格式,是UNIX系统实验室(USL)作为应用程序二进制接口(Application Binary Interface,ABI)而开发和发布的。ELF文件有三种不同类型:可重定位文件:包含代码和数据,用于链接成可执行文件或共享目标文件后使用(.o文件和.a静态库)。可执行文件:包含二进制代码和数据,可直接复制到存储器并执行(/bin或/usr/bin目录下的文件。共享目标文件:特殊的可重定位文件,可在加载或运行时被动态地加载到存储器并链接。文件最前部为ELF文件头,描述了整

2021-02-20 17:05:30 660

原创 Linux5.4内核编译

Linux是如此美妙,如此有趣。Like Matrix,It’s Everywhere !编译环境Windows10, Vmware16, Ubuntu20.04,虚拟环境。PC机,内存32G,CPU 16 核心,I7八代。源码下载检查Ubuntu虚拟环境的内核版本,本人编译环境内核版本为 version-5.8.0然后到 https://www.kernel.org 下载接近的版本,本人下载的是5.4.80版。下载完后拷贝到home目录解压得到linux-5.4.80的源代码文件夹。源

2021-02-18 17:50:08 2546

原创 HotSpot IO与NIO

Java NIO和IO之间第一个最大的区别是,IO是面向流的,NIO是面向缓冲区的。 Java IO面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方。此外,它不能前后移动流中的数据。如果需要前后移动从流中读取的数据,需要先将它缓存到一个缓冲区。 Java NIO的缓冲导向方法略有不同。数据读取到一个它稍后处理的缓冲区,需要时可在缓冲区中前后移动。这就增加了处理过程中的灵活性。但是,还需要检查是否该缓冲区中包含所有您需要处理的数据。而且,需确保当更多的数据读入缓冲区时,不要覆

2020-11-16 16:47:03 266

原创 HotSpot Net

HotSpot对上层Java网络的支持主要通过Socket来支持。通过套接在TCP/IP传输控制协议层和HTTP/FTP/SMTP应用层之间搭建桥梁。传输控制层用操作系统层面实现。上层协议借助Socket进一步实现,Java平台已为我们实现了方便的应用层协议。如需自行实现自定义协议,可借助Socket来实现,比如Hadoop中的YARN调度器就借助Socket和NIO来实现分布式调度。一.Socket为了调试Socket修改Hello类的内容如下public class Hello{ pub

2020-11-10 18:37:03 543

原创 HotSpot 反射

Java是一门静态语言,但是Java的反射赋予了Java动态的能力。Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。反射被视为动态语言的关键。反射功能可以让我们在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方

2020-11-08 19:00:58 267

原创 HotSpot HashCode

在Java中每个对象都有一个hash值。无论何时,对同一个对象调用hashCode()都应该产生同样的值。如果在讲一个对象用put()添加进HashMap时产生一个hashCdoe值,而用get()取出时却产生了另一个hashCode值,那么就无法获取该对象了。所以如果你的hashCode方法依赖于对象中易变的数据,用户就要当心了,因为此数据发生变化时,hashCode()方法就会生成一个不同的散列码。一.用处在Object中通过hashCode方法来提供hash值子类可以重写此方法。以提供通常容器数据

2020-11-06 20:03:59 245

原创 HotSpot String常量池

HotSpot中使用StringTable来缓存字符串常量,以提高程序的运行性能。在Java语言中String类被final关键字修饰,意味着String类不能被继承,并且它的成员方法都默认为final方法;字符串一旦创建就不能再修改。String实例的值是通过字符数组实现字符串存储的。使用字符串池的优点就是避免了相同内容的字符串的创建,节省了内存,省去了创建相同字符串的时间,同时提升了性能;另一方面,字符串池的缺点就是牺牲了JVM在常量池中遍历对象所需要的时间,不过其时间成本相比而言比较低。一.Stri

2020-11-06 20:00:12 374

原创 HotSpot Park原理

上一篇了解了HotSpot关于CAS的支持,作为JUC并发支持,HotSpot提供了Park来支持线程的挂起,唤醒操作。在synchronized层面ObjectMonitor通过ParkEvent来操作线程挂起唤醒,在AQS层面UnSafe通过Parker来操作线程的挂起唤醒。...

2020-10-31 16:07:05 370

原创 HotSpot CAS原理

在Java中CAS(compareAndSet()方法的简称)是JUC的基石之一,HotSpot通过UnSafe类来实现CAS。CAS语义:如果当前状态值等于预期值,则以原子方式同步状态设置为给定的更新值,从volatile的角度来看CAS需要同时具备volatile读写内存语义。编译器不会对volatile写以及volatile写前面的指令重排序,要同时实现volatile读和volatile写的内存语义,编译器不能对CAS与CAS前面和后面的任意指令做重排序。一.AtomicIntegerAtomi

2020-10-27 20:19:02 472 2

原创 HotSpot final原理

Java中的final很重要,final关键字可用来修饰类,方法,变量。修饰类时表示该类不可被继承。修饰方法时表示该方法不可被重载。修饰变量时表示不可变值或引用。JSR-133通过为final域增加写和读重排序规则,为Java程序提供初始化安全保障:只要对象是正确构造的(没有this逃逸),那么就不需要使用同步。任意线程都能看到这个final域在构造函数中被初始化后的值。一.final类在HotSpot中对final类,在类加载阶段验证其是否继承了final类。hotspot/src/share/vm

2020-10-21 15:41:00 382 2

原创 HotSpot volatile原理

关于HotSpot中volatile的实现之前,需要先探讨一下Java的内存模型。为了提高程序的执行性能,编译器和处理器常常会对一段指令做重排序。在单线程环境下指令重排序可以显著提高程序的执行性能,但在多线程下便会出现一致性问题。Java通过统一的内存模型,锁,内存屏障等手段来处理这种一致性问题。一.Java内存模型在Java中,堆内存在线程之间共享,局部变量不在线程间共享。JMM决定一个线程堆共享变量的写入何时对另一个线程可见,JMM定义了线程私有本地内存与主内存的抽象关系,提供统一的编程模型。线程间

2020-10-20 11:28:30 562

原创 HotSpot ObjectMonitor原理

Java Monitor 从两个方面来支持线程之间的同步,即:互斥执行与协作。 Java 使用对象锁 ( 使用 synchronized 获得对象锁 ) 保证工作在共享的数据集上的线程互斥执行 , 使用 notify/notifyAll/wait 方法来协同不同线程之间的工作。这些方法在 Object 类上被定义,会被所有的 Java 对象自动继承。HotSpot通过ObjectMonitor提供对Java层面的wait(),notify(),synchronized的支持。一.monitorhots

2020-10-02 16:21:09 1151

原创 HotSpot synchronized原理

Java通过对synchronize关键字来支持多线程同步。在字节码层面synchronize表现为monitorenter, monitorexit, 同时外加一个flags标志区分synchronize的同步作用域。synchronized用的锁是存在Java对象头里的,虚拟机的对象头主要包括两部分数据:Mark Word(标记字段)和Klass Pointer(类元数据指针),其中Klass Point是是对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例,Mark Wor

2020-09-30 16:42:49 553

原创 HotSpot CMS收集器

HotSpot中CMS收集器通过牺牲系统吞吐量来实现响应速度优先。适合追求垃圾收集速度的服务器上。CMS收集器属于分代收集器年轻代算法并发复制算法,老年代算法为并发标记清除算法。年轻代分代为ParNewGeneration,老年代分代为ConcurrentMarkSweepGeneration。适用于对响应时间要求高的应用场景。一.CMS收集器初始化使用-XX:+UseConcMarkSweepGC启用CMS。hotspot/src/share/vm/runtime/init.cppji

2020-09-28 17:43:11 387

原创 HotSpot Serial收集器

GC在HotSpot中的地位举足轻重。JDK9为止提供了四种收集器:Serial,CMS,Parallel,G1。按机器规模,分代类型,吞吐量,延时,CPU利用率等,结合不同的算法,每种收集器都有各自适用的使用场景,同时衍生出多种GC组合配置。今天来看Serial收集器。Serial收集器属于分代GC收集器。年轻代主要算法为标记复制算法,老年代主要算法为标记压缩算法。Serial和SerialOld都是单线程GC。特点是需要STW。适用于响应时间要求不高的桌面应用或开发调试环境。一. Seri

2020-09-23 17:21:17 307

原创 HotSpot 对象的创建

HotSpot中对象是是通过对象模型来表示的,具体来说就是oop和klass来表示,oop代表了一个Java对象在堆内存中的表现形式。使用klass来表示Java类的信息。虚拟机创建Java对象时,会在按照klass所提供的类信息,在内存中创建一个oop对象,具体的内存可能是线程TLAB会堆空间。然后该oop对象的地址会赋给一个变量,这个变量可能在线程栈上或直接来自堆空间对此oop的引用。一.对象模型hotspot/src/share/vm/oops/oop.hppHotSpot内部oop的描述如下,

2020-09-22 16:55:46 1133

原创 HotSpot C1编译器与栈上替换

上一篇主要分析了HotSpot模板解释器和汇编器的实现,相比于c解释器,通过汇编器和模板解释器将字节码指令编译成汇编指令,显著提升了HotSpot的性能。除此之外HotSpot更进一步实现了C1,C2编译器用于在服务端选择性的进一步编译优化指令。此外提供了Tiered分层编译,内置LLVM,AOT编译,GraalVm全栈...

2020-09-09 19:51:19 1808

原创 HotSpot汇编器与模板解释器

上一篇我们从查看了HotSpot线程与桩(stub)的实现,其中桩代码的实现涉及到手工汇编(__ 前缀的代码),这些手工汇编最终都是通过HotSpot内部汇编器生成不同硬件架构对应的汇编指令机器码。虚拟机内部根据不同的cpu生成了各自对应的汇编指令以实现跨平台兼容。今天我们来看HotSpot汇编器的实现。hotspot/src/share/vm/runtime/stubRoutines.cppBufferBlob是CodeBlob的一种,BufferBlob并向codecacche申请分配一块CodeH

2020-09-08 18:34:34 907

原创 HotSpot线程与栈帧

上一篇主要查看了HostSpot的类解析过程,本质上是字节码文件读取解析的过程,解析的结果封装到对应的模型当中供虚拟机使用。HotSpot是基于堆栈的虚拟机,HotSpot执行引擎需要通过线程来划分管理方法栈。再深入HotSpot执行引擎如何运行之前,本篇主要来看HotSpot线程。1.线程的创建在Java种创建一个线程通常使用两种方式:extends Thread 或 implement Runnable,这两种方式是一回事(Thread实现了Runnable)。线程start()以后会关联到Hos

2020-09-07 17:22:25 1084

原创 HotSpot 类解析

上一篇了解了Java字节码文件组织结构,继HotSpot类加载后本篇来探讨HotSpot类解析。Java字节码文件是以二进制流的形式由HotSpot加载,然后HotSpot将字节码解析转换成虚拟机内部的对象模型。并将这个对象模型存储在虚拟机的元空间供虚拟机引擎重复使用。所以关于类解析有三个问题:类如何被解析,对象模型是什么样的,元空间(MetaSpace)的存储结构。在类加载一篇我们知道字节码的二进制流由ClassFileStream加载到内存,然后由ClassFileParser解析。一,HotSpot

2020-08-17 17:23:55 1285

原创 Java字节码文件

上一篇我们分析了字节码文件加载到虚拟机的过程,在继续深入class文件类解析前先了解下class文件格式。Java虚拟机中每一个class文件都对应着唯一一个类或接口的定义信息。每个class文件由字节流组成。在描述class文件格式时使用类c伪结构体。结构体中的类数组表是由任意数量的可变长度的项组成的复合结构,表中的每项长度不固定一,Java字节码文件1. 类文件结构ClassFile { u4 magic; //魔数 0xCAFEBABE u2 minor_version; //副版本号

2020-08-10 16:57:47 1100

原创 HotSpot 类加载

上一篇我们从使用一个类来断点分析了HotSpot的启动流程。今天我们来看HotSpot的类加载。首先必须明确的是在HotSpot启动的过程中,在init_globals()函数中universe2_init()函数中已经预加载了系统运行必须的Java类。所以我们先分析预加载的系统运行必须的类,然后再看JVM启动以后我们的Hello类是如何加载的。1. HotSpot内部预加载类在开始分析之前需要了解HotSpot中几个C++类,vmSymbols.cpp使用宏定义类诸如java_lang_System等

2020-08-03 10:52:15 846

原创 HotSpot 启动流程

本篇是JVM系列开篇,主要分析JVM的启动流程。JVM系列主要以HotSpot为主,按HotSpot各模块来一一展开,包括Class类文件成分,字节码文件加载及解析,HotSpot内存结构,JVM解析器,Kclass-Oop模型,垃圾回收器,执行引擎,字节码指令系统,JIT, AOT, 逃逸分析,栈顶缓存等等。一. HotSpot的组成结构JVM(全称Java Virtual Machine), 是一台虚拟的计算机,本身不跨平台。是Java,Python等编程语言生成的字节码文件的执行平台。具体的JVM

2020-06-15 16:40:56 2163

原创 HotSpot 源代码编译

编译环境Windows10,VMware15,Ubuntu18.04, 虚拟环境。PC机,内存32G,CPU 16 核心,I7八代。Ubuntu18.04 虚拟机。环境准备安装Boot JDK,下载Linux版Oracle JDK8,解压安装到/usr/lib下, 执行gedit ~/.bashrc 文件末尾追加如下export JAVA_HOME=/usr/lib/jd...

2020-04-26 15:15:29 2223

原创 Android10.0 系统源代码编译

AndroidQ已改名Android10, 今天我们换一种方式来编译Android10。编译环境Windows10,VMware15,Ubuntu18.04, 虚拟环境。PC机,内存32G,CPU 16 核心,I7八代。Ubuntu18.04 虚拟机。源码下载下载 git :sudo apt-get install git配置PATH环境变量mkdir ~/binecho...

2019-12-19 14:22:39 12371 15

原创 Android9.0 系统源码编译

一个多月没写博客了,感觉不会再爱了。Android P 发布已经好久了,今天来尝一尝这块Pie。编译环境Ubuntu18.04, 双系统环境PC机,内存32G,CPU 16 核心,I7八代。源码下载镜像源 : https://aosp.tuna.tsinghua.edu.cn准备环境下载 git :sudo apt-get install git安装curl库:s...

2019-04-16 16:46:49 11541 5

原创 Hadoop2.8.5 节点间的数据传输

数据节点 DataNode 在运行中会与三种对端有互动。第一种是 NameNode ,如前所述,对于数据块的存储地点,虽然最初是由 NameNode 分配和指定的,但相关的信息最终来自DataNode 的报告。第二种是用户的 App (包括 Shell ),用户的 App 可以存在于集群内的任何节点上,不过那是在独立的 JVM 上,即使与 DataNode 同在一个节点上也互相独立;然而真正把数据...

2019-01-31 10:49:48 1307

原创 Hadoop2.8.5 数据节点 DataNode

数据节点 DataNode 在 HDFS 文件系统中处于从属的地位, 但是其结构却比处于主导地位的查名节点 NameNode 更复杂。这是因为:虽然 NameNode 起着目录的作用,但是文件的内容却是存储在 DataNode 上的,读写文件时一旦知道了哪一个块在什么节点上,或者指定存放在什么节点上,下面就不需要 NameNode 的介入了。而块的存取,却是颇为复杂的操作。再说 NameNode ...

2019-01-30 10:45:39 1028 2

原创 Hadoop2.8.5 分布式文件系统HDFS

Hadoop的两大系统之一“HDFS”。所谓分布,是说整个文件系统的内容并非集中存储在一台或几台“文件服务器上”,而是分散在集群的不同节点上。理想的情景是集群内的每一台机器都承担着一些内容的存储。HDFS 是 Hadoop 集群的文件系统,这是一种分布( distributed )、容错( faulttolerant )的文件系统。对于大数据处理系统,文件系统之所以应该是分布式的,不再仅仅是因为容...

2019-01-29 13:52:19 432

原创 Hadoop2.8.5 MapReduce计算流程

上一篇我们从宏观的角度从作业认领到分发考察了MapReduce框架。今天我们来探究其内部,从宏观上说, MR 框架主要就是 Map 和 Reduce 这两个阶段。但是实际上远不是那么简单,这两个宏观的阶段都进一步划分成好几个更微观的阶段,前面提到过的排序(Sort )阶段为例, Mapper 的输出端有个由框架提供的局部排序阶段,而 Reducer 输入端的收取(Fetch )和合并( Mage ...

2019-01-14 09:22:16 493

原创 Hadoop2.8.5 MapReduce计算框架

Hadoop 中 YARN 子系统的使命是为用户提供大数据的计算框架。早期的Hadoop ,甚至早期的 YARN 都只提供一种计算框架,那就是 MapReduce。 Hadoop 后来有了一些新的发展,除 MapReduce 外又提供了称为 Chain 和 Stream 的计算框架,一来使用户不必非得用 Java 编程;二来更允许用户利用 Linux 上的 Utility 工具软件搭建更像“数据流...

2019-01-13 10:48:28 401

原创 Hadoop2.8.5 作业的投运

上一篇关于容器的投运是YARN调度在受理作业后分配一个容器并投运到NM节点上,在NM上建立一个 “ 项目组长 ”,该项目组长就是 MRAppMaster。也就是说RM只管到这一级。接下来的事情由 MRAppMaster来处理。根 据 ContainerLaunchContext 中的信息将作业分解为若干任务,例如 16 个 Mapper 、 1 个 Reducer ,不用 Co nbiner ,那...

2019-01-11 14:46:53 297

原创 Hadoop2.8.5 容器的投运

上一篇我们考察了YARN调度系统的容器周转和分配,RM受理作业后就为该作业分配容器,最后由发射架将容器发送到对岸的NodeManager上,现在我们来看NM收到容器后如何启动JVM并创建AM作为作业的领头人,之后的事情就交给了AM。今天我们就来考察容器投运到NM这一过程。为了投运一个作业,RM 首先得在某个NodeManag er 节点上启动一个进程作为这个作业的主管,扮演类似于项目组长那样的角色...

2019-01-10 14:58:42 529

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除