无论我们写出怎样的程序,最后都是由操作系统来运行我们的程序,而操作系统如何管理我们的程序,我们程序的数据如何保存和计算,这些都是操作系统需要处理的事情,我们只要将写好的程序交给操作系统就好。

虽然操作系统可以帮助我们做很多事情,但是它并不是万能的,有时候我们需要告诉它如何处理,或者说我们需要按照它的规则来办事。而操作系统本质的作用就是用来管理调度内存和cpu。

进程

进程是操作系统分配资源的最小单位,也就是我们写的每个程序都至少包含一个进程,当然也可能包括多个进程。在进程中,我们有自己的资源管理,我们可以申请内存,可以进行数据的运算,这些都是进程需要处理的事情。

线程

既然有了进程,为什么还要线程呢?因为进程切换太消耗资源了。我们知道一个事物或者一种方法的出现,一定是为了解决某种问题或者某些问题。而线程的出现就是为了方便操作系统调度,因此,线程是操作系统调度的最小单位。一个进程里面可以有一个线程,也可以有多个线程,多个线程之间互相做自己的事情,但是它们共享进程的存储空间,也就是说它们都可以访问进程的内存空间,这样的好处就是方便线程的通信,缺点也很明显,如果多个线程都想同时修改共享内存的数据,它们就会产生竞争,而锁的机制就是为了解决共享内存的线程之间修改共享内存的一种方法。

携程

进程的创建需要最多的资源,线程需要的资源比它小很多,但是人们似乎还是不满意,于是协程诞生了,它需要的资源的更少,只需要几kb,也就是说一个普通的主机也能够轻轻松松启动几十万个协程。之前我们说过,进程是cpu分配资源的最小单位,线程是cpu管理的最小单位,那么协程cpu怎么管理呢?答案就是操作系统cpu不直接管理协程,而是由用户自己去管理,因此,我们经常也把协程叫做用户态线程。

既然协程是有用户管理的,因此我们可以根据我们的需要在不同协程之间进行切换,比如当一个协程遇到io耗时操作的时候,我们可以将cpu资源切换到其它协程,这样我们就可以大幅提升cpu利用率。

虽然协程很方便,但是由于需要用户自己去管理状态切换,因此用户需要实现一个处理器调度机制,这其实并不简单,这也是为什么知道最近才有很多语言实现协程。

总结

无论是进程,线程还是协程,它们统一说来都是一个资源块,都是可以被cpu调度的一块代码块,不同的就是cpu是如何调度它们的。操作系统通过进程和线程的管理来处理cpu的调度,操作系统封装了进程和线程的实现,我们只需要做的就是让我们的程序尽可能合理分配处理器资源。

当明白了这些,我们更多关注的就是进程之间如何通信,线程和进程之间如何通信,协程间如何通信,这些其实才是我们在编码过程中投入更多精力关注的。

进程 线程 协程_进程,线程,协程那些事相关推荐

  1. python是如何实现进程池和线程池的_进程、线程、线程池和协程如何理解?

    1.进程.线程.线程池的概念 进程是一个动态的过程,是一个活动的实体.简单来说,一个应用程序的运行就可以被看做是一个进程,而线程,是运行中的实际的任务执行者.可以说,进程中包含了多个可以同时运行的线程 ...

  2. 进程 线程 协程_进程 线程 协程 管程 纤程 概念对比理解

    不知道是不是我自己本身就有那么一丝丝的密集恐惧,把这么一大堆看起来很相似很相关的概念放在一起,看起来是有点麻,捋一捋感觉舒服多了. 相关概念 任务.作业(Job,Task,Schedule) 在进程的 ...

  3. kotlin协程_使Kotlin协程无缝采用的5个技巧

    kotlin协程 After successfully adopting coroutines in my prod project I think it is time to share 5 tip ...

  4. c++ 协程_理解Python协程(Coroutine)

    由于GIL的存在,导致Python多线程性能甚至比单线程更糟. GIL: 全局解释器锁(英语:Global Interpreter Lock,缩写GIL),是计算机程序设计语言解释器用于同步线程的一种 ...

  5. python两个线程交替打印_三线程按顺序交替打印ABC的四种方法

    建立三个线程A.B.C,A线程打印10次字母A,B线程打印10次字母B,C线程打印10次字母C,但是要求三个线程同时运行,并且实现交替打印,即按照ABCABCABC的顺序打印. 二.Synchroni ...

  6. python线程异常中断_中断线程

    如果线程需要执行一个长时间任务,就可能需要能中断线程.中断线程就是其他线程给该线程发一个信号,该线程收到信号后结束执行run()方法,使得自身线程能立刻结束运行. 我们举个栗子:假设从网络下载一个10 ...

  7. 主线程 子线程死掉_当线程死时,子进程也会死

    我有一个程序可以触发Python计时器来生成子进程.一旦程序终止或终止,这些子进程就应该终止.为了做到这一点,我使用了"prctl hack",它设置了一旦父对象死亡,子对象应该接 ...

  8. c++ 异步下获取线程执行结果_前端异步编程的那些事

    啊 一.异步编程的运行机制 我们学习Javascript语言的时候就知道它的执行环境是"单线程"的. 所谓"单线程",就是指一次只能处理一个任务.如果有多个任务 ...

  9. 创建线程的方式_创建线程有几种不同的方式?

    方式可以用来创建线程 1)继承Thread类 2)实现Runnable接口 3)应用程序可以适用Executor框架来创建线程池 实现了Runnable接口这种方式更受欢迎,因为这不需要继承Threa ...

最新文章

  1. springboot打成jar后获取classpath下的文件
  2. Swift 条件编译,编译标记
  3. 6700设置上网教程
  4. 全球及中国拉丝润滑剂粉末行业投资潜力及发展战略规划报告2021-2027年
  5. 详细易懂的二叉树遍历(先中后)
  6. 工作站的windows server 2008 终于安装好了
  7. linux 云主机安装方法,虚拟主机linux服务器安装教程
  8. system权限运行cmd
  9. 公告:CSDN下载频道即将全面改版
  10. 计算机图形学 参数曲线和曲面的相关知识点
  11. 针对源代码保密源代码安全管理产品选型建议
  12. 玩转冷板式液冷 你需要一份靠谱的“设计参考”
  13. 中国城市电话区号对照表中国移动短信中心号查询及命名规则
  14. Flutter 布局 - UI - 官方文档 - 学习速记(一)
  15. 排查Linux服务器是否被入侵步骤
  16. 在 IDEA 中的各种调试技巧,轻松定位 Bug(超级全面)
  17. python删除文本末尾所有空行
  18. 版本管理工具 git和SVN 忽略文件和目录
  19. oracle 918,Oracle00-918:未明确定义列的错误
  20. 生信基础(三)——统计分析工具R语言

热门文章

  1. 基于自适应逆透视变换的车道线SLAM
  2. 数据库低端sql查询语句片段
  3. [推荐]Angular File Changer (Supporting Touch Bar and NgRx)→用于快速切换同名HTML/SCSS/TS文件,非常的实用
  4. rtsp流 转 http播放视频
  5. mixamo网站FBX模型带骨骼绑定动作库
  6. 搜索:广搜 词语阶梯
  7. SUST_ACM_2019届暑期ACM集训热身赛题解
  8. getURLParameters - 网址参数
  9. img-responsive class图片响应式
  10. Spring学习-理解IOC和依赖注入