并发编程(1) 之 基本背景

1.人们的期望
   对于单处理器环境下,人们希望自己的程序能够并行的执行,即可以并行的执行程序中的多个部分;而对于多处理器的环境下,则希望可以同时进行执行;
 
2.并发“具有可论证的确定性,但实际上具有不确定性”
  我们可以通过仔细分析和代码审查编写出能够正确工作的并发程序,但在实际情况中,可能出现并发程序在给定,适当条件的时候,运行失败;这种情况可能是我们 在测试的工作中没有碰上的,且我们在测试的过程中无法预定的测试场景;且产生故障情况是偶尔发生的,但我们却不能不给予关注,如果不给予关注,则将可能会 被它带来巨大影响;

3.并发的相关问题
  如何让程序更快的运行:如果想要一个程序运行的更快,那么可以将其断开为几个独立的片段,则在单独的处理器上运行每个片段;前提是存在多个处理器;所以如果将程序运行的更快,必须学会如何利用额外的处理器;
 
  如果有一台多处理器的机器,那么可以在这些处理器之间分布多个任务,从而大大提高吞吐量;比如对于web服务器,可以将每个请求转发不同服务器上进行响应;

  并发通常是提高运行在单处理器上的程序运行的性能?
  1)单处理器上运行并发程序的开销确实比程序的所有部分顺序执行的开销大;因为对于并发程序因为设计到多个任务的切换,即一个任务转到另一个任务的时候,存在所谓上下文切换的代价,所以顺序执行比并发执行的消耗更小一些;
  
   为什么要使用并发编程?
  1)如果在单处理器上执行全部程序,则如果某一个时间点,某一个任务在执行的过程中出现因为外部条件(I/O问题)导致该任务无法执行,那么我们就做这个任务或线程阻塞了,则程序将无法运行下来,整个程序都停止下来,直到外部条件发生变化;
     如果我们在单处理器上使用并发编程,则我们可以在该时间点运行另一段程序,这样就可以保证程序看起来并没有停止运行;
    很重要的一点,如果没有现成阻塞,则就没有必要在单处理器上使用并发的必要性了;

  一个很经典的例子
    在单处理器上程序为整体运行的前提下,在用户界面,如果后台程序执行时间很长,前台客户的输入可能无法被响应;应为当前只有一个线程在运行后台程序;我们 也不可能在任何一段代码都加入监停用户输入动作的代码,所以我们可以使用一个单独的线程来响应用户的输入,这样就可以保持程序一定程度的响应性;这样就好 象CPU同时存在于两处,一处处理后台程序,一处处理用户响应程序,造成多CPU的一种错觉;

4.什么是进程?
   进程是运行在它自己的地址空间内的自包容的程序;
  
5.在操作系统上使用进程实现并发?
   多任务处理器可以通过周期性的将cpu从一个进程切换到另一个进程,来实现同时运行多个进程(程序);因为进程都是在自己独立的内存里,所以进程间是相互隔离的,不会产生彼此影响;且进程间不存在彼此通讯的需要,因为他们都是完全独立的!

6.什么叫函数性语言?
   即其中每个函数调用都不会产生任何副作用,并因此可以当作独立的任务来进行驱动;

7.什么是线程?
   线程是指程序的一个指令执行序列,WIN32 平台支持多线程程序,允许程序中存在多个线程。 在单 CPU 系统中,系统把 CPU 的时间片按照调度算法分配给各个线程,因此各线程实际上是分时执行的,在多 CPU 的 Windows NT 系统中, 同一个程序的不同线程可以被分配到不同的 CPU 上去执行。由于一个程序的各线程是在相同的地址空间运行的,因此设及到了如何共享内存, 如何通信等问题,这样便需要处理各线程之间的同步问题,这是多线程编程中的一个难点;

8.为什么java要提供线程的支持?
   大家都知道的,java的一个最大的特点就是编写一次,到任何一处操作系统都能运行,如果该操作系统上存在jvm;但对于Macintosh操作系统,它 有一个特点就是,它不支持多任务,否则任何并发的java程序都无法移植到该系统上,所以java采取了由执行程序的单一进程中再创建任务,即以多个线程 的形式进行程序执行,从而提高程序的运行效率;

9.协作式多线程
对于涉及较大任务量的程序,且线程数量的限制一定的情况下,如何实现任务都能进行必要的处理呢?解决这个问题的典型方式就是协作式多线程;java的线程 机制是抢占式的,这表示调度机会周期性的中断某个线程,将上下文切换到另一个线程,从而为每个线程都提供时间片,使得每个线程都会分配到数量合理的时间去 驱动它的任务;且在协作式系统中,每个任务都会自动的放弃控制,这要求程序员要意识到再每个任务中插入某种类型的让步语句;

10.使用多线程实现并发编程的效果
    并发编程可以使我们将程序划分为多个分离的,独立运行的任务;使用多线程机制,这些独立的任务将由单独的执行线程来驱动;一个线程就是在进程中有一个单一 的顺序控制流;它不受其他任务的影响,因此单个进程就可以拥有多个并发执行的任务,使我们的程序中每个任务感觉都有自己的cpu;

11.多任务和多线程往往是使用多处理器系统的最合理方式

12.任务
   我们前面不是已经说了么,一个程序可以分割为多个任务;且这些任务具有独立运行的特性;在java中描述任务的方式是,它必须继承Runnable接口;

posted @ 2013-10-16 14:44  chasewade  阅读(364)  评论(0编辑  收藏  举报