一、前言

进程即正在执行的一个过程。进程是对正在运行程序的一个抽象。

进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一。操作系统的其他所有内容都是围绕进程的概念展开的。   

PS:即使可以利用的cpu只有一个(早期的计算机确实如此),也能保证支持(伪)并发的能力。将一个单独的cpu变成多个虚拟的cpu(多道技术:时间多路复用和空间多路复用+硬件上支持隔离),没有进程的抽象,现代计算机将不复存在。

 操作系统的作用:1:隐藏丑陋复杂的硬件接口,提供良好的抽象接口2:管理、调度进程,并且将多个进程对硬件的竞争变得有序

二、并发编程之多进程

多进程详细链接

1. 什么是进程

    进程就是一个正在进行/运行的程序,换言之,进程指的是一个程序的运行过程程序vs进程:程序:只是一堆代码文件进程:程序运行的过程才是进程串行:一个任务完完整整地运行完毕,再执行下一个任务,按次序依次进行串行看起来就是一个一个运行的:对一个一个的运行就是串行:错误并发(切换+保存状态):多个任务看起来是同时运行,单核就可以实行并发并行:多个任务是真正意义上的同时运行,只有多核才能实现并行多道技术的产生背景:就是想要在单核下实现并发
   ps:现在的主机一般是多核,那么每个核都会利用多道技术有4个cpu,运行于cpu1的某个程序遇到io阻塞,会等到io结束再重新调度,会被调度到4个cpu中的任意一个,具体由操作系统调度算法决定
        如何实现:1. 空间上的复用:将内存分为几部分,每个部分放入一个程序的数据,         这样,同一时间内存中就有了多道程序的数据,为cpu在多个任务间切换做准备

       2. 时间上的复用:多个进程共享cpu的时间关键点就是cpu在多个任务之间进行切换有两种情况下会发生切换:1. 一个任务占用cpu时间过长(没有遇到IO操作):会降低效率1. 一个任务在运行的过程中遇到IO操作: 可以提升效率2. 为何要用进程要实现并发效果

    

同步\异步 and 阻塞\非阻塞(重点)

同步

同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不会返回。按照这个定义,其实绝大多数函数都是同步调用。但是一般而言,我们在说同步、异步的时候,特指那些需要其他部件协作或者需要一定时间完成的任务。
举例:  1. concurrent.futures.ProcessPoolExecutor().submit(func,).result()   2. concurrent.futures.ThreadPoolExecutor().submit(func,).result()  一提交便得到结果

异步

异步的概念和同步相对。当一个异步功能调用发出后,调用者不能立刻得到结果。当该异步功能完成后,通过状态、通知或回调来通知调用者。如果异步功能用状态来通知,那么调用者就需要每隔一定时间检查一次,效率就很低(有些初学多线程编程的人,总喜欢用一个循环去检查某个变量的值,这其实是一 种很严重的错误)。如果是使用通知的方式,效率则很高,因为异步功能几乎不需要做额外的操作。至于回调函数,其实和通知没太多区别。举例:  1. concurrent.futures.ProcessPoolExecutor(3).submit(func,)   2. concurrent.futures.ThreadPoolExecutor(3).submit(func,)

阻塞

#阻塞调用是指调用结果返回之前,当前线程会被挂起(如遇到io操作)。函数只有在得到结果之后才会将阻塞的线程激活。有人也许会把阻塞调用和同步调用等同起来,实际上他是不同的。对于同步调用来说,很多时候当前线程还是激活的,只是从逻辑上当前函数没有返回而已。
#举例:
#1. 同步调用:apply一个累计1亿次的任务,该调用会一直等待,直到任务返回结果为止,但并未阻塞住(即便是被抢走cpu的执行权限,那也是处于就绪态);
#2. 阻塞调用:当socket工作在阻塞模式的时候,如果没有数据的情况下调用recv函数,则当前线程就会被挂起,直到有数据为止。

