我们在阅读源码时,函数功能可以分为两类:1. bootmem.c 2. page_alloc.c. 1. bootmem.c是关于bootmem allocator的,上篇文章已经简述过. 2. page_alloc.c是关于Memory Management subsystem的. 关于内存管理子系统的初始化调用了多个函数,我们首先分析在bootmem_init中调用的add_active_range函数. start_kernel --> setup_arch ---> arch_mem_…
源码声明:基于Linux kernel 3.08 1. 在kernel/arch/mips/kernel/head.S中会做一些特定硬件相关的初始化,然后会调用内核启动函数:start_kernel: 2. start_kernel是通用的内核启动函数,但是在初始化内核过程中,必然有一些参数是特定于硬件体系结构的,这些特定于硬件体系结构的设置通过调用函数setup_arch函数: 3. 我们看看MIPS架构的setup_arch函数做了哪些特定于MIPS的设置: /* kernel/arch/m…
start_kernel ——> setup_arch ——> arch_mem_init ——> bootmem_init ——> init_bootmem_node: 此时,不得不说的就是 bootmem . 1. 什么是bootmem: 我们都知道,所有的物理内存是交给内核管理的,或者说是交给内存管理子系统管理的.那么,从内核启动到内核管理子系统启动之间,是否需要内存呢?答案是肯定的,该时间段内是需要物理内存的. 那么bootmem就是负责该时间段的物理内存的分配. 2. 特…
PFN相关宏说明: /* kernel/include/linux/pfn.h */ PFN : Page Frame Number(物理页帧) /* * PFN_ALIGN:返回地址x所在那一页帧的下一页帧的起始地址. * 例如:PFN_ALIGN(0x00000800) = 0x00001000 : PFN_ALIGN(0x00001800) = 0x00002000; * 理解:假如我们认为一页大小是0x0f,那么当前地址是0x08,如何通过0x08获得0x10呢? 0x08 + (0x1…
start_kernel ——> setup_arch ——> arch_mem_init ——> |——> bootmem_init  |——> device_tree_init  |——> sparse_init     |——> plat_swiotlb_setup  |——> paging_init 我们看看paging_init做了什么?! void __init paging_init(void) { unsigned long max_zone…
引言 在本篇文章中,我们主要剖析c++中的动态内存管理,包括malloc.new expression.operator new.array new和allocator内存分配方法以及对应的内存释放方式和他们之间的调用关系,另外也包括一些会引发的陷阱如内存泄漏. 动态内存管理函数及其调用关系 c++中的动态内存分配和释放方式有很多,主要包括: malloc与free new expression与delete expression array new 与array delete operator…
Jedis cluster集群初始化源码剖析 环境 jar版本: spring-data-redis-1.8.4-RELEASE.jar.jedis-2.9.0.jar 测试环境: Redis 3.2.8,八个集群节点 applicationContext-redis-cluster.xml 配置文件: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.spri…
原文 C#共享内存实例 附源码 网上有C#共享内存类,不过功能太简单了,并且写内存每次都从开头写.故对此进行了改进,并做了个小例子,供需要的人参考. 主要改进点: 通过利用共享内存的一部分空间(以下称为“数据信息区”)来存储当前内存中存储的数据信息(count和length或者添加其他信息),完成了对内存读写功能的完善. 在读写内存时,读写数据信息区. 1.写共享内存 根据共享内存当前的使用length,依次往后写. 2.读共享内存 读取从共享内存的起始位置(不包括数据信息区)至length的所…
http://www.9miao.com/content-6-304.html Firefly卡牌手游<暗黑世界V1.5>服务器端源码+GM管理后台源码 关于<暗黑世界V1.5>:本次主要是更新了<暗黑世界>系列版本推出一些GM管理后台匹配的接口.本次<暗黑世界V1.5>可直接兼容<暗黑世界V1.4>的客户端源码!无需更新客户端源码! 关于<GM后台管理系统>:基于python,django.详细部署架设+使用+介绍说明地址:http…
至此,内存初始化部分已看完,遗留问题: 1.对于unicore或者mips的页表建立都很清楚,但是对于ARM我不清楚: 初始化部分涉及的页表映射建立,我都以unicore架构为准,ARM的页表映射从原理上讲easy,问题在于ARM的页表中没有引入Dirty.Accessed位,因此,对于如何在基于ARM架构的Linux系统上实现页回收就有些疑问,上次和同学看下代码,ARM使用了软件的方法解决了该问题,但是具体方法自己并不清楚.  当然对于新的ARM架构可能在页表项上已支持Dirty.Access…
目录 1.关键接口和类 1.1.关键类之 DefaultListableBeanFactory 1.2.关键类之XmlBeanDefinitionReader 1.3.关键类之ClassPathXmlApplicationContext 2.spring初始化过程中对外暴露的扩展接口 3.扩展点的启动顺序 spring的IOC容器初始化流程很复杂,本文只关注流程中的关键点,勾勒出主要轮廓,对容器的初始化有一个整体认识,以下基于spring的5.1.2.RELEASE分析,本文演示代码地址:htt…
之前阅读也有总结过Block的RPC服务是通过NettyBlockRpcServer提供打开,即下载Block文件的功能.然后在启动jbo的时候由Driver上的BlockManagerMaster对存在于Executor上的BlockManager统一管理,注册Executor的BlockManager.更新Executor上Block的最新信息.询问所需要Block目前所在的位置以及当Executor运行结束时,将Executor移除等等.那么Driver与Executor之间是怎么交互的呢…
上篇内容分析了http server的启动代码,这篇文章继续从initialize()方法中按执行顺序进行分析.内容还是分为三大块: 一.源码调用关系分析 二.伪代码执行流程 三.代码图解 一.源码调用关系分析 上一篇内容是NameNode启动http server的分析,是根据锁定NameNode的main()入口,发现了该入口仅有两行核心代码,先进入到了第一行核心代码 createNameNode()中,发现默认情况是new了一个NameNode对象.在NameNode的构造方法中,有一些很…
多进程通信的时候,会涉及到共享内存.shmop_open()创建或打开一个内存块 PHP_FUNCTION(shmop_open) { long key, mode, size; struct php_shmop *shmop; struct shmid_ds shm; int rsid; char *flags; int flags_len; //解析传PHP进来的参数 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "lsll&quo…
用solr做项目已经有一年有余,但都是使用层面,只是利用solr现有机制,修改参数,然后监控调优,从没有对solr进行源码级别的研究.但是,最近手头的一个项目,让我感觉必须把solrn内部原理和扩展机制弄熟,才能把这个项目做好.今天分享的就是:Solr是如何启动并且初始化的.大家知道,部署solr时,分两部分:一.solr的配置文件.二.solr相关的程序.插件.依赖lucene相关的jar包.日志方面的jar.因此,在研究solr也可以顺着这个思路:加载配置文件.初始化各个core.初始化各个…
去年项目需要看了hazelcast源码,当时记录的笔记. Node是节点的抽象,里面包含节点引擎.客户端引擎.分区服务.集群服务.组播服务.连接管理.命令管理.组播属性.节点配置.本地成员.tcp地址.组播地址.连接者.节点初始化器.管理中心.安全上下文. Config类,包含GroupConfig.NetworkConfig.MapConfig.TopicConfig.QueueConfig.MultiMapConfig.ListConfig.SetConfig.ExecutorConfig.…
基本流程概述 - 与django相比是两种不同的实现方式. - django/tornado是通过传参数形式实现 - 而flask是通过上下文管理, 两种都可以实现,只不实现的方式不一样罢了. - 上下文管理: - 说上下文管理前要先提一下threadinglocal,它为每一个线程开辟一块独立的空间,但是Flask不是用它做得,它自己实现类一个local类 - 其中创建了一个字典来保存数据,这个字典的key是用线程的唯一标识,如果有协程用greelet拿的一个唯一标识,可以是线程的也可以支持协…
最近项目需要用到Spring Security的权限控制,故花了点时间简单的去看了一下其权限控制相关的源码(版本为4.2). AccessDecisionManager spring security是通过AccessDecisionManager进行授权管理的,先来张官方图镇楼. AccessDecisionManager AccessDecisionManager 接口定义了如下方法: //调用AccessDecisionVoter进行投票(关键方法) void decide(Authent…
上篇博客我们讲解了网络yum源和光盘yum源的搭建步骤,然后详细介绍了相关的yum命令,yum 最重要是解决了软件包依赖性问题.在安装软件时,我们使用yum命令将会简单方便很多.我们知道yum命令只能安装rpm包,如果是源码包呢?我们又该如何安装,那么这篇博客我们主要介绍如何安装源码包. 1.源码包和RPM包的区别 在 Linux软件包管理之RPM命令 这篇博客中我们从概念上介绍了源码包和rpm包的区别. 源码包开源,如果有足够的能力,可以直接修改源代码.安装时可以自由选择所需的功能.软件是编译…
一:前言 没有完整看完,但是看到了一些关键的地方,这里做个记录,过程会有点乱,以后逐渐补充最终归档为完整流程:相信看过框架源码的都知道过程中无法完全确定是怎样的流程,毕竟不可能全部都去测试一遍 ,但是看的过程中灵感的显现很重要(就是直觉知道接下来的步骤是什么应该是什么之类的,但是这个自觉是猜的而非蒙的,即过程里是有往会递推看到了一些关键点的而不是抛色子来确定是哪个子类) ,因此自己写的时候也无法将看的过程里产生的想法写得很细,过程也有点跳,如果大家有疑问最好自己去验证(方式就是搜索然后看哪里调用…
内存管理子系统是linux内核最核心最重要的一部分,内核的其他部分都需要在内存管理子系统的基础上运行.而对其初始化是了解整个内存管理子系统的基础.对相关数据结构的初始化是从全局启动例程start_kernel开始的.本文详细描述了从bootloader跳转到linux内核内存管理子系统初始化期间所做的操作,从而来加深对内存管理子系统知识的理解和掌握. 内核的入口是stext,这是在arch/arm/kernel/vmlinux.lds.S中指定的.而符号stext是在arch/arm/kerne…
目录 1.源码包和RPM包的区别 RPM包和源码包默认安装位置: 由于安装位置不同带来的影响 2.源码包安装 ①.安装准备 ②.安装注意事项 ③.安装源码包 3.源码包卸载 4.脚本安装包 5.总结 上篇博客我们讲解了网络yum源和光盘yum源的搭建步骤,然后详细介绍了相关的yum命令,yum 最重要是解决了软件包依赖性问题.在安装软件时,我们使用yum命令将会简单方便很多.我们知道yum命令只能安装rpm包,如果是源码包呢?我们又该如何安装,那么这篇博客我们主要介绍如何安装源码包. 回到顶部…
前言:时间很快,已经快到春节的时间了,这段时间由于生病,博客基本没更新,所以今天写一下我们做的一个项目吧,是对权限的基本操作的操作,代码也就不怎么说了,直接上传源码和图片展示,下面我们直接进入主题介绍这个项目和一些技术点: 1.项目所用到的技术 (1)前台展示:ASP.NET MVC 3.0+Jquery EasyUI+Jquery (2)开发环境:VS2012 (3)数据库:SQL Server 2012 (4)代码管理:SVN (5)用到的技术:ASP.NET MVC,EF框架,Jquery…
源码包管理tarball ====================================================================================tarball安装src.rpm安装 tarball安装 1. 获得源码包途径. 官方网站,可以获得最新的软件包 例如Apache www.apache.org Nginx www.nginx.org. www.google.com ( pcre cacti ) 2. 安装源码包准备工作1. 编译环境如g…
是不是我错了,本想这个函数会如网上所说将进行非连续内存管理的初始化,但是对于2.6.34的ARM架构而言,该函数实际完成的业务非常少. 内存管理的初始化读到此处,我感觉原有的认识存在很大缺陷: (1)内核空间的下限是3G吗?永久映射的PKMAP_BASE已在3G下; (2)低端内存是896M吗?2.6.32的omap4430的VMLLOC_END是1G - 128M,VMALLOC_MIN是1G - 128M -128M: (3)还存在固定映射吗?FIXADDR_SIZE的空间已被FIX_KMA…
看了下kmem_cache_init,涉及到不同MIGRATE间的buddy system的迁移,kmem_cache的构建,slab分配器头的构建.buddy system的伙伴拆分. 对于SMP系统,每个kmem_cache还有各个CPU的arraycache_init,这样每个CPU可以从各自的arraycache_init中获取缓存,如果不足,则从slab分配器中获得:当让slab分配器的三条链表也有一定的缓存作用,如果三条链表都已空了,则需要从buddy system中申请页.在申请页…
转载 https://mp.weixin.qq.com/s/UF9s52CBzEDmD0bwMfFw9A DispatcherServlet是SpringMVC的核心分发器,它实现了请求分发,是处理请求的入口,本篇将深入源码分析它的初始化过程. 首先,从DispatcherServlet的名称上可以看出它是一个Servlet,通过一张图来看一下它的实现关系. 既然DispatcherServlet是一个Servlet,那么初始化的时候一定会执行init方法,查看源码发现DispatcherSer…
一.配置YUM库及更新操作 yum概述 基于RPM包构建的软件更新机制,自动解决软件依赖关系 YUM仓库格式 本地:file:// 网络:ftp://或http:// yum源里面包含的内容 .rpm包 .元数据文件mount /dev/cdrom /mediacd /media/Serverls re*在每个yum仓库中,都有repodata目录(存放的是仓库数据)#baseurl代表yum在互联网上所查找的链接地址.这里需要解释一下#$basearch代表了系统的构架格式如i386和repo…
授人以鱼不如授人以渔,首先声明这篇文章并没有过多的总结和结论,主要内容是教大家如何一步一步自己手动debug调试源码,然后总结spring如何解决的循环依赖,最后,操作很简单,有手就行. 本次调试 是使用@Autowired注入,通过来调试源码看spring如何解决的循环依赖问题. 首先创建一个简单的springBoot项目,引入spring-boot-test包即可.可以使用idea提供的spring官网推荐的快速创建. maven依赖 <dependency> <groupId>…
需求 之前工作流的运行都是用的docker-java提供的api拉起的docker容器直接跑服务,但是最新线上的新业务资源消耗较大,单个容器如果不加控制,CPU和内存都会拉满,导致服务器莫名宕机事故的发生,所以Docker限制cpu使用率和内存限制就得安排上 实施 HostConfig构建 自定义HostConfig,设置cpu和内存限制,pipeline配置了就按照配置来,如果没有就走默认配置 public void setUp() { this.dockerHostConfig = new…