开始线程(Thread)之旅,作为程序员,打交道更多的是线程,各种多线程程序,并行编程都是以线程为基础进行的。本文主要内容:

  1. What and Why Thread
  2. 进程和线程的对比

一、What and Why Thread

1.1 What

线程是进程内部的执行单元,进程作为运行程序的实例用于把资源整个在一起,线程属于进程,线程作为在CPU上执行的实体而存在,CPU上运行的是线程,之前的文章说一个CPU在同一时间只能运行一个进程,这是个比较general的说法,准确的说法应该是一个CPU在同一时间只能运行一个进程的一个线程。

每一个进程拥有自己的独立地址空间,但是一个进程内的所有线程都共享所属进程的地址空间(当然包含数据)。

1.2 Why

先引入一个例子,一个Word进程,拥有三个线程(实际好像有30几个)。其中一个负责接受键盘的输入,一个负责自动保存,一个负责调整格式(比如删除一大段文字后Word的格式要马上调整过来)。

这个三个线程因为属于同一个Word进程,共享所有资源,即同一个Word文档,因为CPU真正运行的是线程,这三个线程可以实现并行,对于用户来说,对于Word操作的这三个操作好像也是同时进行的。从系统使用者的角度来说,针对同一个资源(进程)的操作也变成了并行(在单核状态下实际是伪并行,假象)。

因为有多个线程存在,在Word处理的时候,虽然系统一直在自动调整格式,在自动保存,但是用户的输入却从来感觉不到delay。

  1. 多核情况下,多个线程各自有CPU,绝对不会Delay
  2. 单核或者核数小羽线程数时,CPU会不停调度,给各个线程间隔分配资源,用户也不会感觉到明显的delay。

上面的这个例子是无法用进程实现的,假设将上面的三个线程换成三个进程,每个进程只有一个线程去做相应的事情,会出现什么情况呢?

  1. 三个进程会是三个Word文档
  2. 第一进程的线程执行Auto-Save,无法体现到用户真正编辑的文档上
  3. 第二个进程的线程执行Format也无法体现在当前用户编辑的文档上,

上面Word的例子也可以用在Excel中,比如Excel中的有些表格的值是用户输入的,另外一些表格的值是通过输入自动计算的,这里有两个线程即可,一个用于接受处理用户的输入,另外一个用于自动计算。

线程相比进程更加的轻量级,创建和销毁的开销会比进程小很多。在很多系统中创建一个线程要比创建一个进程快10-100倍。

二、线程和进程对比

先上一张图。T1、T2是隶属于进程Process1的线程;T3、T4是隶属于进程Process2的线程。

进程是在更加高一层的抽象,代表运行的程序,从用户的角度来说是一个看得见的应用,比如一个Word,一个Excel,一个等待输入的光标。进程在整个系统层面共享磁盘,文件,内存等等各种系统资源,进程之间的并行是用户最能感知的并行,用户会说我的电脑同时运行着两个Word,还要一个Excel。

最终的执行还是会落地到线程,线程隶属进程,是真正的执行单元,一个进程内部的线程共享当前进程地址空间和资源,当然每一个线程还是会有个性化的数据(会专门写文章介绍)。用户感知到的两个进程的并行(比如两个Word文档同时运行)其实最终还是两个Word文档内部线程之间的并行。

