极限编程

极限编程 (ExtremeProgramming,简称XP) 是由KentBeck在1996年提出的。KentBeck在九十年代初期与WardCunningham共事时,就一直共同探索着新的软件开发方法,希望能使软件开发更加简单而有效。Kent仔细地观察和分析了各种简化软件开发的前提条件、可能性以及面临的困难。1996年三月,Kent终于在为DaimlerChrysler所做的一个项目中引入了新的软件开发观念——XP。 极限编程是一个轻量级的、灵巧的软件开发方法;同时它也是一个非常严谨和周密的方法。它的基础和价值观是交流、朴素、反馈和勇气;即,任何一个软件项目都可以从四个方面入手进行改善: 加强交流;从简单做起;寻求反馈;勇于实事求是。XP是一种近螺旋式的开发方法,它将复杂的开发过程分解为一个个相对比较简单的小周期;通过积极的交流、反馈以及其它一系列的方法,开发人员和客户可以非常清楚开发进度、变化、待解决的问题和潜在的困难等,并根据实际情况及时地调整开发过程。 软件开发的内容是: 需求、设计、编程和测试。 需求: 不仅仅是用户需求,应该是开发中遇到的所有的需求。比如,你首先要知道做这个项目是为了解决什么问题;测试案例中应该输入什么数据……为了清楚地知道这些需求,你经常要和客户、项目经理等交流。 设计: 编码前,肯定有个计划告诉你要做什么,结构是怎样等等。你一定要按照这个来做,否则可能会一团糟。 编程: 如果在项目截止日,你的程序不能跑起来或达不到客户的要求,你就拿不到钱。 测试: 目的是让你知道,什么时候算是完成了。如果你聪明,你就应该先写测试,这样可以及时知道你是否真地完成了。否则,你经常会不知道,到底有哪些功能是真正完成了,离预期目标还差多远。 软件开发中,客户和开发人员都有自己的基本权利和义务。 客户: 定义每个用户需求的商业优先级; 制订总体计划,包括用多少投资、经过多长时间、达到什么目的; 在项目开发过程中的每个工作周,都能让投资获得最大的收益; 通过重复运行你所指定的功能测试,准确地掌握项目进展情况; 能随时改变需求、功能或优先级,同时避免昂贵的再投资;能够根据各种变化及时调整项目计划; 能够随时取消项目;项目取消时,以前的开发工作不是一堆垃圾,已开发完的功能是合乎要求的,正在进行或未完成的的工作则应该是不难接手的。 开发人员: 知道要做什么,以及要优先做什么; 工作有效率; 有问题或困难时,能得到客户、同事、上级的回答或帮助; 对工作做评估,并根据周围情况的变化及时重新评估; 积极承担工作,而不是消极接受分配; 一周40小时工作制,不加班。 这就是软件开发,除此之外再还有其它要关心的问题! 灵巧的轻量级软件开发方法 一套软件开发方法是由一系列与开发相关的规则、规范和惯例。重量级的开发方法严格定义了许多的规则、流程和相关的文档工作。灵巧的轻量级开发方法,其规则和文档相对较少,流程更加灵活,实施起来相对较容易。 在软件工程概念出现以前,程序员们按照自己喜欢的方式开发软件。程序的质量很难控制,调试程序很繁琐,程序员之间也很难读懂对方写的代码。1968年,EdsgerDijkstra给CACM写了一封题为GOTOStatementConsideredHarmful的信,软件工程的概念由此诞生。程序员们开始摒弃以前的做法,转而使用更系统、更严格的开发方法。为了使控制软件开发和控制其它产品生产一样严格,人们陆续制定了很多规则和做法,发明了很多软件工程方法,软件质量开始得到大幅度提高。随着遇到的问题更多,规则和流程也越来越精细和复杂。 到了今天,在实际开发过程中,很多规则已经难于遵循,很多流程复杂而难于理解,很多项目中文档的制作过程正在失去控制。人们试图提出更全面更好的一揽子方案,或者寄希望于更复杂的、功能更强大的辅助开发工具 (CaseTools) ,但总是不能成功,而且开发规范和流程变得越来越复杂和难以实施。 为了赶进度,程序员们经常跳过一些指定的流程,很少人能全面遵循那些重量级开发方法。 失败的原因很简单,这个世界没有万能药。因此,一些人提出,将重量级开发方法中的规则和流程进行删减、重整和优化,这样就产生了很多适应不同需要的轻量级流程。在这些流程中,合乎实际需要的规则被保留下来,不必要的复杂化开发的规被抛弃。而且,和传统的开发方法相比,轻量级流程不再象流水生产线,而是更加灵活。 ExtremeProgramming (XP) 就是这样一种灵巧的轻量级软件开发方法。 为什么称为"Extreme" (极限) “Extreme” (极限) 是指,对比传统的项目开发方式,XP强调把它列出的每个方法和思想做到极限、做到最好;其它XP所不提倡的,则一概忽略 (如开发前期的整体设计等) 。一个严格实施XP的项目,其开发过程应该是平稳的、高效的和快速的,能够做到一周40小时工作制而不拖延项目进度。 极限编程中有四个核心价值是我们在开发中必须注意的: 沟通 (Communication) 、简单 (Simplicity) 、反馈 (Feedback) 和勇气 (Courage) 。 XP用"沟通、简单、反馈和勇气"来减轻开发压力和包袱;无论是术语命名、专著叙述内容和方式、过程要求,都可以从中感受到轻松愉快和主动奋发的态度和气氛。这是一种帮助理解和更容易激发人的潜力的手段。XP用自己的实践,在一定范围内成功地打破了软件工程"必须重量"才能成功的传统观念。 XP精神可以启发我们如何学习和对待快速变化、多样的开发技术。成功学习XP的关键,是用"沟通、简单、反馈和勇气"的态度来对待XP;轻松愉快地来感受XP的实践思想;自己认真实践后,通过对真实反馈的分析,来决定XP对自己的价值;有勇气接受它,或改进它。 工作环境 为了在软件开发过程中最大程度地实现和满足客户和开发人员的基本权利和义务,XP要求把工作环境也做得最好。每个参加项目开发的人都将担任一个角色 (项目经理、项目监督人等等) 并履行相应的权利和义务。所有的人都在同一个开放的开发环境中工作,最好是所有人在同一个大房子中工作,还有茶点供应;每周40小时,不提倡加班;每天早晨,所有人一起站着开个短会;墙上有一些大白板,所有的Story卡、CRC卡等都贴在上面,讨论问题的时候可以在上面写写画画;下班后大家可以一起玩电脑游戏……。 需求 客户应该是项目开发队伍中的一员,而不是和开发人员分开的;因为从项目的计划到最后验收,客户一直起着很重要的作用。开发人员和客户一起,把各种需求变成一个个小的需求模块 (UserStory) ,例如"计算年级的总人数,就是把该年级所有班的人数累加。";这些模块又会根据实际情况被组合在一起或者被分解成更小的模块;它们都被记录在一些小卡片 (StoryCard) 上,之后分别被程序员们在各个小的周期开发中 (Iteration,通常不超过3个星期) 实现;客户根据每个模块的商业价值来指定它们的优先级;开发人员要做的是确定每个需求模块的开发风险,风险高的 (通常是因为缺乏类似的经验) 需求模块将被优先研究、探索和开发;经过开发人员和客户分别从不同的角度评估每个模块后,它们被安排在不同的开发周期里,客户将得到一个尽可能准确的开发计划;客户为每个需求模块指定验收测试 (功能测试) 。 ...

