进程线程?堆栈?傻傻分不清楚?
进程线程的区分
概念:
进程,是并发执行的程序在执行过程中分配和管理资源的基本单位,是一个动态概念,竟争计算机系统资源的基本单位。一个“死”程序被处理器调用就成了一个“活”进程。每一个进程都有一个自己的地址空间,即进程空间或(虚空间)。进程空间的大小 只与处理机的位数有关,32 位处理机的进程空间大小为 2^32 。进程至少有 5 种基本状态,它们是:初始态,执行态,等待状态,就绪状态,终止状态。
线程,在网络或多用户环境下,一个服务器通常需要接收大量且不确定数量用户的并发请求,因此,操作系统中引进了线程。线程,是进程的一部分,一个没有线程的进程可以被看作是单线程的。线程有时又被称为轻权进程或轻量级进程,也是 CPU 调度的一个基本单位。
区别:
线程的改变只代表了 CPU 执行过程的改变,而没有发生进程所拥有的资源变化。计算机内的软硬件资源的分配与线程无关,进程上下文切换,这些资源都是要被保护起来的。
进程拥有一个完整的虚拟地址空间,不依赖于线程而独立存在;反之,线程是进程的一部分,没有自己的地址空间,与进程内的其他线程一起共享分配给该进程的所有资源。
堆栈的区分
栈和堆的区别:
栈是机器系统提供的数据结构,而堆则是C/C++函数库提供的。
从以上知识可知,
· 栈是系统提供的功能,特点是快速高效,缺点是有限制,数据不灵活;而堆是函数库提供的功能,特点是灵活方便,数据适应面广泛,但是效率有一定降低。
· 栈是系统数据结构,对于进程/线程是唯一的;堆是函数库内部数据结构,不一定唯一。不同堆分配的内存无法互相操作。
· 栈空间分静态分配和动态分配两种。静态分配是编译器完成的,比如自动变量(auto)的分配。动态分配由malloca函数完成。栈的动态分配无需释放
从数据结构方面区分:
堆实际上指的就是(满足堆性质的)优先队列的一种数据结构,先进先出;
栈实际上就是满足先进后出的性质的数学或数据结构。
举例js中的堆栈
基本类型:存放在栈内存中的简单数据段,数据大小确定,内存空间大小可以分配。
5种基本数据类型有Undefined、Null、Boolean、Number 和 String,它们是直接按值存放的,所以可以直接访问。
引用类型:存放在堆内存中的对象,变量实际保存的是一个指针,这个指针指向另一个位置。每个空间大小不一样,要根据情况开进行特定的分配。
当我们需要访问引用类型(如对象,数组,函数等)的值时,首先从栈中获得该对象的地址指针,然后再从堆内存中取得所需的数据。
例子:
var num = 5;
function start(num){
if(num>3){
start(--num);
}
alert(num);
}
start(num);//调用 3 3 4
为什么alert的是3->3->4,不是4->3->3呢?
因为变量存在栈中先进后出了