进程线程?堆栈?傻傻分不清楚?

进程线程?堆栈?傻傻分不清楚?

进程线程的区分

进程线程?堆栈?傻傻分不清楚?

概念:

进程,是并发执行的程序在执行过程中分配和管理资源的基本单位,是一个动态概念,竟争计算机系统资源的基本单位。一个“死”程序被处理器调用就成了一个“活”进程。每一个进程都有一个自己的地址空间,即进程空间或(虚空间)。进程空间的大小 只与处理机的位数有关,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呢?

因为变量存在栈中先进后出了

相关推荐