目录

  • 一、多线程是什么?
  • 二、多进程是什么?
  • 三、多线程与多进程,选择谁?
  • 四、并行、并发、高并发等概念

回到顶部

一、多线程是什么?

说起多线程,那么就不得不说什么是线程,而说起线程,又不得不说什么是进程。

进程可以简单的理解为一个可以独立运行的程序单位,它是线程的集合,进程就是有一个或多个线程构成的。而线程是进程中的实际运行单位,是操作系统进行运算调度的最小单位。可理解为线程是进程中的一个最小运行单元。

那么多线程就很容易理解:多线程就是指一个进程中同时有多个线程正在执行。

为什么要使用多线程?

  • 在一个程序中,有很多的操作是非常耗时的,如数据库读写操作,IO操作等,如果使用单线程,那么程序就必须等待这些操作执行完成之后才能执行其他操作。使用多线程,可以在将耗时任务放在后台继续执行的同时,同时执行其他操作。
  • 可以提高程序的效率。
  • 在一些等待的任务上,如用户输入,文件读取等,多线程就非常有用了。

多线程的缺点:

  • 使用太多线程,是很耗系统资源,因为线程需要开辟内存。更多线程需要更多内存。
  • 影响系统性能,因为操作系统需要在线程之间来回切换。
  • 需要考虑线程操作对程序的影响,如线程挂起,中止等操作对程序的影响。
  • 线程使用不当会发生很多问题。

总结:多线程是异步的,但这不代表多线程真的是几个线程是在同时进行,实际上是系统不断地在各个线程之间来回的切换(因为系统切换的速度非常的快,所以给我们在同时运行的错觉)。

回到顶部

二、多进程是什么?

进程是程序在计算机上的一次执行活动。当你运行一个程序,你就启动了一个进程。凡是用于完成操作系统的各种功能的进程就是系统进程,而所有由你启动的进程都是用户进程。

同理,多进程就是指计算机同时执行多个进程,一般是同时运行多个软件。

回到顶部

三、多线程与多进程,选择谁?

下面是本人从知乎-pansz上转载的一个答案,非常通俗地回答了这个问题。

  • 单进程单线程:一个人在一个桌子上吃菜。
  • 单进程多线程:多个人在同一个桌子上一起吃菜。
  • 多进程单线程:多个人每个人在自己的桌子上吃菜。

多线程的问题是多个人同时吃一道菜的时候容易发生争抢,例如两个人同时夹一个菜,一个人刚伸出筷子,结果伸到的时候已经被夹走菜了。。。此时就必须等一个人夹一口之后,在还给另外一个人夹菜,也就是说资源共享就会发生冲突争抢。

1。对于 Windows 系统来说,【开桌子】的开销很大,因此 Windows 鼓励大家在一个桌子上吃菜。因此 Windows 多线程学习重点是要大量面对资源争抢与同步方面的问题。

2。对于 Linux 系统来说,【开桌子】的开销很小,因此 Linux 鼓励大家尽量每个人都开自己的桌子吃菜。这带来新的问题是:坐在两张不同的桌子上,说话不方便。因此,Linux 下的学习重点大家要学习进程间通讯的方法。

开桌子的意思是指创建进程。开销这里主要指的是时间开销。
可以做个实验:创建一个进程,在进程中往内存写若干数据,然后读出该数据,然后退出。此过程重复 1000 次,相当于创建/销毁进程 1000 次。在我机器上的测试结果是:
UbuntuLinux:耗时 0.8 秒 Windows7:耗时 79.8 秒 两者开销大约相差一百倍。
这意味着,在 Windows 中,进程创建的开销不容忽视。换句话说就是,Windows 编程中不建议你创建进程,如果你的程序架构需要大量创建进程,那么最好是切换到 Linux 系统。