2012-03-12 · 2 min · 309 words · -

Windows PowerShell

Windows PowerShell # 查看 power shell 版本 $PSVersionTable # 查看安装路径 $PSHOME install https://github.com/PowerShell/PowerShell/releases Set-Aliasll dir http://marui.blog.51cto.com/1034148/290067/ Windows PowerShell 是一种命令行外壳程序和脚本环境,使命令行用户和脚本编写者可以利用 .NET Framework 的强大功能。它引入了许多非常有用的新概念,从而进一步扩展了您在 Windows 命令提示符和 Windows Script Host 环境中获得的知识和创建的脚本。 目录 Windows PowerShell 简介 PowerShell脚本十个基本概念 Windows PowerShell 简介 目标受众 Windows PowerShell 入门主要面向之前没有 Windows PowerShell 背景知识的 IT 专业人员、程序员和高级用户。虽然具备脚本和 WMI 方面的背景知识会有所帮助,但是理解本文档并不假定或要求您具备此方面知识。 关于 Windows PowerShell 通过解决长期存在的问题并添加一些新的功能,Windows PowerShell 旨在改进命令行和脚本环境. 关于 Windows PowerShell 通过解决长期存在的问题并添加一些新的功能,Windows PowerShell 旨在改进命令行和脚本环境。 可发现特性 您可轻易发现 Windows Powershell 的功能。例如,若要查找用于查看和更改 Windows 服务的 cmdlet 列表,请键入: ...

2012-03-12 · 3 min · 448 words · -

XMMS

XMMS X Multimedia System (XMMS)是一套自由的音频播放器,其外表极像Winamp,但是运行在Unix-like 操作系统。 XMMS原来的名字是"X11Amp",是由Peter and Mikael Alm在1997年11月所编写的,原因是 “Linux没有好的mp3播放器”。 这个播放器是故意模仿Winamp的,其第一个版本是在翌年5月发行的。自其发行后,XMMS皆支持Winamp的面板。虽然原来的授权是闭源的,但现已变为开源,采用GNU General Public License。 在1999年6月10日,4Front Technologies决定赞助X11Amp开发并将计划名称改成"XMMS"- 这个名称解为"X MultiMedia System"。大部份XMMS使用者将X解为X11或X-Windows ,但实际上X是解为"跨平台"。 批评 XMMS一直坚持使用古老的GTK+程式包来编写,最基本的不升级原因是因为大部份插件皆依赖于旧的GTK环境。很多程序设计员亦认为XMMS的源代码设计得太差,很难维护。基于以上原因,网络上出现了很多相关的改进计划: • Beep Media Player,是以GTK+ 2来重新编写XMMS的音频播放器,在2003年开始计划。 • 而有一个并不著名的以GTK+ 2重新编写XMMS的计划,称为XMMS2,是由Mohammed Sameer主持的,但此计划已停止维护。 • XMMS2计划,是打算将XMMS的代码全部重新编写的,由Peter Alm主持,在2002冬季开始。 编辑本段 特色 XMMS现在支持以下的音频和视频档案: • 音乐光碟, 包含 经由FreeDB支持CDDB • libmikmod 所支持的格式 (including .XM, .MOD, .IT) • MPEG Layer 1,2 and 3 (即是 MP3), 经由 mpg123程式库支持 • Vorbis • WAV • TTA - 经由第三方插件支持 • WavPack - 经由第三方插件支持 ...

2012-03-10 · 1 min · 103 words · -

第一届黑客信息战 MIT CTF 2011记录

第一届黑客信息战 MIT CTF 2011记录 这个是前两天我朋友 dcluo 在 MIT(麻省理工学院) 参加的一个黑客竞赛的实战记录 分享给大家看看 感受一下国外的技术竞赛魅力 ———————————————————————— 第一届 MIT CTF 2011 信息战随笔 – 此次经历,值得记录 (我尽量写的详细,希望各大学校组织效仿这类比赛) 前言: 事情追溯到几个月前在 hackathon 有幸认识了一位MIT 计算机女强人 haoqi 同学。 (hacakthon是微软举办的一个过夜的"搞破坏者"的集会。)在大约凌晨2点左右。。 我和她都被微软强行推荐的 Windows 7 Phone 寂寞无聊的不行。 我突然对她说,你对网络入侵感兴趣么? 一下子,一拍即合。于是引导了今天和昨天 20个小时的入侵攻防信息战模拟。 比赛名称: MIT CTF 2011 时间: 4月2~3日 早8: 30 – 晚9:00点 地点: MIT 人物: 韩国网安内核牛+haoqi+我 + 其他12个组 (~45人) 比赛规格: 13组小队 (MIT,BU,UMASS,NE…) 一个组一个VM (ubuntu 10.10 + 最新apache+MySQL+wordpress) 分别运行在同一个虚拟机服务器上但是不同IP和Domain。 每个组一个SWITCH BOX 和 名为 ctfuser 的用户权限(ssh) 和三个密码 (ssh+wordpress+评分页密码) WordPress 每随机一段时间会要求安装一个plugin。 每天可以有一个snapshot和三次全盘恢复机会。 任务目标: ...

2012-03-06 · 3 min · 448 words · -

IaaS PaaS SaaS

