IBM 发布了第一台基于RISC(精简指令集计算机)架构的原型机。早在上世纪70年代初,基于IBM 科学家 John Cocke的发明,RISC的理念大大简化了计算机操作指令,加快系统运行速度,使得计算机性能得到大幅度提升。
1980:
IBM 发布了第一台基于RISC(精简指令集计算机)架构的原型机。早在上世纪70年代初,基于IBM 科学家 John Cocke的发明,RISC的理念大大简化了计算机操作指令,加快系统运行速度,使得计算机性能得到大幅度提升。如今,RISC架构已经广泛应用于众多工作站和UNIX服务器系统中,并被看作是未来主流的计算架构。
1990:
IBM 推出基于RISC系统、运行AIX V3的新产品线RS/6000(现在称为IBM eServer p系列)。该系统架构后来被称为POWER(POWER1),意为�强RISC性能优化(Performance Optimization With Enhanced RISC)架构。
1991:
IBM和苹果、摩托罗拉公司达成一系列合作协议,内容包括:推出支持苹果 Macintosh个人电脑与IBM网络相连的全新产品;推出面向PC机和低成本工作站的RISC架构PowerPC处理器;形成一个开放的系统环境,保证IBM AIX和苹果Macintosh软件程序在两家公司设计的RISC系统中都能运行。此外,开放的系统环境包括其他一些技术协议。
1993:
IBM 推出可升级的POWER并行系统,这是第一款采用RS/6000技术,基于微处理器的超级计算机。在该系统中,IBM 首次应用多处理器技术,可将复杂密集的任务进行分解,大大加快了计算机的运算速度,开创了业界先河。
IBM和摩托罗拉公司推出PowerPC 601处理器,该处理器是与苹果共同开发的。PowerPC上集成280多万个晶体管,主频为50 MHz。
IBM 发布了66 MHz 的POWER2 处理器,首先应用于RS/6000系统。
1994:
IBM 推出可升级的POWER并行系统 2 (Scalable POWERparallel,SP2)。美国康乃尔理论研究中心配备了SP2超级计算机,运行速度高达1360亿次/秒。欧洲粒子物理学实验室(CERN)采用一款64节点、运行AIX系统的IBM SP2,速度位于欧洲前列。
IBM 成功研发出新一代PowerPC 604处理器,其强大的处理性能在批量生产的处理器产品中处于领先地位。IBM 技术人员还推出了业内最快的"无损"数据压缩芯片,每秒钟能处理40 MB数据。7月,IBM 交付第一百万个PowerPC 601 处理器。
IBM发布首个基于Power 架构的嵌入式控制器PowerPC 403GA。
1995:
PowerPC64位RISC处理器开始应用于IBM AS/400 操作系统中。
8月,苹果公司推出首款基于Power架构的笔记本电脑 PowerBook 500,它采用IBM的 PowerPC 603e 处理器。
1996:
IBM 推出全新的32位POWER2超级芯片(P2SC),主频达135 MHz ,首先应用于RS/6000系统。基于POWER2 架构的P2SC采用了高密度CMOS技术,单个芯片上集成1500万个晶体管。
1997:
IBM"深蓝"超级计算机在经过多局较量后,击败了国际象棋冠军Garry Kasparov。"深蓝"是一款32节点的IBM RS/6000 SP计算机,处理器采用32位P2SC,运行AIX操作系统。在比赛期间,"深蓝"的平均运算速度为每秒1亿2600万步。目前,这台超级计算机被安放在美国华盛顿特区的史密森国家博物馆内。
IBM 为美国国家宇航局提供一款32位的PowerPC微处理器,其运算速度可达每秒3500万次,主要用于火星探测计划。经过洛克希�马丁实验室改造后,最终形成可抗辐射的RAD 6000芯片,植入火星登陆车Sojourner Rover内部的计算机系统中。
1998:
由IBM和美国劳伦斯利弗莫尔国家实验室共同研发的"蓝色太平洋"超级计算机问世。这台计算机采用PowerPC 604处理器,主频高达332 MHz,系统包含176个节点,最高运算速度为每秒3.9万亿次(比一般台式电脑快1.5万倍),存储容量超过 2.6 TB (是普通PC机的8万倍)。"蓝色太平洋"一秒钟内的计算量相当于一个人使用计算器连续计算6万3千年的总和。
IBM 推出世界上第一组基于铜的微处理器 PowerPC 740/750,工作频率为 400 MHz。由于使用了铜芯片技术,处理性能提高了近1/3。
全新64位POWER3 处理器将POWER2 架构(P2SC) 与PowerPC 架构相结合,并对技术应用进行了优化。POWER3 的最高运算速度可达每秒200万次,比"深蓝"所采用的POWER2 超级芯片快出一倍多。
IBM 公布了首个基于Power的嵌入式系统芯片(SoC)内核。不久之后,PowerPC 405 内核也将同其他IP相结合,形成嵌入式SoC微处理器和基于Power的特定应用集成电路(ASIC)解决方案。
1999:
IBM 研究院投资1亿美金开发一种新型的Power架构超级计算机。这种名为"蓝色基因"的计算机峰值速度超过1 Peta FLOP,比当时最快的超级计算机高出500倍。它将被用来模拟复杂蛋白质的折叠。
自正式推出铜芯片一年后,IBM 交付了第一百万个铜技术PowerPC 芯片。
6月,IBM 发布了第一个基于405内核的系统芯片PowerPC 405GP。下半年,IBM 即推出了再下一代嵌入式PowerPC内核。
IBM与任天堂公司共同宣布了一项价值10亿美元的技术协议,IBM将为任天堂的下一代家庭游戏机GAMECUBE提供�强版PowerPC 芯片。新产品性能将超出任何其他家庭游戏系统,为玩家呈现更佳的图像效果和更逼真的动作画面。
IBM 勾画了一项雄心勃勃的战略——向通信行业供应芯片,首先将其芯片技术卖给Cisco Systems公司,同时采取若干步骤向那些生产制造交换机、路由器和其他通信设备的公司展示IBM在供应微处理器和其他部件方面的突出能力。
2000:
IBM 宣布将高速PowerPC 处理器与电视机顶盒(STB)组件一起整合到一个"单芯片系统"上,从而在系统性能、价格和设计等方面为机顶盒厂商带来竞争优势。该单芯片系统拥有众多的先进应用,并能帮助三星等公司灵活应对不断变化的客户需求。
IBM 将RS/6000更名为IBM eServer p系列。
2001:
IBM 新一代超机计算机"ASCI White"在美国劳伦斯利弗莫尔国家实验室投入使用,运算速度高达每秒12.3万亿次,主要用于模拟核爆炸试验。作为美国国家核安全管理局 (NNSA)提高战略运算能力计划(ASCI)的组成部分,该系统强大的运算能力可以在不到1分钟时间内处理地球上每个人发出的一次互联网操作请求。
在经过5年潜心研发后,IBM推出世界上最强大的UNIX服务器—eServer p690("Regatta")。新系统基于先进的POWER4处理器,集成了多项主机技术。由多台p690服务器连接而成的超级计算机拥有1000多个 POWER4处理器,能够完成最为复杂的运算任务。
索尼电脑娱乐公司(SCEI)、IBM和东芝共同宣布了多项计划,为在新兴宽带时代使用的设备进行领先芯片架构的研发。产品代号为"Cell"的新的微芯片采用世界上最先进的研究技术和芯片制造技术,采用比0.10微米还小的工艺——比人的头发细1000倍。这样将制造出比IBM深蓝超级计算机还要强大,耗电很低,能够以超高速度接入宽带互联网的消费者电子设备。
2002:
IBM 推出64位PowerPC 970处理器, 这款高性能产品可应用于普通台式机、入门级服务器等多种环境中。64位的PowerPC 970芯片基于POWER4服务器架构,采用独特的单指令多数据流(SIMD)单元,拥有超强处理性能。此外,它还采用了"Elastic I/O"内部总线结构,这是业界最快的处理器总线之一。
IBM 推出速度更快的POWER4+ 。截至2003年,POWER4+ 已经应用于全部pSeries产品线。
IBM 推出32路eServer iSeries 890服务器,其处理性能为 i840的两倍,采用1.3 GHz POWER4 处理器,单个芯片上集成了1亿7400万个晶体管。
纽约州州长George Pataki和IBM董事长兼首席执行总裁Sam Palmisano联合宣布了先进的IBM 300mm半导体设备生产线的开通。这条生产线是IBM微电子业务的重要扩展,它的主要目的是通过高端芯片代工制造服务和IBM的定制和标准芯片产品,满足客户对IBM领先芯片技术不断�长的需求。
IBM 推出嵌入式PowerPC 440GP 和PowerPC 440GX 处理器,主要运行嵌入式网络和存储应用。PowerPC 440GX拥有TCP/IP负载加速功能,在全部的5项EEMBC基准测试中得分均高于任何其它的"单芯片系统"处理器。
2003:
IBM 宣布一个有关32位嵌入式PowerPC 内核的公开授权计划。
IBM和苹果公司联手推出世界上第一款64位台式机处理器—PowerPC G5,工作频率达2.0 GHz。苹果公司称新的Power Mac G5电脑是"世界上最快的个人电脑"。
IBM 宣布推出划时代的"Blue Gene/L"原型机。这款超级计算机尺寸仅相当于30英寸彩电大小,它的问世将为科学界和IT业发展带来深远影响。最终版"Blue Gene/L"超级计算机将于2005年诞生,占地面积相当于半个网球场,总共包含65536个节点(PowerPC)和64个机架,预计其峰值速度将达到360 Tera Flops。
IBM 宣布eServer pSeries 630将采用POWER4+ 处理器。等到eServer pSeriesp615发布后,POWER4+ 已经应用于全部pSeries产品线。
IBM 推出首款采用64位PowerPC技术的刀片服务器BladeCenter JS20,扩大了客户的选择范围,提高投资回报率,实现快速经济的计算性能扩展。
IBM 推出全新的PowerPC 750GX。与 PowerPC 750相比,新产品的二级缓存扩大了一倍,由原先的512KB变为1MB。
2004:
IBM宣布开发出一种制造低功耗、高性能微处理器的新方法,首次把绝缘硅(SOI)、应变硅和铜制程三种技术工艺结合在一起。64位PowerPC 970FX成为首款采用新技术生产的处理器产品,并在业内评选中荣获大奖。
IBM 交付第4000台eServer p690服务器,该产品基于POWER 架构,是世界上最受欢迎的UNIX服务器。
IBM宣布POWER5处理器并推出备受关注的基于POWER5处理器的第一款系统eServer i5。年底,IBM又推出了eServer p5-520和p5-550 Express。基于IBM POWER5微处理器,这些服务器为客户提供了源自大型主机的技术和性能,从而为中型公司提供适合他们预算的价格和配置。
2005:
IBM开始大量生产IBM eServer p5-510服务器,这款服务器的设计初衷是将POWER5的性能和领先的虚拟化能力带入到入门级UNIX和Linux服务器。
IBM首次推出四款新的UNIX系统,包括IBM System p5-550Q、p5-520、p5-550和p5-505,它们均采用新的POWER5+微处理器技术,瞄准中小企业客户。
IBM预先展示了经过升级的高密度POWER5+ IBM p5-575超级计算机的预发布版。
2006:
IBM System p5 595是世界上最强大的服务器,保持着每秒400万次交易的世界记录。该款服务器具有多达64个POWER5+微处理器内核,使用IBM最初为游戏机开发的Dual Stress技术。Dual Stress技术能够同时拉伸和压缩硅,这样可以提供更高的处理器性能和更高的能效。
IBM推出8款新的IBM System p5服务器,其中包括几款基于当时最快的POWER5+处理器的服务器。另外,公司还宣布新的IBM System p5 570在16个内核的系统中创下了新的交易处理性能记录。
道琼斯指数选择IBM System p5 570服务器作为其全球指数和平均指数,如:道琼斯工业平均指数的计算平台。
2007:
IBM首次推出POWER6——有史以来最快的微处理器, 同时推出一款充分利用了该芯片在节能和虚拟化技术方面重大突破的新型超高性能服务器——IBM System p570。新型System p570是业界第一款同时囊括四大UNIX基准测试速度记录的服务器。
新推出的双核POWER6处理器的速度为4.7 GHz,是其上一代POWER5处理器的2倍,但运行和散热所消耗的电能基本相同。这意味着客户可以使用新的处理器将性能提高100%或将能耗减半。POWER6处理器的速度几乎是HP服务器产品线所使用的最新HP Itanium处理器的3倍。
新的IBM System p570服务器中的POWER6芯片是第一款在硬件上进行十进制浮点计算的微处理器内置的十进制浮点运算能力能够为企业运行复杂的税收、金融和ERP程序带来巨大的优势
星期四, 十一月 29, 2007
IBM小型机的发展史
在DLL中使用资源
在讨论关于动态链接到MFC的DLL的模块状态问题之前,先来看一个例子。本例可以通过如下步骤来完成:
1)在VC菜单中File->New新建一个命名为DLLShared的MFC AppWizard的工程,下一步选择Regular DLL using shared MFC DLL。
2)在工程中添加一个对话框资源,其ID为:IDD_ABOUTBOX。并在resource.h之中将IDD_ABOUTBOX 的数值改为100。
3)在DLLShared.cpp中定义如下函数:
void ShowDlg()
{
CDialog dlg(IDD_ABOUTBOX);
dlg.DoModal();
}
4)在DLLShared.def文件中的EXPORTS语句中添加一行:ShowDlg,以导出ShowDlg函数。
5)编译生成DLLShared.dll和DLLShared.lib。
继续使用上面的Use工程,将前面生成的DLLShared.dll和DLLShared.lib两个文件复制到工程的Debug目录内,并将
extern "C" __declspec(dllexport) void ShowDlg();
#pragma comment(lib,"debug/DLLStatic")
这两行改为:
void ShowDlg();
#pragma comment(lib,"debug/DLLShared")
编译并运行Use.exe。点击按钮,这次你看到了什么?对,没错,这次弹出的是Use.exe的关于对话框。将上述例子的DLL类型换成MFC Extension DLL(using shared MFC DLL)也会出现相同的问题。
为什么会出现上面的问题?这是因为在使用了MFC共享库的时候,默认情况下,MFC使用主应用程序的资源句柄来加载资源模板。虽然我们调用的是DLL中的函数来显示DLL中的对话框,并且对应的对话框模板是存储在DLL中的,但MFC仍旧在主应用程序也就是Use.exe中寻找相应的对话框模板。由于在DLL中所定义的对话框资源ID与主应用程序中所定义的关于对话框的资源ID相同,所以MFC就把主应用程序中的关于对话框显示了出来。如果二者不同,则MFC就认为DLL中所定义的对话框资源不存在,dlg.DoModal会返回0,也就是什么都不会显示。
那么如何解决上述问题呢?解决办法就是在适当的时候进行模块状态切换,以保证具有当前状态的模块是我们所需要的模块从而使用正确的资源。MFC提供了下列函数和宏来完成这些工作:
AfxGetStaticModuleState:这是一个函数,其函数原型为:
AFX_MODULE_STATE* AFXAPI AfxGetStaticModuleState( );
此函数在堆栈上构造AFX_MODULE_STATE类的实例pModuleState并对其赋值后将其返回。在AFX_MODULE_STATE类的构造函数中,该类获取指向当前模块状态的指针并将其存储在成员变量中,然后将pModuleState设置为新的有效模块状态。在它的析构函数中,该类将存储在其成员变量中的指针还原为存贮的前一个模块状态。
AFX_MANAGE_STATE:这是一个宏,其原型为:
AFX_MANAGE_STATE( AFX_MODULE_STATE* pModuleState )
该宏用于将pModuleState(指向包含模块全局数据也就是模块状态的AFX_MODULE_STATE结构的指针)设置为当前的即时作用空间中(the remainder of the immediate containing scope)的有效模块状态。在离开包含该宏的作用空间时,前一个有效的模块状态自动还原。
AfxGetResourceHandle:这个函数的原型为:
HINSTANCE AfxGetResourceHandle( );
该函数返回了一个保存了HINSTANCE类型的、应用程序默认所加载资源的模块的句柄。
AfxSetResourceHandle:这个函数的原型为:
void AfxSetResourceHandle( HINSTANCE hInstResource );
该函数将hInstResource所代表的模块设置为具有当前状态的模块。
通过使用上述四个函数或宏就可以正确的在动态链接到MFC的DLL中切换模块状态。接下来我们将通过修改上面出现问题的那个例子来介绍如何使用上述四个函数或宏。先来看看Regular DLL using shared MFC DLL类型:
在上述例子的第三步的ShowDlg函数的第一条语句前加上如下语句(要确保该语句在函数实现的第一行):
AFX_MANAGE_STATE(AfxGetStaticModuleState());
之后重新编译生成DLLShared.dll和DLLShared.lib,并将这两个文件重新拷贝到Use工程的Debug目录内。这次编译生成Use.exe并运行,点击按钮,可以看到弹出的时我们在DLL中所加入的那个对话框,而不再是Use.exe的关于对话框了。
通过上面的讲解,相信你已经知道该语句的作用了。在函数ShowDlg的第一行加上这么一句后,每次调用DLL的应用程序使用该函数的时候,MFC库都会自动切换当前模块状态,这样就保证了资源读取的正确性。
AFX_MANAGE_STATE(AfxGetStaticModuleState());是自动切换当前模块状态,也可以通过使用AfxGetResourceHandle和AfxSetResourceHandle来手动切换当前模块状态。具体使用方法如下:
在上述例子的第三步的ShowDlg函数的第一条语句前加上如下语句(要确保该语句在函数实现的第一行):
HINSTANCE save_hInstance = AfxGetResourceHandle();
AfxSetResourceHandle(theApp.m_hInstance);
在调用对话框成功之后,也就是dlg.DoModal();之后,添加:
AfxSetResourceHandle(save_hInstance);
这种方法在进入ShowDlg函数之后,通过AfxGetResourceHandle来获得并保存当前状态模块的句柄。然后获得DLL模块的句柄theApp.m_hInstance(当然,也可以使用GetModuleHandle函数来获得DLL模块的句柄),并使用AfxSetResourceHandle函数来将其设置为当前状态状态。最后在调用对话框成功之后再用恢复AfxSetResourceHandle资源句柄,将当前模块状态恢复。
这样做有些麻烦,但是有一点好处是可以在完成使用资源的任务之后就可以立即恢复资源句柄。而AFX_MANAGE_STATE(AfxGetStaticModuleState());的方法只能等函数的作用空间结束之后才恢复资源句柄。由于可执行文件必须重画工具条等原因,因此建议只要有可能就必须恢复资源句柄,否则可能会遇到许多问题。比如说,如果用户移动DLL的对话框,而此时资源句柄仍然为DLL的资源,那么程序就会崩溃。最好的恢复句柄的时机在对话框响应WM_INITDIALOG消息的时候,因为这时对话框的模板等已经读出了。
对于MFC Extension DLL(using shared MFC DLL)类型的MFC DLL,切换当前模块状态的方法与Regular DLL using shared MFC DLL类型的MFC DLL所使用的方法很相似,这里不再举例实现。二者不同的地方如下:
在MFC扩展DLL中使用AFX_MANAGE_STATE(AfxGetStaticModuleState());时,会产生如下错误:
mfcs42d.lib(dllmodul.obj) : error LNK2005: __pRawDllMain already defined in dllextend.obj
mfcs42d.lib(dllmodul.obj) : error LNK2005: _DllMain@12 already defined in dllextend.obj
mfcs42d.lib(dllmodul.obj) : error LNK2005: __pRawDllMain already defined in dllextend.obj
因此在MFC扩展DLL中需要将AFX_MANAGE_STATE(AfxGetStaticModuleState());换成AFX_MANAGE_STATE(AfxGetAppModuleState());才能正确切换当前模块状态。
在MFC扩展DLL中使用AfxGetResourceHandle和AfxSetResourceHandle的方法与在Regular DLL using shared MFC DLL类型的MFC DLL中所使用的方法相同。并且,DLL模块的句柄可以通过MFC提供的DlgextentDLL这个结构的hModule成员来获得。即使用AfxSetResourceHandle(DlgextentDLL.hModule);语句。
当然,对于动态链接到MFC的DLL,也可以在调用该DLL的MFC应用程序中使用AfxGetResourceHandle和AfxSetResourceHandle两个函数来切换当前状态模块。该DLL模块的句柄可以用GetModuleHandle函数来获得。在此不再赘述。
星期三, 三月 07, 2007
SQL学习笔记(转)
SQL学习笔记
1. 1. 一张表不能同时和复数张表外连接。
2.只有当同一张表的多个连接条件均为外连接时,外连接才起作用。
3.同一张表的多个外连接条件中,只要一个不满足条件,该表的记录则为空。
4.使用集合函数的SQL中,可用HAVING指定集合后结果的条件。
例:SELECT x,SUM(i) FROM A GROUP BY x HAVING SUM(i) > 100
5.排序操作中,NULL在SQLSERVER中被作为最小值,在ORACLE ,DB2中被作为最大值。
ORACLE9i中,可用NULLS FIRST,NULLS LAST来改变NULL 记录的位置。
例:SELECT * FROM foo ORDER BY a DESC NULLS LAST
6.WHERE条件中的子查询,会与主表中的记录逐条匹配,因此效率低下。
7.INSERT ALL(*ORACLE)可以同时登录多条记录,可以同时登录多张表。
语法中SELECT 是必须的。例:INSERT ALL INTO foo VALUES(1,2) INTO
foo VALUES(3,4) SELECT * FROM DUAL
INSERT ALL
WHEN a < 10000 THEN
INTO bar1
ELSE
INTO bar2
SELECT a,b FROM foo
8.(*ORACLE) 符合条件的记录存在时更新,不存在时登录。
MERGE INTO bar USING foo ON (foo.a = bar.a)
WHEN MATCHED THEN UPDATE SET bar.b = foo.b,bar.c = foo.c
WHEN NOT MATCHED THEN INSERT(bar.a,bar.b,bar.c)
VALUSE(foo.a,foo.b,foo.c)
9. SELECT FOR UPDATE OF 锁记录
SELECT * FROM foo ,bar WHERE foo.a = bar.a AND bar.b = abc FOR UPDATE
OF foo.a NOWAIT
10. LOCK TABLE 锁表
11. 记录集合差运算MINUS,只取得主表中,从表中没有的记录。
例:SELECT a FROM foo MINUS SELECT a FROM bar
12. 记录集合交集运算INTERSECT ,取出两张表中都存在的记录。
例:SELECT a FROM foo INTERSECT SELECT a FROM bar
13. 字符串连接运算符:
例:SELECT 姓名 '(' 性别 ')' FROM 个人信息