大量创建进程的典型例子有两个,一个是 gnu autotools 工具链,用于编译很多开源代码的,他们在 Windows 下编译速度会很慢,因此软件开发人员最好是避免使用 Windows。另一个是服务器,某些服务器框架依靠大量创建进程来干活,甚至是对每个用户请求就创建一个进程,这些服务器在 Windows 下运行的效率就会很差。这"可能"也是放眼全世界范围,Linux 服务器远远多于 Windows 服务器的原因。

再次补充:如果你是写服务器端应用的,其实在现在的网络服务模型下,开桌子的开销是可以忽略不计的,因为现在一般流行的是按照 CPU 核心数量开进程或者线程,开完之后在数量上一直保持,进程与线程内部使用协程或者异步通信来处理多个并发连接,因而开进程与开线程的开销可以忽略了。
另外一种新的开销被提上日程:核心切换开销。 现代的体系,一般 CPU 会有多个核心,而多个核心可以同时运行多个不同的线程或者进程。当每个 CPU 核心运行一个进程的时候,由于每个进程的资源都独立,所以 CPU 核心之间切换的时候无需考虑上下文。 当每个 CPU 核心运行一个线程的时候,由于每个线程需要共享资源,所以这些资源必须从 CPU 的一个核心被复制到另外一个核心,才能继续运算,这占用了额外的开销。换句话说,在 CPU 为多核的情况下,多线程在性能上不如多进程。
因而,当前面向多核的服务器端编程中,需要习惯多进程而非多线程。

回到顶部

四、并行、并发、高并发等概念

并行:多个CPU实例或多台机器同时执行一段处理逻辑,是真正的同时。

并发:通过CPU调度算法,让用户看上去同时执行,实际上CPU操作层面不是真正的同时。

并发时如果操作了公用资源,可能产生线程安全问题。

线程安全:多个线程操作公用资源,有可能产生安全问题。

高并发:高并发指的是是一种系统运行过程中遇到的一种“短时间内遇到大量操作请求”的情况,主要发生在web系统集中大量访问或者socket端口集中性收到大量请求(例如:12306的抢票情况;天猫双十一活动)。该情况的发生会导致系统在这段时间内执行大量操作,例如对资源的请求,数据库的操作等。如果高并发处理不好,不仅仅降低了用户的体验度(请求响应时间过长),同时可能导致系统宕机,严重的甚至导致OOM异常,系统停止工作等。如果要想系统能够适应高并发状态,则需要从各个方面进行系统优化,包括,硬件、网络、系统架构、开发语言的选取、数据结构的运用、算法优化、数据库优化……。

多线程与高并发的联系

多线程只是在同/异步角度上解决高并发问题的其中的一个方法手段,是在同一时刻利用计算机闲置资源的一种方式。

多线程在高并发问题中的作用就是充分利用计算机资源,使计算机的资源在每一时刻都能达到最大的利用率,不至于浪费计算机资源使其闲置。

