一、线程与进程的区别

先简单说说线程与进程的概念:

(1)进程是指一个内存中运行的应用程序,比如在Windows系统中,一个运行的exe就是一个进程。

(2)线程是指进程中的一个执行流程。

区别:

一个程序至少有一个进程,而一个进程至少有一个线程。一个应用程序可以同时启动多个进程。例如对于IE浏览器程序,每打开一个IE浏览器窗口,就启动了一个新的进程。而线程则是指进程中的一个执行流程,一个进程可以有多个线程,每个线程分别执行不同的任务,当进程内的多个线程同时运行时,这种运行方式就被称为并发运行。

另外,线程与进程还有一个非常重要的区别:每个进程在执行过程中都拥有独立的内存单元,而同一个进程中的多个线程则共享内存,从而极大地提高了程序的运行效率。

二、对多线程并发的理解

多线程并发只是表面和感觉上的并发,并不是实质上的并发。一个线程要运行,它必须占有CPU,而我们目前用的计算机大多都是单CPU的,所以一次最多只能有一个线程获取CPU并运行。

多线程的实质是“最大限度地利用CPU资源”,当某一个线程的处理不需要占用CPU而只需要和I/O等资源打交道时,让其他线程有机会获得CPU资源。这有点类似于“统筹方法”,例如让你打扫房子和烧水,要在最短的时间内做好这两件事,你一定会想到先把水烧上,然后在等水烧开的空闲时间中去打扫房子,而不是先打扫好了再去烧水,也不是先烧好了再去打扫,这个例子里面,你是那个唯一的CPU,而烧水和打扫就是两个线程。

虽然CPU只有一个,但是它在多个线程之间频繁切换,当切换的频率高到一定程度时,我们就感觉所有的线程在同时运行,于是感觉这多个线程是并发的。因此,并发并不是真的指多个线程同时运行,它仅仅只是形容一种现象。就好像说有些人是“铁人”一样,仅仅只是用于形容某个人不怕苦不怕累,像个“铁人”。

1. 并发:在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行。其中两种并发关系分别是同步和互斥

2. 互斥:进程间相互排斥的使用临界资源的现象,就叫互斥。

3. 同步:进程之间的关系不是相互排斥临界资源的关系,而是相互依赖的关系。进一步的说明:就是前一个进程的输出作为后一个进程的输入,当第一个进程没有输出时第二个进程必须等待。具有同步关系的一组并发进程相互发送的信息称为消息或事件。

其中并发又有伪并发和真并发,伪并发是指单核处理器的并发,真并发是指多核处理器的并发。

4. 并行:在单处理器中多道程序设计系统中,进程被交替执行,表现出一种并发的外部特种;在多处理器系统中,进程不仅可以交替执行,而且可以重叠执行。在多处理器上的程序才可实现并行处理。从而可知,并行是针对多处理器而言的。并行是同时发生的多个并发事件,具有并发的含义,但并发不一定并行,也亦是说并发事件之间不一定要同一时刻发生。

5. 多线程:多线程是程序设计的逻辑层概念,它是进程中并发运行的一段代码。多线程可以实现线程间的切换执行。

6. 异步:异步和同步是相对的,同步就是顺序执行,执行完一个再执行下一个,需要等待、协调运行。异步就是彼此独立,在等待某事件的过程中继续做自己的事,不需要等待这一事件完成后再工作。线程就是实现异步的一个方式。异步是让调用方法的主线程不需要同步等待另一线程的完成,从而可以让主线程干其它的事情。

异步和多线程并不是一个同等关系,异步是最终目的,多线程只是我们实现异步的一种手段。异步是当一个调用请求发送给被调用者,而调用者不用等待其结果的返回而可以做其它的事情。实现异步可以采用多线程技术或则交给另外的进程来处理。

为了对以上概念的更好理解举一个简单例子, 假设我要做 烧开水,举杠铃100下, 洗衣服 3件事情。

