几个基本概念
操作系统
一个计算机系统有许多资源:CPU时间、内存空间、文件存储空间、I/O设备等等。操作系统扮演着这些资源的分配者的角色。面对为数众多而且可能相互竞争冲突的资源请求,操作系统必须决定如何为特定的程序和用户分配资源,并力求公平、高效。
进程的状态
初始态(正被创建),等待,就绪,执行,终止。
进程控制块
简称PCB,存储了某一具体进程的详细信息,包括:
1、进程状态;
2、程序计数器(指明了该进程将要执行的下一条指令的地址);
3、CPU寄存器(累加器、变址寄存器、栈指针、通用寄存器,以及条件信息等);
4、CPU调度信息(优先权、指向调度队列的指针和其它调度参数);
5、存储器管理信息;
6、记账信息(CPU 实时使用量、时间限制、账户数目、作业或进程数目等);
7、I/O 状态信息(包括分配给该进程的 I/O 设备的列表、打开的文件的列表等等)。
上下文切换
要将CPU分配给另一个进程,需要先保存当前进程的状态,然后载入新进程的存储状态,这个过程称为上下文切换。一个进程的上下文保存在PCB中,它包括了CPU寄存器值、进程状态和内存管理信息。明显,上下文切换纯粹只是CPU开销。
线程
每个进程至少有一个控制线程。线程是一个基本的CPU执行单元,更接近执行体的概念,有时也称为LWP(轻权进程)。它包含了一个线程ID、一个程序计数器、一组寄存器和一个堆栈,除此之外有独立的信号屏蔽字和线程私有数据。同一个进程中的线程共享整个内存空间,包括代码区和数据区以及其它的系统资源(如打开的文件描述符)。
虚拟内存
相对于物理内存(主存储区),Linux下有一个虚拟内存的概念,它是为了满足物理内存不足而提出的策略,实则是从磁盘空间(辅助存储区)分出来的一块逻辑内存,也称交换空间。详细点说,内核会将内存中暂时不用的信息写到交换区,这样物理内存便得到了释放,这块内存就可用作其它目的。
物理地址
物理地址是内存单元的地址,也就是被装入内存的内存地址寄存器的地址。
虚拟地址空间
在32位机器中,虚拟地址空间的大小为4G,虚拟地址亦即逻辑地址(运行程序时查看到的地址),由内存管理单元完成到物理地址的映射。内核将其分为两部分:最高的1G字节供内核使用,为“内核空间”;较低的3G字节供进程使用,为“用户空间”。进程可以通过系统调用进入内核。
任意时刻,一个CPU运行一个进程,所以对内核而言,只存在着一个4G的虚拟地址空间,当进程发生切换时,虚拟地址空间也相应的发生切换。进程的代码、数据等最终都是要装载到物理内存中运行的,因此必须通过某种机制将虚拟地址空间映射到物理地址,Linux采用了分页机制。因而为每个进程创建一个页表,以实现虚拟地址到物理地址的转化。
分页机制
把物理内存分成固定大小的块,称为帧(frame),把虚拟地址分成同样大小的块,称为页(page)。当一个进程执行时,它的页从辅助存储区装入到有效物理帧中,辅助存储区也被分为固定大小的块,这些块的大小与内存帧的大小相同。把虚拟地址分为两个部分:高位为页号,低位为页偏移。页号用于索引页表,页表包含了物理内存中每个页的基地址,将这个基地址与页偏移相结合即为实际的物理单元地址。一般每页的大小在512字节到16M字节之间,且总是为2的幂次方。