首页 > 系统相关 >c++学习:程字辈(进程、线程、协程)

c++学习:程字辈(进程、线程、协程)

时间:2023-07-26 18:11:40浏览次数:35  
标签:协程 程字辈 调度 c++ 线程 寄存器 进程 上下文

程字辈(进程、线程、协程)

介绍 C++ 中的进程、线程、协程之间的联系及区别。(以 linux 下实现为例)

进程

概念: 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。每个进程都有自己的独立内存空间,不同进程通过进程间通信来通信。

  • 由于进程比较重量,占据独立的内存,所以上下文进程间的切换开销(栈、寄存器、虚拟内存、文件句柄等)比较大,但相对比较稳定安全。

linux 多进程

在Linux中,创建进程有如下两个目的:

  1. 将同一个程序分成多个进程进行处理(例如:使用Web服务器接收多个请求)
  2. 创建另一个程序(例如:从bash启动一一个新的程序)
    在 Linux 下进程管理主要通过以下三个函数:
  • fork():从父进程拷贝生成一个子进程。
  • system():会调用fork函数产生子进程,由子进程来执行command命令,命令执行完后随即返回原调用的进程。例如:
    • system("./a");: 相当于在终端输入./a,也就是运行这个程序
  • exec():exec函数是直接覆盖掉当前进程,也就是说,并没有增加新进程,而只是替换了当前进程。主要的作用如下所示:
    1. 读取可执行文件,并读取创建进程的内存映像所需的信息。
    2. 用新进程的数据覆盖当前进程的内存。
    3. 从最初的命令开始运行新的进程。

三者的区别联系实现参考:Linux——进程管理篇(详解fork和exec)
linux网络编程:如何使用多进程、多线程及优缺点

线程

概念: 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。

  • 线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。
  • 线程间通信主要通过共享内存,上下文切换很快,资源开销较少,但相比进程不够稳定容易丢失数据。线程私有的资源包含:线程ID、寄存器组的值、线程的栈、错误返回码errno值、线程的信号屏蔽码、线程的优先级--可以自己设置优先级。

协程

概念: 协程是一种用户态的轻量级线程,协程的调度完全由用户控制。

  • 协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈,基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。
  • 协程只能调用非阻塞接口,当调用阻塞接口时,整个线程都被阻塞,(线程中实现协程 常用的两个API则是setjump,保存当前的堆栈,longjump跳转到指定的位置)。

协程 (C++20)

对比

1、进程与线程的比较

线程是指进程内的一个执行单元,也是进程内的可调度实体。线程与进程的区别:

  1. 地址空间:线程是进程内的一个执行单元,进程内至少有一个线程,它们共享进程的地址空间,而进程有自己独立的地址空间
  2. 资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源
  3. 线程是处理器调度的基本单位,但进程不是
  4. 二者均可并发执行
  5. 每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口,但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

2、协程与线程进行比较

  1. 一个线程可以多个协程,一个进程也可以单独拥有多个协程
  2. 线程进程都是同步机制,而协程则是异步
  3. 协程能保留上一次调用时的状态,每次过程重入时,就相当于进入上一次调用的状态

ref

进程,线程,协程讲解
Linux——进程管理篇(详解fork和exec)
linux网络编程:如何使用多进程、多线程及优缺点

标签:协程,程字辈,调度,c++,线程,寄存器,进程,上下文
From: https://www.cnblogs.com/zjacky/p/17553825.html

相关文章

  • C/C++代码混淆器
    C/C++代码混淆器试图通过混淆C/C++源代码以达到保护知识产权的目的的做法其实就是自欺欺人,因为不论如何混淆代码,到了编译阶段代码终究是要被还原成它本来的样子,说到底,这只是一层窗户纸而已。我曾利用宏机制实现过一个C/C++代码混淆器,效果乍一看还真能给人一种眼前一亮的神奇,......
  • C#引用c++ DLL找不到入口点
    c++中的函数名称在编译后改变了,需要利用dumpbin.exe找到编译后的名字dumpbin.exe在VS安装目录参考路径:C:\ProgramFiles(x86)\MicrosoftVisualStudio\2019\Community\VC\Tools\MSVC\14.28.29910\bin\Hostx64\x64打开cmd,移动到dumpbin.exe对应路径,然后输入命令dumpbin-e......
  • C++使用指针进行地址传递及错误示范
    正确示范:voidchange(int*a,int*b){ inttemp=*a; *a=*b; *b=temp;}错误示范:voidchange(int*a,int*b){ int*temp=a; a=b; b=temp;} ......
  • 1.c++入门以及简单顺序结构
    1.c++入门以及简单顺序结构编程就是教计算机解决问题,编程语言就是和计算机沟通时用到的语言——严欣怡一、编写一个简单的C++程序#include<iostream>usingnamespacestd;intmain(){ cout<<"你好C++,我是严欣怡."; return0;}二、语法基础变量1.变量的概念变......
  • 1.c++入门以及简单顺序结构题目
    #1.c++入门以及简单顺序结构题目##1.计算(a+b)*c的值```c++inta,b,c;cin>>a>>b>>c;cout<<(a+b)*c;return0;```##2.带余除法```c++inta,b;cin>>a>>b;cout<<a/b<<""<<a%b;``````c++//c++中取余结果只与%前面的正负有关系cout<<......
  • 1.C++入门以及简单顺序结构
    1.C++入门以及简单顺序结构编程就教计算机解决问题,编程语言就是和计算机沟通时用到的语言——金思宸一、编写一个简单的c++程序#include<iostream>usingnamespacestd;intmain(){ cout<<"你好c++"; return0;}2、语法基础变量1.变量的概念变量本子是一个装东......
  • 【持续更新】C/C++ 踩坑记录(一)
    未定义行为之NULLdereference下面这段代码中is_valid()解引用了空指针str,我们的直觉是编译运行后将迎来SIGSEGV,然而事情并非所期望的那样。/**ub_null.c-未定义行为演示之NULLdereference*/#include<stdio.h>#include<string.h>intis_valid(constchar*......
  • C++中delete和delete[]的深层区别
    C++中delete和delete[]的深层区别今天又看到群里有人讨论C++中delete和delete[]的区别,表层原因大家都了解,因为教科书上说得很明白:new和delete需配对使用,new[]和delete[]需配对使用。但若问起在什么情况下针对new[]申请的资源可以使用delete释放而不会有任何问题,能讲清......
  • C++ 单例模式三种写法
    #include<iostream>#include"Apple.h"#include"Singleton.h"#include"ActivityManager.h"#include"ResourceManager.h"usingnamespaceMySpace;intmain(){Apple::abc=10;//参考:https://blog.csdn.n......
  • Eclipse for c/c++ 导入外面项目没有信息打印出来
      eclipseforc/c++ 导入外面项目没有信息打印出来: 就是因为这个Binaries里面二进制文件太多了,不知道运行哪一个,造成无输出,全删或只保留一个再编译运行: 运行成功:thevalueofsin(2.0)is0.909297TheIDofthisthreadis:-1202372520155============gett......