‘IaaS PaaS SaaS’ 云服务"现在已经快成了一个家喻户晓的词了。如果你不知道PaaS, IaaS 和SaaS的区别,那么也没啥,因为很多人确实不知道。 “云"其实是互联网的一个隐喻,“云计算"其实就是使用互联网来接入存储或者运行在远程服务器端的应用,数据,或者服务。 任何一个使用基于互联网的方法来计算,存储和开发的公司,都可以从技术上叫做从事云的公司。然而,不是所有的云公司都一样。不是所有人都是CTO,所以有时候看到云技术背后的一些词可能会比较头疼。 云也是分层的 任何一个在互联网上提供其服务的公司都可以叫做云计算公司。其实云计算分几层的,分别是Infrastructure (基础设施) -as-a-Service,Platform (平台) -as-a-Service,Software (软件) -as-a-Service。基础设施在最下端,平台在中间,软件在顶端。别的一些"软"的层可以在这些层上面添加。 IaaS: Infrastructure-as-a-Service (基础设施即服务) 第一层叫做IaaS,有时候也叫做Hardware-as-a-Service,几年前如果你想在办公室或者公司的网站上运行一些企业应用,你需要去买服务器,或者别的高昂的硬件来控制本地应用,让你的业务运行起来。 但是现在有IaaS,你可以将硬件外包到别的地方去。IaaS公司会提供场外服务器,存储和网络硬件,你可以租用。节省了维护成本和办公场地,公司可以在任何时候利用这些硬件来运行其应用。 一些大的IaaS公司包括Amazon, Microsoft, VMWare, Rackspace和Red Hat.不过这些公司又都有自己的专长,比如Amazon和微软给你提供的不只是IaaS,他们还会将其计算能力出租给你来host你的网站。 PaaS: Platform-as-a-Service (平台即服务) 第二层就是所谓的PaaS,你公司所有的开发都可以在这一层进行,节省了时间和资源。 PaaS公司在网上提供各种开发和分发应用的解决方案,比如虚拟服务器和操作系统。这节省了你在硬件上的费用,也让分散的工作室之间的合作变得更加容易。网页应用管理,应用设计,应用虚拟主机,存储,安全以及应用开发协作工具等。 一些大的PaaS提供者有Google App Engine, Microsoft Azure,Force.com, Heroku,Engine Yard。最近兴起的公司有AppFog, Mendix 和 Standing Cloud SaaS: Software-as-a-Service (软件即服务) 第三层也就是所谓SaaS。这一层是和你的生活每天接触的一层,大多是通过网页浏览器来接入。任何一个远程服务器上的应用都可以通过网络来运行,就是SaaS了。 你消费的服务完全是从网页如Netflix, MOG, Google Apps, Box.net, Dropbox或者苹果的iCloud那里进入这些分类。尽管这些网页服务是用作商务和娱乐或者两者都有,但这也算是云技术的一部分。 一些用作商务的 SaaS 应用包括 Citrix 的 GoToMeeting,WebEx,Salesforce的CRM,ADP,Workday和SuccessFactors。 Iaas和Paas之间的比较 PaaS的主要作用是将一个开发和运行平台作为服务提供给用户,而IaaS的主要作用是提供虚拟机或者其他资源作为服务提供给用户。接下来,将在七个方面对PaaS和IaaS进行比较: 开发环境: PaaS基本都会给开发者提供一整套包括IDE在内的开发和测试环境,而IaaS方面用户主要还是沿用之前比较熟悉那套开发环境,但是因为之前那套开发环境在和云的整合方面比较欠缺,所以使用起来不是很方便。 支持的应用: 因为IaaS主要是提供虚拟机,而且普通的虚拟机能支持多种操作系统,所以IaaS支持的应用的范围是非常广泛的。但如果要让一个应用能跑在某个PaaS平台不是一件轻松的事,因为不仅需要确保这个应用是基于这个平台所支持的语言,而且也要确保这个应用只能调用这个平台所支持的API,如果这个应用调用了平台所不支持的API,那么就需要对这个应用进行修改。 开放标准: 虽然很多IaaS平台都存在一定的私有功能,但是由于OVF等协议的存在,使得IaaS在跨平台和避免被供应商锁定这两面是稳步前进的。而PaaS平台的情况则不容乐观,因为不论是Google的App Engine,还是Salesforce的Force.com都存在一定的私有API。 可伸缩性: PaaS平台会自动调整资源来帮助运行于其上的应用更好地应对突发流量。而IaaS平台则需要开发人员手动对资源进行调整才能应对。 整合率和经济性: PaaS平台整合率是非常高,比如PaaS的代表Google App Engine能在一台服务器上承载成千上万的应用,而普通的IaaS平台的整合率最多也不会超过100,而且普遍在10左右,使得IaaS的经济性不如PaaS。 ...

2012-03-06 · 1 min · 87 words · -

systemd timer, cron, crond, crontab, linux 定时任务, cronie

systemd timer, systemd-timer, cron, crond, crontab, linux 定时任务, cronie 安装了 systemd 的系统, 可以用 systemd-timer 来替代 cron 和 anacron。 When using the systemd init system, (persistent) timers are available as a replacement of (ana)cron. Since version 197 systemd supports timers, making cron unnecessary on a systemd system. Since version 212 persistent services are supported, replacing even anacron. Persistent timers are run at the next opportunity if the system was powered down when the timer was scheduled to run. ...

2012-03-02 · 6 min · 1075 words · -

MySQL index

MySQL index http://book.51cto.com/art/201012/240956.htm 7.2 创建索引 创建索引是指在某个表的一列或多列上建立一个索引,以便提高对表的访问速度。创建索引有3种方式,这3种方式分别是创建表的时候创建索引、在已经存在的表上创建索引和使用ALTER TABLE语句来创建索引。本节将详细讲解这3种创建索引的方法。 7.2.1 创建表的时候创建索引 (1) 创建表时可以直接创建索引,这种方式最简单、方便。其基本形式如下: CREATE TABLE 表名 ( 属性名 数据类型 [完整性约束条件], 属性名 数据类型 [完整性约束条件], …… 属性名 数据类型 [ UNIQUE | FULLTEXT | SPATIAL ] INDEX | KEY [ 别名 ] ( 属性名1 [(长度)] [ ASC | DESC] ) ); 其中,UNIQUE是可选参数,表示索引为唯一性索引;FULLTEXT是可选参数,表示索引为全文索引;SPATIAL也是可选参数,表示索引为空间索引;INDEX和KEY参数用来指定字段为索引的,两者选择其中之一就可以了,作用是一样的;“别名"是可选参数,用来给创建的索引取的新名称;“属性1"参数指定索引对应的字段的名称,该字段必须为前面定义好的字段;“长度"是可选参数,其指索引的长度,必须是字符串类型才可以使用;“ASC"和"DESC"都是可选参数,“ASC"参数表示升序排列,“DESC"参数表示降序排列。 1.创建普通索引 创建一个普通索引时,不需要加任何UNIQUE、FULLTEXT或者SPATIAL参数。 【示例7-1】 下面创建一个表名为index1的表,在表中的id字段上建立索引。SQL代码如下: CREATE TABLE index1 (id INT , name VARCHAR(20) , sex BOOLEAN , INDEX ( id) ); 运行结果显示创建成功,使用SHOW CREATE TABLE语句查看表的结构。显示如下: MySQL> SHOW CREATE TABLE index1 \G ...

2012-03-01 · 2 min · 222 words · -

可执行文件

可执行文件 目标文件与可执行文件格式的小历史 目标文件与可执行文件的格式和操作系统和编译器密切相关,不同的系统平台下会有不同的格式,但是这些格式又大同小异,可以说,目标文件与可执行文件格式的历史几乎是操作系统的发展史。 COFF是由Unix System V Release 3首次提出并使用的格式规范,后来Microsoft在其基础上,制定了PE格式标准,并将其应用于自家的Windows NT系统。后台,System V Release 4 在 COFF的基础上引入了ELF格式,目前流行的Linux系统也是以ELF作为基本的可执行文件格式。这也是为什么目前PE和ELF如此相似的原因,因为它们都是源于同一种可执行文件格式COFF。 在COFF之前,Unix最早的可执行文件格式是a.out格式,中文意为汇编器输出。因其设计简单,以至于后来共享库出现的时候,a.out格式变得捉襟见肘,难以满足共享库实现的要求,于是从Unix System V Release 3开始被COFF取代。由于COFF格式的设计非常通用,以至于COFF的继承者PE和ELF目前还在被广泛地使用。COFF的主要贡献是在目标文件中引入了“段”的机制,不同的目标文件可以拥有不同数量及不同类型的段。另外,还定义了调试数据的格式。 可执行文件(Executable File)是指可以由操作系统直接加载执行的文件,在Windows操作系统中可执行文件就是PE文件结构,在Linux下则是ELF文件 PE文件整体结构 PE结构可以大致分为: DOS部分 PE文件头 节表(块表) 节数据(块数据) 调试信息 PE文件种类如下表所示: 种类 主扩展名 可执行系列 EXE, SCR 库系列 DLL, OCX, CPL, DRV 驱动程序系列 SYS, VXD 对象文件系列 OBJ 在Windows下所谓PE文件即Portable Executable,意为可移植的可执行的文件。常见的.EXE、.DLL、.OCX、.SYS、.COM都是PE文件。PE文件有一个共同特点:前两个字节为4D 5A (MZ)。如果一个文件前两个字节不是4D 5A则其肯定不是可执行文件。比如用16进制文本编辑器打开一个“.xls”文件其前两个字节为:0XD0 0XCF;打开一个“.pdf”其前两个字节为:0X25 0X50。 ———————————————— 版权声明:本文为CSDN博主「Apollon_krj」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/Apollon_krj/article/details/77069342 https://www.ascotbe.com/2020/03/23/PortableExecutable/ ELF (Executable Linkable Format) ELF (Executable Linkable Format):linux下的可执行文件格式,按照ELF格式编写的文件包括:.so、.a等 Mach-O Mach-O:iOS/MacOS下可执行文件格式,平时常见的.app或者ipa只是zip压缩包并非可执行文件,可执行文件在压缩包中。在mac下使用file命令打印任意可执行文件便可以看到如下内容: file /Applications/filename.app/Contents/MacOS/filename Mach-O 64-bit executable x86_64 ...

