首页 > 系统相关 >【协程】进程,线程和协程

【协程】进程,线程和协程

时间:2023-04-29 12:44:56浏览次数:47  
标签:协程 线程 内存 进程 CPU 切换

进程

进程,描述的是程序的执行过程,是运行着程序的代表,在操作系统中,每个进程的内存空间都是独立的,使用多进程并发有两个缺点:一是内核的管理成本高,而是无法简单地通过内存同步数据(进程运行的虚拟内存空间),很不方便,于是多线程模式就出现了。

线程

线程是操作系统能够运行运算调度的最小单位。它被包含在进程之中,是进程中实际运作的单位,一条线程指的是进程中单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。线程总是在进程之内的。一个进程至少会包含一个线程。虽然一个进程中可以并行运行多个线程,而且各个线程之间可以访问进程地址空间的每一个内存地址。

虽然共享地址空间可以方便地共享对象,但这也导致一个问题,任何一个进程出错时,进程中的所有线程都会跟着一起崩溃。

线程内存占用

单个线程消耗内存过多,64位的linux为每个线程的栈分配了8MB的内存,通过ulimit -s可以查看线程的默认分配的内存。单位kb

线程上下文切换

线程的切换是由内核控制的,什么时候会切换线程呢?当时间片用尽,当调用阻塞方法时,CPU都会切换到其他下次讷航那个执行,一次上下围切换的成本在及时纳秒到几个微秒间,当线程数量众多时,这些切换会消耗绝大部分的CPU运算能力。

实现高并发的一个思路就是将内核实现的请求切换工作,交给用户态的代码完成。

协程

什么是协程

协程是用户态的线程,通常创建协程时,会从进程的堆中分配一段内存作为协程的栈。线程的栈有8MB,而协程的栈大小通常只有几十KB。而且C库的内存池不会给协程预分配内存,因为它感知逼到协程的存在。这样更低的内存空间为高并发提供了保证

协程的调度

每个协程有独立的栈,而栈即保留了变量的值,也保留了函数的调用关系,参数和返回值,CPU中栈寄存器SP指向了当前协程的栈,而指令寄存器IP保留着下一条要执行的指令地址。因此从协程1切换到协程2的时候,首先要把SP、IP寄存器的值为线程1保存下来,再从内存中找出协程2上一次切换前保存好的寄存器值,写入CPU的寄存器,这样就完成了协程切换(Swoole4实现)

总结

为什么要搞出协程:

1.节省CPU资源,避免系统内核级的线程频繁切换,造成CPU资源浪费,而协程是用户态的线程,用于可以自行控制协程的创建和销毁,可以避免系统级线程上下文切换造成的资源浪费。

2.节约内存,在64位的Linux中,一个线程需要分配8MB占内存和64M堆内存,系统内存制约导致无法开启更多的线程实现高并发。而在协程编程模式下,可以轻松有十几万协程。

3.稳定性,线程之间通过内存来共享数据,也导致任何一个线程出错时,进程中所有下次讷航那个会跟着一起崩溃(真的会这样吗?)

4.开发效率,使用协程在开发程序之中,可以很方便的将一些耗时的IO操作异步化,例如写文件、耗时IO请求等。











参考文章:

https://zhuanlan.zhihu.com/p/337072647

标签:协程,线程,内存,进程,CPU,切换
From: https://www.cnblogs.com/Wangzx000/p/17340087.html

相关文章

  • 13 进程
    进程:从进程的结构看:进程是一个应用程序运行时刻的实例;从进程的功能看:进程是应用程序运行时所需资源的容器;从操作系统对进程的实现角度看:进程是一堆数据结构;进程的结构:进程必须要有一个地址空间:这个地址空间包括至少两部分:一部分是内核,一部分是用户的应用程序;每个进程拥有x86......
  • 实验2 多线程
    创建一个线程#include<stdio.h>#include<unistd.h>#include<pthread.h>#include<sys/types.h>void*threadFunc(void*arg){printf("InNEWthreaad\n");}intmain(){ pthread_ttid;//createthreadfunctionpthread_create(......
  • HashMap为什么存在线程不安全呢?
    关注Java后端技术栈“回复“面试”获取最新资料本文主要探讨下HashMap在多线程环境下容易出现哪些问题,深层次理解其中的HashMap。我们都知道HashMap是线程不安全的,但是HashMap在咱们日常工作中使用频率在所有map中确实属于比较高的。因为它可以满足我们大多数的场景了。上面展示了......
  • STM32:RTthread_线程
    1微处理器系统    随着产品功能的增多,裸机系统不能够满足产品需求,引入RTOS实时操作系统的多线程管理,可以增加程序的稳定性逻辑性,便于管理;2线程  通常默认一个能独立实现功能的函数,称之为线程;多线程管理的意思就是这个程序可以实现多个功能管理;  2.1线程栈   ......
  • Java多线程之---用 CountDownLatch 说明 AQS 的实现原理
    本文基于jdk1.8。CountDownLatch的使用前面的文章中说到了volatile以及用volatile来实现自旋锁,例如java.util.concurrent.atomic包下的工具类。但是volatile的使用场景毕竟有限,很多的情况下并不是适用,这个时候就需要synchronized或者各种锁实现了。今天就来说一下几......
  • Java 中的几种线程池,你之前用对了吗
    好久不发文章了,难道是因为忙,其实是因为懒。这是一篇关于线程池使用和基本原理的科普水文,如果你经常用到线程池,不知道你的用法标准不标准,是否有隐藏的OOM风险。不经常用线程池的同学,还有对几种线程的使用不甚了解的同学可以读一下此文。为什么要使用线程池虽然大家应该都已经很清......
  • 进程间通信
    匿名管道/*匿名管道用在具有关系的进程间,原因是共享文件描述符环形队列,双指针-读指针、写指针管道中没有数据,read将会被堵塞管道写满时,write将会被堵塞创建匿名管道#include<unistd.h>int......
  • C# 多线程
    首先要关注电脑配置是否是多核多CPU的。因为一个CPU在同一时刻只能运行一个线程,但是多个CPU在同一时刻就可以运行多个线程。 多线程的优点:1、可以同时完成多个任务;2、可以使程序的响应速度更快;3、可以让占用大量处理时间的任务或当前没有进行处理的任务定期将处理时间让给......
  • 多线程读写文件
    参考:实践1-2:多线程读写文件-l.w.x-博客园(cnblogs.com)得到的结论是,可以多线程读写,但是会有多种情况:多线程同时读同一个文件,在这种情况下并不会造成冲突多线程同时写同一个文件,会造成写数据丢失多线程同时对同一个文件进行写和读,会造成脏读解决办法是加锁,同时......
  • C#使用委托在Socket Udp端口侦听线程内更新主窗口控件显示
    c#开启线程侦听SocketUDP端口,端口接收到网络读卡器的读卡数据后刷新UI界面显示接收数据,解析数据包信息并向读卡器发送显示文字、驱动读卡器播报语音、蜂鸣响声提示、开启继电器开关等操作。  .net提示通过设置:CheckForIllegalCrossThreadCalls=false,可以在子线程内强制更新......