非阻塞

#非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前也会立刻返回,同时该函数不会阻塞当前线程。

总结

1. 同步与异步针对的是函数/任务的调用方式:同步就是当一个进程发起一个函数(任务)调用的时候,一直等到函数(任务)完成,而进程继续处于激活状态。而异步情况下是当一个进程发起一个函数(任务)调用的时候,不会等函数返回,而是继续往下执行当,函数返回的时候通过状态、通知、事件等方式通知进程任务完成。2. 阻塞与非阻塞针对的是进程或线程:阻塞是当请求不能满足的时候就将进程挂起,而非阻塞则不会阻塞当前进程

三、并发编程之多线程

多线程详细链接

1、什么是线程

线程顾名思义,就是一条流水线工作的过程,一条流水线必须属于一个车间,一个车间的工作过程是一个进程

关系:

程序------>进程(至少一个主进程)------>线程(至少一个主线程,依赖于进程)

进程只是用来把资源集中到一起(进程只是一个资源单位,或者说资源集合),而线程才是cpu上的执行单位。

#可以想象成北京地铁与上海地铁是不同的进程,而北京地铁里的13号线是一个线程,北京地铁所有的线路共享北京地铁所有的资源,比如所有的乘客可以被所有线路拉。

生活中进程、线程

2、创建线程的开销小

如果我们的软件是一个工厂,该工厂有多条流水线,流水线工作需要电源,电源只有一个即cpu(单核cpu)

一个车间就是一个进程,一个车间至少一条流水线(一个进程至少一个线程)

创建一个进程,就是创建一个车间(申请空间,在该空间内建至少一条流水线)

而建线程,就只是在一个车间内造一条流水线,无需申请空间,所以创建开销小

3、线程与进程的区别

线程共享创建它的进程的地址空间                      进程有自己的地址空间。

线程可以直接访问进程的数据段                         进程拥有父进程的数据段的自己的副本。

线程可以直接与进程的其他线程通信                  进程必须使用进程间通信来与兄弟进程通信。

新线程很容易创建                                               新进程需要复制父进程。

线程可以对同一进程的线程进行相当大的控制    进程只能对子进程进行控制。

对主线程的更改(取消、优先级更改等)可能会影响进程中其他线程的行为                对父进程的更改不会影响子进程。

4、为何多线程

多线程指的是,在一个进程中开启多个线程

1. 多线程共享一个进程的地址空间

2. 线程比进程更轻量级,线程比进程更容易创建可撤销,在许多操作系统中,创建一个线程比创建一个进程要快10-100倍,在有大量线程需要动态和快速修改时,这一特性很有用

3. 若多个线程都是cpu密集型的,那么并不能获得性能上的增强,但是如果存在大量的计算和大量的I/O处理,拥有多个线程允许这些活动彼此重叠运行,从而会加快程序执行的速度。

很形象的线程小故事

转载于:https://www.cnblogs.com/nixindecat/p/9663400.html