2012-03-01 · 1 min · 82 words · -

MongoDB

MongoDB # mongodb 5.0以上需要 cpu支持 avx, pve 中 cpu 类型要选 max podman run -d --name wekan-db -p 27017:27017 mongo:5.0.9 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有: 面向集合存储,易存储对象类型的数据。 模式自由。 支持动态查询。 支持完全索引,包含内部对象。 支持查询。 支持复制和故障恢复。 使用高效的二进制数据存储,包括大型对象 (如视频等) 。 自动处理碎片,以支持云计算层次的扩展性 支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。 文件存储格式为BSON (一种JSON的扩展) 可通过网络访问 所谓"面向集合" (Collenction-Orented) ,意思是数据被分组存储在数据集中,被称为一个集合 (Collenction)。每个 集合在数据库中都有一个唯一的标识名,并且可以包含无限数目的文档。集合的概念类似关系型数据库 (RDBMS) 里的表 (table) ,不同的是它不需要定 义任何模式 (schema)。 模式自由 (schema-free),意味着对于存储在mongodb数据库中的文件,我们不需要知道它的任何结构定义。如果需要的话,你完全可以把不同结构的文件存储在同一个数据库里。 存储在集合中的文档,被存储为键-值对的形式。键用于唯一标识一个文档,为字符串类型,而值则可以是各中复杂的文件类型。我们称这种存储形式为BSON (Binary Serialized dOcument Format) 。 MongoDB服务端可运行在Linux、Windows或OS X平台,支持32位和64位应用,默认端口为27017。推荐运行在64位平台,因为MongoDB 在32位模式运行时支持的最大文件尺寸为2GB。 MongoDB把数据存储在文件中 (默认路径为: /data/db) ,为提高效率使用内存映射文件进行管理。

2012-02-29 · 1 min · 61 words · -

Bootchart, systemd-analyze

Bootchart, systemd-analyze Bootchart 已经成为 systemd 的一部分 https://wiki.archlinux.org/title/Improving_performance/Boot_process#Analyzing_the_boot_process systemd-analyze plot > plot.svg 很多朋友抱怨自己的 Linux 系统启动速度太慢,但又苦于没有什么好途径进行分析,使之能够得到改进。如果你正受到这方面问题的困惑,那么有一个 Bootchart 小工具能够帮助你。 Bootchart 能够对系统的性能进行分析,并生成系统启动过程的图表,以便为你提供有价值的参考信息。综合所得的信息,你就可以进行相应的改进,从而加快你的 Linux 系统启动过程。 在安装 Bootchart 并重新启动系统后,你就可以在 /var/log/bootchart/ 找到它生成的图片文件了。以下是我的系统所生成的启动过程图表,你可以参考一下。 First you need to enable some options in the kernel to use the BSD process accounting. This feature is optional, but is highly recommended for improved accuracy. If you are using genkernel to build your kernel, run the following command: And enable the following options: General setup —> [] BSD Process Accounting [] BSD Process Accounting version 3 file format ...

2012-02-28 · 1 min · 86 words · -

kernel config 3.2.8

kernel config 3.2.8 http://0123.blog.163.com/blog/static/4788312011112214258169/ http://www.cnblogs.com/unicode/archive/2010/05/19/1739675.html http://blog.csdn.net/unsigned_/article/details/6123426 http://blog.csdn.net/woshixingaaa/article/details/5982246 1,仔细了解你电脑的硬件型号,越清楚越好切记切记。 2.一定要把SCSI控制器的驱动及与文件系统有关的都编译进内核,而不是模块。 3.把对启动过程没有关系的驱动,一定要编进模块。 4.一定要把你的.config文件复制出来,作为下次重复编译的起点 5.在编译前,一定要保证系统中至少有一个可以正常启动的内核 6.可能在你正确编译完成后,你的一些系统工具不能正常工作,所以不要盲目追新,和util-bin,linux-util,以及模块工具等不能协同工作就悲摧了。 7.一般来说,手动编译的内核启动速度比发行版提供的要快那么一点点,但是,一般的各发行版定制的内核都经过了不同程度的优化,选择自行编译等于放弃了这些优点。除非你清楚你在做什么,否则编译内核只适合喜欢鼓捣学习提高的童鞋。that’s all,good luck! []Prompt for development and/or incomplete code/drivers 对开发中的或者未完成的代码和驱动进行提示, Linux下的很多东西,比如网络设备、文件系统、网络协议等等,它们的功能、稳定性、或者测试等级等等还不能够符合大众化的要求,还处于开发之中。这就是所谓的α版本(阿尔法版本):最初开发版本;接下来的是β版本(beta版本),公开测试版本。如果这是阿尔法版本,那么开发者为了避免收到诸如"为何这东西不工作"的信件的麻烦,常常不会让它发布出去。但是,积极的测试和使用阿尔法版本对软件的开发是非常好的。你只需要明白它未必工作得很好,在某些情况有可能会出问题。汇报详细的出错情况对开发者很有帮助。这个选项同样会让一些老的驱动可用。很多老驱动在后来的内核中已经被代替或者被移除。除非你想要帮助软件的测试,或者开发软件,或者你的机器需要这些特性,否则你可以选N ,那样你会在配置菜单中得到较少的选项。如果你选了Y, 你将会得到更多的阿尔法版本的驱动和代码的配置菜单。 () Cross-compiler tool prefix 交叉编译工具前缀,如果你要使用交叉编译工具的话输入相关前缀。默认不使用。不需要;交叉编译(cross-compile)大致的意思就是在一个平台上为另外一个平台生成代码,也就是说,你在编译时使用的编译器的host和target是不同的,比如你在x86的机器上生成mips的代码。你给本地机器编内核的话,用不到这个。 (ylxy1.2)Local version - append to kernel release 本地版本-附加内核发行版本. 在你的内核版本后面加上一串字符来表示版本。这些字符在你使用 uname -a命令时会显示出来。你在这设置的版本字符将会出现在文件的目录和内容中,如果这些文件调用了内核的版本号。你的字符最多不能超过64位。 [*]Automatically append version information to the version string 自动生成版本信息。这个选项会自动探测你的内核并且生成相应的版本,使之不会和原先的重复。这需要Perl的支持。由于在编译的命令make-kpkg 中我们会加入-append-to-version选项来生成自定义版本,所以这里选N. []Kernel compression mode (Gzip) ((none))Default hostname [*]Support for paging of anonymous memory(swap) 这是使用交换分区或者交换文件来做为虚拟内存的,当然要选上了。 [*]System V IPC 为进程提供通信机制,这将使系统中各进程间有交换信息与保持同步的能力。有些程序只有在选Y的情况下才能运行,所以不用考虑,这里一定要选。 [*] BSD Process Accounting ...

