进程优先级:(主要针对cpu密集型)
优先级:决定了资源的优先分配权的等级划分
问: 为什么要有优先级?
答:让操作系统运行的更加合理。让用户体验更好
交互式进程:一旦有操作要优先处理(优先级要比较高才行)
批处理进程:一直处理数据,但是对CPU要求并不是太高
设置:ps -ef
PRI 优先级 NI nice值:PRI无法直接设置,但是可以通过设置NI值,进而调整PRI值
renice -n size -p pid nice -n size ./main
IO密集型程序 :这个程序内部是大量的io操作
CPU密集型程序:这个程序内部是大量的cpu运算(受优先级的影响)
并行:cpu资源足够,多个程序同时运行
并发:cpu资源不够,多个程序切换运行,同时推进
独立性:进程间相互独立
竞争性:狼多肉少,因此每个狼之间都具有竞争性
环境变量:保存系统运行环境参数的变量
环境变量作用:让操作系统的一些操作变得更加方便,使系统环境参数的配置更加灵活;可以向进程传递参数
查看:
echo :通过变量名称查看指定环境变量
env:查看所有环境变量
set :查看环境变量及临时变量
export :声明/设置一个环境变量
unset:删除一个变量
常见环境变量:HOME USER SHELL PWD PATH(重要)。。。
环境变量的继承特性:
在子进程中获取继承父进程的环境变量信息
Shell终端下所运行的进程能够获取到所有的环境变量,但是获取不到普通变量
main(int argc,char * argv[],char* env[]);参数获取
argc:第二个参数中有多少个
env[]:保存main函数中所有的环境变量
全局变量的获取:
extern char **environ;全局变量获取
char* getenv(const char*env_name)接口获取
环境变量的使用场景:
通常是父进程通过给子进程设置环境变量来达到向子进程传递数据的功能
程序地址空间:(百度网盘的例子)(就是程序的虚拟地址空间)
为进程提供连续虚拟地址,映射到物理地址,供程序使用,通过mm_struct实现的
虚拟地址空间的本质:操作系统为进程进行的一个虚拟内存描述(mm_struct)
每个进程都有一个独立的虚拟地址空间
进程中所访问到的实际都是一个虚拟地址
程序地址空间-》进程地址空间-》虚拟地址空间(内存描述符)
内存地址:就是内存区域的一个编号
一个全局变量,如果子进程中改变了这个数字的值,那么父进程的数值不会改变,这就导致同一个全局变量出现了两个数值,两个数字意味着就是两个变量,两个变量的地址肯定是不同的,但是通过程序验证得到两个地址一样,原因是他们都是用的相同的虚拟地址,但是真正的物理地址不一样,过程如下图。
操作系统通过虚拟地址空间向进程描述了一个完整的连续的虚拟地址空间,供进程使用,但是物理内存中进程数据的存储采用离散式存储(提高内存利用率),并且使用页表映射虚拟地址与物理地址的映射关系, 在页表中可以实现内存访问控制(标志位表示内存的访问权限)
虚拟地址空间(mm_struct):
虚拟地址空间,那么mm_struct如何描述一个地址空间(实际上就是一个结构体)
mm_struct:也叫内存描述符
{
ulong size;
ulong code_start;
ulong code_end;
ulong data_start;
ulong data_end;
}
直接使用物理内存:内存利用率低,缺乏内存访问控制
为什么要使用虚拟地址空间?
进程在通过访问虚拟地址进而获取变量数据,最终还是要去访问物理内存,因为数据是存储在物理内存中的,虚拟地址通过页表映射到物理地址,进而访问物理内存区域。虚拟地址是连续的,但是在物理内存中地址不一定连续。
页表:
不但记录了虚拟地址和物理地址的映射关系,还记录了这块地址的属性,实现内存访问控制。
使用程序地址空间的优点:
通过页表映射实现数据在物理内存上的离散式存储,提高了内存的利用率;
通过页表进行了内存访问控制
每个进程都有自己的虚拟地址空间,因此进程间保证了独立性。
进程间独立的好处
越独立越稳定,如果相互之间有联系,那么一个进程退出可能会导致另外一个进程退出
每个程序都需要连续的内存地址(物理)
进程调度:PCB是程序调度的基本单位,优先级其实就是数组的下标,下标越小优先级越高,用一个位图标记,每一位标记,判断位图中是0还是1
了解进程调度算法
1.先来先服务
2.短作业优先
3.高响应比优先调度算法
如果通过虚拟地址得到物理地址:分段式内存管理/分页式内存管理/段页式内存管理???
分段式内存管理:
内存地址的构成:段号+段内偏移
在内核中有个段表:有很多的段表项(物理段的起始地址)
解释:这是一个段表,左边存的是段号,通过段号找到右边的段起始地址,然后再拿到段内偏移(我想这个段内偏移应该是个给定的数值把),然后就找到了物理地址。
好处:对程序内存管理友好(对内存空间进行分段,什么代码段数据段啥的)
分页式内存管理:
内存地址的构成:页号+页内偏移
页表—有很多页表项
解释:通过地址中页号找到页表项,然后再拿到物理页号,再通过页表项中的物理页号加上页内偏移得到物理地址。进而得到地址中的数据。
好处:提高内存利用率
虚拟地址的构成:页号+页内偏移
为什么会有分页式内存管理?
如上图,假设有这样一种情况,内存总共有16G,其中一个程序占用了8M,另外另个分别是4M,现在有个5M的程序要运行,虽然剩余了8M,但是由于地址是不连续的,因此这个5M的程序没法运行,分页式内存管理就是解决这个问题的。
映射关系:页表
笔试题:
有2G内存,内存页大小是2048字节,现在有一个页表,物理内存块大小2048
有一个虚拟地址:5088,请问物理地址是多少?
5088/2048=页号
5088%2048=页内偏移
物理地址=5*2048+992
虚拟地址空间(内存指针)和页表共同使用:
提高内存利用率,增加内存访问控制,保证进程之间的独立性(虚拟地址空间和页表的作用)。
PCB里边就有虚拟地空间
页表如何通过虚拟地址获取物理地址进而访问物理内存?
虚拟地址由页号和页内偏移组成。
段页式内存管理:
段号+段内页号+页内偏移
问:创建子进程都发生了什么?(重要)
答:写时拷贝技术:子进程重新开辟一块内存空间,更新页表信息,修改自己的值。在物理内存中重新开辟了一片空间,虚拟地址空间不变,还是一样的(为了不影响父进程)
代码共享:代码段是只读的,所以子进程和父进程的代码肯定是一样的
进程的独立性:进程应该具有独立性,保证稳定
进程的O(1)调度算法:
CPU调度进程
段页式内存管理:(目前系统用的就是这种)
内存地址:段号+段内页号+页内偏移
段表项中包含页表起始地址
段内页表项中又包含物理页号
解释:通过段号在段表中找到段表项,通过段表项中的段内页表地址找到段内页表,通过地址中的段内页号在段内页表中找到页表项,通过页表项中的物理页号与业内偏移组成物理地址。
内存置换算法:
内存至于4G,但是要处理5G的程序怎么办?
swap分区也叫交换内存,内存不够的时候,将内存中的数据置换到交换分区中,腾出内存处理数据
FIFO:先进先出
LFU:最近最少频率未使用
LRU:最近最久未使用