进程之间是相互独立的,无法看到各自的地址空间。但是对于线程而言,就不一样了,进程是承担系统资源的基本单位,线程是承担进程资源以及被调度的基本单位。
一个PCB代表一个线程,而线程的空间来自于进程分出的一小部分资源,对应了上面说的“线程是承担进程资源的基本单位”,这样的话,因为是承担了同一个进程的资源,所以有一部分资源是线程间可以相互看到的!!那么到底哪些内容是可以“共享”的呢??
原则上来说,大部分内容应该是可以共享的,了解了不能共享的,剩下的就是可以共享的内容了。这里主要了解一些听说过的内容。
即便是承担进程资源,唯独栈区不能分你一点,下面就列举出几种情况。
函数被调用的时候,要在栈上建立栈帧,此时函数的地址、函数的返回值、维护函数栈帧的寄存器(esp、ebp)都是私有的。栈上可能写了一些你自己定义的函数,如果其他线程能看到,岂不是相当于可以让一个陌生人随意拿你的东西。
CPU执行指令的信息保存在一个叫做程序计数器的寄存器中,每一条语句都有对应的地址,当线程的运行时间到了,线程就要排到运行队列的末尾等待,CPU在执行指令的时候,通过这个程序计数器的值可以知道上一次执行到哪个地方了。
线程既是承担进程资源的基本单位,也是被调度的基本单位。最开始我们也说了,一个线程可以看作是一个PCB,而在运行队列中轮流运行的就是PCB,一个PCB的运行时间到了,就要排到末尾。然而,一般谁先被调用,谁后被调用,是要根据优先级而定的,这个优先级决定了哪个线程先被调用。
当PCB的运行时间到了以后,此时就要排到运行队列的末尾。那么运行过程中产生的 大量临时数据以及 CPU暂停运行的位置信息,我们统称为上下文数据。
这个相比之下就很好判断了,虚拟内存地址空间可以被分成多个部分。除了栈区不能被共享外,堆区、全局区、代码区都是可以被共享的!除此之外,加载到内存的动态链接库也是可以被共享的!比如线程库pthread,就是放在了栈区和堆区中间的位置
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删