2012-02-28 · 1 min · 144 words · -

IPC, 进程间通信IPC (InterProcess Communication)

IPC, 进程间通信IPC (InterProcess Communication) 每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信 (IPC,InterProcess Communication) 进程间通信模型 进程间通信的7种方式 匿名管道 命名管道 消息(Message)队列 共享内存 (share memory) 信号量(semaphore) socket (socket) 管道/匿名管道(pipe) 管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道。 只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程); 单独构成一种独立的文件系统: 管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是自立门户,单独构成一种文件系统,并且只存在与内存中。 数据的读出和写入: 一个进程向管道中写的内容被管道另一端的进程读出。写入的内容每次都添加在管道缓冲区的末尾,并且每次都是从缓冲区的头部读出数据。 进程间管道通信模型 管道的实质: 管道的实质是一个内核缓冲区,进程以先进先出的方式从缓冲区存取数据,管道一端的进程顺序的将数据写入缓冲区,另一端的进程则顺序的读出数据。 该缓冲区可以看做是一个循环队列,读和写的位置都是自动增长的,不能随意改变,一个数据只能被读一次,读出来以后在缓冲区就不复存在了。 当缓冲区读空或者写满时,有一定的规则控制相应的读进程或者写进程进入等待队列,当空的缓冲区有新数据写入或者满的缓冲区有数据读出来时,就唤醒等待队列中的进程继续读写。 管道的局限: 管道的主要局限性正体现在它的特点上: 只支持单向数据流; 只能用于具有亲缘关系的进程之间; 没有名字; 管道的缓冲区是有限的 (管道制存在于内存中,在管道创建时,为缓冲区分配一个页面大小) ; 管道所传送的是无格式字节流,这就要求管道的读出方和写入方必须事先约定好数据的格式,比如多少字节算作一个消息 (或命令、或记录) 等等; 命名管道(named pipe) 匿名管道,由于没有名字,只能用于亲缘关系的进程间通信。为了克服这个缺点,提出了有名管道(FIFO)。 有名管道不同于匿名管道之处在于它提供了一个路径名与之关联,以有名管道的文件形式存在于文件系统中,这样,即使与有名管道的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够彼此通过有名管道相互通信,因此,通过有名管道不相关的进程也能交换数据。值的注意的是,有名管道严格遵循先进先出(first in first out),对匿名管道及有名管道的读总是从开始处返回数据,对它们的写则把数据添加到末尾。它们不支持诸如lseek()等文件定位操作。有名管道的名字存在于文件系统中,内容存放在内存中。 匿名管道和有名管道总结: (1) 管道是特殊类型的文件,在满足先入先出的原则条件下可以进行读写,但不能进行定位读写。 (2) 匿名管道是单向的,只能在有亲缘关系的进程间通信;有名管道以磁盘文件的方式存在,可以实现本机任意两个进程通信。 (3) 无名管道阻塞问题: 无名管道无需显示打开,创建时直接返回文件描述符,在读写时需要确定对方的存在,否则将退出。如果当前进程向无名管道的一端写数据,必须确定另一端有某一进程。如果写入无名管道的数据超过其最大值,写操作将阻塞,如果管道中没有数据,读操作将阻塞,如果管道发现另一端断开,将自动退出。 (4) 有名管道阻塞问题: 有名管道在打开时需要确实对方的存在,否则将阻塞。即以读方式打开某管道,在此之前必须一个进程以写方式打开管道,否则阻塞。此外,可以以读写 (O_RDWR) 模式打开有名管道,即当前进程读,当前进程写,不会阻塞。 延伸阅读: 该博客有匿名管道和有名管道的C语言实践 信号 (Signal) 信号是Linux系统中用于进程间互相通信或者操作的一种机制,信号可以在任何时候发给某一进程,而无需知道该进程的状态。 如果该进程当前并未处于执行状态,则该信号就由内核保存起来,知道该进程回复执行并传递给它为止。 如果一个信号被进程设置为阻塞,则该信号的传递被延迟,直到其阻塞被取消是才被传递给进程。 信号 (Signal) 信号是比较复杂的通信方式,用于通知接受进程有某种事件发生, 除了用于进程间通信外,进程还可以发送信号给进程本身;Linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction (实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数) ...

2012-02-28 · 7 min · 1475 words · -

sysstat

sysstat system performance tools for Linux The sysstat package contains the following system performance tools: sar: collects and reports system activity information; iostat: reports CPU utilization and disk I/O statistics; mpstat: reports global and per-processor statistics; pidstat: reports statistics for Linux tasks (processes); sadf: displays data collected by sar in various formats. The statistics reported by sar deal with I/O transfer rates, paging activity, process-related activities, interrupts, network activity, memory and swap space utilization, CPU ...

2012-02-27 · 1 min · 91 words · -

eBPF

eBPF eBPF 的用处 有了 eBPF,无需修改内核,也不用加载内核模块,程序员也能在内核中执行自定义的字节码。eBPF 和内核紧密联系,下面先介绍一些相关的基本概念。 Linux 系统分为内核空间和用户空间。内核空间是操作系统的核心,对所有硬件都具备不受限制的完整的访问能力,例如内存、存储以及 CPU 等。内核既然具备了这样的超级权限,势必需要严加保护,仅允许运行最可靠的代码。而用户空间运行的就是非内核的进程——例如 I/O、文件系统等。这些进程仅能通过内核开放的系统调用,对硬件进行有限的访问。换句话说,用户空间的程序一定要经过内核空间的过滤。 系统调用接口能够满足绝大多数需要,开发者在面对新的硬件、文件系统、网络协议甚至自定义的系统调用时,还是需要更多的弹性的。在不修改内核源码的情况下,用户代码要直接访问硬件怎么办呢?可以使用 Linux 内核模块 (LKM)。用户空间一般是需要通过系统调用来访问内核空间,而 LKM 是直接加载到内核的,是内核的一部分。LKM 最有价值的特点之一,就是可以在运行时加载,不用编译内核也不用重启机器。 what is ebpf 1 图 1:LKM 的动态加载和卸载 LKM 非常有用,但是也引入了很多风险。内核和用户空间不同,要进行不同的安全考量。内核空间是为了操作系统内核这样的特权代码准备的。系统调用连接了内核和用户空间,让用户空间能够对硬件进行合适的操作。换个说法,LKM 是能够让内核崩溃的。模块和内核的紧密关系,使得安全和升级成本直线升高。 eBPF 是什么 eBPF 是一个用于访问 Linux 内核服务和硬件的新方法。这一新技术已经用于网络、出错、跟踪以及防火墙等方面。 dtrace 是一个 Solaris 和 BSD 操作系统上的动态跟踪工具,eBPF 受到 dtrace 的启发,原意是设计一个更好的 Linux 跟踪工具。跟 dtrace 不同的是,Linux 无法获取运行中系统的鸟瞰视图,它被系统调用、库调用以及函数所限制。一小撮工程师在 Berkeley Packet Filter (BPF)基础之上,构建一个内核虚拟机级别的包过滤机制,提供了类似 dtrace 的功能。2014 年第一个版本适配了 Linux 3.18,提供的功能相对较少。要使用完整的 eBPF,需要 Linux 4.4 或以上。 what is ebpf 2 上图对 eBPF 架构进行了一个简单的展示。eBPF 程序需要满足一系列的需求,才能被加载到内核。Verifier 中有一万多行代码用来对 eBPF 程序进行检查。Verifier 会遍历对 eBPF 程序在内核中可能的执行路径进行遍历,确保程序能够在不出现导致内核锁定的循环的情况下运行完成。除此之外还有其它必须满足的检查,例如有效的寄存器状态、程序大小以及越界等。安全控制方面,eBPF 和 LKM 是颇有差异的。 ...

