Linux内核进程创建、销毁

Linux内核进程创建、销毁

进程创建

进程创建方式

传统UNIX内核
  1. 复制父进程所拥有的资源
    • 建立新的内存映射关系
    • 栈空间
  2. 创建:页目录、页表不一样
  3. 创建:页框内容一样
现代UNIX内核
  1. 写时复制技术
    • 建立新的内存映射关系
    • 页保护
    • 写时创建页框,修改映射关系
  2. 创建:页目录不一样,页表一样
  3. 创建:页框内容一样
  4. 运行:页目录不一样,页表不一定一样
  5. 运行:页框内容不一定一样
  6. 轻量级进程
    • 页表共享
    • 文件表
    • 信号处理
  7. vfork系统调用
    • 内存地址共享
    • 父进程阻塞

创建一个进程

用户进程创建接口
  1. clone() ---- 轻量级进程
  2. fork() ---- clone()
    • 子进程是父进程的完整副本,复制了父亲进程的资源,包括内存的内容task_struct内容
  3. vfork() ---- clone()
    • 子进程与父进程共享数据段,而且由vfork()创建的子进程将先于父进程运行

进程创建步骤

进程创建流程
  1. do_fork()功能:处理进程创建产生的系统调用
  2. 查找pidmap_array位图,分配新PID
  3. 父进程被跟踪current->ptrace检测
  4. 调用copy_process()复制进程描述符
  5. 启动标志CLONE_STOPPED检测
  6. vfork标志CLONE_VFORK检测
  7. 结束并返回PID
进程描述符创建
  1. copy_process()功能:创建进程描述符
  2. 入参clone_flags检测
  3. 调用dup_task_struct()获取进程描述符
  4. 初始化进程描述符中的list_head数据结构、自旋锁
  5. 复制信号量、文件表、信号、页表和命名空间
  6. 复制clone()前的CPU寄存器值
    • 使子进程返回0
  7. 调用sched_fork()初始化新进程调度程序数据结构
    • 切换到running状态
  8. 把新进程描述符插入进程链表
  9. 把新进程PID插入pidhash[PIDTYE_PID]散列表
  10. 终止并返回子进程描述符
进程创建标志

标志

含义

CLONE_PARENT

创建的子进程的父进程是调用者的父进程,新进程与创建它的进程成了“兄弟”而不是“父子”

CLONE_FS

子进程与父进程共享相同的文件系统,包括root、当前目录、umask

CLONE_FILES

子进程与父进程共享相同的文件描述符(file descriptor)表

CLONE_NEWNS

在新的namespace启动子进程,namespace描述了进程的文件hierarchy

CLONE_SIGHAND

子进程与父进程共享相同的信号处理(signal handler)表

CLONE_PTRACE

若父进程被trace,子进程也被trace

CLONE_VFORK

父进程被挂起,直至子进程释放虚拟内存资源

CLONE_VM

子进程与父进程运行于相同的内存空间

CLONE_PID

子进程在创建时PID与父进程一致

CLONE_THREAD

Linux 2.4中增加以支持POSIX线程标准,子进程与父进程共享相同的线程群

进程销毁

销毁进程的理由

资源回收

  1. 内存
  2. 文件
  3. 信号量

终止一个进程

用户态
  1. exit()
  2. pthread_exit()
核心态
  1. exit_group() ---- 终止线程组
    • do_group_exit()
  2. exit() ---- 终止某线程
    • do_exit()
终止current线程组
  1. 检查SIGNAL_GROUP_EXIT标志
  2. 调用zap_other_threads()杀死current线程组中的其它进程
    • 遍历线程组
    • 发送SIGKILL信号
  3. 调用do_exit()终止自身
终止线程
  1. 设置删除标识PF_EXITING
  2. 释放内存页exit_mm()
  3. 释放信号量exit_sem()
  4. 释放文件描述符exit_fs()
  5. 更新父进程和子进程的亲属关系
  6. 重新调度schedule()

进程被终止之后

进程设计逻辑
  1. UNIX允许进程查询内核以获得其父进程的PID,或者其任何子进程的执行状态。
  2. UNIX内核在进程一终止后不会就丢弃包含在进程描述符字段中的数据。
僵死进程
  1. 技术上来说进程已死,但必须保存它的描述符,直到父进程得到通知。
  2. 如果父进程在子进程结束前结束如何处理?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值