1.进程和线程的区别
(1)调度。进程时资源的分配单位,线程作为调度和分派的单位。在同一进程内,线程的切换不会引起进程的切换,而只有由一个进程中的线程切换到另一个进程中的线程时,才会发生进程切换。
(2)并发行。一个进程内的多个线程同样可以并发执行,因为系统具有更好的并发性。
(3)系统资源。在引入线程的操作系统中,线程称为被调度和分派的基本单位。基本不拥有资源,只有一些运行必需的资源,如程序计数器,一组寄存器和栈,但它可以和进程内其他线程共享进程所拥有的全部资源,即代码段,数据段,以及系统资源如文件描述符,I/O设备等等。
(4)系统开销。在创建和撤销进程时,系统都要进行资源分配和回收,如内存空间,I/O设备等,因此操作系统需要的时空开销显著大于线程创建和撤销的开销。在进程进行切换时,涉及当前进程的进程映像的保存,以及新选择进程的进程映像设置,而线程的切换只需保存和设置少量的寄存器内容,并不涉及存储器管理方面的操作。同一进程内多个线程具有相同的地址空间,因而线程之间的同步和通信也变得更加容易。
摘自《操作系统教程》范策 李畅主编。
2.线程私有栈空间
线程栈空间是开辟在进程的堆区域的。注意不是开辟在进程的栈区域。
每个线程维护一个控制块
{
…
void * stackaddr; //线程栈的位置
size_t stacksize; //线程栈的大小
…
}
每个线程有自己的执行堆栈,程序计数器,通用寄存器组和状态标记。
此处总结不完善,留待日后知识更加完备时来补充。
3.说说虚拟地址空间
1.为什么需要?
(1)主存和磁盘通信的数据交互的效率很低。虚拟存储器把主存看成是一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,并根据需要在磁盘和主存之间来回传送数据,通过这种方式高效使用主存。
(2)为每个进程提供一致的地址空间,从而简化了存储器管理。
(3)它保护了每个进程的地址空间不被其他进程破坏。
2.如何工作?
从页表,地址翻译,虚拟存储器与物理存储器,页命中与缺页这几个方面回答。
3.具体说说每个linux进程的虚拟存储器
包括哪些区域,每个区域特征
4.fork后父进程和子进程的栈变量,堆变量,全局变量,静态变量,常量是私有还是公有的?
全都是私有的。
当调用fork函数后,内核为新进程创建各种数据结构,并分配给它一个唯一的PID,所以是一个完整的进程。为了给这个新进程创建虚拟存储器,它创建了当前进程的mm_struct,区域结构和页表的原样拷贝,然后把两个进程的每个页面都标记为只读,并将两个进程中的每个区域结构都标记为私有的写时拷贝.进程进行写操作时,写时拷贝机制就会创建新页面.