Sharpmark's Personal Home Page

并发编程 – 并行与分布式

如果两个事件在同一时间间隔内发生就称这两个事件是并发的,两个或多个任务在同一时间间隔内执行叫做并发执行。对我们而言,并发并不一定就表示在同一精确时刻执行,例如,两个任务可能在同一秒发生,但是每个任务在该秒的不同时间片内执行。

并发技术是的计算机程序能够在同一时间间隔或同一时限内做更多的工作,……。某些情况下,在同一时间间隔做更多的工作并不是目的所在,简化程序解决方案才是真正目的。有时把问题的解决方案看作一组并发执行的任务更合理。

并行(Parallel)分布式(Distributed)编程是达到软件并发的两种基本途径,它们是两种不同的、有时又相互交叉的编程范例。并行编程技术将程序必须处理的作业分配给一个物理或虚拟计算机内的两个或多个处理器,分布式编程技术将程序必须处理的作业分配各两个或多个处理器,这些处理器可以也可以不在同一个计算机中,也就是说分布式程序的各部分通常在不同的由网络连接的计算机上运行,或者至少在不同的处理器上运行。包含并行性的程序在同一个物理或虚拟计算机上执行,程序内的并行性可分成进程或线程。分布式程序仅能分成线程,多线程仅限于并行性。

在技术上,并行程序有时候是分布式的,例如PVM(Parallel Virtual Machine) 编程;分布式编程有时用于实现并行性,例如MPI(Message Passing Interface)编程。但是并非所有的分布式程序都包括并行性,分布式程序的各部分可以在不同时间间隔内的不同时刻执行。

软件级的并发可以分为:指令级、例程(函数/程序)级、对象级、应用程序级。

——摘自《C++并行与分布式编程》 Parallel and Distributed Programming Using C++

并行计算和分布式计算是两个容易混淆的概念,希望上面的解释可以帮助同样迷惑的你理解他们的关系。

Java Enterprise Edition(J2EE)概述

十月份开始看J2EE的东西。很崩溃,突然涌出来那么多名词。一个个理解它们的意思,作用和使用方法……。很吐,为了能让后来人不被这些名词所迷惑,这里写个扫盲贴,新入门的人可以根据下面的介绍,合理的选择自己需要学习的东西。随着我对他们认识的逐步加深,这篇还可能不断更新。欢迎随时关注。下面的内容都是自己写的,但自己也是初学,所以有什么不对的地方,欢迎指正。

Java

先说Java. 目前广泛使用的是Java 1.5。Java分为Java Platform, Enterprise Edition(Java EE), Java Standard Edtion(Java SE), Java Micro Edition(Java ME)。分别运用于企业开发,标准开发以及移动设备(嵌入式)开发。在Java是1.2版本的时候,SUN认为Java改动很大,所以称之为Java2。后来大家习惯了这种称呼方法,就有了所谓的J2EE, J2SE, J2ME,他们跟Java EE/SE/ME是完全等价的。不过在2006年,SUN放弃了J2xE的称呼,统一为Java XX Edition。这里侧重说一些关于Java EE的名词。

JDK/JRE

JDK:Java Development Kit。语源是SDK。是Java得开发包,面向使用Java开发的人员。JRE是Java Runtime Enviroment,面向的是使用Java相关软件或者服务的用户。

JSP/Servlet

Servlet是Java EE的核心。它是一个响应网络请求,并做出答复的组件。可以处理各种网络请求,并返回结果。绝大多数时候,servlet响应的是http请求,返回的是一个html页面。Servlet处理请求得功能很完善,不过对于返回的Html各式并没有天生的良好支持。所以就有了JSP(Java Server Page),它是将类似Java语法的代码嵌入html页面中,生成动态的html。JSP实质上,在最后都会编译成servlet。所以,JSP只是一种简化html开发的技术。

Struts/Webwork

基于Java EE的框架。所谓框架, 可以理解成是对底层进行了封装,并提供专有功能的程序库。Struts是Java EE的老牌开源框架。struts, webwork都是侧重于表示层方面的框架,都是基于MVC模型。Struts 1.2比较成熟,多数使用struts的都是基于此版本。所谓的struts 2.0是struts的开发者发现struts本身的固有模型有问题,所以完全放弃,跟另一个表示层框架webwork合并,使用Webwork2作为底层的新框架,跟struts 1.2完全不同。

