- 博客(14)
- 资源 (7)
- 收藏
- 关注
原创 CFS 调度器数据结构篇
在上一节我们了解了CFS的设计原理,包括CFS的引入,CFS是如何实现公平,CFS工作原理的。本小节我们重点在分析CFS调度器中涉及到的一些常见的数据结构,对这些数据结构做一个简单的概括,梳理各个数据结构之间的关系图出来。调度类CFS调度器是在Linux2.6.23引入的,在当时就提出了调度类概念,调度类就是将调度策略模块化,有种面向对象的感觉。先来看下调度类的数据结构,调度类是通过str...
2020-02-28 18:53:05 913
原创 CFS Scheduler(CFS调度器)
前面我们分享了O(n)和O(1)调度器的实现原理,同时也了解了各个调度器的缺陷和面临的问题。总的来说O(1)调度器的出现是为了解决O(n)调度器不能解决的问题,而O(1)调度器在Linux2.4内核的在服务器的变形是可行的,但是Linux2.4以后随着移动设备的逐渐普遍,面临的卡顿问题逐渐明晰,这才导致后来的CFS调度器的出现。今天我们来学习CFS调度器,再分析代码之前,我们可以先看下内...
2020-02-27 18:15:21 1878
原创 Linux O(1)调度器
前面我们学习了O(n)调度器的设计,以及它的核心算法。在这里复习下。O(n)调度器核心:O(n)调度器采用一个runqueue运行队列来管理所有可运行的进程,在主调度schedule函数中会选择一个优先级最高,也就是时间片最大的进程来运行,同时也会对喜欢睡眠的进程做一些补偿,去增加此类进程的时间片。当runqueue运行队列中无进程可选择时,则会对系统中所有的进程进行一次重新计算时间片的操...
2020-02-23 13:11:07 1139
原创 Linux O(n)调度器
前面我们学习了调度器的设计需要关注的几个点,在这里复习下:吞吐量(对应的是CPU消耗型进程) 响应速度(对应的是IO消耗型进程) 公平性,确保每个进程都可以有机会运行到 移动设备的功耗Linux中调度器的设计,引入的概念普通进程和实时进程使用优先级区分,0-99表示实时进程,100-139表示普通进程 实时进程采用两种调度策略SCHED_RR或者SCHED_FIFO 普通进程采...
2020-02-21 18:32:08 847
原创 进程调度开篇
在前面的几篇文章中,我们重点分析了如果通过fork, vfork, pthread_create去创建一个进程或者线程,以及后面说了在内核层面do_fork的实现。目前为止我们已经了解到一个进程是如何创建的。既然创建了一个进程,那这个进程肯定要去运行,执行它的使命。而进程何时被执行,在计算机系统中需要调度器来选择。所以我们从今天要开启一系列调度相关的知识了。为何要有调度器计算机设...
2020-02-20 18:32:40 458 1
原创 do_fork实现--下
昨天在do_fork实现–上中学习了do_fork创建的前半段,今天我们接着继续分析copy_Process函数分析了copy_fs, copy_files, copy_signal, copy_sighand, copy_mm,今天接着分析copy_thread, copy_thread是和架构相关的,需要到具体的ARCH目录下去看在分析copy_thread之前,我们先看几个知识...
2020-02-19 20:14:49 1125
原创 do_fork实现--上
在前面几节中讲述了如何通过fork, vfork, pthread_create去创建一个进程,或者一个线程。通过分析最终fork, vfork, pthread_create最终会通过系统调用clone去创建进程。今天我们就重点来分析clone之后的事情。为了学习今天这一节,前面的都是铺垫。既然fork, vfork, pthread_create都去调用到clone这个系统调用,...
2020-02-18 20:06:05 535
原创 Linux0号进程,1号进程,2号进程
本节我们将从linux启动的第一个进程说起,以及后面第一个进程是如何启动1号进程,然后启动2号进程。然后系统中所有的进程关系图做个简单的介绍0号进程0号进程,通常也被称为idle进程,或者也称为swapper进程。0号进程是linux启动的第一个进程,它的task_struct的comm字段为"swapper",所以也成为swpper进程。#define INIT_TASK_CO...
2020-02-17 20:07:26 8365 6
原创 ThreadInfo结构和内核栈的两种关系
本来本节是要学习内核启动的第一个进程的建立,也就是0号进程,也称idle进程,也称swapper进程。但是在学习第一个进程建立之前需要先学习threadinfo和内核栈的关系。目前内核存在两种threadinfo和内核的关系,接下来我们通过画图一一举例说明。ThreadInfo结构在内核栈中Threadinfo结构存储在内核栈中,这种方式是最经典的。因为task_struct结构...
2020-02-16 18:53:19 2448 4
原创 僵尸进程
之前在第一节进程的基本概念中讲到进程的状态的时候,提到进程的状态中存在一个僵尸状态。今天我们重点来分析下什么是僵尸进程,僵尸进程是如何产生的,以及僵尸进程如何灭掉,僵尸进程产生的原理。先来看一个在之前遇到的例子:Tasks: 779 total, 6 running, 753 sleeping, 0 stopped, 20 zombie Mem: 7.3G total, 6....
2020-02-15 17:59:34 629
原创 线程的创建以及线程的本质
上节详细学习了进程的创建,通过实例学习了fork和vfork的区别。本节将学习线程的创建,只涉及应用层的线程,内核线程的创建在后面学习。应用线程的创建应用线程的创建,想必大家都有所了解。使用pthread_create库函数来创建应用线程。通过一个简单的例子来看下。我们先来看下pthread_create的参数,通过man pthread_createNAME pt...
2020-02-14 15:44:00 871
原创 进程的创建fork vs vfork
上一篇文章学习了进程的基本概念,以及进程的状态,最后学习了Linux中是如何描述一个进程的。本节来学习Linux中进程是如何创建的,以及fork和vfork的区别。在大学的时候操作系统课程中我们都学过如何去创建一个进程,是通过fork系统调用命令来创建的。使用fork创建进程如下是一个简单的通过fork系统调用来创建子进程的例子#include <stdio.h>...
2020-02-12 18:13:12 797
原创 进程的基本概念
本系列文章将重点学习分析进程的相关内容,包括进程的基本概念,进程的创建,fork,vfork,clone等系统调用是如何创建进程的,linux内核是如何描述一个进程的,以及进程的调度算法学习,比如CFS调度算法等相关内容。其中前提的准备工作:以linux5.0内核代码为基础学习 以ARM64架构来实践学习过程中会通过实践+阅读内核源代码+图文并茂的方式来呈现进程管理的相关内容。为什...
2020-02-11 19:55:13 301
原创 2020年学习规划
时隔两年已经没有写文章了,在这两年中收获了很多,但是发现到用的时候总是想不起来,所以打算从2020年开始继续培养写文章的好习惯。2020年过年刚好赶上了肺炎,一下子在家呆了快一个月了。在家实在无聊的时候翻阅了前几年买的Linux内核书籍,突然发现以前看不懂的内容突然可以看懂了,以前不理解的知识点,现在居然恍然大悟。所以下定决心,需要在2020年,再次踏上学习linux内核的道路。虽然学习li...
2020-02-07 11:16:37 703 3
ARMGIC手册详解.zip
2020-03-21
ARM_v8_architecture参考手册.zip
2020-03-21
ARMv8-A_Architecture.zip
2020-03-21
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人