进程和线程(待续) 一、定义

教科书式回答,进程是资源分配的最小单位,而线程是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