一、定义
教科书式回答,进程是资源分配的最小单位,而线程是CPU调度的最小单位。
进程有自己的独立地址空间(虚拟的,4G大小),一个进程崩溃后不会对其他进程产生影响。同一进程内的某一个线程崩溃后,整个进程也崩溃了。因为线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间。
多进程比多线程程序要健壮,但是由于切换时更耗费资源和时间,所以有高并发需求时,一般采用多线程。
想要分清进程和线程的区别,我们先来看一下进程的独立地址空间中包含哪些内容。
进程的虚拟独立地址空间主要包含以下内容:
Text Segment、Data Segment()、BBS(未初始化数据区)、stack、heap、内核空间
TextSegment 表示程序的代码段;
DataSegment (全局初始化数据区/静态数据区,或简称数据段)表示 已经初始化且初值非0的全局变量和静态局部变量 ;
BBS(未初始化数据区-特指全局变量和静态局部变量)表示未初始化或初始值为0的全局变量和静态局部变量;操作系统负责这些段的加载并分配内存空间,这些段在编译期就分段完成。在程序执行前初始化为0或者NULL指针。
栈(stack)用于存储局部变量、函数参数、函数返回值
堆(heap)用于存储程序动态申请的内存,需要程序员手动释放。因为空闲空间的内存是不连续的,所以堆在操作系统中是用链表来存储的。
内核空间(kernel space)属于操作系统的一部分,常驻内存。
1 int a = 0; 全局初始化区 2 char *p1; 全局未初始化区 3 4 void main() 5 { 6 int b; //栈 7 char s[] = "abc"; //栈 s和"abc"都是栈上 8 char *p2; //栈 9 char *p3 = "123456"; //123456