首页 文章 精选 留言 我的

精选列表

搜索[Java框架],共10000篇文章
优秀的个人博客,低调大师

Linux未来监控tracing框架——eBPF

eBPF源于早年间的成型于 BSD 之上的传统技术 BPF(Berkeley Packet Filter)。BPF 的全称是 Berkeley Packet Filter,顾名思义,这是一个用于过滤(filter)网络报文(packet)的架构。 BPF 是在 1997 年首次被引入 Linux 的,Linux 内核中的报文过滤机制其实是有自己的名字的:Linux Socket Filter,简称 LSF。 从 3.15 开始,一个套源于 BPF 的全新设计开始,在3.17被添置到了 kernel/bpf 下。全新设计最终被命名为了 extended BPF(eBPF);为了后向兼容,传统的 BPF 仍被保留了下来,并被重命名为 classical BPF(cBPF)。相对于 cBPF,eBPF 带来的改变可谓是革命性的:一方面,它已经为内核追踪(Kernel Tracing)、应用性能调优/监控、流控(Traffic Control)等领域带来了激动人心的变革;另一方面,在接口的设计以及易用性上,eBPF 也有了较大的改进。 cBPF 所覆盖的功能范围很简单,就是网络监控和 seccomp 两块,数据接口设计的粗放;而 eBPF 的利用范围要广的多,性能调优、内核监控、流量控制什么的,数据接口的多样性设计。 由一个文件(net/core/filter.c)进化到一个目录(kernel/bpf) 目前,支持生成 BPF 伪代码的编译器只有 llvm 一家,即使是通篇使用 gcc 编译的 Linux 内核,samples 目录下的 bpf 范例也要借用 llvm 来编译完成。 1. 运行监测 eBPF 其实是内核模块,比内核模块更短小精干,实现的功能也更新颖, eBPF注入的代码是要在内核中运行的,会有安全隐患。 为了最大限度控制安全隐患,cBPF 时代就开始加入了代码检查机制以防止不规范的注入代码;到了 eBPF则在载入程序(bpf_load_program())时加入了更复杂的verifier 机制,会进行一系列的安全检查。 2. 架构 架构如下: 3. bcc 现在可以用 C 来实现 BPF,但编译出来的却仍然是 ELF 文件,开发者需要手动析出真正可以注入内核的代码。这工作有些麻烦,于是就有人设计了 BPF Compiler Collection(BCC),BCC 是一个 python 库,但是其中有很大一部分的实现是基于 C 和 C++的,python实现了对 BCC 应用层接口的封装。 使用 BCC 进行 BPF 的开发仍然需要开发者自行利用 C 来设计 BPF 程序——但也仅此而已,余下的工作,包括编译、解析 ELF、加载 BPF 代码块以及创建 map 等等基本可以由 BCC 一力承担,无需多劳开发者费心。 3.1 bcc安装 github的地址链接如下: https://github.com/iovisor/bcc 执行:git clone https://github.com/iovisor/bcc.git 在Ubuntu中直接安装二进制文件,命令如下: sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys D4284CDD echo "deb https://repo.iovisor.org/apt/xenial xenial main" | sudo tee /etc/apt/sources.list.d/iovisor.list sudo apt-get update sudo apt-get install bcc-tools libbcc-examples linux-headers-$(uname -r) 这样就可以 使用bcc/example/tracing中的python用例。

优秀的个人博客,低调大师

linux内存管理之全局框架

