管理进程的结构
进程控制块(pcb,也称进程描述符)。每个进程描述符中有关于该进程的进程号(pid),指令,数据,状态等信息。一个计算机中所有的pcb是以双向循环链表这种数据结构连接在一起的。
僵死进程:当进程主题被释放,而进程的pcb结构还存在时,这样的进程就被称为僵死进程(造成这种情况的一种原因是子进程已经结束但是父进程未结束,子进程就是一个僵死进程)。
操作系统内存管理方式:分页分段机制
操作系统启动时会将内存划分成等大小的一些区域,每个区域称之为页帧(大小为4k)。运行一个程序时,系统会为其在内存上的进程维护一个页表,由于在磁盘中存储程序时,也是按页存储,因此可以将该程序的每一页和内存上其所映射到的页帧一一对应(一个进程一个页表,而不是一个磁盘上的程序)。
页帧:
页表:
要查找一个指令或者一个数据的地址时,会根据该进程的页表查找到该指令或者数据所在内存中的页帧的地址,再加上其逻辑地址就是它在内存上的地址,假设一个数据在第一页的逻辑地址为256的地方,则根据该进程的页表可以确定该数据在下标为3的页帧上,由于在内存中的地址是从0开始偏移,每个页帧的大小为4k,则可以确定该数据在内存中的地址为:3*4k + 256(以上面的进程为例)
主函数的参数
主函数并不是像我们所想的那样没有参数,每个主函数都会有3个参数,int argc,char *argv[],char *envp[]。表示的含义分别为:传递给主函数参数的个数,参数列表,环境变量,注意参数列表中至少有一个参数,即argc>=1。(程序本身就是第一个参数)
输出缓冲区
每个进程都会有一个缓冲区,一般大小约为1M(1024k),使用标准输出函数输出的字符会先被输出到缓冲区中,当缓冲区满或者有其他可以刷新缓冲区的条件满足时,才会将缓冲区的内容输出到界面上。
缓冲区刷新的条件
- 遇到“\n”(换行符)
- 调用fflush函数主动刷新缓冲区
- 缓冲区满
- 进程结束
注意:如果以_exit函数结束进程,则不刷新缓冲区