一. 前言
在前文中,我们分析了内核中进程和线程的统一结构体task_struct
,并分析进程、线程的创建和派生的过程。在本文中,我们会对任务间调度进行详细剖析,了解其原理和整个执行过程。由此,进程、线程部分的大体框架就算是介绍完了。本节主要分为三个部分:Linux内核中常见的调度策略,调度的基本结构体以及调度发生的整个流程。下面将详细展开说明。
Collecting, sharing and creating knowledge
前文分析到Linux内核正式启动,完成了实模式到保护模式的切换,并做好了各种准备工作。下来就要看开始内核初始化工作了,源码位置位于init/main.c中的start_kernel()
,源码如附录所示。这包括了一系列重要的初始化工作,本文会介绍其中一部分较为重要的,但是详细的介绍依然会留在后文各个模块的源码学习中单独进行。本文的目的在于承接上文给出一个从内核启动到各个模块开始运转的过程介绍,而不是详细的各部分内容介绍。
创建0号进程:INIT_TASK(init_task)
异常处理类中断服务程序挂接:trap_init()
内存初始化:mm_init()
调度器初始化sched_init()
剩余初始化:rest_init()
Linux操作系统内核是服务端学习的根基,也是提高编程能力、源码阅读能力和进阶知识学习能力的重要部分,本文开始将记录Linux操作系统中的各个部分源码学习历程。
关于如何学习源码,个人觉得可以从以下角度入手,有效地提高阅读和学习的效率。(学习语言就不说了,这是基本功。学习IDE推荐Source Insight或者Visual Studio,网站源码阅读推荐woboq)
本人是重度游戏爱好者,MMORPG当然也体验过很多,从早期的传奇、奇迹到冒险岛,从天下三、剑网三到天刀、逆水寒,其中有一个共同的问题:人一多就卡。拿剑网三举例,大攻防小攻防简直不要太卡,尤其是一波对冲,如果你不屏蔽人物、不降低画质,那简直就是在作死的边缘试探。为此,本文试分析如何解决MMORPG中多人对战造成的卡顿问题。
卡顿分为个人电脑卡顿和服务器卡顿两种。其中个人卡顿可能是由于显卡性能不够(引擎优化不够)、内存不足(客户端优化不够)、网络延迟高(大多数是因为网太垃圾了,也有可能是客户端服务端优化不足)等原因导致。这些不在本文的讨论范围内,因为每一个展开都会是极多极难的问题,本文仅专注于讨论大攻防时由于人多导致的服务器卡顿问题,即如何做到一个玩家在进行大规模对战时游戏体验和JJC以及战场体验接近或者相同的问题。