讲解复杂繁琐的机制原理,最通俗的方法就是用模型架构的方式向读者呈现,先要在整体上了解大方向大架构,再根据大方向大架构来进行分支深入,犹如毛主席那句话“战略上蔑视敌人,战术上重视敌人”。下面我也以这种方式把各个大模型方式向大家画出,并作出简略解述。 一. 地址划分。 1. CPU地址。 CPU地址是指CPU的地址总线能寻址的范围,32bit-CPU寻址范围为4G, 这个地址是虚拟的,实际上外部物理内存是不会使用这么大的内存。 CPU虚拟地址的4G空间,通常划分为两部分,一部分为内核虚拟地址,通常为3G-4G之间,另一部分为用户虚拟地址,通常为0G-3G之间,显然,用户进程能使用的虚拟地址范围远大于内核可以使用的虚拟地址空间,但是,物理内存只有局限性的几M,几G,内核虚拟地址如何使用物理内存,用户空间如何使用物理内存,这些问题正是linux内存管理的关键。 2. 物理内存 物理内存是指外部存储数据的设备,有可以被CPU寻址到的地址总线,受到CPU的Cache 和TLB/MMU管理寻址。 需要澄清一个概念:任何代码是在CPU上运行的,而不是在物理内存上,物理内存是个设备,用于存放用户进程空间的可执行代码或者内核关键数据结构,这些代码或结构终将是要受到CPU通过MMU寻址,Cache命中指令数据来获取的。 NUMA的全称是非一致性内存访问,它通常是多核访问的概念,每一个CPU核都会有一个节点对应使用一部分物理内存,对这些节点的管理附加这些数据结构:perCPU变量,list表串联各节点遍历,zone的划分,zonelist的管理等等。为了使问题更加简单化,我们只分析UMA的一个节点的情况,当然它也包含NUMA的一些数据结构特征,这个后面会有所简述。 下图是NUMA的一个简略图抽象如图2-1所示。 图2-1 NUMA多核物理内存zone示意图 3. 内核虚拟地址空间划分。 如果读者仅仅了解一些皮毛,必然认为内核的虚拟地址空间仅有逻辑地址这一说,其实这只是内存内核虚拟地址划分的一个特例,并非全部的完整表述,现在我划出完整的图形,并且改变改变对内核虚拟地址空间名称的叫法,如图2-2 图2-2 内核虚拟地址空间划分及其对物理内存的映射 下面来改改名字咯,直接映射的地址我们可以叫为内核物理直接映射地址或者逻辑地址。linux原则上只能使用虚拟空间1G中的896M,剩下的128M留作它用,所以直接映射之外的物理内存称为高端内存。128M之间的空间又划分为多个gap安全间隙,虚拟地址,固定映射和持久映射,注意这里的虚拟地址叫法通常和前述的内核虚拟地址有些混杂,后者是指CPU内核虚拟地址,是更广的概念。由于直接映射的部分有了名字叫逻辑地址,那么这里的虚拟地址空间常专指这个部分。 虚拟地址有以下用途,使用vm_struct结构体经内核管理高端内存,它可以使用kmap方式获取高端物理内存的空间;也可以不映射物理高端内存,将这段地址直接作为外部物理设备的ioremap地址,从而可以直接操纵设备,当然这也将外部设备地址空间暴露出来并且容易造成干扰,所以通常不能直接访问ioremap映射的地址而是用readb/writeb读写,而且要做好优化屏障设置并且用iounmap释放,因为映射了的设备常具有’边际效应’. 如果没有高端内存,(当然32bit的嵌入式系统通常不会使用高端内存,至少我见过的那么多关于ARM,powerPC,MIPS32的嵌入式应用都是没有使用高端内存的), 那么固定映射和持久映射也多半不会用到。固定映射可以指定长期持有物理内存某些地址页的占用,这个映射关系可以在初始阶段进行配置,而持久映射在启用时就建立了同高端内存物理页的映射关系,它在其他阶段都不会被解除。 强调的是,我这里不关心高端内存,内核的直接映射逻辑地址就可以涵盖全部物理内存。 4. 用户虚拟地址空间的划分 用户虚拟地址空间图构并不复杂,复杂的是它在虚拟内存空间中的应用,如何映射文件,如何组织区间映射,关联的进程是谁,对应的内存结构体实例是什么等等问题才是用户虚拟映射最难的地方,下面仅仅划出图示,对用户虚拟内存空间可以先有一个大了解,如图2-3。 图2-3用户空间虚拟内存布局 既然用户空间是虚拟的,那么它是怎么访问物理内存的呢,当然就是PGD,PUD,PMD,PTE,OFFSET及其TLB快表查询了,上层目录入口PUD和中间目录入口一般不考虑,考虑二级目录就可以了。从网上摘的图2-4: 图2-4 用户进程空间访问物理内存的方法 二. 伙伴系统 伙伴系统是按阶管理外界物理内存的方法,最大有11阶,每一阶有一个或者多个页合并的集合并使用指针串联起来,同时在同一阶中的一个或多个页集合中形成各自的伙伴,要强调的是各个阶的伙伴都是等页个数的,用下图2-5是比较好理解的。 图2-5 伙伴系统在内存中的大致模型 当内核申请一段按页却并非按照阶数分配的内存时候,通常会使用伙伴系统原理将其按照该申请空间的最大阶数分配,多出来的页按照伙伴系统算法归并到其他阶的链表当中形成其他阶的新伙伴。释放该内存空间的时候,释放的空间会尝试找到能以它为伙伴的那个阶进行连接,如果大小超过,则劈开,多余的再寻找其他可以以它为伙伴的阶。够拗口的,但还是很容易理解的,后面会有源代码呈现出来以实例详细分析。 三. 反碎片技术: 反碎片机制其实还在伙伴系统之前,它主要是将各个zone区域的物理内存分成可回收reclaimable但不可移动unmovable,可移动movable,不可移动unmovable. 这些标记按照一定得list串联起来管理,当外部条件申请物理内存导致许多碎片的时候,它可以按照这些数据结构的标志,来从新组织归类物理内存,从而减少碎片页或者孤独页。反碎片技术在嵌入式系统当中少用,绝大部分由伙伴系统占据江山了,因此不会对此做具体分析,简略过之。 四. Slab分配机制。

