【Linux 内核笔记】进程管理

本文详细探讨了Linux内核中的进程管理,包括进程创建、进程终结以及孤儿进程的处理。在进程创建时,主要涉及父进程与子进程的页表复制和进程描述符的初始化。在进程终结阶段,讨论了如何释放资源和设置退出状态。孤儿进程的解决方案是寻找新的父进程,通常是init进程。文章总结了核心过程,如copy_process和do_exit在进程生命周期中的关键作用。
摘要由CSDN通过智能技术生成

  • clone()-fork()-exec()-exit() 子进程结束ZOMBIE 父进程wait4()
    进程描述符task_struct进程所有信息 由thread_info分配。为了提高current宏找进程描述符的速度,方便使用偏移量计算进程描述符

  • 进程状态
    TASK_RUNNING
    TASK_INTERRUPTIBLE
    TASK_UNINTERRUPTIBLE
    TASK_ZOMBIE
    TASK_STOP

  • 用户空间——sys_call /异常——(进程上下文)内核空间

  • copy-on-write 写时拷贝其他以只读方式共享 fork()分配子进程页表和task_struck. vfork()不拷贝页表,其余同fork,在无写时拷贝时代有利。如今相差无几

进程创建

Unix:fork()exec()首先fork()拷贝父进程,区别pid和资源和统计量。fork()实际开销是复制父进程的页表以及给子进程创建唯一的进程描述符。exec()读取可执行文件载入地址空间运行。

  • clone() -> do_fork() -> copy_process():
      1. dup_task_struck()与父进程完全相同的内核栈thread_info ->task_struct
      1. 检查总进程数量小于max
      1. 区分父子进程:task_struct成员清零或初始值
      1. 子进程TASK_UNINTERRUPIBLE不被执行
      1. 更新进程描述符的flag成员copy_flags() PF_SUPERPRIV=0设置PF_FORKNOEXEC(未执行标志)
      1. 分配alloc_pid()
      1. clone()的输入参数中确定新进程行为方式和父子进程之间共享的资源种类 eg: clone(CLONE_VM| CLONE_FS | CLONE_SIGHAND,0)
      1. 扫尾,返回do_fork()指向子进程的指针

copy_process–复制父进程的内核栈进程描述符等–检查进程数量–进程描述符设置初始值–设置UNINTERRUPTBLE–更新flags–分配pid–分配共享资源–返回指针给do_fork()

  • 内核线程区别在于无独立地址空间 mm指针-> NULL 只在内核空间运行且由内核线程生成。 调用do_exit()退出,或内核其他部分调用kthread_stop()退出
进程终结
  • do_exit():
      1. 在进程描述符task_struct标志成员PF_EXITING
      1. del_time_sync() 删除内核定时器
      1. 若有BSD 进程记账功能 输出信息
      1. exit_mm() 释放占用的mm_struct若无其他进程使用此地址空间则彻底释放
      1. sem_exit() 释放信号
      1. exit_files(), exit_fs() 递减引用计数,若某引用计数为0释放资源
      1. exit_code()设为exit()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值