首页 文章 精选 留言 我的

精选列表

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

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如需转载请自行联系原作者

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

Docker基本概念和框架

Docker简介 启动Docker容器: 什么是容器? 一种虚拟化的方案 操作系统级别的虚拟化 只能运行相同或相似内核的操作系统 依赖于Linux内核特性:Namespace和Cgroups(Control Group) 容器技术优点: 占用磁盘空间小 资源占用小 对CPU、内存资源消耗小 什么是Docker? 将应用程序自动部署到容器 Go 语言开源引擎 Github地址:https://github.com/docker/docker 2013年初 dotCloud 基于Apache2.0 开源授权协议发行 Docker的目标 提供简单轻量的建模方式 职责的逻辑分离 快速高效的开发生命周期 鼓励使用面向服务的架构 Docker的使用场景 1、使用Docker容器开发、测试、部署服务。 2、创建隔离的运行环境 3、搭建测试环境 4、构建多用的平台即服务(PaaS)基础设施 5、提供软件即服务(SaaS)应用程序 6、高性能、超大规模的宿主机部署 例如: 1、腾讯万台规模的Docker应用实践 Docker的基本组成 docker client客户端 docker daemon守护进程 docker image 镜像 docker container 容器 docker registry 仓库 Docker客户端/守护进程 c/s架构 本地/远程 Docker Image 镜像 容器的基石 层叠的只读文件系统 联合加载(union mount) Docker Container 容器 通过镜像启动 启动和执行阶段 写时复制(copy on write) Docker Registry仓库 公有 私有 docker Hub docker version 查看docker版本 docker search tutorial 查找tutorial镜像 docker pull learn/turorial 从仓库下载镜像到本地 docker run learn/turorial echo ‘ hello word’ docker run learn/turorial apt-get install -y ping 在容器中安装ping命令 docker ps -l 查看容器 docker commit 69822a9948422 learn/ping 将修改的容器提交 docker run learn/ping pingwww.google.com运行镜像 docker ps 查看你当前镜像 docker inspect efefdc74ald5 查看你运行中的容器 docker image 查看镜像 docker push learn/ping 将镜像保持到docker hub仓库上 Docker容器相关技术简介 Docker依赖的Linux内核特性 Namespaces 命名空间 Control groups (cgroups)控制组 Docker源码分析:http://www.infoq.com/cn/articles/docker-source-code-analysis-part1/ 本文转自 yard521 51CTO博客,原文链接:http://blog.51cto.com/tangyade/1905232,如需转载请自行联系原作者

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

医院信息化框架概览

在常主任的带领下,今天就医院的一些信息化建设方面的概览及基础架构进行了一些总结和交流。内容如下: his------门诊,住院,医生站,电子病历等。 pacs-----影像数据,全院级含超声,病理,内镜,乳腺等。 lis------检验,需要主动给his接口 pacs、lis、his都有自己的数据库,表结构、说明书、字段都得拿出来,属于维护性源码。 手术麻醉与ICU(病人躺床上不能动的那种) 分诊叫号也都得给接口 服务器在使用时不要使用到超过容量的80%,位密度原理,可能靠近主轴附件数据读的就有问题。 SQL要用2008R2,C语言--程序员语言,pascal--学生语言,VB--娃娃语言 powerbuiler效率高但图形界面做的不好。 X86---40根地址线(1TB内存),虚拟48根(256TB) X64(50根地址线--1PB) mpeg1 1.5m VCD mpeg2 3-10m DVD mpeg3 20-40m 高清电视 mpeg4 48-96m 网络 SIFT SURT 图像检索标准 0XB800编码地址,0X0000 互联网医疗 移动医疗 精准医疗 慢病管理 健康管理 大数据研究------把各个业务核心数据统计出来,比如门诊赚了多少钱,哪些外地人过来就诊等,有点类似数据挖掘。 内外网安全,网闸----摆渡概念 华龙总医院 计算机条码规范 IP地址 vlan 科室 本文转自 流颗星 51CTO博客,原文链接:http://blog.51cto.com/liukexing/1964609

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

Sentry--错误日志收集框架

