- 博客(48)
- 收藏
- 关注
原创 valgrind定位内存问题
valgrind介绍 Valgrind是一个GPL的软件,用于Linux(For x86, amd64 and ppc32)程序的内存调试和代码剖析。你可以在它的环境中运行你的程序来监视内存的使用情况,比如C 语言中的malloc和free或者 C++中的new和 delete。使用Valgrind的工具包,你可以自动的检测许多内存管理和线程的bug,避免花费太多的时间在bug
2017-08-10 11:00:41
645
原创 Java线程池
多线程的软件设计方法确实可以最大限度地发挥现代多核处理器的计算能力,提高生产系统的吞吐量和性能。但是,若不加控制和管理的随意使用线程,对系统的性能反而会产生不利的影响。什么是线程池 为了避免系统频繁地创建和销毁线程,我们可以让创建的线程进行复用。比如数据库中的数据库连接池,为了避免每次数据库查询都重新建立和销毁数据库连接,我们可以使用数据库连接池维护一些数据库连接,让他们长期保持在一个激活状态。当
2017-08-04 10:54:38
459
转载 十问 Linux 虚拟内存管理 (glibc)
最近在做 MySQL 版本升级时( 5.1->5.5 ) , 发现了 mysqld 疑似“内存泄露”现象,但通过 valgrind 等工具检测后,并没发现类似的问题。因此,需要深入学习 Linux 的虚拟内存管理方面的内容来解释这个现象。 Linux 的虚拟内存管理有几个关键概念: 1. 每个进程有独立的虚拟地址空间,进程访问的虚拟地址并不是真正的物理地址 2. 虚拟地址可通过每个进程
2017-08-02 19:27:10
992
原创 Linux进程线程源码浅析
内核版本3.13概述 Linux内核中,进程通过数据结构task_struct(也称为进程描述符) 被表示成任务(task),不像其他的操作系统会区别进程、轻量级进程和线程(下边就统称进程吧),Linux系统用 task_struct 数据结构来表示所有的执行上下文。对于每一个进程,一个类型为task_struct的进程描述符始终存在于内存中。它包含了内核管理全部进程所
2017-07-30 22:54:26
2502
3
转载 ucontext-人人都可以实现的简单协程库
1.协程介绍协程是一种轻量级的、用户态的执行单元。协程拥有自己的寄存器上下文和栈,协程调度切换时,将寄存器上下文和栈保存到其他地方,再切回来的时候,恢复先前保存的寄存器上下文和栈。不管是进程还是线程,每次阻塞、切换都需要陷入系统调用,先让CPU跑操作系统的调度程序,然后再由调度程序决定该跑哪一个进程/线程。协程的休眠和唤醒都是发生在用户态,也就是说应用程序开发者要自
2017-07-29 20:41:02
573
原创 java锁学习笔记
1.减小锁持有时间 减少锁的持有时间有助于降低锁冲突的可能性,进而提升系统的并发能力。即就是只在必要时进行同步,不需要同步操作的代码,尽量注意不要也加入需要同步的代码块中,这样就可以明显的减少线程持有锁的时间,提高系统的吞吐量。2.减小锁粒度 减小锁粒度是一种削弱多线程锁竞争的有效手段。这种技术典型的使用场景就是ConcurrentHashMap类的
2017-07-29 20:24:36
293
原创 java 单例模式与多线程
什么是单例模式单例模式是一种创建型模式,某个类在采用了单例模式,在该类创建后,只能产生一个实例供外部访问,并且提供一个全局的访问点。数据库连接池的设计一般就是采用单例模式,因为数据库连接是一种数据库资源。数据库软件系统中使用数据库连接池,主要就是节省打开或关闭数据路连接所引起的效率损耗,使用单例模式,就可以大大降低这些损耗饿汉模式饿汉模式也称为立即加载,即就是使用类的时候已
2017-07-14 23:03:35
403
原创 Linux内核模块编程问题
最近在做的实验,以内核模块方式实现,现在就内核模块编程遇到的的一些问题,做以记录如下:1.内核函数访问用户态空间在内核模块中若想要打开或者写一个文件时,可以调用内核中的open/write函数,但是内核中的这些函数其中的一些参数是需要从用户态传过来的,也就是有“__user”修饰的函数(该类函数需要进行内存地址的检查变换)。如果在内核中直接指定一个文件或者缓冲区(内核空间中的),则
2017-07-06 16:33:38
783
原创 可执行文件的装载
学习程序员自我修养,随笔,以方便后边查阅。进程虚拟地址空间 每个程序被运行起来以后,将拥有独立的虚拟地址空间(virtual address space),该虚拟地址空间的大小由计算机的硬件平台决定,具体的说由CPU的位数决定。硬件决定了地址空间的最大理论上限,即硬件的寻址空间大小,比如32位的硬件平台决定了虚拟地址空间的地址为 0 到 2^32 - 1 ,即0x00000000 ~ 0xFFFF
2017-07-06 16:25:43
1506
原创 管道文件系统pipefs
概述 在Linux的世界里,万物皆文件,并且都是通过虚拟文件系统VFS来同一管理调用不同的文件系统,因此Linux中可以通过文件IO系统调用来进行操作。而管道就是一个伪文件系统,其通过pipefs来实现。同其他真正的文件系统(ext3、ext4等)一样,都实现VFS中的四种主要对象:super_block、inode、dentry和文件对象file。当对管道进行读写操作时,VFS就会将请
2017-06-06 13:33:07
1656
原创 linux 管道实现解析
管道是进程间通信的一种方式,分为无名管道和有名管道两种。使用无名管道可以进行相关进程间通信(也就是父子进程),使用有名管道可以进行不相关进程(没有父子关系的进程)之间的通信。下边主要介绍下无名管道的实现机制。 用户态创建无名管道函数有pipe()和pipe2(),通常在命令行的一个命令输出中查找一些特定数据时,也常用到管道技术,如“ps -elf | grep program”,其也是调用pi
2017-05-30 22:07:56
1169
原创 log4j日志处理实战
前边博文介绍学习了log4j的基本功能及使用,接下来根据Log4j已有的实现方法结合实际需求进行二次开发,以更好的满足实际的需求。Log4j概述Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务 器、NT的事件记录器、UNIXSyslog守护进程等;我们也可以控制每一条日志的输出格式
2017-03-08 14:10:38
359
原创 Java synchronized关键字学习二
接上一篇博文: synchronized(非this对象x) 格式的写法是将x对象本身作为“对象监视器”,这样就可以得出如下3个结论: 1)当多个线程同时执行synchronized(x){}同步代码块时呈同步效果; 2)当其他线程执行x对象方法里面的synchronized同步方法时呈同步效果; 3)当其他线程执行x对象方法里面的synchronized(this)代码块时也呈现
2017-03-08 13:46:25
300
原创 Java synchronized关键字学习一
介绍synchronized是Java语言的关键字,可用来给对象和方法或者代码块加锁,当它锁定一个方法或者一个代码块的时候,同一时刻最多只有一个线程执行这段代码。当两个并发线程访问同一个对象object中的这个加锁同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。然而,当一个线程访问object的一个加锁代码块时,另一个线程仍然
2017-03-06 17:28:27
409
原创 java 7新特性-TWR(Try-with-resources)
在java 7之前,一般在进行文件IO操作时都需要显式的进行文件流的close操作,无论是操作到文件流末尾还是发生异常。往往很简单的一个逻辑都要好几行的代码进行修饰,使得代码结构变的复杂。如下程序就使用了TWR,避免了java 7之前使用finally块时的繁琐,使得程序变得简洁package javaFile.copyfile;import java.io.FileInputStre
2017-03-05 22:12:21
8991
原创 JVM学习笔记——虚拟机类加载机制
概述虚拟机把描述符的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。类的生命周期类从被加载到虚拟机内存中开始,到卸载出内存为止,整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initia
2017-03-04 21:03:38
530
原创 类文件结构学习笔记
“Java一次编译,处处运行”解释 各种不同平台的虚拟机与所有平台都统一使用的存储格式——字节码(ByteCode)是构成平台无关性的基石。 实现语言无关性的基础仍然是虚拟机和字节码存储格式。Java虚拟机不和包括Java在内的任何语言绑定,它只与“Class文件”这种特定的二进制文件格式所关联,Class文件中包含了Java虚拟机指令集和符号表以及若干其它辅助信息。
2017-02-27 19:44:36
255
原创 flume拦截器及问题解决
概述Flume 除了主要的三大组件 Source、Channel和 Sink,还有一些其他灵活的组件,如拦截器、SourceRunner运行器、Channel选择器和Sink处理器等。组件框架图今天主要来看看拦截器,先看下组件框架流程图,熟悉了大致框架流程学习起来必然会更加轻松: 接收事件根据配置选择对应的Source运行器(EventDrivenSou
2017-01-17 18:50:23
8122
1
原创 flume之hdfsSink分析
前边分析了flume的 Source 和 MemoryChannel 两个组件,接下来分析下第三个大组件 Sink。Sink组件主要用于从Channel 中拉取数据至下一个flume agent 或者目的存储对象(如HDFS)。要分析Sink,就来先看下Sink接口的定义:public interface Sink extends LifecycleAware, NamedCompon
2017-01-10 20:38:02
1867
原创 flume监控分析
flume 监控分析由启动flume时可以发现,flume 入口函数位于flume-ng-node目录中的Application.java文件中:Info: Sourcing environment configuration script /home/bjtianye1/apache-flume-1.7.0-bin/conf/flume-env.shInfo: Including H
2016-12-29 14:03:37
2733
原创 flume MemoryChannel分析
前边介绍了flume的基本概念和Source部分,接下来看看flume中的第二大组件Channel中的MemoryChannel。MemoryChannel是完全在内存中运行,速度很快,其优点同样也就成了缺点,不能持久化,若机器发生宕机或断电,数据就会丢失。在实际使用中需要根据具体的需求进行合理的选择。 先看下MemoryChannel的基本的类图,根据这个结构图可以很好的帮助理解。
2016-12-28 14:02:49
6392
1
原创 flume Source启动过程分析
程序入口由启动flume时可以发现,flume 入口函数位于flume-ng-node目录中的Application.java文件中:
2016-12-18 17:44:06
4053
原创 flume日志收集系统
flume日志收集系统概述Flume是一个分布式的、可靠的、高可用的海量日志采集系统。它能够将不同数据源的海量日志数据进行高效收集、聚合、移动,最后存储到一个中心化数据存储系统中。能够做到实时推送事件,并且可以满足数据量是持续且量级很大的情况。基本组件Flume传输的数据的基本单位是event,如果是文本文件,通常是一行记录,这也是事务的基本单位,代表着一个数据
2016-12-18 15:31:37
3239
原创 Java泛型
什么是泛型泛型是Java SE 1.5的新特性,Java语言引入泛型的好处是安全简单,并且以提高代码的重用性。在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,
2016-10-27 14:05:27
423
原创 log4j日志处理学习
log4j学习本次学习Log4j日志框架的主要目的是为了实现对大数据平台的日志管理,因为现在的平台日志信息实在是太过庞大了,所占的硬盘空间也会越来越多,为了对日志信息文件做相应的管理,从而可以使用Log4j实现这些功能。什么是Log4jLog4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是
2016-10-22 19:21:50
2472
原创 Java集合之Map
前边对Java单列集合Collection有了基本的了解,现在开始学习下集合的Map接口。Map是一个非常有用的数据结构,该接口是一个双列集合,所谓双列就是Map是依照键(key)-值(value)对的序列来存储元素,该元素是两个对象,其中的键(key)是唯一的,不能重复,而每个键对应的值(value)则不同,value可以重复。对于Map这种特点在生活中挺常见的,比如,现在每个人都有一个
2016-10-17 00:28:32
910
原创 Java集合Collection接口之List子接口
List接口介绍List接口是有序的collection(也称为序列,这个有序不是指的自然顺序,而是指添加进集合中的顺序与元素出来的顺序一致),用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。 主要的实现类有如下三个: ArrayList :底层是维护了一个Objecy数组实现的,特点:查询速度快,增删慢;
2016-10-05 16:07:23
924
原创 Java集合之Collection接口
集合概述Java集合类是一种类似于数组的,存储对象引用(而非对象本身)的容器。集合石存储对象最常用的一种方式。集合中可以存储任意类型的对象,且长度可变,这就是说它类似于数组却又不同于数组的原因,集合比数组更加适用。集合可以使用对象的增、删、改、查等操作。集合框架图图中,实现边框的是实现类,如ArrayList、LinkedList、HashMap等;短线边框的是抽象类,如AbstractCollec
2016-10-04 20:10:08
691
原创 java多线程之内存可见性学习笔记
java多线程之内存可见性:1.什么是可见性 可见性:一个线程对共享变量值的修改,能够及时地被其他线程看到。共享变量:如果一个变量在多个线程的工作内存中都存在副本,那么这个变量就是这几个线程的共享变量。Java内存模型(JMM)Java内存模型(Java Memory Model)描述了Java程序中各种变量(线程共享变量)的访问规则,以及在JVM中将变
2016-09-01 21:56:28
2045
原创 java多线程学习
进程线程什么是进程呢? 进程就是程序(任务)的执行过程,它是动态性的,比如大家常使用的QQ、开发用的Eclipse等经过点击运行就可以看作一个进程,在磁盘中存储的相关文件不是进程;进程持有资源(共享内存,共享文件)和线程。 那什么是线程呢? 拿QQ来说,在你和朋友进行文字聊天的同时还可以收发文件;在使用Eclipse进行源代码编辑,后台会进行语法检验和源代码编译,这些不同的小任
2016-08-28 16:27:10
553
原创 I/O复用系统调用之epoll
I/O复用系统调用之epoll()epoll API是linux系统特有的(在2.6内核新增),同I/O多路复用和信号驱动I/O功能类似,均可以监视多个文件描述符上的I/O就绪事件。 epoll()将用户关心的事件放入内核的事件表中,无须像select和poll那样每次调用都需要传入文件描述符集合或者事件集合,因为从用户态到内核态的切换很耗费资源,epoll每次管理一个文件描述符,该描
2016-08-18 11:12:23
662
原创 TCP带外数据OOB
传输层协议使用带外数据(out-of-band,OOB)来发送一些重要的数据,如果通信一方有重要的数据需要通知对方时,协议能够将这些数据快速地发送到对方.为了发送这些数据,协议一般不使用与普通数据相同的通道,而是使用另外的通道实现.OOB数据(TCP)介绍带外数据即就是优先数据,linux系统的套接字机制支持低层协议发送和接受带外数据.但是TCP协议没有真正意义上的带外数据.为了发送重要协议,TCP
2016-08-09 17:31:37
4438
原创 I/O复用系统调用之select()和poll()
I/O复用是一种让进程预先告知内核的能力,使得内核一旦发现进程指定的一个或多个I/O条件就绪(如可以读/写了),内核就通知进程。主要有select、poll和epoll三种函数支持。调用这几个函数时,不会阻塞在真正的I/O函数上(如read、write),而是阻塞在这几个系统调用上,直到指定的I/O条件就绪。下边看看select系统调用的应用场景。I/O复用系统调用之select(
2016-08-09 00:13:02
1187
原创 I/O模型
unix下可用的5种I/O模型:1.阻塞式I/O2.非阻塞式I/O3.I/O复用(select和poll)4.信号驱动式I/O(SIGIO)5.异步I/O(POSIX的aio_系列函数)阻塞式I/O模型:阻塞式I/O模型是用的比较多的一种I/O模型。socket的默认状态是阻塞的,即就是发出一个不能立即完成的套接字调用时,该进程被睡眠,直到相应的调用操作完成。可能会发生阻塞
2016-08-05 21:54:14
608
原创 用户态文件系统fuse学习
FUSE(用户态文件系统)是一个实现在用户空间的文件系统框架,通过FUSE内核模块的支持,使用者只需要根据fuse提供的接口实现具体的文件操作就可以实现一个文件系统。
2016-06-15 20:50:11
28845
37
原创 daemon守护进程初识
daemon介绍守护进程是一种生存期长的进程。常常在系统引导装载时启动,直到系统关闭时才终止。它们在后台运行,没有控制终端。daemon编写规则1.调用umask将文件模式创建屏蔽字设置为一个已知值(通常为0);umask(0);2.调用fork,然后使父进程exit,调用setsid创建一个新会话(下边有介绍);if((pid = fork()) 0)
2016-06-01 20:39:57
619
原创 初学socket网络编程
一、服务器端实现:1.创建socket#include #include int socket(int domain, int type, int protocol);domain是套接字的域(协议簇),常用AF_UNIX(本地套接字)、AF_INET(网络套接字); type套接字类型,决定套接字采用的通信机制;流套接字(SOCK_STREAM):维持一个有序、可
2016-05-22 21:37:52
496
原创 linux 文件删除过程浅析
1.Linux文件删除原理Linux是通过link的数量控制文件删除的,只有当文件不存在任何链接时,该文件才会被删除,一般每个文件有两个link计数器: i_count 和 i_nlink,从VFS inode结构体中可以找到:struct inode {struct hlist_node i_hash; /* hash链表的指针 */struct list_head i_
2016-05-14 17:43:54
6124
2
原创 namespaces之 User Namespace机制
USER Namespaces主要是对用户和用户组进行隔离。它是从Linux 3.8内核才慢慢支持的,现在有些linux发行版还不支持user namespaces(主要是因为还不完全成熟,处于对安全的担心,在编译内核时并未开启USER Namespaces,Centos 7就不支持,后边的测试基于Ubuntu 14.04). User namespaces允许每个命名空间中User
2016-04-27 17:20:56
4275
2
原创 Linux容器LXC学习之Namespace
Linux Containers即就是Linux容器,是一个加强版的Chroot。容器可以提供轻量级的虚拟化,一遍隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。; LXC主要依赖Linux内核的3种隔离机制(isolation infrastructure):Chroot 将应用隔离岛一个虚拟的私有root下Cgroups 实现资源控制,给每个
2016-04-22 22:18:54
1360
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人