线程概念
1.再谈进程地址空间和页表
进程中使用malloc/new都是在虚拟内存中开辟的空间,需要通过页表与物理内存建立联系以后才能拥有真正的物理空间,也就是说一个进程能看到多少资源取决于进程地址空间,但这个资源是否有效则取决于页表是否与物理内存之间建立映射关系,也即是进程地址空间是一个进程的资源窗口,页表决定进程到底有多少资源
页表分为用户级页表和内核级页表,OS为了区分页表的权限就必须要为页表设置属性,因此页表中不但要保存虚拟地址和物理地址还要存放一系列相关属性
页表并不简单,在32位系统下,一共有2^32 个地址(每个地址单位是一字节);如果要为每个地址设立一个页表条目则需要2^32次方个页表条目,而一个页表条目中除了要存放地址之外,还要存放一些相关属性,假设这些总共占用6个字节,那么存放一个页表就需要24GB的空间,因此虚拟地址到物理地址之间的映射并不像我们之前讲的那么简单
首先我们来认识一下物理内存,OS为了方便对物理内存做管理,将其划分成了若干个4KB大小的数据页,并设置了struct Page{}结构体,最后通过数组(struct Page mem[])的方式来管理这些数据页,这些数据页也被称为页框;这就是为什么外设和文件系统进行交互的时候是以4KB为单位的;数据在被加载到内存中之前也早已被划分为一个个4KB大小的块了,这些块也被称为页帧; 管理内存除了要有对应的数据结构以外还要有对应的管理算法,一般Linux当中常用的管理算法就是伙伴系统
其实页表是类似于索引管理的,以32为系统为例,一个地址有32个比特位,以10 10 12的方式构成;最开始的10位比特位是页目录的位置,一共有2^10 个目录;随后的10个比特位就是页表项的位置,一个页目录对应一个页表项,而一个页表项中又有2^10 个栏目,页表项的栏目中存放的就是页框的起始地址,最后的12位就是代表该地址在页框中的偏移量(2^12=4KB,这就是为什么是以4KB为单位的)
CPU中集成了MMU,虚拟到物理的转换,MMU也参与,那么为什么要采用页表 MMU的方式:硬件的速度远快于软件,因为软件要执行首先要被加载到CPU中,还有时间片的限制,但是硬件就没有;不过硬件一旦确定就存在可扩展性差和可维护性低的缺点,所以需要软件来进行灵活管理
2.什么是线程