iis服务器助手广告广告
返回顶部
首页 > 资讯 > 操作系统 >Linux内核源码的进程调度是怎样的
  • 324
分享到

Linux内核源码的进程调度是怎样的

2023-06-16 23:06:00 324人浏览 独家记忆
摘要

这篇“linux内核源码的进程调度是怎样的”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Linux内核源码的进程调度是怎样的

这篇“linux内核源码的进程调度是怎样的”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Linux内核源码的进程调度是怎样的”文章吧。

1 Linux时间系统

计算机最基本的时间单元是时钟周期,例如取指令、执行指令、存取内存等。时间系统是计算机系统非常重要的组成部分,特别是对于Unix类分时系统尤为重要。时间系统主要任务是维持系统时间并且防止某个进程独占CPU及其他资源,也就是驱动进程的调度。

1 时钟硬件

大部分PC机中有两个时钟源,他们分别叫做RTC和OS(操作系统)时钟。RTC(Real Time Clock,实时时钟)也叫做CMOS时钟,它是PC主机板上的一块芯片,它靠电池供电,即使系统断电,也可以维持日期和时间。由于它独立于操作系统,所以也被称为硬件时钟,它为整个计算机提供一个计时标准,是最原始***层的时钟数据。

Linux只用RTC来获得时间和日期;然而,通过作用于/dev/rtc设备文件,也允许进程对RTC编程。通过执行/sbin/clock系统程序,系统管理员可以配置时钟。

OS时钟产生于PC主板上的定时/计数芯片,由操作系统控制这个芯片的工作,OS时钟的基本单位就是该芯片的计数周期。在开机时操作系统取得RTC中的时间数据来初始化OS时钟,然后通过计数芯片的向下计数形成了OS时钟,它更应该被称为一个计数器。OS时钟只在开机时才有效,而且完全由操作系统控制,所以也被称为软时钟或系统时钟。下面我们重点描述OS时钟的产生。

OS时钟输出脉冲信号,接到中断控制器上,产生中断信号,触发后面要讲的时钟中断,由时钟中断服务程序维持OS时钟的正常工作。

2 时钟运作机制

RTC和OS时钟之间的关系通常也被称作操作系统的时钟运作机制。一般来说,RTC是OS时钟的时间基准,操作系统通过读取RTC来初始化OS时钟,此后二者保持同步运行,共同维持着系统时间。保持同步运行是什么意思呢?就是指操作系统运行过程中,每隔一个固定时间会刷新或校正RTC中的信息。

图2 时钟运作机制

我们可以看到,RTC处于***层,提供最原始的时钟数据。OS时钟建立在RTC之上,初始化完成后将完全由操作系统控制,和RTC脱离关系。操作系统通过OS时钟提供给应用程序所有和时间有关的服务。

3 Linux时间基准

以上我们了解了RTC(实时时钟、硬件时钟)和OS时钟(系统时钟、软时钟)。下面我们具体描述OS时钟。OS时钟是由可编程定时/计数器产生的输出脉冲触发中断而产生的。输出脉冲的周期叫做一个“时钟滴答”。计算机中的时间是以时钟滴答为单位的,每一次时钟滴答,系统时间就会加1。操作系统根据当前时钟滴答的数目就可以得到以秒或毫秒等为单位的其他时间格式。

定义“时间基准”的目的是为了简化计算,这样计算机中的时间只要表示为从这个时间基准开始的时钟滴答数就可以了。“时间基准是由操作系统的设计者规定的。例如DOS的时间基准是1980年1月1日,Unix的时间基准是1970年1月1日上午12点,Linux的时间基准是1970年1月1日凌晨0点。

4 Linux的时间系统

OS时钟记录的时间也就是通常所说的系统时间。系统时间是以“时钟滴答”为单位的,而时钟中断的频率决定了一个时钟滴答的长短,例如每秒有100次时钟中断,那么一个时钟滴答的就是10毫秒(记为10ms),相应地,系统时间就会每10ms增1。

Linux中用全局变量jiffies表示系统自启动以来的时钟滴答数目。在/kernel/time.c中定义如下:

unsigned long volatile jiffies

在jiffies基础上,Linux提供了如下适合人们习惯的时间格式,在/include/linux/time.h中定义如下:

struct timespec {/* 这是精度很高的表示*/

long tv_sec; /* 秒 (second) */

long tv_nsec; 

if(xtime.tv_sec > last_rtc_update + 660)

update_RTC();

}

其中,xtime是前面所提到的timeval类型,这是一个全局变量。

(3) 时钟函数do_timer() (在/kernel/sched.c中)

void do_timer(struct pt_regs * regs)

{

(*(unsigned long *)&jiffies)++;

update_process_times();

++lost_ticks;

if( ! user_mode ( regs ) )

++lost_ticks_system;

mark_bh(TIMER_BH);

if (tq_timer)

mark_bh(TQUEUE_BH);

}