多进程和多线程的概念相关推荐

  1. 一文看懂Python多进程与多线程编程(工作学习面试必读)

    进程(process)和线程(thread)是非常抽象的概念, 也是程序员必需掌握的核心知识.多进程和多线程编程对于代码的并发执行,提升代码效率和缩短运行时间至关重要.小编我今天就来尝试下用一文总结下 ...

  2. python 多进程和多线程

    python 多进程和多线程 一.进程和线程 1.概念 进程: 一个进程就是一个任务,可以理解为一个程序.一个进程可以有多个线程,至少一个.多进程中,同一个变量,各自有一份拷贝存在于每个进程中,互不影 ...

  3. 谈谈dpdk应用层包处理程序的多进程和多线程模型选择时的若干考虑

    看到知乎上有个关于linux多进程.多线程的讨论:http://www.zhihu.com/question/19903801/answer/14842584 自己项目里也对这个问题有过很多探讨和测试 ...

  4. 你能分清多进程与多线程吗?

    总第127篇/张俊红 今天我们来聊聊Python里面的多进程与多线程编程模式. 1.多线程工作 在开始讲今天的正文之前,先给大家介绍一个概念「多线程工作」,这个概念可能有的人听过,也可能有的人平常工作 ...

  5. 多CPU,多核,多进程,多线程以及进程和线程的简单理解以及区别

    当面临这些问题的时候,有两个关键词无法绕开,那就是并行和并发. 首先,要先了解几个概念: 1.进程是程序的一次执行. 2.进程是资源分配的基本单位. 3.一个进程可以包括多个线程. 4.在单CPU计算 ...

  6. 多进程 VS 多线程

    在Linux下编程多用多进程编程少用多线程编程. IBM有个家伙做了个测试,发现切换线程context的时候,windows比linux快一倍多.进出最快的锁(windows2k的 critical ...

  7. Python第十二章-多进程和多线程01-多进程

    多进程和多线程 一.进程 1.1 进程的引入 现实生活中,有很多的场景中的事情是同时进行的,比如开车的时候 手和脚共同来驾驶汽车,再比如唱歌跳舞也是同时进行的:试想,如果把唱歌和跳舞这2件事情分开依次 ...

  8. qt 进程打开excel_Python干货:多进程与多线程!

    今天我们来聊聊Python里面的多进程与多线程编程模式. 01 多线程工作 在开始讲今天的正文之前,先给大家介绍一个概念「多线程工作」,这个概念可能有的人听过,也可能有的人平常工作中就是这么做的.我再 ...

  9. linux 下 多进程与多线程

    [Linux]多进程与多线程之间的区别 http://blog.csdn.net/byrsongqq/article/details/6339240 网络编程中设计并发服务器,使用多进程与多线程 ,请 ...

最新文章

  1. 大数据开发套件—调度运维常见问题
  2. 10个操作数的随机四则运算(二)
  3. 企业网络推广教你如何打造更利于SEO优化的标题?
  4. 《疯狂Java讲义》5
  5. 大屏网页手机缩放html,大屏页面三种缩放
  6. 中文句法分析、标记规范及其应用
  7. d630 无线驱动 linux,fedora 8下DELL D630无线网卡驱动的安装
  8. pytorch自定义图片输入
  9. android studio 使用问题 解决方法
  10. SDWebImage 的简单使用方法
  11. Home Assistant系列 -- 设置界面语言与地理位置
  12. Xmodem、Ymodem和Zmodem协议是最常用的三种通信协议
  13. R数据分析:二分类因变量的混合效应,多水平logistics模型介绍
  14. 违反计算机信息网络国际联网安全,网络安全合规指引题库:计算机信息网络国际联网,是指中华人民共和国境内的计算机信息网络为实现信息的国际交流,同外国的计算机信息网络相联接。()...
  15. 万亿产业进化论,装备企业的机会在哪里?
  16. linux系统分区支持ntfs吗,如何使Linux支持NTFS分区
  17. 在电脑上显示未知发布者怎么办_Win7无法验证发行者、未知发布者的解决方法...
  18. python创建学生类姓名学号_python创建学生成绩管理系统
  19. 2021 年最值得使用的 Node.js 框架
  20. 兔子随笔:留学还得趁年轻

热门文章

  1. 仿脉脉PHP源码,php - 如何实现类似脉脉网的二维人际关系
  2. ps 2c语言程序,C语言基础(二)
  3. plus rss.php,dedecms织梦rss输出改成全文输出
  4. java linux路径 home_根据linux自带的JDK,配置JAVA_HOME目录
  5. maven项目转成web项目
  6. 年会抽奖程序准备好了吗?没有的话,直接来取!
  7. Spring Boot 2.x基础教程:使用Spring Data JPA访问MySQL
  8. 如何自动保存 Spring Boot 应用进程号?
  9. 这块抖音爆红的支架,搞到一波优惠,按需而入!
  10. 开源高性能异步网关:Soul