进程概念:程序运行起来称之为进程。进程使用task_struct来表示自身信息。pid,各种链表,状态,内核栈SP,地址空间分配、文件描述符、及其他各种资源分配情况、时间片、进程统计信息等。
内核态和用户态:保护模式下,进程运行状态分为用户态和内核态。进程的地址空间一共有4G(32bitsOS),最高的1G为各进程共享的内核数据映射。用户态进程只能访问用户地址空间数据(小于3G),内核态进程可以访问所有地址空间。进程使用段页管理虚拟内存,GDT中对应内核段的基址(0)与用户段的基址(3G)不同。根据段描述符(CS,DS)的值判断该进程是内核态或用户态进程。用户态进程只能访问进程自己的地址空间,使用用户态堆栈;内核态进程可以访问内核堆栈(与task_struct在同一物理页),同时也可以访问用户态堆栈。
进程状态的切换:从用户态到内核态的转换称为切换。引起的原因有系统调用和中断。系统调用户中断产生时,页表切换为新进程的页表,CS/SP切换为内核态段选择符,IP切换为系统调用的目标地址,通过iRet指令切换。
进程切换:根据调度算法,当从中断或系统调用返回时,如果进程的时间片用尽,会发生进程切换。新选中的进程占领CPU,CS,mm和SS栈更换为新进程的环境。需要说明,在内核态运行的进程不能被切换出去,进城切换的时机只能是当前进程从内核态转到用户态的时候(例如中断和系统调用)
信号:signal的信息保存在task_struct中,发送信号(kill)会更新目标进程的task_struct,但是只有在从内核态返回用户态时,才对进程的信号队列进行检查并进行处理。
进程关系:根据父子关系,进程状态等进程排入到各种链表中。0号进程是init进程,是所有孤儿进程的父进程
进程间通信:信号-直接修改task_struct;文件映射-线性地址映射同样的物理页面;pipe:管道文件系统,通过文件系统API进入内核;系统V共享内存,信号灯,消息队列:内核数据结构