技术

3D浏览器与互联网

2009-07-01 18:10  分类: 技术   标签: .

上世纪90年代初,互联网开始兴起,人们打开电脑不但可以看到自己电脑中的内容还可以通过细细的网线看到其他电脑中内容,电脑不再是一个孤立的计算机器,而是成为人们通往世界的一个窗口,这个世界便是互联网打造的虚拟世界。刚开始的虚拟世界只是文本的,人们一般通过telnet的方式远程登录到服务器,可以获得象bbs这样的文本服务,虽然只是文本,但互联网已经开始吸引大量的用户进入,特别是大学生们曾如痴如醉的沉浸在文本的bbs中,虚拟世界开始显示出其威力。

1994年,美国网景公司成功的推出一款称为网络浏览器的软件Netscape Navigator,通过该软件不但可以看到互联网上的文本内容还可以很容易的看到图形内容,而且用户操作界面也是图形化方式,令人们可以更加方便的使用互联网,人们可以只需要点击鼠标即可遨游于互联网的海洋中,互联网开始极快的发展起来,此时由互联网造就的虚拟世界是2D图形化的,以2D网页的方式展现,直至现在很多人的印象中互联网是一页一页的。当时全世界的浏览器只有Netscape一家,用户使用Netscape上网,从某种意义上来说,Netscape就是当时的互联网,也是互联网规范的制订者,网站的设计者为了能让他们设计的网页能够在Netscape上正确显示必须符合Netscape的规范。2D图形化的互联网发展至今已经走过了14年的历程,其间,有多家IT公司为2D互联网开发了浏览器并制订了越来越丰富的规范,早期的Netscape浏览器由于功能开发速度,市场竞争,公司策略等因素已经在业界逐渐消失,微软的Internet Explorer浏览器是目前使用最普遍的浏览器,这些浏览器以显示文本和2D图片为主要目的而设计,这里姑且称之为2D浏览器。

由于近年来计算机3D图形技术和网络通信的飞速发展,互联网业界开始出现了3D互联网和3D浏览器的概念,虽然3D互联网和3D浏览器的概念还非常模糊,业界也没有相关技术标准,但人们还是产生了相关需求,比如要求互联网空间化,更加接近自然世界的体验,社交也不满足于文字和图片,希望拥有3D形象和动作表情,对基于互联网的创作也不满足于文字和图片,希望拥有3D创作功能,这些需求勾勒出了3D浏览器的雏形。

3D浏览器应该是2D浏览器的新一代产品,应该以显示文本、2D和3D内容为主要目的,应该完全兼容目前的2D浏览器功能并新增3D内容,应该对3D内容进入互联网提供统一的规范,对3D内容的规范包括3D内容的定义,传输和存储,使用3D浏览器浏览3D内容应该和浏览2D内容一样容易。

业界也有一些公司已经开发出了他们称为3D浏览器的产品,但是这些产品基本上只是将2D网页张贴到3D物品的表面,或象Windows Vista一样可以转动2D网页,能够对2D网页按深度排列,这些我认为都不符合3D浏览器的概念,他们只是对2D网页进行3D形象化操作,而不是给网页新增了3D内容。

我认为,对于2D网页的显示而言,目前的2D浏览器已经做得很好,人们使用起来也是非常方便,显示效果也很好,将2D网页张贴在3D表面可以在翻动2D网页时增加便利和形象感,但真正浏览2D网页时还是需要以平面的方式显示在屏幕上的,将2D网页张贴在3D表面上不是3D浏览器的主要功能,只是一个附加的小功能,3D浏览器真正需要做到的是能以良好的方式显示网页上的3D内容。由于3D内容的显示需要一个有深度和广度的场景,在2D网页上嵌入这样一个场景不但不美观,效果不好,技术实现也不规范,因此我认为3D浏览器上可以开辟3D内容的专门区域,将浏览器的显示区人为划分成2D网页区和3D场景区,这两个区域同时在3D浏览器上,大小比例可通过移动分割条动态调整,3D场景的定位也采用URL的方式,3D浏览器具有2D地址栏和3D地址栏两个地址栏,用户在3D场景中的定位可以通过在3D地址内直接输入3DURL也可以在2D网页中直接点击相关的3DURL,3D场景中也可以链接相关的2D网页,用户在3D场景中点击2DURL时,2D网页区显示相应的2D网页。