烧开水 这件事情, 我要做的事情为, 准备烧开水 1分钟, 等开水烧开 8 分钟 , 关掉烧水机 1分钟

举杠铃100下 我要做的事情为, 举杠铃100下 10分钟

洗衣服 我要做的事情为, 准备洗衣服 1分钟, 等开水烧开 5 分钟 , 关掉洗衣机 1分钟

单核情况下

同步的完成,我需要做的时间为 1+ 8 +1 + 10 + 1+ 5 +1 = 27 分

如果异步,就是在等的时候,我可以切换去做别的事情

准备烧开水(1) + 准备洗衣服(1) + 举50下杠铃 (5)分钟+ 关洗衣机 1分钟 + 举杠铃20下 (2)分钟+ 关烧水机 1分钟 + 举30下杠铃(3)分钟

1+1+5+1+2+1+3 =14 分钟

双核 异步 并行

核1 准备烧开水 1分钟+ 举杠铃50下(5)分钟+ 等待3分钟 + 关掉烧水机 1分钟

核2 准备洗衣服 1分钟+ 举杠铃50下(5)分钟+ 关掉洗衣机 1分钟 + 等待3分钟

其实只花了 1+5+3+1 = 10分钟

其中还有双核都等待了3分钟

双核 异步 非并行

核1 举杠铃100下(10)分钟

核2 准备烧开水 1分钟+ 准备洗衣服 1分钟+ 等待5 分钟+ + 关掉烧水机 1分钟 + 等待 1 分钟 + 关掉洗衣机 1分钟

其实只花了 1+5+3+1 = 10分钟

多线程的做法

单核下

线程1 准备烧开水 1分钟, 等开水烧开 8 分钟 , 关掉烧水机 1分钟

线程2 举杠铃100下 10分钟

线程3 准备洗衣服 1分钟, 等开水烧开 5 分钟 , 关掉洗衣机 1分钟

cpu 可能这么切换 最理想的切换方式

线程1 准备烧开水1 sleep 1 sleep 5 sleep 1 sleep 2 关开水 1分钟 exit

线程2 sleep 1 sleep 1 举杠铃50 5分钟 sleep 1 举杠铃20 2分钟 sleep1 举杠铃30下 3分钟

线程3 sleep 1 准备洗衣服1 分钟 sleep 5 关洗衣机1分钟 exit

最后使用了 14分钟 和异步是一样的。

但是实际上是不一样的,因为线程不会按照我们设想的去跑, 如果线程2 举杠铃先跑,整个流程的速度就下来了。

异步和同步的区别, 在io等待的时候,同步不会切走,浪费了时间。

如果都是独占cpu 的业务, 比如举杠铃的业务, 在单核情况下 多线和单线 没有区别。

多线程的好处,比较容易的实现了 异步切换的思想, 因为异步的程序很难写的。多线程本身程还是以同步完成,但是应该说

比效率是比不上异步的。 而且多线很容易写, 相对效率也高。

多核的好处,就是可以同时做事情, 这个和单核完全不一样的。

