C++原理

作者: 千浪 | 来源:发表于2020-03-13 11:10 被阅读0次

进程与线程

进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。

线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。在Unix System V及SunOS中也被称为轻量进程(lightweight processes),但轻量进程更多指内核线程(kernel thread),而把用户线程(user thread)称为线程。

  • 同一进程中的多条线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符信号处理等等。但同一进程中的多个线程有各自的调用栈(call stack),自己的寄存器环境(register context),自己的线程本地存储(thread-local storage)。
  • 在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。在多线程OS中,线程是能独立运行的基本单位,因而也是独立调度和分派的基本单位。由于线程很“轻”,故线程的切换非常迅速且开销小(在同一进程中的)。在多线程OS中,进程不是一个可执行的实体。
  • 线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通信需要以通信的方式(IPC)进行。不过如何处理好同步与互斥是编写多线程程序的难点。
  • 在引入线程的操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位。

线程与进程的区别可以归纳为以下4点:

1)地址空间和其它资源(如打开文件):进程间相互独立,同一进程的各线程间共享。某进程内的线程在其它进程不可见。

2)通信:进程间通信IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助,以保证数据的一致性。

3)调度和切换:线程上下文切换比进程上下文切换要快得多。

4)在多线程OS中,进程不是一个可执行的实体。

  • 进程是资源分配的最小单位,线程是程序执行的最小单位。
  • 进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,这种操作非常昂贵。而线程是共享进程中的数据的,使用相同的地址空间,因此CPU切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也比进程要小很多。
  • 线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通信需要以通信的方式(IPC)进行。不过如何处理好同步与互斥是编写多线程程序的难点。
  • 但是多进程程序更健壮,多线程程序只要有一个线程死掉,整个进程也死掉了,而一个进程死掉并不会对另外一个进程造成影响,因为进程有自己独立的地址空间

https://foofish.net/thread-and-process.html

堆和栈

栈 stack:

存放函数的参数值、局部变量,由编译器自动分配释放

堆heap:

是由new分配的内存块,由应用程序控制,需要程序员手动利用delete释放,如果没有,程序结束后,操作系统自动回收

2、因为堆的分配需要使用频繁的new/delete,造成内存空间的不连续,会有大量的碎片

3、堆的生长空间向上,地址越大,栈的生长空间向下,地址越小

malloc/free 和new/delete 区别

相同点:都可用于申请动态内存和释放内存

不同点:

简单点说,malloc只分配指定大小的堆内存空间,而new可以根据对象类型分配合适的堆内存空间,当然还可以通过重载operator new 自定义内存分配策略,其次还能够构造对象,free释放对应的堆内存空间,delete,先执行对象的析构函数,在释放对象所占空间。

malloc与free是C++/C 语言的标准库函数,new/delete 是C++的运算符。malloc分配时的大小是人为计算的,返回类型是void*,使用时需要类型转换,而new在分配时,编译器能够根据对象类型自动计算出大小,返回类型是指向对象类型的指针,其封装了sizeof和类型转换功能,实际上new分为两步,第一步是通过调用operator new函数分配一块合适,原始的,未命名的内存空间,返回类型也是void *,而且operator new可以重载,可以自定义内存分配策略,甚至不做内存分配,甚至分配到非内存设备上,而malloc无能为力,第二步,调用构造函数构造对象,new将调用constructor,而malloc不能;delete将调用destructor,而free不能

相关文章

  • Android 中 C++ 调用 Java, 以及 Java 调

    C++ 调用 Java的原理本质 通过C++中jniEnv的几个关键API实现在C++ 中调用 Java的方法: ...

  • 网络协议(一)

    以下内容来自于小码哥"网络协议从入门到底层原理" C\C++跨平台的原理: C\C++跨平台: 使用平台相关的编译...

  • io流&流式编程

    跟C++的流有什么区别? 百度搜索(C++ java 流 stream)(理解java中的流) C++流的原理:可...

  • C++原理

    进程与线程 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单...

  • C++ this 原理

    先看一个类 C++对象中,为什么需要 this。 ① 【main函数弹栈会 隐式代码:(栈区:delete stu...

  • typeid

    本文分析C++中typeid的实现原理 1. 前言 1.1 typeid C++里面的typeid是个运算符,返回...

  • 写在开篇

    如果想要更好的理解OC的底层实现原理,就必须对C++有一定的了解,不期望我们完全掌握C++,最起码我们对C++有一...

  • 深刻剖析之c++博客文章

    三大特性 封装、继承、多态 多态 C++ 虚函数表解析C++多态的实现原理 介绍了类的多态(虚函数和动态/迟绑定)...

  • 第3篇:C++的string内部原理

    本文假定你对C/C++的string语法已经有基本的了解。 如果你对C++的string的内部实现原理不了解的话,...

  • c++ 编译原理

    原文链接:https://blog.csdn.net/HSUPERA/article/details/518952...

网友评论

      本文标题:C++原理

      本文链接:https://www.haomeiwen.com/subject/bvhqshtx.html