linux学习之线程
线程概念
- 线程是进程内的一个执行分支,是CPU调度的基本单位
- 进程是内核数据结构+进程代码和数据
线程理解
- 在代码段中,代码在进程中都是串行调用的(不考虑多线程)
- 但是进程创建消耗时间和内存,成本高。那么有没有一种方法,可以只创建task_struct,不创建地址空间和页表呢
- 如果要设计线程,那么我们的OS也要对线程进行管理。但是Linux因为进程和线程都是执行流,比较相似,所以就用进程来模拟线程,而windows就是分别涉及了数数据结构和算法
4. 我们在调度的时候,不用区分线程和进程,都是执行流。在Linux中,真正在调度的时候,可能是进程也可能是线程。但由于没有具体的线程调度算法。所以,Linux中的执行流是轻量级线程(小于进程,大于线程)
理解地址空间
问题
大家可以想一想:多个执行流是如何在进程地址空间中进行代码划分的?
复习
- 内存大部分是以4kb为单位
- 动静态库是进行集体编址,以4kb为单位
- 磁盘中的可执行程序,写到文件系统里,自然就是4kb
铺垫
- 我们一般将内存中4kb的数据块,叫做页框/页帧。这是操作系统进行内存管理的基本单位
- 我们想要管理内存中的数据块,创建一个Page结构体。而我们可以创建Page结构体数组,来方便管理
基本结构
- 虚拟地址被分为三块。分别是10byte、10byte、12byte
- 进程在刚开始加载的时候,不用加载整个页表,只需要根据虚拟地址的第一块来创建页表(一共有1024项,这张表叫做页目录)
- 页目录对应的各个二级页表的地址 在查找的时候,先在页目录进行查找
- 页表的一个单位是页表项,页表存储的是每一个4kb数据块(也就是页框)的起始地址
- 4kb还是太大了,我们要访问4kb中的某个区域,它的地址就是首地址+虚拟地址后十二位(因为2的12次方对应着4kb)这样就能找到每一个地址。虚拟地址的后12位,叫做页内偏移。
- 我们还可以在页表中加一些标志位 ,来表示内存数据块是用户用的还是内核用的
结语
下一篇文章会介绍进程控制。