Operating System-Thread(1)What and Why Thread &&进程和线程的对比的更多相关文章

  1. 如何定位“Operating system error 32(failed to retrieve text for this error. Reason: 15105)”错误中被占用的文件

      之前在这篇"Operating system error 32(failed to retrieve text for this error. Reason: 15105)"博 ...

  2. InnoDB: Operating system error number 87 in a file operation. 错误87的解决方法

    InnoDB: Operating system error number 87 in a file operation. 错误87的解决方法 140628  8:10:48 [Note] Plugi ...

  3. Modern Operating System

    No one can do all things, learn to be good at use what others already did. Most computers have two m ...

  4. Java 使用线程方式Thread和Runnable,以及Thread与Runnable的区别

    一. java中实现线程的方式有Thread和Runnable Thread: public class Thread1 extends Thread{ @Override public void r ...

  5. The web application [] appears to have started a thread named [Abandoned connection cleanup thread] com.mysql.jdbc.AbandonedConnectionCleanupThread

    01-Jul-2016 14:25:30.937 WARNING [localhost-startStop-1] org.apache.catalina.loader.WebappClassLoade ...

  6. Thread message loop for a thread with a hidden window? Make AllocateHwnd safe

    Thread message loop for a thread with a hidden window? I have a Delphi 6 application that has a thre ...

  7. 严重: The web application [] appears to have started a thread named [Abandoned connection cleanup thread] but has failed to stop it.

    今日在重新部署项目时出现此问题,虽然对项目无影响,但问题就是问题.完整信息如下(使用idea工具): 十二月 05, 2015 11:44:27 上午 org.apache.catalina.star ...

  8. Java 线程第三版 第一章Thread导论、 第二章Thread的创建与管理读书笔记

    第一章 Thread导论 为何要用Thread ? 非堵塞I/O      I/O多路技术      轮询(polling)      信号 警告(Alarm)和定时器(Timer) 独立的任务(Ta ...

  9. Java 螺纹第三版 第一章Thread介绍、 第二章Thread创建和管理学习笔记

    第一章 Thread导论 为何要用Thread ? 非堵塞I/O      I/O多路技术      轮询(polling)      信号 警告(Alarm)和定时器(Timer) 独立的任务(Ta ...

随机推荐

  1. java jdk和android sdk的安装以及环境变量的配置

    安卓环境变量设置 (烦)http://wenku.baidu.com/link?url=QRwpFhP8d0yJorhcvuZPrz3lNFQW-uwYg6TlZtv6uen6_SVsvRrzf0UJ ...

  2. ORACLE client 11g r2 客户端开发环境配置

    一.安装ORACLE客户端,这里不做说明.需要注意的是,客户端解压位置应该在磁盘根目录下. 如果放在带中文字或者空格的文件名的路径下出了问题,可以放到磁盘根目录在安装.应该就会没有问题. 另外,一般安 ...

  3. iOS绘图CGContextRef详解

    转自:http://blog.csdn.net/u014286994/article/details/51333118 /* CoreGraphics - CGContext.h */ /** Gra ...

  4. Visual studio 创建文件时自动添加备注

    Visual studio 创建文件时自动添加备注 描述 要求每回添加一个类,普通类或单元测试类文件头自动添加备注, 比如:Copyright, FileName, Author and so on. ...

  5. require.js vs browserify

    require.js vs browserify require.js是模块加载器:browserify是预编译工具 require.js遵循的是AMD规范:browserify遵循的是CommonJ ...

  6. 两个Java项目之间相互调用

    转自:http://dysfzhoulong.iteye.com/blog/1008747 一个项目A另一个项目B:(项目A和项目B都是Java写的项目) 在A项目中怎么调用B项目中的类和方法 有两种 ...

  7. Python: generator, yield, yield from 详解

    1.Generator Expressions 生成器表达式是用小括号表示的简单生成器标记法: generator_expression ::= "(" expression co ...

  8. python基础16 ----面向对象程序设计二

    一.继承与派生 1.继承的定义:继承是一种创建新类的方式,即在类中提取共同的部分创建出一个类,这样的类称为父类,也可称为基类和超类,新建的类称为派生类或子类. 2.单继承:就相当于子类继承了一个父类. ...

  9. 分布式数据库对比评测(Es,mongodb,redis)基础知识篇

    前言 我建议大家看下这个,否则后面你不知道我在说什么. 1.ES数据库相关概念 啥是Es,说白了就是支持文档搜索的分布式数据库,专门方便搜索的,GITHUB京东现在都在用. 1.ES的数据库存放在哪里 ...

  10. 每天一个Linux命令(19)find命令_初识

    Linux下find命令在目录结构中搜索文件,并执行指定的操作.     (1)用法: 用法: find pathname    -option      [-print | -exec | -ok] ...