其中,update_process_times()函数与进程调度有关,从函数的名子可以看出,它处理的是与当前进程与时间有关的变量,例如,要更新当前进程的时间片计数器counter,如果counter<=0,则要调用调度程序。

与时间有关的事情很多,不能全都让这个函数去完成,这是因为这个函数是在关中断的情况下执行,必须处理完最重要的时间信息后退出,以处理其他事情。那么,与时间相关的其他信息谁去处理,何时处理?这就是由第三章讨论的后半部分去去处理。上面timer_interrupt()所做的事情就是上半部分。

(4)中断安装程序

从上面的介绍可以看出,时钟中断与进程调度密不可分,因此,一旦开始有时钟中断就可能要进行调度,在系统进行初始化时,所做的大量工作之一就是对时钟进行初始化,其函数time_init ()的代码在/arch/i386/kernel/time.c中,对其简写如下:

void __init time_init(void)

{

xtime.tv_sec=get_cmos_time();

xtime.tv_usec=0;

setup_irq(0,&irq0);

}

其中的get_cmos_time()函数就是把当时的实际时间从CMOS时钟芯片读入变量xtime中,时间精度为秒。而setup_irq(0,&irq0)就是时钟中断安装函数,那么irq0指的是什么呢,它是一个结构类型irqaction,其定义及初值如下:

static struct irqaction irq0 = { timer_interrupt, SA_INTERRUPT, 0, "timer", NULL, NULL};

setup_irq(0, &irq0)的代码在/arch/i386/kernel/irq.c中,其主要功能就是将中断程序连入相应的中断请求队列,以等待中断到来时相应的中断程序被执行。

我们将有关函数改写如下,体现时钟中断的大意:

do_timer_interrupt( ) /*这是一个伪函数 */

{

SAVE_ALL  /*保存处理机现场 */

intr_count += 1;  /* 这段操作不允许被中断 */

timer_interrupt() /* 调用时钟中断程序 */

intr_count -= 1;

jmp ret_from_intr /* 中断返回函数 */

}

其中,jmp ret_from_intr 是一段汇编代码,也是一个较为复杂的过程,它最终要调用jmp ret_from_sys_call,即系统调用返回函数,而这个函数与进程的调度又密切相关,,因此,我们重点分析jmp ret_from_sys_call。

2.系统调用返回函数:

系统调用返回函数的源代码在/arch/i386/kernel/entry.S中

ENTRY(ret_from_sys_call)

cli  # need_resched and signals atomic test

cmpl $0,need_resched(%ebx)

jne reschedule

cmpl $0,sigpending(%ebx)

jne signal_return

restore_all:

RESTORE_ALL

ALIGN

signal_return:

sti  # we can get here from an interrupt handler

testl $(VM_MASK),EFLAGS(%esp)

movl %esp,%eax

jne v86_signal_return

xorl %edx,%edx

call SYMBOL_NAME(do_signal)

jmp restore_all

ALIGN

v86_signal_return:

call SYMBOL_NAME(save_v86_state)

movl %eax,%esp

xorl %edx,%edx

call SYMBOL_NAME(do_signal)

jmp restore_all

….

reschedule:

call SYMBOL_NAME(schedule) # test

jmp ret_from_sys_call

这一段汇编代码就是前面我们所说的“从系统调用返回函数”ret_from_sys_call,它是从中断、异常及系统调用返回时的通用接口。这段代码主体就是ret_from_sys_call函数,在此我们列出相关的几个函数:

(1)ret_from_sys_call:主体

(2)reschedule:检测是否需要重新调度

(3)signal_return:处理当前进程接收到的信号

(4)v86_signal_return:处理虚拟86模式下当前进程接收到的信号

(5)RESTORE_ALL:我们把这个函数叫做彻底返回函数,因为执行该函数之后,就返回到当前进程的地址空间中去了。

可以看到ret_from_sys_call的主要作用有:

检测调度标志need_resched,决定是否要执行调度程序;处理当前进程的信号;恢复当前进程的环境使之继续执行。

最后我们再次从总体上浏览一下时钟中断:

每个时钟滴答,时钟中断得到执行。时钟中断执行的频率很高:100次/秒,时钟中断的主要工作是处理和时间有关的所有信息、决定是否执行调度程序以及处理下半部分。和时间有关的所有信息包括系统时间、进程的时间片、延时、使用CPU的时间、各种定时器,进程更新后的时间片为进程调度提供依据,然后在时钟中断返回时决定是否要执行调度程序。下半部分处理程序是Linux提供的一种机制,它使一部分工作推迟执行。

以上就是关于“Linux内核源码的进程调度是怎样的”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网操作系统频道。

--结束END--

本文标题: Linux内核源码的进程调度是怎样的

