Java并发编程:进程和线程之由来

Java多线程基础:进程和线程之由来html

  在前面,已经介绍了Java的基础知识,如今咱们来讨论一点稍微难一点的问题:Java并发编程。固然,Java并发编程涉及到不少方面的内容,不是一朝一夕就可以融会贯通使用的,须要在实践中不断积累。因为并发确定涉及到多线程,所以在进入并发编程主题以前,咱们先来了解一下进程和线程的由来,这对后面对并发编程的理解将会有很大的帮助。编程

  下面是本文的目录大纲:安全

  一.操做系统中为何会出现进程?服务器

  二.为何会出现线程?多线程

  三.多线程并发并发

  如有不正之处,请多多谅解并欢迎指正。性能

  请尊重做者劳动成果,转载请标明原文地址:spa

  http://www.cnblogs.com/dolphin0520/p/3910667.html操作系统

一.操做系统中为何会出现进程?

  提及进程的由来,咱们须要从操做系统的发展历史谈起。线程

  也许在今天,咱们没法想象在不少年之前计算机是什么样子。咱们如今能够用计算机来作不少事情:办公、娱乐、上网,可是在计算机刚出现的时候,是为了解决数学计算的问题,由于不少大量的计算经过人力去完成是很耗时间和人力成本的。在最初的时候,计算机只能接受一些特定的指令,用户输入一个指令,计算机就作一个操做。当用户在思考或者输入数据时,计算机就在等待。显然这样效率和很低下,由于不少时候,计算机处于等待用户输入的状态。

  那么能不能把一系列须要操做的指令预先写下来,造成一个清单,而后一次性交给计算机,计算机不断地去读取指令来进行相应的操做?就这样,批处理操做系统诞生了。用户能够将须要执行的多个程序写在磁带上,而后交由计算机去读取并逐个地执行这些程序,并将输出结果写到另外一个磁带上。

  虽然批处理操做系统的诞生极大地提升了任务处理的便捷性,可是仍然存在一个很大的问题:

  假若有两个任务A和B,任务A在执行到一半的过程当中,须要读取大量的数据输入(I/O操做),而此时CPU只能静静地等待任务A读取完数据才能继续执行,这样就白白浪费了CPU资源。人们因而想,可否在任务A读取数据的过程当中,让任务B去执行,当任务A读取完数据以后,让任务B暂停,而后让任务A继续执行?

  可是这样就有一个问题,原来每次都是一个程序在计算机里面运行,也就说内存中始终只有一个程序的运行数据。而若是想要任务A执行I/O操做的时候,让任务B去执行,必然内存中要装入多个程序,那么如何处理呢?多个程序使用的数据如何进行辨别呢?而且当一个程序运行暂停后,后面如何恢复到它以前执行的状态呢?

  这个时候人们就发明了进程,用进程来对应一个程序,每一个进程对应必定的内存地址空间,而且只能使用它本身的内存空间,各个进程间互不干扰。而且进程保存了程序每一个时刻的运行状态,这样就为进程切换提供了可能。当进程暂时时,它会保存当前进程的状态(好比进程标识、进程的使用的资源等),在下一次从新切换回来时,便根据以前保存的状态进行恢复,而后继续执行。

  这就是并发,可以让操做系统从宏观上看起来同一个时间段有多个任务在执行。换句话说,进程让操做系统的并发成为了可能。

  注意,虽然并发从宏观上看有多个任务在执行,可是事实上,任一个具体的时刻,只有一个任务在占用CPU资源(固然是对于单核CPU来讲的)。

二.为何会出现线程?

  在出现了进程以后,操做系统的性能获得了大大的提高。虽然进程的出现解决了操做系统的并发问题,可是人们仍然不知足,人们逐渐对实时性有了要求。由于一个进程在一个时间段内只能作一件事情,若是一个进程有多个子任务,只能逐个地去执行这些子任务。好比对于一个监控系统来讲,它不只要把图像数据显示在画面上,还要与服务端进行通讯获取图像数据,还要处理人们的交互操做。若是某一个时刻该系统正在与服务器通讯获取图像数据,而用户又在监控系统上点击了某个按钮,那么该系统就要等待获取完图像数据以后才能处理用户的操做,若是获取图像数据须要耗费10s,那么用户就只有一直在等待。显然,对于这样的系统,人们是没法知足的。

  那么可不能够将这些子任务分开执行呢?即在系统获取图像数据的同时,若是用户点击了某个按钮,则会暂停获取图像数据,而先去响应用户的操做(由于用户的操做每每执行时间很短),在处理完用户操做以后,再继续获取图像数据。人们就发明了线程,让一个线程去执行一个子任务,这样一个进程就包括了多个线程,每一个线程负责一个独立的子任务,这样在用户点击按钮的时候,就能够暂停获取图像数据的线程,让UI线程响应用户的操做,响应完以后再切换回来,让获取图像的线程获得CPU资源。从而让用户感受系统是同时在作多件事情的,知足了用户对实时性的要求。

  换句话说,进程让操做系统的并发性成为可能,而线程让进程的内部并发成为可能。

  可是要注意,一个进程虽然包括多个线程,可是这些线程是共同享有进程占有的资源和地址空间的。进程是操做系统进行资源分配的基本单位,而线程是操做系统进行调度的基本单位。

三.多线程并发

  因为多个线程是共同占有所属进程的资源和地址空间的,那么就会存在一个问题:

  若是多个线程要同时访问某个资源,怎么处理?

  这个问题就是后序文章中要重点讲述的同步问题。

  那么可能有朋友会问,如今不少时候都采用多线程编程,那么是否是多线程的性能必定就因为单线程呢?

  不必定,要看具体的任务以及计算机的配置。好比说:

  对于单核CPU,若是是CPU密集型任务,如解压文件,多线程的性能反而不如单线程性能,由于解压文件须要一直占用CPU资源,若是采用多线程,线程切换致使的开销反而会让性能降低。

  可是对于好比交互类型的任务,确定是须要使用多线程的、

  而对于多核CPU,对于解压文件来讲,多线程确定优于单线程,由于多个线程可以更加充分利用每一个核的资源。

  虽然多线程可以提高程序性能,可是相对于单线程来讲,它的编程要复杂地多,要考虑线程安全问题。所以,在实际编程过程当中,要根据实际状况具体选择。

  关于进程和线程的由来,暂时就讲这么多了,感兴趣的朋友能够参考相关资料。

相关文章
相关标签/搜索