2012-02-27 · 1 min · 90 words · -

System.map、vmlinuz、initrd.img

System.map、vmlinuz、initrd.img vmlinuz 1.vmlinuz是可引导的、压缩的内核。“vm"代表"Virtual Memory”。Linux 支持虚拟内存,不像老的操作系统比如DOS有640KB内存的限制。Linux能够使用硬盘空间作为虚拟内存,因此得名"vm"。vmlinuz是可执行 的Linux内核,它位于/boot/vmlinuz,它一般是一个软链接,比如图中是vmlinuz-2.4.7-10的软链接。 vmlinuz的建立有两种方式。一是编译内核时通过"make zImage"创建,然后通过:“cp /usr/src/linux-2.4/arch/i386/linux/boot/zImage/boot/vmlinuz"产生。zImage适用于 小内核的情况,它的存在是为了向后的兼容性。 2.是内核编译时通过命令make bzImage创建,然后通过:“cp/usr/src/linux-2.4/arch/i386/linux/boot/bzImage /boot/vmlinuz"产生。bzImage是压缩的内核映像,需要注意,bzImage不是用bzip2压缩的,bzImage中的bz容易引起误解,bz表示"big zImage”。 bzImage中的b是"big"意思。 zImage(vmlinuz)和bzImage(vmlinuz)都是用gzip压缩的。它们不仅是一个压缩文件,而且在这两个文件的开头部分内嵌有 gzip解压缩代码。所以你不能用gunzip 或 gzip –dc解包vmlinuz。内核文件中包含一个微型的gzip用于解压缩内核并引导它。两者的不同之处在于,老的zImage解压缩内核到低端内存(第一 个640K), bzImage解压缩内核到高端内存(1M以上)。如果内核比较小,那么可以采用zImage或bzImage之一,两种方式引导的系统运行时是相同的。 大的内核采用bzImage,不能采用zImage。vmlinux是未压缩的内核,vmlinuz是vmlinux的压缩文件。 二、initrd-x.x.x.img initrd是"initial ramdisk"的简写。initrd一般被用来临时的引导硬件到实际内核vmlinuz能够接管并继续引导的状态。图中的initrd-2.4.7- 10.img主要是用于加载ext3等文件系统及scsi设备的驱动。比如,使用的是scsi硬盘,而内核vmlinuz中并没有这个scsi硬件的驱 动,那么在装入scsi模块之前,内核不能加载根文件系统,但 scsi模块存储在根文件系统的/lib/modules下。为了解决这个问题,可以引导一个能够读实际内核的initrd内核并用initrd修正 scsi引导问题。initrd-2.6.20-1.img是用gzip压缩的文件,initrd实现加载一些模块和安装文件系统等功能。 initrd映象文件是使用mkinitrd创建的。mkinitrd实用程序能够创建initrd映象文件。这个命令是RedHat专有的。其它 Linux发行版或许有相应的命令。这是个很方便的实用程序。具体情况请看帮助:man mkinitrd下面的命令创建initrd映象文件。 initrd是linux在系统引导过程中使用的一个临时的根文件系统,用来支持两阶段的引导过程。 直白一点,initrd就是一个带有根文件系统的虚拟RAM盘,里面包含了根目录'/',以及其他的目录,比如: bin,dev,proc,sbin,sys等linux启动时必须的目录,以及在bin目录下加入了一下必须的可执行命令。 PC或者服务器linux内核使用这个initrd来挂载真正的根文件系统,然后将此initrd从内存中 卸掉,这种情况下initrd其实就是一个过渡使用的东西。 在现在的许多简单嵌入式linux中一般是不卸载这个initrd的,而是直接将其作为根文件系统使用,在这之前就需要把所需要的程序,命令还有其它文件 都安装到这个文件系统中。其实现在的大多数嵌入式系统也是有自己的磁盘的,所以,initrd在现在大多数的嵌入式系统中也和一般的linux中的作用一 样只是起过渡使用。 Initrd的引导过程: '第二阶段引导程序',常用的是grub将内核解压缩并拷贝到内存中,然后内 核接管了CPU开始执行,然后内核调用init()函数,注意,此init函数并不是后来的init进程!!!然后内核调用函数 initrd_load()来在内存中加载initrd根文件系统。Initrd_load()函数又调用了一些其他的函数来为RAM磁盘分配空间,并计 算CRC等操作。然后对RAM磁盘进行解压,并将其加载到内存中。现在,内存中就有了initrd的映象。 然后内核会调用mount_root()函数来创建真正的根分区文件系统,然后调用sys_mount()函数来加载真正的根文件系统,然后chdir到这个真正的根文件系统中。 最后,init函数调用run_init_process函数,利用execve来启动init进程,从而进入init的运行过程。 三、System.map 内核符号映射表,顾名思义就是将内核中的符号 (也就是内核中的函数) 和它的地址能联系起来的一个列表。是所有符号及其对应地址的一个列表。之所以这样就使 为了用户编程方便,直接使用函数符号就可以了,而不用去记要使用函数的地址。当你编译一个新内核时,原来的System.map中的符号信息就不正确 了。随着每次内核的编译,就会产生一个新的 System.map文件,并且需要用该文件取代原来的文件 System.map是一个特定内核的内核符号表。它是你当前运行的内核的System.map的链接。 内核符号表是怎么创建的呢? System.map是由"nm vmlinux"产生并且不相关的符号被滤出。 下面是System.map文件的一部分: c0100000 A _text c0100000 t startup_32 c01000a5 t checkCPUtype c0100133 t is486 c0100142 t is386 c010018c t L6 c010018e t ready c010018f t check_x87 c01001b6 t setup_idt c01001d3 t rp_sidt c01001e0 T stack_start c01001e8 t int_msg c01001fc t ignore_int c010021e T idt_descr c0100224 T cpu_gdt_descr c0101000 T swapper_pg_dir c0102000 T pg0 c0103000 T pg1 c0104000 T empty_zero_page c0105000 T _stext 在进行程序设计时,会命名一些变量名或函数名之类的符号。Linux内核是一个很复杂的代码块,有许许多多的全局符号。 Linux内核不使用符号名,而是通过变量或函数的地址来识别变量或函数名。比如不是使用size_t BytesRead这样的符号,而是像c0343f20这样引用这个变量。 对于使用计算机的人来说,更喜欢使用那些像size_t BytesRead这样的名字,而不喜欢像c0343f20这样的名字。内核主要是用c写的,所以编译器/连接器允许我们编码时使用符号名,当内核运行时使用地址。 然而,在有的情况下,我们需要知道符号的地址,或者需要知道地址对应的符号。这由符号表来完成,符号表是所有符号连同它们的地址的列表。上图就是一个内核符号表,由上图可知变量名checkCPUtype在内核地址c01000a5。 Linux 符号表使用到2个文件: /proc/ksyms System.map ...