并发编程(进程与线程)相关推荐

  1. 学习笔记(33):Python网络编程并发编程-进程池线程池

    立即学习:https://edu.csdn.net/course/play/24458/296451?utm_source=blogtoedu 进程池与线程池: 一般应用在网站上,进程池或线程池最大的 ...

  2. Python 并发编程--进程,线程,协程

    并发编程 基本概念的区分: 并发 只有一个CPU,多个程序在一个CPU上轮流执行,宏观上多个进程并发执行,但微观上依旧是串行 并行 有多个CPU,多个程序在多个CPU上同时执行. 进程 计算机中最小的 ...

  3. python并发编程-进程池线程池-协程-I/O模型-04

    目录 进程池线程池的使用***** 进程池/线程池的创建和提交回调 验证复用池子里的线程或进程 异步回调机制 通过闭包给回调函数添加额外参数(扩展) 协程*** 概念回顾(协程这里再理一下) 如何实现 ...

  4. python并发编程--进程、线程、协程、锁、池、队列

    文章目录 操作系统的概念 进程 multiprocessing模块 守护进程 使用多进程实现一个并发的socket的server 锁 生产者消费者模型 数据共享 线程threading模块 守护线程和 ...

  5. 学习笔记(24):Python网络编程并发编程-进程与线程的区别

    立即学习:https://edu.csdn.net/course/play/24458/296438?utm_source=blogtoedu 线程与进程的区别: 1.消耗区别:进程>线程 1) ...

  6. java并发编程实践(2)线程安全性

    [0]README 0.0)本文部分文字描述转自:"java并发编程实战", 旨在学习"java并发编程实践(2)线程安全性" 的相关知识: 0.1)几个术语( ...

  7. 并发和多线程(一)并发、进程、线程概念

    一.并发.进程.线程的基本概念和综述 1.1 并发 两个或者更多的任务(独立的活动)同时发生(进行):一个程序同时执行多个独立的任务: 以往计算机,单核cpu(中央处理器):某一个时刻只能执行一个任务 ...

  8. Python 第八篇:异常处理、Socket语法、SocketServer实现多并发、进程和线程、线程锁、GIL、Event、信号量、进程间通讯...

    本节内容: 异常处理.Socket语法.SocketServer实现多并发.进程和线程.线程锁.GIL.Event.信号量.进程间通讯.生产者消费者模型.队列Queue.multiprocess实例 ...

  9. python多线程执行其他模块的文件_python并发编程--进程线程--其他模块-从菜鸟到老鸟(三)...

    concurrent模块 1.concurrent模块的介绍 concurrent.futures模块提供了高度封装的异步调用接口 ThreadPoolExecutor:线程池,提供异步调用 Proc ...

最新文章

  1. JVM中可生成的最大Thread数量
  2. 如果有一个类是 myClass , 关于下面代码正确描述的是?
  3. Android屏幕适应详解(一)
  4. SQL逻辑查询语句执行顺序
  5. 学习笔记 Keras:基于Python的深度学习库
  6. mybatisplus代码生成器_想做时间管理大师?你可以试试Mybatis Plus代码生成器
  7. linux怎么运行ofstream,ofstream和ifstream详细用法---转
  8. box2d 碰撞检测_(译)如何使用box2d来做碰撞检测(且仅用来做碰撞检测)
  9. 深度学习(18)神经网络与全连接层一: 数据加载
  10. visual studio 2005中生成网站和发布网站区别
  11. python和对象复习_python 面向对象基础和高级复习
  12. 寻优秀开源项目,百万程序员为你助力!
  13. python 交集_Python设置交集
  14. JavaScript提高:003:easy UI实现tab页面自适应问题
  15. 三人表决器Verilog
  16. KETTLE 下载网址
  17. cgcs2000大地坐标系地图_MapGIS国土空间数据2000大地坐标系转换系统
  18. 树莓派4B安装系统及开热点
  19. MySQL练习sql脚本(某校学生管理系统版本)
  20. Android OS历史版本

热门文章

  1. mysql 日期 1970_Mysql中处理1970年前的日期(unixtime为负数的情况)负数时间戳格式化...
  2. html5 audio js控制进度,HTML5 audio标签使用js进行播放控制实例
  3. 用c语言编写24点游戏,C语言解24点游戏程序
  4. python地图图表和3d_Python地图可视化三大秘密武器
  5. 视频+案例,玩转LightGBM
  6. 用TensorFlow训练一个目标检测器(手把手教学版)
  7. 张利国java pdf_Java Web开发与实战–Eclipse+Tomcat+Servlet+JSP整合应用 (刘伟张利国) PDF...
  8. Eclipse用法和技巧十九:eclipse修改workspace
  9. 用curl自动登录HTTPS站点
  10. extjs计算两个DateField所间隔的月份(天数)