那么何谓3DURL,技术上如何实现呢?首先3DURL在格式上和现在互联网上的URL没有任何区别,是标准的URL,那么3D浏览器如何识别3DURL呢?其实3D浏览器并不需要识别某个URL是否为3DURL,当用户用鼠标点击3DURL时,3D浏览器象普通URL一样解析URL中的服务器地址并向服务器发出HTTP连接请求,如果该服务器为3D内容服务器,则向3D浏览器返回连接请求时会通过特殊的标志信息让3D浏览器知道当前连接的是3DURL,从而能够正确的将3D内容显示在3D区域,也就是说3D浏览器仅仅通过服务器的返回信息判断内容为2D内容还是3D内容,从而在正确的区域显示内容。

如果用普通的2D浏览器点击3DURL会是怎样的结果呢?由于2D浏览器在向服务器请求HTTP连接时会带有浏览器的信息,如果3D内容服务器判断请求信息的浏览器为不带3D功能的普通2D浏览器,则会返回一个消息告知不能浏览3D内容,请使用3D浏览器,用户在普通2D浏览器上点击3DURL时会看到该提示信息。

那么谁来提供3D内容服务器呢?理论上只要有统一的规范,任何企业都可以提供3D内容服务器空间,前期该服务应该由HiPiHi公司自己提供,HiPiHi公司可以给用户提供3D内容服务器空间以及相应的3DURL。互联网中2D内容一般以网页的方式显示,3D内容拟采用地块的方式显示,用户申请了3D内容服务器空间就是申请了地块,每个地块都有唯一的3DURL,就像每个网页都具有URL一样,每个地块上都可以承载一定的3D内容(3D模型为主),就像每个网页都可以容纳一定的2D内容一样。

由于用户申请网页空间后2D网页可以任意的多,而用户申请3D内容空间后只有少量的地块,怎样解决这个问题?在3D虚拟世界中,由于地块在平面上连续的延展的,一旦某用户申请的地块前后左右都被邻居挡住,理论上无法再连续扩大地盘,也就无法再承载更多的3D内容,为了解决这个扩展问题,可采用3D空间映射法,就是将其他的3D空间映射到该3D空间的某个点上,这些3D空间将无法在3D空间内连续表示,只能在4D空间中加以描述,可以称为4D空间映射。4D空间映射可以在有限地块上映射出无限的3D空间,3D内容的承载量仅取决于硬盘的容量,从而可以解决空间和容量矛盾的问题。

综上所述,HiPiHi目前正在走当年Netscape的路,当年的Netscape将互联网变成2D的,而HiPiHi将让互联网变成3D的,如果能够抓住时机,迅速解决技术问题,开发出实用性的产品,HiPiHi将重演Netscape当年的辉煌。
HiPiHi令3D互联网崛起所需要提供的内容有:

1.3D浏览器(客户端)
2.3D内容在互联网的标准(规范)
3.3D内容服务器空间提供
4.用户创造丰富的3D内容

互联网将从一页一页的模式发展成互为联通的3D空间,人们现在使用互联网像在翻书,以后更像在看电影或直接成为里面的演员,如果头戴式显示器进一步普及,效果将更加好,当你进入互联网的时候,将更加完整地进入这个虚拟的人类空间。

无锁队列

2009-05-31 12:16  分类: 技术   标签: . .

计算机的资源是有限的,如果不加限制,对资源的并发访问将产生一系列问题,因此在并行计算中广泛使用了锁(lock)。

锁的引入带来的问题是效率的降低,因此在高效系统中,应尽可能避免锁的使用,关于无锁队列的理论研究和实践已经进行了很多年,理论已经证明,单生产者-单消费者队列的锁可以去掉,从而形成一个并发无锁队列(lock free queue)