对线程与进程的区别以及对多线程并发的理解相关推荐

  1. 什么是线程线程和进程的区别

    什么是线程线程和进程的区别 线程是进程的一个实体,是cpu调度和分派的基本单位,比进程小可以独立运行的基本单位 一个进程包含多个线程具有独立功能的程序是操作系统进行资源分配和调度的一个独立单位

  2. 探究线程与进程的区别这一问题

    进程和线程基础(理论概念) 1. 定义 看了下面的定义,可能会有点晕,但我还是要把他写下来(为了严谨). 进程是资源(CPU.内存等)分配的基本单位,具有一定独立功能的程序关于某个数据集合上的一次运行 ...

  3. Linux中线程和进程的区别

    Linux中线程和进程的区别 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,它是系统进行资源分配和调度的一个独立单位.例如,用户运行自己的程序,系统就创建一个进程,并为它分配资源,包括 ...

  4. C#中线程和进程的区别

    线程和进程的区别 进程是程序和调度的独立单元 线程是CPU调度的基本单元 一个进程包含一个或多个线程 线程是轻量级的进程

  5. 线程和进程的区别(面试必备)

    参考文章: https://www.jianshu.com/p/2dc01727be45 线程与进程的区别通俗的解释: https://www.jianshu.com/p/8ad441510860 附 ...

  6. call线程起名字_高级分享:Java多线程你真的理解透彻了吗?带你玩转一次多线程!...

    不知道怎么引入正文 相信后端同学在开发的时候多多少少都会涉及到多线程开发,作为Java开发的我也同样会经常用到多线程开发. 我认为Java语言在处理多线程上是非常优秀的,我们可以使用简明的代码实现线程 ...

  7. 为什么校招面试中总被问“线程与进程的区别”?我该如何回答?

    作者 | 宇宙之一粟 责编 | 徐威龙 出品 | AI 科技大本营(rgznai100) 进程与线程?(Process vs. Thread?) 面试官(正襟危坐中):给我说说"线程&quo ...

  8. 2012-5-3 线程和进程的区别

    进程和线程的区别 http://www.cnblogs.com/lmule/archive/2010/08/18/1802774.html 简而言之,一个程序至少有一个进程,一个进程至少有一个线程. ...

  9. Python | 面试必问,线程与进程的区别,Python中如何创建多线程?

    其实关于元类还有很多种用法,比如说如何在元类当中设置参数啦,以及一些规约的用法等等.只不过这些用法比较小众,使用频率非常低,所以我们 不过多阐述 了,可以在用到的时候再去详细了解.我想只要大家理解了元 ...

最新文章

  1. mybatis的优缺点
  2. 紧随时代发展 安防消费也在悄然发生改变
  3. 计算机系学生thinkbook,ThinkBook系列性能差,只能当一台学习机?其实它只是专注于办公...
  4. 3D数学 ---- 矩阵和线性变换
  5. qt中文件读取的方法(新手入门必看)
  6. mysql如何植入到oracle_MySQL产品的生命周期
  7. QIPAIFANS网站程序【2013最新版】
  8. linux学习之路之使用脚本来复制二进制程序和所需的库文件
  9. c语言学习-定义并调用函数求两个整数之差的绝对值
  10. C语言实现windows进程遍历
  11. kindle刷机ttl_求助大神!现在KPW2只能在TTL下进入uboot
  12. 【BZOJ1823】 [JSOI2010]满汉全席
  13. 地学计算方法/地统计学(5第五章 空间插值与克里格法)
  14. vue.js 密码加密_1Password ——密码管理工具
  15. net stop sharedaccess命令 2009-1-15 11:10
  16. 我的2013----默默的积累
  17. 危化品防火柜的概念是什么?
  18. 梦幻西游唯美版3D模型展示
  19. 人力资源数据分析师前景_人力资源数据分析师——大数据下的精英岗位
  20. Docker基础: Linux内核命名空间之(1) mnt namespace

热门文章

  1. 计算机网络cdma的缺点,CDMA和GSM比较的优缺点是什么?
  2. python databaselibrary_Robot Framework下DataBaseLibrary的使用
  3. 安装linux并卸载windows,如何在安装双启动后卸载 Windows 或者 Linux
  4. mysql client centos_centos7 安装mysql和mysqlclient遇到的那些坑
  5. vue 判断同一数组内的值是否一直_前端代码+后端API,值得一学的Vue高仿音乐播放器实战项目
  6. 这一大波电子“艺术”图,美翻了!
  7. 二极管为什么单向导电?
  8. java mp3数组_Java基础之数组(一)
  9. AES加密算法的VHDL实现
  10. qtdesigner设计表格_实例9 利用Qt Designer设计一个对话框