优秀的个人博客,低调大师

iOS FMDB(数据库框架)

FMDB 1. 导包 // 点击项目->General->Linked Frameworks and Libraries->搜索libsqlite3.tbd,并add. #import "FMDB.h" #import <sqlite3.h> @interface ViewController () // 数据库对象 @property (nonatomic, strong) FMDatabase *fmDatabase; @end 2. 打开数据库 // 创建数据库路径 NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"data.sqlite"]; // 创建数据库对象 FMDatabase *db = [FMDatabase databaseWithPath:path]; self.fmDatabase = db; // 打开数据库,true,打开成功;false,打开失败 BOOL isSuccess = [db open]; // 判断是否打开成功 if (isSuccess) { NSLog(@"打开数据库成功"); NSLog(@"数据库路径:%@", path); } else { NSLog(@"打开数据库失败"); } 3. 创建表 // 创建表,执行sql语句,增删改相同,查询不一样 NSString *sql = @"create table if not exists test(id integer primary key autoincrement, name text, age integer);"; // 执行创建表命令,true, 创建成功;false,创建失败 BOOL isSuccess = [self.fmDatabase executeUpdate:sql]; if (isSuccess) { NSLog(@"创建表成功"); } else { NSLog(@"创建表失败"); } 4. 插入数据 // 向表中添加100条数据 for (int i = 0; i < 100; i++) { // 名称设置 NSString *name = [NSString stringWithFormat:@"item-%d", i]; // 随机生成20--25岁之间的年龄 NSInteger age = arc4random_uniform(5) + 20; // sql语句拼接 NSString *sql = [NSString stringWithFormat:@"insert into test(name,age) values('%@',%zd);", name, age]; // 执行插入语句 BOOL isSuccess = [self.fmDatabase executeUpdate:sql]; // 判断是否添加成功 if (isSuccess) { NSLog(@"添加成功"); } else { NSLog(@"添加失败"); } } 5. 查询数据 // 查询语句 NSString *sql = @"select name,age from test where age = 23;"; // 执行查询语句 FMResultSet *result = [self.fmDatabase executeQuery:sql]; // 遍历查询结果 while ([result next]) { // name NSString *name = [result stringForColumnIndex:0]; // age NSInteger age = [result intForColumnIndex:1]; NSLog(@"name = %@, age = %ld.", name, age); } 6. 更新数据 // 修改语句 NSString *sql = @"update test set age = 30 where age < 22;"; // 执行sql语句 BOOL isSuccess = [self.fmDatabase executeUpdate:sql]; if (isSuccess) { NSLog(@"修改数据成功"); } else { NSLog(@"修改数据失败"); } 7. 删除数据 // 删除语句 NSString *sql = @"delete from test where age > 25;"; // 执行语句 BOOL isSuccess = [self.fmDatabase executeUpdate:sql]; if (isSuccess) { NSLog(@"删除成功"); } else { NSLog(@"删除失败"); }

优秀的个人博客,低调大师

AliOS Things网络适配框架 - SAL

