进程概念: 进程时操作系统调度程序运行的灵魂 ----pcb,在linux 下是task_struct
进程查看: ps -ef ; -aux /proc(保存) getpid()
进程创建: 操作系统通过复制调用进程创建一个新的子进程 fork()
复制:复制父进程的pcb(代码共享,数据独有) 父进程PPID 子进程PID
创建子进程的意义:分担压力;单独完成其他任务;
返回值:对于父进程,返回值是子进程的pid>0;对于子进程,返回值是0;出错返回-1
进程状态:运行态R,可中断睡眠态S,不可中断睡眠态D,停止态T,僵死态Z;
僵尸进程:处于僵死状态的进程 进程退出了,但是资源没有完全释放;
产生原因:子进程先于父进程退出,退出后操作系统通知父进程,获取子进程返回值,
并且允许操作系统释放子进程资源(没有完全释放是为了保存退出原因),父进程没有关注子进程的退出,这时候子进程处于僵死状态成为僵尸进程;
退出方式:退出父进程;
避免方式:进程等待
孤儿进程:父进程先于子进程退出,子进程成为孤儿进程,运行在系统后台,父进程成为1号进程
守护进程和精灵进程
环境变量:用于存储系统运行环境参数的变量----让系统的参数设置更加简单
环境变量相关命令:
查看环境变量: env set echo
添加环境变量: export
删除环境变量: unset
常见环境变量: HOME USER PWD SHELL PATH
环境变量特性:全局特性(父子进程之间的继承关系,父进程设置了子进程的环境变量)
代码中操作环境变量: main函数值第三个参数 int main(int argc,char *argv[],char*enxv[])
全局变量
函数
程序地址空间:
内存地址:内存区域的一个编号
程序地址空间:进程的虚拟地址空间---虚拟地址 mm_struct
{ ulong mem_size
ulong code_start
ulong code_end }
每个程序都有一个“连续”的地址空间 分页式当剩余内存小于所需要运行的内存,
我们所看到的程序地址空间实际是一个虚拟地址空间,是操作系统通过mm_struct这个结构体为进程描述的一个空间,陶瓷有时候也称作内存描述符
为什么要使用虚拟地址空间呢?
进程在通过访问虚拟地址进而获取变量数据,最终还是要去访问物理内存,因为数据是存储在物理内存中的
在虚拟地址和物理地址之间通过“页表”进行地址映射,转换得到物理地址。进而访问物理内存区域
通过映射之后,物理地址可就不一定连续了,通过这种映射转换的方式实现数据的离散存储提高内存利用率
“页表”中不但记录了虚拟地址和物理地址的映射关系,并且还记录了这块地址的属性实现内存访问控制
写时拷贝技术:操作系统通过复制父进程创建子进程,子进程初始时与父进程指向同一块物理内存区域,当内存数据发生改变时,会为子进程重新开票内存更新页表
进程的独立性:独立更加稳定
虚拟地址空间和页表的作用: 提高内存利用率;增加访问控制;保持进程独立性;
虚拟地址怎样转换成物理地址: -----------------有图片C理解
分段式内存管理:内存地址的构成---段号+段内偏移
段表--有很多的段表项(物理地址的起始地址)
分页式内存管理: 内存地址的构成---页号+页内偏移
页表--有很多的页表项
段页式内存管理: 段号+段内页号+页内偏移
段表项中又有段内页表起始地址
段内页表中又包含物理页号
分段式:通过地址中的段号去段表中找到段表项,通过段表项中物理起始地址加上地址中段内偏移获取到物理地址
分页式:通过地址中的页号找到页表项,通过页表项中的物理页号加上页内偏移获取到物理地址
段页式:通过段号在段表中找到段表项,通过段表项中的段内页表地址找到段内元素,通过地址值段内页号在段内页表中找到页表项,通过页表中的物理页号与页内偏移组成物理地址
内存置换算法:
swap交换分区: 内存不够时,将内存中暂时不使用的数据置换到交换分区,腾出内存,处理数据
三种算法:FIFO: 先进先出
LFU: 最近最少频率未使用
LRU: 最近最久没使用