常见泽1 发表于 2024-12-30 18:30

《Linux内核深度解析》第二章 进程 理论学习(结合代码分析)

<p><span style="font-size:16px;"><span style="font-family:宋体;">进程进行状态之间的切换,这些工作都是有调度器来完成的</span></span></p>

<p ><span style="font-size:16px;"><span style="font-family:宋体;"> &nbsp;</span></span></p>

<p ><span style="font-family:宋体;"><span style="font-size:16px;">这一章学习结合了IMX6ULL的LINUX相关源码进行分析</span></span></p>

<p ><span style="font-size:16px;"><span style="font-family:宋体;">内核调度器的入口是一个名为 schedule() 的函数,该函数会调用 pick_next_task() 来选择下一个要运行的进程。调度器需要先和一个具体的调度类相关联,然后由后者去挑选下一个该运行的进程。</span></span></p>

<p >&nbsp;</p>

<p ><span style="font-size:16px;"><span style="font-family:宋体;"> &nbsp;</span></span></p>

<p ><span style="font-size:16px;"><span style="font-family:宋体;"> &nbsp;</span></span></p>

<p >&nbsp;</p>

<p ><span style="font-size:16px;"><span style="font-family:宋体;">切换进程的函数是context_switch函数,执行的工作如下</span></span></p>

<p ><span style="font-size:16px;"><span style="font-family:宋体;">Switch_mm_irqs_off负责切换进程的用户虚拟地址空间</span></span></p>

<p ><span style="font-size:16px;"><span style="font-family:宋体;">Switch_to负责切换处理器的寄存器</span></span></p>

<p >&nbsp;</p>

<p ><span style="font-size:16px;"><span style="font-family:宋体;">调度进程的时机如下:</span></span></p>

<ol>
        <li ><span style="font-size:16px;"><span style="font-family:宋体;">进程主动调用schedule()函数</span></span></li>
        <li ><span style="font-size:16px;"><span style="font-family:宋体;">周期性的调度,抢占当前进程,强迫当前进程让出处理器</span></span></li>
        <li ><span style="font-size:16px;"><span style="font-family:宋体;">唤醒进程的时候,被唤醒的进程可能抢占当前进程</span></span></li>
        <li ><span style="font-size:16px;"><span style="font-family:宋体;">创建新进程的时候,新进程可能抢占当前进程</span></span></li>
</ol>

<p >&nbsp;</p>

<p >&nbsp;</p>

<p ><span style="font-size:16px;"><span style="font-family:宋体;">摘抄网络上的一段话:</span></span></p>

<p ><span style="font-size:16px;"><span style="font-family:宋体;">fork创造的子进程复制了父进程资源,包括内存及进程描述符的内容,注意是资源的复制而不是指针的复制,当然,用户也不需要太大担心性能的问题,Linux采用的写时复制技术能让fork的性能大幅提升</span></span></p>

<p ><span style="font-size:16px;"><span style="font-family:宋体;">vfork的行为更像一个线程(指没有自已独立的内存空间),更明显的是vfork的调用将挂起当前进程(即父进程)</span></span></p>

<p ><span style="font-size:16px;"><span style="font-family:宋体;">相对上面两者而言,clone显得很复杂,根据flag的不同可以实现不同的功能</span></span></p>

<p >&nbsp;</p>

<p ><span style="font-size:16px;"><span style="font-family:宋体;">fork函数的实现主要是通过copy_process函数实现task_struct结构的创建和初始化,</span></span></p>

<p >&nbsp;</p>

<p ><span style="font-size:16px;"><span style="font-family:宋体;">fork系统调用代码</span></span></p>

<p ><span style="font-size:16px;"><span style="font-family:宋体;"> &nbsp;</span></span></p>

<p ><span style="font-size:16px;"><span style="font-family:宋体;"> &nbsp;</span></span></p>

<p >&nbsp;</p>

<p ><span style="font-size:16px;"><span style="font-family:宋体;">进程退出</span></span></p>

<p ><span style="font-size:16px;"><span style="font-family:宋体;">①、进程主动终止: 从main()函数返回,链接程序会自动添加到exit()系统调用; exit系统调用在内核定义如下\kernel\exit.c:</span></span></p>

<p ><span style="font-size:16px;"><span style="font-family:宋体;"> &nbsp;</span></span></p>

<p ><span style="font-size:16px;"><span style="font-family:宋体;"> &nbsp;</span></span></p>

<p >&nbsp;</p>

<p ><span style="font-size:16px;"><span style="font-family:宋体;">②、进程被动终止: 进程收到一个自己不能处理的信号;进程收到 SIGKILL等终止信息。</span></span></p>

freebsder 发表于 2024-12-31 11:49

<p>现在学Linux内核的帖子好少<img height="48" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/lol.gif" width="48" /></p>

常见泽1 发表于 2025-1-2 08:55

freebsder 发表于 2024-12-31 11:49
现在学Linux内核的帖子好少

<p>从入门到放弃,太难了,我这种门外汉</p>
页: [1]
查看完整版本: 《Linux内核深度解析》第二章 进程 理论学习(结合代码分析)