AliOS Things中提供了丰富的SAL开发组件,来加速MCU+通信连接芯片的应用场景开发和部署。在此类应用场景中,主控MCU芯片通过UART或SPI总线与WiFi、NB-IoT等通信芯片相连,AliOS Things操作系统和用户APP运行在主控MCU中,需要网络数据访问时,通过外接的通信芯片进行网络负载的接收和发射。主控MCU和外接通信芯片之间的通信,可以是AT Command通道,也可以是厂商私有协议通道。 AliOS Things SAL方案概述 目前,AliOS Things提供了atparser、at_adapter、SAL等开发组件。借助这些组件,用户可以方便地进行应用开发,同时这些组件也方便厂商在现有MCU产品基础上通过外接通信芯片方式扩展网络访问能力。下图展示了AliOS Things提供的SAL组件和方案架构:

优秀的个人博客,低调大师

android网络框架Retrofit 同步异步

http://blog.csdn.net/jiguangcanhen/article/details/39006197 同步的方式: 1)首先定义要接口。注解Get表示使用的Get请求方式,{user}代表要被替换的数据 public interface GitHubService { @GET("/users/{user}/repos") List<Repo> listRepos(@Path("user") String user); } 2)初始化RestAdapter,并利用动态代理来创建的接口对象。 RestAdapter restAdapter = new RestAdapter.Builder() .setEndpoint("https://api.github.com") .build(); GitHubService service = restAdapter.create(GitHubService.class); 3)使用网络访问并返回 List<Repo> repos = service.listRepos("octocat"); 异步的方式: @POST("/users/new") void createUser(@Body User user, Callback<User> cb); 注:body注解,在进行请求前对象会被转换器进行相应的数据转换。 前两部和之前的相同,不同在于最后一个参数变成了CallBack对象。 controller.getLogin(mail, password,newCallback<UserDataModel>() { @Override publicvoidfailure(RetrofitError error) { //TODOAuto-generated method stub } @Override publicvoidsuccess(UserDataModel ldm, Response response) { //TODOAuto-generated method stub }); 可以看到当请求网络返回之后,会在failure中和success中进行回调,而且默认的数据转换器会把相应的json字符串转换为对象。(当然,我们也可以定义自己的数据转换器) 定义自己的数据转换器: publicclassMyConverterimplementsConverter { @Override publicObject fromBody(TypedInput body, Type type)throwsConversionException { StringBuffer result =newStringBuffer(); try{ InputStream is = body.in(); byte[] buffer =newbyte[1024]; while(is.read(buffer) != -1){ result.append(newString(buffer,"UTF-8")); } }catch(IOException e) { e.printStackTrace(); } returnresult; } @Override publicTypedOutputtoBody(Objectobject) { returnnull; } } 上面的自定义数据转换器,会在请求成功之后,返回给我们字符串,而不是相应的被gson转换过格式的字符串。 RestAdapter restAdapter =newRestAdapter.Builder() .setEndpoint(“url”) .setConverter(newMyConverter()) .build(); 在创建RestAdapter之后创建设置使用自己的数据转换器就可以了。 我们还可以灵活的进行其他的配置: 1)设置请求拦截器,会在请求发出前,进行拦截。 RequestInterceptor requestInterceptor = new RequestInterceptor() { @Override public void intercept(RequestFacade request) { request.addHeader("User-Agent", "Retrofit-Sample-App"); } }; RestAdapter restAdapter = new RestAdapter.Builder() .setEndpoint("https://api.github.com") .setRequestInterceptor(requestInterceptor) .build(); 2)设置错误控制器 class MyErrorHandler implements ErrorHandler { @Override public Throwable handleError(RetrofitError cause) { Response r = cause.getResponse(); if (r != null && r.getStatus() == 401) { return new UnauthorizedException(cause); } return cause; } } RestAdapter restAdapter = new RestAdapter.Builder() .setEndpoint("https://api.github.com") .setErrorHandler(new MyErrorHandler()) .build(); 3)设置log日志。 RestAdapter restAdapter = new RestAdapter.Builder() .setLogLevel(RestAdapter.LogLevel.FULL) .setEndpoint("https://api.github.com") .build(); 上面只是简单介绍了它的使用,其实它还有很多的功能,Get,Post,Put,Delete,Head……具体请参见官方网址。 版权声明:本文为博主原创文章,未经博主允许不得转载。 本文转自wanqi博客园博客,原文链接:http://www.cnblogs.com/wanqieddy/p/4933606.html如需转载请自行联系原作者

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册