linux进程详解
冯诺依曼体系结构
操作系统(Operator System)
概念

设计OS的⽬的

进程
基本概念
描述进程的内核数据结构-PCB(进程控制块)
Linux操作系统下的PCB是: struct task_struct
task_ struct
查看进程









通过系统调⽤获取进程标⽰符


通过系统调⽤创建进程-fork
1.fork是一个系统调用,父进程调用fork,触发软中断,cpu陷入内核,将cpu的寄存器组保存在父进程的内核栈中,更新cpu的寄存器,栈指针是pcb中保存的内核栈栈顶,pc是中断向量表的入口函数,去中断向量表中找软中断处理函数,软中断处理函数根据cpu寄存器里的系统调用号,去系统调用表里执行对应系统调用,创建子进程pcb,拷贝父进程的进程地址空间mm_struct和文件描述符表files_struct,拷贝父进程内核栈,将父进程内核栈里的返回值寄存器里的值改成子进程pid,将子进程内核栈里返回值寄存器值改成0,更新子进程pcb中的寄存器组,使pc指向fork后下一条指令,然后将子进程pcb加入运行队列,等到子进程被调度,cpu就会从子进程pcb中获取寄存器
2.父进程fork系统调用执行完后从内核栈中恢复寄存器,然后返回用户态
3.子进程被调度cpu从其pcb的thread_struct中获取寄存器,然后执行fork后的下一条指令,也就是从内核栈恢复寄存器,然后返回用户态,在给int pid 写返回值时触发缺页中断,因为int pid所在的虚拟页对应的页表项中没有写权限,执行中断方法,找一个新的物理页拷贝原来的物理页,然后页表项指向新物理页,然后再写返回值给int pid,这就是为什么父子进程中int pid变量地址一样,因为是虚拟地址,但是int pid值却不一样,因为同样地址的虚拟页,页表项中对应的物理页不一样,所以有两个值,这两个值在不同的物理页
总结:pcb中的那套寄存器是用来实现进程调度的,cpu从进程的内核栈中的恢复的那套寄存器才是返回到用户态的
写时拷贝
fork创建子进程时pcb的mm_struct采用浅拷贝的模式,也就是说虚拟地址空间结构(vm_area_struct)和页表映射物理页(页表)父子进程是一样的,而且拷贝后会将父子进程的页表权限全部设为只读,当其中一个进程往某个地址写入时,mmu硬件找虚拟地址对应页表项,查看权限时是只读,mmu硬件会缺页异常,硬件电路已经编好了出现缺页异常怎么做了,就是cpu会陷入内核,执行14号中断函数,找一个新物理页,拷贝,然后修改页表项
进程状态
进程退出 和 僵尸进程、孤儿进程-CSDN博客
进程调度
进程的调度_进程的活动队列-CSDN博客
查看进程优先级和nice值
ps -l 以长格式打印进程信息