除了高效,无锁队列还能防止优先级倒置(priority inversion)。

有三个优先级不同的task,A,B,C;A的优先级最高,B次之,C最低。其中A和C有共享的临界区。如果C已进入临界区,那么A在进入临界区之前,就会被阻塞。task B有可能打断C而进入运行状态,这样C什么时候从临界区退出,就是一个未知的时间。A只有C从临界区退出后才能被调度,A被阻塞的时间也是未知的。这样,低优先级的B先于高优先级的A被调度,优先级发生了逆转。

解决这个问题有两种手段:
1:Priority inheritance(优先级继承),如果一个高优先级的task被阻塞,与它共享临界区的低优先级的task在进入临界区后,优先级就会继承高优先级 task的优先级,保证它不会被其他优先级次高的任务打断。从临界区退出后,C的优先级恢复正常。这种方法的缺点是动态改变线程的优先级耗费了大量时间。
2:A priority ceiling(最高优先级),给临界区分配最高优先级,如果一个task进入临界区,就把临界区的优先级赋给它,已保证它不会被打断。从临界区退出后,task的优先级恢复正常。这种方法的缺点是假如没有高优先级A的存在,B将被延迟执行。

这两种解决方案带来的代价都是效率的降低,在实际系统中,除了无锁队列,还应采用其他方案,尽量避免对锁的使用,否则可能出现与预期相反的结果,而问题相当难于查找。

关于优先级倒置,和著名的火星探路者软件故障联系在一起,因而名声大噪。

在发生问题之前,探路者被认为是没有缺陷的,直到着陆几天后,系统被整个重置了,接下来发生的一切,带给我们很多启示。

发生如此重大的问题,如何迅速查找问题根源并解决?探路者所使用的系统记录了所有需要关心的事件,航天局工程师们通宵达旦一遍又一遍的重复运行这些事件,当只剩下一个工程师没有回家休息时,终于重现了故障,原来是优先级倒置。这提示我们,详细记录系统的运行对我们改正错误很重要,黑盒跟踪错误几乎是不可能的。

事实上,在发射前的测试中,出现过1、2次系统重置的现象,但无法重现和解释,出于本能,他们拒绝认为这是软件问题,而把其归结为硬件问题。各类系统中,有很多问题都是这么遗漏的,不应忽略任何异常偶发事件,直到找到根源。

这次事件也向我们展示了理论的重要性,多年前有人研究了此类问题并给出了解决方案,使得问题能得以迅速查找并解决。

这次事件还提示,长期运行的系统,在效率和正确性之间,首先应关注的是正确性,效率应该是其次的。

发生了重置事件,探路者的工作受影响了吗?答案是几乎没有,这不得不感谢它的设计者,设计充分考虑了容错性,即使系统完全重置,重新启动后也能不受影响的在原来基础上继续工作。

刚才扯远了,回到无锁队列,实现无锁队列,需要考虑到原子操作和内存屏障(memory barrier)。原子操作我们就不谈了,重点说一下内存屏障。

单核系统不会存在内存屏障问题,对多核系统,为提高效率,允许乱序执行,这样应该先写入内存的数据未必先写入,逻辑上会出现错误,解决的方法是在写入前,强迫cpu串行化,这就是内存屏障技术。

在intel系列cpu中,因为使用了强排序技术,很难测试到cpu乱序执行问题,但并非不会发生,因此在程序中还是要考虑这个问题。测试内存屏障的最佳cpu是power pc。

关于无锁队列的最详细介绍和实现,请参照http://www.audiomulch.com/~rossb/code/lockfree/ ,优先级倒置和内存屏障,请在google中查找。

欢迎来到仙言魔语,你还没有 登录 Sign Up
RSS

about

小时候读过“西游记”、庄周梦蝶,后来又看过什么“黑客帝国”......冥冥之中,有种直觉,我们应该可以有另一个“我”,去开始另一种生活,变成 “仙鬼神魔”之类,法力无边、“上九天揽月,下五洋捉鳖”......也许,这就是所谓我们HiPiHi梦想的起源。……

more