简介 Sentry’s real-time error tracking gives you insight into production deployments and information to reproduce and fix crashes.---官网介绍 Sentry是一个实时事件日志记录和汇集的日志平台,其专注于错误监控,以及提取一切事后处理所需的信息。他基于Django开发,目的在于帮助开发人员从散落在多个不同服务器上的日志文件里提取发掘异常,方便debug。Sentry由python编写,源码开放,性能卓越,易于扩展,目前著名的用户有Disqus, Path, mozilla, Pinterest等。它分为客户端和服务端,客户端就嵌入在你的应用程序中间,程序出现异常就向服务端发送消息,服务端将消息记录到数据库中并提供一个web节目方便查看。 DSN(Data Source Name) 当你完成sentry配置的时候,你会得到一个称为“DSN”的值,看起来像一个标准的URL。Sentry 服务支持多用户、多团队、多应用管理,每个应用都对应一个 PROJECT_ID,以及用于身份认证的 PUBLIC_KEY 和 SECRET_KEY。由此组成一个这样的 DSN: '{PROTOCOL}://{PUBLIC_KEY}:{SECRET_KEY}@{HOST}/{PATH}{PROJECT_ID}' PROTOCOL 通常会是http或者https,HOST 为 Sentry 服务的主机名和端口,PATH 通常为空。 Sentry支持的语言: 安装 这里有两种方式安装sentry,我这里介绍用docker的安装方式(官网推荐用docker)。 sentry运行需要的服务: PostgreSQL Redis Memcached Outbound Email 启动sentry需要依赖的服务: Web Service Background Workers Cron Process 容器安装sentry需要的环境: Docker 1.10.0+ Compose 1.6.0+(optional) 另外redis、数据库等也可以配置cluster,并结合HAProxy使用。我这里docker容器全部只安装在了一台机器(Ubuntu1404)上。 安装docker 增加GPG key: 1 2 3 4 $ sudo apt-getupdate $ sudo apt-get install apt-transport-httpsca-certificates $ sudo apt-keyadv--keyserverhkp: //p80 .pool.sks-keyservers.net:80\ --recv-keys58118E89F3A912897C070ADBF76221572C52609D 配置apt仓库: 在/etc/apt/sources.list文件最好追加一行: 1 debhttps: //apt .dockerproject.org /repo ubuntu-trustymain 安装docker-engine: 1 2 3 $ sudo apt-getupdate $ sudo apt-get install linux-image-extra-$( uname -r)linux-image-extra-virtual $ sudo apt-get install docker-engine 2、安装docker-compose 使用pip安装,如果没有pip需要先安装: 1 2 $ sudo apt-get install python-pip $ sudo pip install docker-compose 3、构建容器并创建数据库和sentry安装目录 1 2 3 $ sudo apt-get install git $ sudo gitclone $ sudo mkdir -pdata/{sentry,postgres} 4、生成secret key并添加到docker-compose文件里: 1 2 3 4 $ sudo docker-composerun-- rm webconfiggenerate-secret-key #这里复制生成的字符串 $ sudo vimdocker-compose.yml #取消SENTRY_SECRET_KEY的注释,并把刚刚复制的字符串插入其中,类似如下: 5、重建数据库,并创建sentry超级管理员用户 1 $ sudo docker-composerun-- rm webupgrade 这里采用交互方式创建用户: upgrade过程: 创建用户,sentry新建的时候需要一个超级管理员用户: 6、启动所有的服务: 1 $ sudo docker-composeup-d 7、访问sentry 打开浏览器,输入url:http://ipaddress:9000 访问之前可以检查下容器和端口情况: docker ps看下当前运行的容器: netstat查看端口打开情况: 登陆界面,这里会提示你的Root URL,如果不想更改继续下一步即可完成: 页面展示: 至此sentry搭建完成! 补充: Sentry目前用户类型有四种: 超级管理员, 管理员,普通用户和System agents. 超级用户只能通过命令行来创建,其他用户可以自己注册或由其他用户邀请注册加入,然后由超级管理员或管理员分配项目和权限。为了更好支持团队协助以及信息安全,新版本Sentry(5.4.2)经过了重新设计,重新设计后的Sentry以Team为中心组织权限。所谓Team就是一个团队,一些用户组织在一起对某些项目有操作权限的组织。一个项目只能属于一个Team, 一个用户却可以属于多个Team, 并可在不同Team中扮演不同角色, 如用户A在Team X是管理员而在Team Y中是System agents. Sentry对用户角色的指定只能到Team级别,不能到Project级别, 所以将某个用户加入到某个Team之后,这个用户就对所有所有属于这个Team下所有project有了相同的权限。 超级管理员: 能创建各种用户, team和project只能由超级管理员创建。项目的一些设置比如改变Owner, 数据公开可见与否(设为public的数据可以通过url不登陆也能查看)以及客户端domain限制的设定。另外还有管理项目的api key(客户端只有得到此api key才能向Sentry发送消息)的权限等等。 管理员: 能创建用户, team和项目设定中除改变owner之外的权限, 可以对项目中具体数据做resolve, bookmark, public/public和remove操作。 普通用户: 无Team界面,只能对项目中具体数据做resolve, bookmark, public/unpublic和remove操作。 System agents: 无Team界面,只能对项目中具体数据做bookmark, unpublic和remove操作。 参考链接: docker安装:https://docs.docker.com/engine/installation/linux/ubuntulinux/ sentry安装:https://docs.sentry.io/server/installation/ 本文转自Jx战壕 51CTO博客,原文链接:http://blog.51cto.com/xujpxm/1868597,如需转载请自行联系原作者

资源下载

更多资源
Mario

Mario

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

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

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部分的功能。

用户登录
用户注册