进程&&线程
- 进程:处于执行期的程序。
- 线程:在进程中活动的对象。
- 进程提供两种虚拟机制:虚拟处理器和虚拟内存。
- 内核把进程的列表存放在task list的双向循环链表中。
- linux通过slab分配器分配task_struct结构。用slab分配器动态生成task_struct。
- unix创建进程的方式:
①fork通过拷贝当前进程创建一个子进程。
②exec负责读取可执行文件并将其载入地址空间开始执行。
写时拷贝: 写时拷贝是可以推迟甚至免除拷贝数据的技术,fork正时采用这个机制,fork的时候,内核没有复制整个进程地址空间,而是让父子进程共享同一个拷贝。只有需要写入的时候,数据才会被复制。在此之前,只是以只读方式共享。
进程调度
- IO调度算法。
- 进程可以分为IO消耗型(读写频繁)和cpu消耗型(运算频繁)。io指进程大部分时间用来提交IO请求或是等待IO请求。
- 进程优先级,有两种,
①nice值,范围-20到19,默认值0.nice数值越大,越低优先级。nice实际是代表了时间片的比例,可以通过 ps -el 查看。
②实时优先级,范围0到99.与nice相反,数值越大,越高实时优先级。
4. 时间片:进程所获取的处理器时间和系统负载密切相关。这个比例还会受进程nice影响,nice值作为权重将调整进程所使用的处理器时间使用比。
5. 调度算法。完全公平调度(CFS),实现在kernel/sched_fair.c,他是针对普通进程的调度类。现代调度器有两个通用的概念:进程优先级和时间片。
6. CFS使用红黑树来组织可运行进程队列,并利用其迅速找到最小vruntime值的进程。
内存管理
- 内核把物理页作为内存管理的基本单位,从虚拟内存的角度,页就是最小单位。
- 内核把页划分成不同的区(zone)。
- linux主要使用四种区:
·ZONE_DMA 这个区包含的也能用来执行DMA操作。
·ZONE_DMA32 和ZONE_DMA类似,该区包含的页面可用来执行DMA操作;而和ZONE_DMA不同之处,这些页面只能被32位设备访问。
ZONE_NORMAL 这个区包含正常影射的页。
ZONE_HIGHEM 包含高端内存。
- 获取页
- kmalloc的GFP标志:
- vmalloc 和kmalloc :kmalloc函数确保页在物理地址上是连续的(虚拟地址自然也是连续的),vmalloc函数只确保在虚拟地址空间内是连续的,他通过分配非连续的物理内存块,再修正页表,再内存映射到逻辑地址空间连续区域中,其中,只有硬件设备需要得到物理地址连续的内存,所有硬件设备用到的任何内存区都必须是物理上连续的块,不仅仅是虚拟地址上的块。vmalloc会比kmalloc更消耗性能,所以vmalloc仅在不得已的情况下才被使用,典型就是为了获取大块内存。
- vmalloc原型:void * vmalloc(unsigned long size);
void * vfree(const void *addr);
没有GFP标志,这两个函数默认就是可以睡眠的,所以不能用于中断上下文中。 - slab层(即slab分配器)扮演了通用数据结构缓存层的角色。
- 管理区页框分配器,这里我们简称为页框分配器,在页框分配器中主要是管理物理内存,将物理内存的页框分配给申请者,而且我们知道也可页框大小为4K(也可设置为4M),这时候就会有个问题,如果我只需要1KB大小的内存,页框分配器也不得不分配一个4KB的页框给申请者,这样就会有3KB被白白浪费掉了。为了应对这种情况,在页框分配器上一层又做了一层SLAB层,SLAB分配器的作用就是从页框分配器中拿出一些页框,专门把这些页框拆分成一小块一小块的小内存,当申请者申请的是小内存时,系统就会从SLAB中获取一小块分配给申请者。它们的整个关系如下图:
设备与模块
- 所以unix系统,设备分为以下类型:块设备,字符设备,网络设备。
- 块设备,可以寻址,寻址以块为单位,支持重定位操作,也就是对数据的随机访问,块设备通常挂载成文件系统。
- 字符设备,是不可寻址的,仅提供数据的流式范文,就是一个个字符或者一个个字节访问。和块设备不一样,应用程序可以通过直接访问设备节点与字符设备交互。
- 网络设备,提供了对网络的访问,通过一个物理适配器和特定的网络协议进行的。他不是通过设备节点来访问,而是通过套接字API来访问的。
- 杂项设备,miscdev其实是一个简化的字符设备。