2012-02-26 · 1 min · 145 words · -

linux 内核, kernel

linux 内核, kernel kernel-devel和kernel-headers都是Linux内核开发和编译过程中需要的软件包,它们包含的内容有一定的区别。 kernel-headers是Linux内核头文件的软件包,它包含了编译内核模块所需的头文件和接口定义,但是不包含内核模块的源代码。这些头文件包括了Linux内核的各种数据结构、系统调用和其他接口的声明,编译内核模块时需要这些头文件来编译并链接内核模块。 kernel-devel则是Linux内核开发包,它不仅包含了内核头文件,还包含了编译内核模块所需的各种库文件、编译器和调试工具等。它还包含了内核模块的源代码,可以让开发人员对内核进行修改和定制。 kernel doc https://www.kernel.org/doc/html/latest/ linux内核版本的分类 Linux内核版本有两种: 稳定版和开发版 ,Linux内核版本号由3组数字组成: 第一个组数字.第二组数字.第三组数字 第一个组数字: 目前发布的内核主版本。 第二个组数字: 偶数表示稳定版本;奇数表示开发中版本。 第三个组数字: 错误修补的次数。 例1: 2.6.18-128.ELsmp , 第一个组数字: 2 , 主版本号 第二个组数字: 6 , 次版本号,表示稳定版本(因为有偶数) 第三个组数字 18 , 修订版本号 , 表示修改的次数,头两个数字合在一齐可以描述内核系列。如稳定版的2.6.0,它是2.6版内核系列。128: 表示这个当前版本的第128次微调patch , 而ELsmp指出了当前内核是为ELsmp特别调校的 EL : Enterprise Linux ; smp : 表示支持多处理器 , 表示该内核版本支持多处理器 linux内核下里的ELsmp与EL与smp 在linux下ELsmp指出了当前内核是为ELsmp特别调校的 EL : Enterprise Linux ; smp : 表示支持多处理器 , 表示该内核版本支持多处理器 例2:Red Hat Linux开机的时候,GRUB的启动菜单会有两个选项,分别是 Red Hat Enterprise Linux ES (版本号.ELsmp) Red Hat Enterprise Linux ES-up (版本号.EL) 其实这个就是系统开机时由GRUB引导启动 - 单处理器与对称多处理器启动核心文件的区别。 Red Hat Enterprise Linux ES (版本号.ELsmp) multiple processor (symmetric multiprocessing ) Red Hat Enterprise Linux ES-up (版本号.EL) uniprocessor ...

2012-02-26 · 1 min · 101 words · -

gz,bz2,xz三种压缩格式的 OpenBSD CVS库容量对比

gz,bz2,xz三种压缩格式的 OpenBSD CVS库容量对比 gz,bz2,xz三种压缩格式的 OpenBSD CVS库容量对比 压缩gz格式速度最快,也是OpenBSD的常用格式,压缩bz2格式时间稍长一些,但似乎在好机器上还可以接受,xz格式的压缩效果确实不错,cvs.tar是打包的全部OpenBSD CVS库,原本大小有5G多,经过xz压缩后只有700多M,不得不说压缩算法确实强悍,不过压缩时间太长——在我的1300MHz主频的老机器上,将5G多的cvs打包文件压缩成xz格式用了两个小时左右,看来这种格式最好不作为日常采用的格式,但是如果作为放在服务器上供长期、大量下载的资源,使用这种压缩格式来进行压缩和解压尚可理解。 代码: ls -la total 14202000 drwxr-xr-x 3 root wheel 512 Mar 25 21:18 . drwxr-xr-x 15 root wheel 512 Mar 25 16:35 .. drwxr-xr-x 10 root wheel 512 Mar 25 17:49 cvs -rw-r–r– 1 root wheel 387 Mar 25 16:40 cvs-supfile -rw-r–r– 1 root wheel 5208381440 Mar 25 21:18 cvs.tar -rw-r–r– 1 root wheel 898476333 Mar 25 21:03 cvs.tar.bz2 -rw-r–r– 1 root wheel 1162675369 Mar 25 21:13 cvs.tar.gz ...

2012-02-26 · 1 min · 77 words · -

GCC

GCC GCC (GNU Compiler Collection ) ,GCC是一系列编译器的集合, 是Linux操作系统的核心组件之一。是一套由 GNU 开发的编程语言编译器。它是一套GNU编译器套装以 GPL 及 LGPL 许可证所发行的自由软件,也是 GNU计划的关键部分,亦是自由的类Unix及苹果电脑 Mac OS X 操作系统的标准编译器。GCC 原名为 GNU C 语言编译器,因为它原本只能处理 C语言。GCC 很快地扩展,变得可处理 C++。之后也变得可处理 Fortran、Pascal、Objective-C、Java, 以及 Ada与其他语言。 GCC最初名为GNU C Compiler,当时它只是一款C语言的编译器,不过随着后续迭代,它支持C++、Fortran、Go等语言,GCC也因此成为一个编译器集合。GCC有以下特点: GCC支持的编程语言多。比如,g++ 是 C++ 编译器,gfortran是 Fortran 编译器。 GCC支持的硬件全。GCC可以将源代码编译成x86_64、ARM、PowerPC等硬件架构平台的可执行文件。 GCC支持众多业界标准。GCC能很快支持最新的C++标准,GCC支持OpenMP、OpenACC。 虽然编译器并非只有GCC一种,macOS上有Clang,Windows上有MSVC,但GCC的这些特点让它从众多编译器间脱颖而出,很多开源软件会选择GCC完成编译工作。 刚才提到,软件构建的过程比较复杂,GCC的一些“兄弟”工具提供了很多支持功能: GNU Make:一款自动化编译和构建工具,多文件、多模块的大型软件工程经常需要使用GNU Make。 GDB:GNU Debugger,用于调试。 GNU Binutils:一组二进制工具集,包括链接器ld、汇编器as等,GNU Bintuils可以和GCC、GNU Make一起完成构建过程。我们将在下文使用这些工具。 综上,GCC在Linux操作系统占有举足轻重的地位。 预处理 使用预处理器cpp工具进行预处理。注意,这里的cpp是C Preprocessor的缩写,并不是C-plus-plus的意思。 cpp hello.c -o hello.i 预编译主要处理源代码中以#开始的预编译指令,主要处理规则如下: 处理#include 预编译指令,将被包含的文件插入到该预编译指令的位置。这是一个递归的过程,如果被包含的文件还包含了其他文件,会递归地完成这个过程。 处理条件预编译指令,比如#if、#ifdef、#elif、#else、#endif。 删除#define,展开所有宏定义。 添加行号和文件名标识,以便于在编译过程中产生编译错误或者调试时都能够生成行号信息。 编译 编译的过程主要是进行词法分析、语法分析、语义分析,这背后涉及编译原理等一些内容。这里只进行编译,不汇编,可以生成硬件平台相关的汇编语言。 $ gcc -S hello.i -o hello.s gcc其实已经做了封装,背后是使用一个名为cc1的工具,cc1并没有放在默认的路径里。Ubuntu 16.04系统上,cc1位于:/usr/lib/gcc/x86_64-linux-gnu/5.4.0/cc1: ...