本文链接: https://www.lsjlt.com/news/286376.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Linux内核源码的进程调度是怎样的
    这篇“Linux内核源码的进程调度是怎样的”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Linux内核源码的进程调度是怎样的...
    99+
    2023-06-16
  • Linux内核调优是怎样的
    这篇文章主要为大家分析了Linux内核调优是怎样的的相关知识点,内容详细易懂,操作细节合理,具有一定参考价值。如果感兴趣的话,不妨跟着跟随小编一起来看看,下面跟着小编一起深入学习“Linux内核调优是怎样的”的知识吧。一、内核文件系统操作系...
    99+
    2023-06-28
  • Linux内核进程管理的基础是怎样的
    本篇文章为大家展示了Linux内核进程管理的基础是怎样的,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。内核通过 task_struct 描述进程用命令 pstree 可以让内核以树形的结构把进程之间...
    99+
    2023-06-15
  • Linux内核是怎样的
    这篇文章主要介绍“Linux内核是怎样的”,在日常操作中,相信很多人在Linux内核是怎样的问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux内核是怎样的”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
    99+
    2023-06-05
  • Linux中Kill命令的进程调度是怎样的
    本篇文章为大家展示了Linux中Kill命令的进程调度是怎样的,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一丶进程管理Linux 是一种动态系统,能够适应不断变化的计算需求。Linux 计算需求的...
    99+
    2023-06-28
  • Linux内核是怎么样的
    这篇文章将为大家详细讲解有关Linux内核是怎么样的,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Linux 内核,这个经常听见,却不不知道它具体是干嘛的东西,是不是觉得非常神秘Linux 内核看不见摸不...
    99+
    2023-06-16
  • 升级Linux内核的教程是怎样的
    本篇文章为大家展示了升级Linux内核的教程是怎样的,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。大家好,今天我们学习一下如何从Elrepo或者源代码来安装最新的Linux内核4.0。代号为&...
    99+
    2023-06-13
  • 怎样进行Linux内核的解析
    本篇文章为大家展示了怎样进行Linux内核的解析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。计算机由硬件和软件两大部分组合而成,软件来操作和控制计算机,完成控制工作的软件就称为操作系统,在Linu...
    99+
    2023-06-28
  • Linux内核和Windows内核的区别是怎样的
    Linux内核和Windows内核的区别是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Windows 和 Linux 可以说是我们比较常见的两款操作系统的。Window...
    99+
    2023-06-15
  • linux内核结构是怎样的
    Linux内核是一个分层的结构,由多个模块组成,每个模块负责不同的功能。下面是Linux内核的主要组成部分:1. 进程管理模块:负责...
    99+
    2023-10-08
    linux
  • Linux内核处理中断的过程是怎样的
    Linux内核处理中断的过程是怎样的,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。中断是现代 CPU 工作方式中重要的部分。例如:当你每次在键盘上按下一个按键后,CPU 会...
    99+
    2023-06-28
  • Linux内核中dev_info、dev_dbg、dev_err及动态调试是怎样的
    Linux内核中dev_info、dev_dbg、dev_err及动态调试是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。目前在kernel驱动代码中,都不再建议直接使用...
    99+
    2023-06-15
  • Java+Linux内核源码之如何理解多线程之进程
    这篇文章主要讲解了“Java+Linux内核源码之如何理解多线程之进程”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java+Linux内核源码之如何理解多线程之进程”吧!Linux 内核如...
    99+
    2023-06-15
  • Linux内核源代码编程的规范有哪些
    这篇文章主要介绍“Linux内核源代码编程的规范有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Linux内核源代码编程的规范有哪些”文章能帮助大家解决问题。1.强烈推荐单行的宽度为八十列。任何...
    99+
    2023-06-27
  • Linux进程调度的逻辑是什么
    这篇文章主要介绍“Linux进程调度的逻辑是什么”,在日常操作中,相信很多人在Linux进程调度的逻辑是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux进程调度的逻辑是什么”的疑惑有所帮助!接下来...
    99+
    2023-06-29
  • 涉及到linux内核的bug排查过程是怎样的
    这期内容当中小编将会给大家带来有关涉及到linux内核的bug排查过程是怎样的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。编写代码只是程序员的工作之一,调试代码的时间甚至会超过编写代码,之前为大家讲解了...
    99+
    2023-06-15
  • linux的进程调度怎么理解
    这篇文章主要讲解了“linux的进程调度怎么理解”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“linux的进程调度怎么理解”吧!名词在此之前,我们必须(当然也不是必须,但了解原理有利于理解和...
    99+
    2023-06-16
  • Linux内核驱动fsync机制实现过程是怎样的
    Linux内核驱动fsync机制实现过程是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。在Linux内核中的IO模型基本分为4类: 1、同步阻塞I/O 2、同步非阻塞I/...
    99+
    2023-06-13
  • linux内核中list链表的源码分析
    这篇文章将为大家详细讲解有关linux内核中list链表的源码分析,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。linux kernel里的很多数据结构都很经典, list链表就是其中之一,...
    99+
    2023-06-06
  • Linux的进程线程及调度的概念是什么
    这篇“Linux的进程线程及调度的概念是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Linux的进程线程及调度的概念是...
    99+
    2023-06-28
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作