C++原理

2020-03-13  本文已影响0人  千浪

进程与线程

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

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

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

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

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

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

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

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不能

上一篇下一篇

猜你喜欢

热点阅读