博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
进程、线程、协程基本概念理解
阅读量:6820 次
发布时间:2019-06-26

本文共 873 字,大约阅读时间需要 2 分钟。

  hot3.png

概述

    最近接触一些进程、线程、协程、相关的东西,总是容易搞混淆,或者出错,专门想总结下这块的几个概念的问题!

进程

  • 进程之间不共享任何状态
  • 进程的调度由操作系统完成
  • 每个进程都有自己独立的内存空间
  • 进程间通讯主要是通过信号传递的方式来实现的,实现方式有多种,信号量、管道、事件等,任何一种方式的通讯效率都需要过内核,导致通讯效率比较低
  • 由于是独立的内存空间,上下文切换的时候需要保存先调用栈的信息、cpu各寄存器的信息、虚拟内存、以及打开的相关句柄等信息,所以导致上下文进程间切换开销很大,通讯麻烦。

线程

  • 线程之间共享变量,解决了通讯麻烦的问题
  • 对于变量的访问需要锁
  • 线程的调度主要也是有操作系统完成
  • 一个进程可以拥有多个线程,但是其中每个线程会共享父进程像操作系统申请资源,这个包括虚拟内存、文件等,由于是共享资源,所以创建线程所需要的系统资源占用比进程小很多,相应的可创建的线程数量也变得相对多很多。
  • 线程时间的通讯除了可以使用进程之间通讯的方式以外还可以通过共享内存的方式进行通信,所以这个速度比通过内核要快很多。
  • 另外在调度方面也是由于内存是共享的,所以上下文切换的时候需要保存的东西就像对少一些,这样一来上下文的切换也变得高效。

协程

  • 协程的调度完全由用户控制
  • 一个线程可以有多个协程,用户创建了几个线程,然后每个线程都是循环按照指定的任务清单顺序完成不同的任务,当任务被堵塞的时候执行下一个任务,当恢复的时候再回来执行这个任务,
  • 任务之间的切换只需要保存每个任务的上下文内容,就像直接操作栈一样的,这样就完全没有内核切换的开销
  • 可以不加锁的访问全局变量,所以上下文的切换非常快;
  • 另外协程还需要保证是非堵塞的且没有相互依赖,协程基本上不能同步通讯,多采用一步的消息通讯,效率比较高。

--------------------------------------------------

注:

1、在阮一峰老师的博客中关于进程、线程的简单解释

 

转载于:https://my.oschina.net/rasine/blog/664139

你可能感兴趣的文章
基于Metronic的Bootstrap开发框架经验总结(15)-- 更新使用Metronic 4.75版本
查看>>
Kafka(二)-- 安装配置
查看>>
MapReduce 图解流程
查看>>
[LeetCode] Wildcard Matching
查看>>
推荐系统
查看>>
HoloLens | 世界的每一次变化,其实都提前打好了招呼
查看>>
seq命令
查看>>
线性表接口的实现_Java
查看>>
利用安卓手机搭建WEB服务器
查看>>
小巧玲珑:机器学习届快刀XGBoost的介绍和使用
查看>>
intellij开发安卓与genymotion配合
查看>>
jmeter大神博客笔记
查看>>
java.lang.NoClassDefFoundError: javax/annotation/Priority
查看>>
springmvc-mvc:resource标签使用
查看>>
Ubuntu 16.04安装IntelliJ IDEA时快捷键冲突设置
查看>>
Ubuntu界面重新安装图形界面
查看>>
比萨斜塔——统计显著性检验
查看>>
如何写一份优秀的java程序员简历
查看>>
Spark(一): 基本架构及原理
查看>>
ASPNETCOREAPI 跨域处理 SQL 语句拼接 多条件分页查询 ASPNET CORE 核心 通过依赖注入(注入服务)...
查看>>