进程管理
进程:
描述进程西南西的结构或者进行进程管理和控制 --PCB
进程实体部分 – 有序指令 数据
系统管理进程(可执行程序代码+各种资源及处理器状态等等)是通过PCB(进程描述符)来记录这些数据,从而管理进程。
操作系统管理PCB是通过双向循环链表管理,链表中每一项都是task_struct,该结构在32位机器中大小约17k
1.执行程序时,要生成一个进程,先申请PCB,然后加载程序部分
2.一个进程结束时,先释放实体部分,再释放PCB
僵尸进程:进程实体释放与其PCB释放有时间差(PCB释放需要一定条件),进程实体被释放,但是PCB没有释放(操作系统看一个进程是否存在是看PCB是否存在)
进程的状态:
逻辑上:
就绪:所有资源准备完毕,只等CPU空闲调度执行
执行:CPU正在执行进程中的指令
阻塞:等待某些事件的发生
时间片具体参考时间片轮转法
内核中的状态:
并发并行
并行需要依赖硬件支持(双核,四核,八核)
程序到进程的加载过程:简单分页(将内存划分成大小相等的固定的区块,一般4k)
磁盘的页帧和程序的页通常大小相同
操作系统为每一个进程维护了一个页表:页表中记录程序的所有的页号加载到内存上后,对应的页帧标号
逻辑地址:在程序中的相对地址
物理地址:在物理内存上的绝对地址
printf打印的地址是逻辑地址
交换分区:在磁盘上开辟的一块空间,是对内存的一个补充
一个进程执行时,并不需要进程的所有页都时刻在内存上。进程当前不需要的页就会被保存在交换分区上。(内存不足时)
1.在内存上驻留更多进程
2.可以执行比内存大的进程
操作系统的发展:
1.串行处理
2.批处理
3.多道程序设计
4.分时系统 实时系统
输出缓冲区问题:
此段代码执行结果为:睡眠五秒,然后打印helloworld
因为第一个printf无 \n ,所以先不会输出
printf是将内容写入到输入缓冲区,缓冲区刷新到界面上需要一定条件:
1.遇到“\n”
2.主动刷新缓冲区 fflush(stdout);
3.进程结束(exit或者_exit)_exit不会刷新缓冲区中的数据而直接结束进程
4.缓冲区满
缓冲区意义:提高程序执行效率
主函数参数:int main(int argc,char argv[] , char envp[ ]);
argc:传给主函数的参数个数(默认只有一个)
argv:传递给主函数的参数列表,字符指针数组,传递的都是字符串
envp:传递的环境变量列表
参考:
- Linux内核设计与实现(第三版)
- Linux系统编程