阅读全文 »

《计算机程序的结构和解析》精彩摘录 2

心智的活动,出了尽力产生各种简单的认识之外,主要表现在:

  • 将若干简单认识组合为一个符合认识,由此产生出各种复杂的认识。
  • 将两个人是放在一起对照,不管他们如何简单或复杂,由此得到有关它们 的相互关系的认识。
  • 将有关认识与那些在实际中和他们同在的所有其他认识隔离开,这就是抽象。所有具有普通性的认识都是这样的道德。

计算过程是存在于计算机里的一类抽象事物,在其演化过程中,这些过程会去操作一些被称为数据的抽象事物。人们创建出一些称为程序的规则模式,以指导这类过程的进行。

一个强有力的程序设计语言,不仅是一种指挥计算机执行任务的方式,它还应该成为一种框架,使我们能够在其中组织自己有关计算过程的思想。

函数与过程之间的矛盾,不过是在描述一件事件的特征,与描述如何去做这件事情之间的普遍性差异的一个具体反映,人们有时也称它为说明性的知识与行动性的知识之间的差异。在数学里,人们通常关心的是说明性描述(是什么);而在计算机科学里,人们通常关心行动性的描述(怎么做)。

能够看清所考虑的动作的后果的能力,对成为程序设计专家至关重要。对结果的了解,才能反推出所需的过程。我们需要对计算过程中各种动作的进行情况作出规划,用一个程序去控制这一过程的进展。要学会去看清各种不同种类的过程会产生什么样的计算过程,只要在掌握了这种技能之后,我们才能学会如何去构造出可靠的程序,使之能够表现出所需要的行为。

WWWDOT – GOOGLE = DOTCOM 解法

今天无意在网上看到了Google实验室能力倾向测试
虽然已经过时了,不过还是很有趣,用了几分钟把第一题作出来了。在这里跟大家分享一下解题过程。原题目如下:

Solve this cryptic equation, realizing of
course that values for M and E could be
interchanged. No leading zeros are allowed.
WWWDOT – GOOGLE = DOTCOM

我的解法如下:

阅读全文 »

《计算机程序的结构和解析》精彩摘录 1

I think that it’s extraordinarily important that we in computer science keep fun in computing. When it started out, it was an awful lot of fun. Of course, the paying customers got shafted every now and then, and after a while we began to take their complaints seriously. We began to feel as if we really were responsible for the successful, error-free perfect use of these machines. I don’t think we are. I think we’re responsible for stretching them, setting them off in new directions, and keeping fun in the house. I hope the field of computer science never loses its sense of fun. Above all, I hope we don’t become missionaries. Don’t feel as if you’re Bible salesmen. The world has too many of those already. What you know about computing other people will learn. Don’t feel as if the key to successful computing is only in your hands. What’s in your hands, I think and hope, is intelligence: the ability to see the machine as more than when you were first led up to it, that you can make it more.

——Alan J. Perlis (April 1, 1922-February 7, 1990)

译文:我认为,在计算机科学中保持计算中的趣味性是特别重要的事情。这一学科在起步时饱含着趣味性。当然,那些付钱的客户们时常觉得受了骗。一段时间之后,我们开始严肃地看待他们的抱怨。我们开始感觉到,自己真得像是要负起成功地、无差错地、完美地使用这些机器的责任。我不认为我们可以做到这些。我认为我们的责任是去拓展这一领域,将其发展到新的方向,并在自己的家里保持趣味性。我希望计算机科学的领域绝不要丧失其趣味意识。最重要的是,我希望我们不要成为传道士,不要认为你是兜售圣经的人,世界上这种人已经太多了。你所知道的有关计算的东西,其他人也都能学到。绝不要认为似乎成功计算的钥匙就掌握在你的手里。你所掌握的,也是我认为并希望的,也就是智慧:那种看到这一机器比你第一次站在它面前时能做得更多的能力,这样你才能将它向前推进。