开始线程(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. intellij idea 自动生成setter getter

    windows下: alt + insert,然后选择要生成的成员. mac下: command + N

  2. 启动/关闭Spring boot服务脚本

    启动Spring boot服务脚本 #!/bin/bash cd /test java -jar test.jar &> ./test.log & echo "成功&q ...

  3. spring bean实例化的三种方式

    一.使用类的无参构造创建 配置文件 java代码 注意若类里面没有无参的构造,则会出现异常 二.使用静态工厂创建 配置文件 java代码 Factory类 测试类 结果 三.使用实例工厂 配置文件 1 ...

  4. bug-3——onload,onbeforeunload,Onunload的区别

    window.onload事件设置页面加载时执行的动作,即进入页面的时候执行的动作.   window.onunload已经从服务器上读到了需要加载的新的页面,在即将替换掉当前页面时调用 一般用于设置 ...

  5. Apache Shiro 使用手册(五)Shiro 配置说明(转发:http://kdboy.iteye.com/blog/1169637)

    Apache Shiro的配置主要分为四部分: 对象和属性的定义与配置 URL的过滤器配置 静态用户配置 静态角色配置 其中,由于用户.角色一般由后台进行操作的动态数据,因此Shiro配置一般仅包含前 ...

  6. 【TFS】解决TFS编译中文乱码问题

    前言; TFS2018做程序集成非常方便,线上编译然后直接生成docker镜像,但是在使用过程中遇到编译窗口中文乱码的问题,这个问题找了好久没人知道怎么解决.如下: 这个问题不解决,每次编译失败,研发 ...

  7. PHP操作MySQL事务处理

    PHP操作MySQL事务处理 /*************** 用begin,rollback,commit来实现 ***************/ /*方法二*/ $conn = mysqli_co ...

  8. 侠客群控引擎二次开发SDK可用方法大全(持续更新)

    如这篇文章所示 http://www.xiake.net/blog/archives/1 侠客的插件SDK能提供很强大的功能(所有官方使用的方法都有提供) 这篇文章是详细介绍所有SDK可调用的方法 首 ...

  9. Spring Cloud之网关

    接口的分类: 开放接口:可以授权一些接口口OAuth2.0协议方式  第三方联合登录 内部接口:  一般只能在局域网中进行访问,服务与服务之间关系都在同一个微服务系统中.目的是为了保证安全问题 接口设 ...

  10. 算法(Algorithms)第4版 练习 1.3.7

    package com.qiusongde; import java.util.Iterator; import java.util.NoSuchElementException; import ed ...