因此Linux的作法是(TODO 这一块还不是很明白)node
进程描述符是一个数据结构(c的struct,相似Python的字典)linux
进程描述符里面有特定的字段,记录每一个进程的父进程,兄弟进程和子进程redis
有时候内核须要根据pid来获取进程描述符
因此内核会保存一个pidhash数据结构,是个hash表(c里面的hash表的实现和redis的hash表实现相似),key是pid,value是进程描述符缓存
进程切换,任务切换,上下文切换是同样的数据结构
每一个进程都有本身的地址空间(在内存),可是进程之间是共享寄存器的,因此进程的切换须要(硬件上下文是寄存器的数据):并发
上面的操做使用一个switch_to宏来实现,传入参数prev,next,prev。传入两次prev是怕切换上下文后,把第一个prev丢了。异步
Linux进程的特性:socket
建立进程的系统调用:函数
close()ui
vfork close函数的封装
内核进程是一直运行在内核态的
进程0
进程0是linux启动后的第一个进程,由它建立进程1
进程1
进程1也叫init进程,进程1会一直运行知道linux关闭
进程执行完指定的代码后,就会终止,这时必须通知内核回收进程的资源。
通常是exit系统调用,c编译程序会本身动把exit函数插入到main函数最后
内核能够强迫整个线程组死掉(例如收到kill -9)
进程删除 当进程终止后,进程会进入僵死状态,直到父进程调用wait4来获取进程的状态数据,而后进程就会被删除。 若是父进程已经不存在,进程会交给init进程托管,init进程会按期执行wait4命令来查看进程的状态,若是进程已经终止,就会删除这个进程