2012-02-26 · 1 min · 121 words · -

关系型数据库 VS 非关系型数据库

关系型数据库 VS 非关系型数据库 关系型数据库(Relational database) VS 非关系型数据库 一、关系型数据库? 1.概念 关系型数据库是指采用了关系模型来组织数据的数据库。简单来说,关系模式就是二维表格模型。 主要代表:SQL Server,Oracle,Mysql,PostgreSQL。 2.优点 (1).容易理解,二维表的结构非常贴近现实世界,二维表格,容易理解。 (2)使用方便,通用的sql语句使得操作关系型数据库非常方便。 (3)易于维护,数据库的ACID属性,大大降低了数据冗余和数据不一致的概率。 3.瓶颈 (1 )海量数据的读写效率。 对于网站的并发量高,往往达到每秒上万次的请求,对于传统关系型数据库来说,硬盘I/o是一个很大的挑战。 (2) 高扩展性和可用性。 在基于web的结构中,数据库是最难以横向拓展的,当一个应用系统的用户量和访问量与日俱增的时候,数据库没有办法像web Server那样简单的通过添加更多的硬件和服务节点来拓展性能和负载能力。 传统数据库操作涉及事物机制,每次写入操作需要进行undo、redo操作,然后将redo操作记录到日志文件,有事物开销,不适合写多读少的场景. 二、从关系型到非关系型 关系型数据库的最大优点就是事务的一致性,这个特性,使得关系型数据库中可以适用于一切要求一致性比较高的系统中。比如:银行系统。 但是在网页应用中,对这种一致性的要求不是那么的严格,允许有一定的时间间隔,所以关系型数据库这个特点不是那么的重要了。相反,关系型数据库为了维护一致性所付出的巨大代价就是读写性能比较差。而像微博、facebook这类应用,对于并发读写能力要求极高,关系型数据库已经无法应付。所以必须用一种新的数据结构存储来替代关系型数据库。所以非关系型数据库应用而生。 三、非关系型 1.概念 NoSQL非关系型数据库,主要指那些非关系型的、分布式的,且一般不保证ACID的数据存储系统,主要代表MongoDB,Redis、CouchDB。 NoSQL提出了另一种理念,以键值来存储,且结构不稳定,每一个元组都可以有不一样的字段,这种就不会局限于固定的结构,可以减少一些时间和空间的开销。使用这种方式,为了获取用户的不同信息,不需要像关系型数据库中,需要进行多表查询。仅仅需要根据key来取出对应的value值即可。 2.分类 非关系数据库大部分是开源的,实现比较简单,大都是针对一些特性的应用需求出现的。根据结构化方法和应用场景的不同,分为以下几类。 (1)面向高性能并发读写的key-value数据库 主要特点是具有极高的并发读写性能,例如Redis、Tokyo Cabint等。 (2)面向海量数据访问的面向文档数据库 特点是,可以在海量的数据库快速的查询数据。例如MongoDB以及CouchDB. (3)面向可拓展的分布式数据库 解决的主要问题是传统数据库的扩展性上的缺陷。 3.缺点 但是由于Nosql约束少,所以也不能够像sql那样提供where字段属性的查询。因此适合存储较为简单的数据。有一些不能够持久化数据,所以需要和关系型数据库结合。 四、对比 1.存储上? Sql通常以数据库表的形式存储,例如存储用户信息,SQL中增加外部关系的话,需要在原表中增加一个外键,来关联外部数据表。如下: NoSql采用key-value的形式存储 2.事务? SQL中如果多张表需要同批次被更新,即如果其中一张表跟新失败的话,其他表也不会更新成功。这种场景可以通过事务来控制,可以在所有命令完成之后,再统一提交事务。在Nosql中没有事务这个概念,每一个数据集都是原子级别的。 3.数据表 VS 数据集 关系型是表格型的,存储在数据表的行和列中。彼此关联,容易提取。而非关系型是大块存储在一起。 4.预定义结构 VS 动态结构 在sql中,必须定义好地段和表结构之后,才能够添加数据,例如定义表的主键、索引、外键等。表结构可以在定义之后更新,但是如果有比较大的结构变更,就会变的比较复杂。 在Nosql数据库中,数据可以在任何时候任何地方添加。不需要预先定义。 5.存储规范 VS 存储代码 关系型数据库为了规范性,把数据分配成为最小的逻辑表来存储避免重复,获得精简的空间利用。但是多个表之间的关系限制,多表管理就有点复杂。 当然精简的存储可以节约宝贵的数据存储,但是现在随着社会的发展,磁盘上付出的代价是微不足知道的。 非关系型是平面数据集合中,数据经常可以重复,单个数据库很少被分开,而是存储成为一个整体,这种整块读取数据效率更高。 6.纵向拓展 VS 横向拓展 ...

2012-02-21 · 1 min · 86 words · -

Foldit

Foldit Foldit就是这样一个程序,它打算用人类的解谜思维来代替计算机算法中的一部分决策,把确定蛋白质的最佳三维形状设计成一个游戏,使得人们在游戏过程中也能对生物科学做出贡献。在这个游戏中你可以不断调整蛋白质的三维形状,上传最高分和所得的三维体,参与世界排名,并且还能与游戏参与者进行即时聊天。 Rosetta@home是一个基于伯克利开放式网络计算平台 (BOINC) 的分布式计算项目。该项目由华盛顿大学贝克实验室开发和维护,用于蛋白质结构预测、蛋白质-蛋白质对接和蛋白质设计的研究。截至2009年12月9日,全球共有8.2万台计算机是这一项目的活跃志愿者,平均执行速度达99万亿FLOPS。Rosetta@Home还开发了一款电子游戏Foldit,目的是通过众包 (crowdsourcing) 途径来实现上述研究目标。尽管这个项目很大程度上侧重于进行提高蛋白质组学方法的精确性和稳固性的基础研究,它也进行一些关于艾滋病、疟疾、癌症、阿兹海默病以及其他疾病的病理学的应用研究。 与其他BOINC项目一样,Rosetta@home使用志愿者的计算机中空闲的进程资源来执行单独的单元计算。计算结果会被发送到项目的中央服务器,经验证后存入数据库中。这个项目是跨平台的,支持多种不同的软件和硬件环境。用户可通过Rosetta@home的屏幕保护程序观看正在自己计算机上进行的蛋白质结构预测的情况。 除了疾病相关研究,Rosetta@home网络还是结构生物信息学中新方法的一个测试框架。这些新方法经Rosetta@home庞大且多样的用户群体使用后,若运行效果稳定,将会被用于其他基于Rosetta的应用程序,例如RosettaDock和人类蛋白质组折叠项目。新方法测试中的两个重要项目是蛋白质结构预测技术的关键测试 (CASP) 和交互作用预测的关键测试 (CAPRI) 。这两项测试实验分别用于评估蛋白质结构预测和蛋白质-蛋白质对接预测的最前沿技术。Rosetta@home稳居最重要的对接预测器之一,并且是现有最好的蛋白质三级结构预测器之一。

2012-02-21 · 1 min · 13 words · -