《Cisco IOS XR技术精要》一2.1 Cisco IOS XR内核

简介:

本节书摘来自异步社区《Cisco IOS XR技术精要》一书中的第2章,第2.1节,作者 【美】Mobeen Tahir , Mark Ghattas , Dawit Birhanu , Syed Natif Nawaz,更多章节内容可以访问云栖社区“异步社区”公众号查看

2.1 Cisco IOS XR内核

Cisco IOS XR技术精要
Cisco IOS XR是一款基于微内核、高度分布的操作系统。Cisco IOS XR中使用的微内核是一种由QNX Software Systems公司开发的QNX Neutrino实时操作系统(RTOS),其使用的内核是轻量级的,仅提供了少量必要的服务。该系统负责终端处理、调度、任务交换、内存管理、同步、进程间通信等工作。微内核系统不包括如设备驱动器、文件系统和网络栈之类的系统服务;这些服务是通过内核外的独立进程来执行的,可以像其他应用那样重新启动。

微内核是一种兼容POSIX(可移植操作系统接口)的内核。POSIX定义了兼容POSIX的OS必须遵循的OS规范和针对API和OS服务的测试组。基于POSIX兼容的内核开发的应用和服务可以方便地移植到另一个兼容POSIX的内核上。

基于微内核的OS必要的一点就是模块性。微内核提供了极具高度的模块性。OS是由一组通过微内核来管理、通过消息传送服务相结合的协作进程来执行工作的。每种进程运行在各自的地址空间中,不会因其他进程而造成内存数据损坏。微内核架构中有一个重要的因素就是快速内容交换能力,该能力提高了模块性的灵活程度。因为内容交换使用的CPU开销很低,它可以使每种应用和服务最大化地使用各自的进程并运行在各自的地址空间中。例如,Cisco IOS XR中,BGP、OSPF、OSPFv3、RIBv4、RIBv6等应用会执行在不同的进程中。而且,如果路由器上配置了多个OSPF进程,那么系统会将每个进程分配进与其他进程完全分离的单独进程实例中。这种快速内容交换能力使更优的模块性成为可能,这里的快速内容交换能力是指由QNX提供、Cisco加强的微内核和有效进程间通信的快速能容交换能力。进程间通信内容将在本章后续小节中做更详细的介绍。

2.1.1 线程

如图2-1所示,OS是由一组通过微内核管理的协同进程组成的。微内核提供了线程调度、抢占,以及到进程的同步服务。微内核还扮演着消息传送“通道”的角色。微内核和进程管理器共同构成了procnto进程。每种进程运行在单独的地址空间中,并且重启不会影响到其他进程。


81c4bb48d124737785c858ec1253664cebbf34b8

在开发一款应用时,经常需要考虑并发地执行多种算法。这种并发性可以通过使用一个进程中的多个线程来实现。线程(thread)是执行与调度操作的最小单元。换句话说,一个进程(process)包含了多个相关线程,并且定义了线程可以执行的地址空间。每个进程至少带有一个线程。有关线程将在2.1节中做详细的介绍。

如读者所见,在例2-1中的show processed threadname 120命令输出中,IOS XR的BGP进程具有多个线程,每个线程各负其职,包括输入、输出、导入等。在下例的输出中,120表示BGP进程的作业ID,作业ID(JID)是分配给每个进程的唯一编号,更多内容将在2.1节中做更详细的介绍。

例2-1 BGP进程的线程名称


5c36b535fb85c4cd6ecd9f66dcee0f25a420b9fb

图2-2给出了最为常见的线程状态以及各状态之间的转换。内侧的圆圈实际上代表了两种截然不同的状态:ready和running。线程状态可以从ready转变成running,反之亦然。处于running状态的线程同样可以转变成图2-2中所示的其他任意一种状态。

Cisco IOS XR微内核使用一种抢占的、基于优先级的、非自适应的调度算法。每个线程分得一个优先级。调度程序负责基于已分配的优先级选择下一个执行的线程。处于ready状态中优先级最高的线程将被将被选择为running。每个优先级级别都会有一个ready状态的先进先出(FIFO)队列。

空闲线程是procnto进程中的一种特殊线程,因为只有这种线程的优先级为0并使用FIFO调度机制。而且,空闲线程只会处于running或ready状态,并且永远不会主动地交出CPU控制权。不过,由于其使用的优先级最低,所以空闲进程可以被任何处于ready状态的其他进程所抢占。

running状态的线程可能由于系统呼叫(如内核呼叫、异常或硬件中断)、被阻断、被抢占,或主动交让操作而转变成某种不同的状态。如果running状态的线程被更高优先级的线程抢占了,将会被放入同优先级ready队列的最前端。另一种情况,如果是由于线程的时隙用尽或是主动交让进程的原因,将会被放入同优先级ready队列的最末端。时隙(timeslice)指的是当同一优先级的ready队列中,如果一个或多个线程为running状态时,每个running状态的线程可以执行的最大时间长度。

当线程需要等待某个事件的发生时(如回复消息),running线程会被阻断。被阻断的线程将会永久地进入对应的阻断状态,直到阻断消失。当进程的阻断结束后,线程通常都会被放入同优先级ready队列的最末端。当然也有一些例外。


8bde69167c7ed0ead8a25f10d15d62b9d3485436

例如,如果一个服务器线程正在等待一个客户端请求,将会进入阻断(block)状态。假设受阻断的服务器线程的优先级为10,而非阻断的客户端线程的以优先级20发送请求并等待回应。在这种情况下,服务器线程将会解除阻断,并将客户端线程转变为阻断的reply状态。如果服务器线程以10的优先级放入ready队列,不过还有多个ready状态的线程优先级为15,这样的话,即便是客户端线程的优先级为20,也会影响到客户端的相应时间。这个问题被称作优先级倒置。为了防止优先级倒置,微内核使用了优先级继承机制,可以使服务器线程的优先级临时地增加成匹配客户端线程的值(20),并将服务器线程放入客户端优先级(20)使用的ready队列中。

2.1.2 调度算法

微内核中提供了如下3种调度算法来满足不同场景的需要。

FIFO调度。
轮询调度。
偶发调度。
在FIFO调度中,除非线程主动交让控制权或被更高优先级线程抢占,否则线程会一直工作下去。在Cisco IOS XR中,只有procnto进程(内核)中的空闲线程使用FIFO调度算法。

IOS XR中的大多数其他进程都使用轮询(round-robin)调度,这种调度方法限定了每个线程得到资源控制权的最大时间长度(时隙)。使用轮询调度的线程会一直运行,直到其主动交让控制权、被更高优先级线程抢占,或待其时隙用尽。

偶发(sporadic)调度算法允许线程的优先级在下降为低优先级之前,在补充间隔(replenishment interval)内使用常规优先级运行一段时长(预算时间,budget time)。图2-3说明了偶发调度算法是如何工作的。


ba486f7c0ff28c8fb3ec55872919e222937234d5

假设从t=0ms开始,线程T1和T2准备就绪,其他所有线程处于阻断状态。此外,假设T1为偶发调度线程,其常规优先级为30,低优先级为10,预算时间为20ms,补充时间为50ms。T2为轮询调度线程,优先级为20。实例如下。

1.由于T1的优先级比T2高,所以T1在t=0ms时被优先调度得到服务。

2. 在t=5ms时,带有40优先级的线程T3阻断结束,并变为ready状态。

3. 由于T3带有比T1还高的优先级,所以T3抢占T1得到服务。抢占的结果是,T1进入优先级30的ready队列的最前端。

4.在t=10ms时,T3线程被阻断并交还CPU控制权。此时优先级为30的T1线程和优先级为20的T2线程均处于ready状态。因此,较高优先级的T1在t=10ms时得到服务。

5. 当t=25ms时,T1线程的预算时间已经用完,由于偶发调度的机制,其优先级被降低成10。此时的T2线程处于ready状态并带有20的优先级,所以,T2抢占了T1,从25ms开始得到服务。

6.在t=50ms时,补充间隔的50ms到期,T1线程的优先级恢复成了常规优先级30,于是,又从T2线程上将控制权抢占了回来。

7.当t=70ms时,新补充间隔中的预算时间20ms又被用完,优先级再次降为10,T2再次抢占T1得到服务。

例2-2给出了show process pidin命令的部分输出。输出中列出了线程,以及相应的进程ID(pid)、线程ID(tid)、进程名称、优先级、调度算法和进程状态。“prio”一列给出了线程的优先级和调度算法。在线程调度符号中,f表示FIFO,r表示轮询,?表示偶发调度。例2-2中,共有两个线程使用FIFO调度;procnto线程1和2,这两个都是内核的空闲线程。每个CPU都会有一个空闲进程。由于此命令是在CRS-16/S的RP上执行的,该RP上共有两块CPU处理器,所以显示出了两个空闲线程,每个CPU一个。例2-2中还显示了eth_server进程中的线程3、4、7使用了偶发调度,所有其他线程使用的是轮询调度。

例2-2 show processes pidin命令输出


1f2d7fff303d29e27c9387bfe9a465a7acd3b065

2.1.3 同步服务

微内核提供了一种基于消息传送的IPC同步机制。这种消息传送服务可以不经过任何中间组件,直接从发送线程的地址空间中将消息拷贝给接收线程。消息的内容和格式对内核来说是透明的。IPC内容将在2.3节中做更详细的介绍。

微内核除了提供了消息传送IPC机制之外,还可以开发出其他使用共享内存空间的IPC机制。不过,访问共享内存空间必须要求同步来确保数据的一致性。例如,如果某个线程正试图访问连接列表,而另一线程正在对列表进行更新,那么很可能会导致灾难性的结果。为了解决这一问题,微内核加入了mutex、condvar和semaphore同步机制。

相互排外锁,即mutex,用于保证在线程之间单独地访问共享数据。在线程访问共享数据之前,应该先获得(锁住)mutex。当完成在共享数据上的操作之后,线程会释放mutex。任意时间上,只能有一个线程获得mutex。如果某个线程试图锁住已经被其他线程锁住的mutex,那么该线程将进入阻断状态,直到mutex解锁并获得为止。当线程释放mutex时,具有最高优先级等待获得mutex的线程将解除阻断并成为新的mutex拥有者。

如果高优先级的线程试图锁住已经被低优先级线程锁住的mutex,那么当前拥有mutex的线程的优先级将会增加到同高优先级的阻断线程一样的优先级值。这种机制被称为优先级继承(priority inheritance),用来解决优先级倒置的问题。优先级继承与优先级倒置的内容在之前的客户端/服务器线程交互部分中有过介绍。

条件变量(condvar)用于等待某些条件的执行(例如超时)。线程在满足特定条件之前一直处于阻断状态。condvar通常与mutex按如下方式结合使用:

锁住mutex;
等待condvar;
执行动作(操作共享数据);
解锁mutex。
另一种同步机制被称为信号量(semaphore),线程状态由semaphore是否为正数来决定。如果semaphore为正数,线程将解除阻断访问资源,semaphore值减1。每次post操作会使semaphore值增加1。可以使用semaphore借助信号控制器来唤醒线程。线程通过semaphore发出一个wait操作,表示等待信号。信号控制器通过semaphore执行post操作,唤醒被semaphore阻断的线程。

像本节先前例2-2中显示的那样,命令show process pidin location< r/s/m >可以列出每个线程的状态。表2-1给出了一份进程可能获得的状态列表。


12bf39711f3aaf3338d5b14095772531e14b3782

回到例2-2的输出,可以看到,某些线程正处于reply状态,这表示客户端线程正处于阻断状态并等待服务器响应。如果进程一直卡在阻断状态,很可能是(Client/Server)进程或应用出了问题。不过,并不是路由器上所有的阻断进程都是有问题的,因为在进程的选择过程中,阻断状态是一种可预期的行为。有些进程卡在阻断状态可能会导致应用不做响应。理解生产网络中路由器的进程行为是很有必要的。

如果想要查看所有阻断线程,可以使用命令show processes blocked location< r/s/m>,如例2-3所示。建议在数秒内多使用几次,这样可以确定某个阻断进程是由于错误被阻断还是执行常规IPC交换时的正常阻断。某些进程,如ksh和devc-conaux设计出来即是阻断状态。ksh作为客户端进程与devc-conaux(服务器进程)进行通信。在用户提供Console服务器上的输入信息之前,线程会一直处于阻断状态。更具体地讲,ksh等待Console或auxiliary端口上的输入信息并向devc-conaux返回系统消息。当devc-conaux回复ksh,进程状态将从阻断变为reply。

例2-3 受阻断进程


1f9f221fd0741bfb2ed7b3b97270bce80ae5d10c
相关文章
|
4天前
|
安全 Android开发 iOS开发
安卓与iOS的较量:技术特性与用户体验的深度解析
在移动操作系统的战场上,安卓和iOS一直占据着主导地位。本文将深入探讨这两大平台的核心技术特性,以及它们如何影响用户的体验。我们将从系统架构、应用生态、安全性能和创新功能四个方面进行比较,帮助读者更好地理解这两个系统的异同。
30 3
|
11天前
|
物联网 区块链 vr&ar
未来已来:探索区块链、物联网与虚拟现实技术的融合与应用安卓与iOS开发中的跨平台框架选择
【8月更文挑战第30天】在科技的巨轮下,新技术不断涌现,引领着社会进步。本文将聚焦于当前最前沿的技术——区块链、物联网和虚拟现实,探讨它们各自的发展趋势及其在未来可能的应用场景。我们将从这些技术的基本定义出发,逐步深入到它们的相互作用和集成应用,最后展望它们如何共同塑造一个全新的数字生态系统。
|
2月前
|
开发工具 Android开发 iOS开发
安卓与iOS开发:平台间的技术较量与融合
在移动应用开发的广阔天地中,安卓和iOS这两大操作系统如同两座巍峨的山峰,各自占据着半壁江山。它们在技术架构、开发工具、用户体验等方面展现出独特的魅力与差异,同时也在相互借鉴与融合中共同推动着移动技术的发展。本文将深入探讨安卓与iOS开发中的技术差异与融合趋势,为开发者提供一场思想的盛宴。
|
4天前
|
安全 Android开发 iOS开发
安卓与iOS的较量:技术特性与用户体验的深度剖析
在移动操作系统的战场上,安卓和iOS一直是两个重量级选手。本文将深入探讨两者的技术架构、安全性、应用生态以及用户体验等方面的差异,并尝试从用户和开发者的角度出发,分析这两个系统的优势与不足。通过比较,我们不仅能更好地理解各自的特点,还能洞察未来移动技术的发展趋势。
|
12天前
|
移动开发 搜索推荐 Android开发
安卓与iOS开发:一场跨平台的技术角逐
在移动开发的广阔舞台上,两大主角——安卓和iOS,持续上演着激烈的技术角逐。本文将深入浅出地探讨这两个平台的开发环境、工具和未来趋势,旨在为开发者揭示跨平台开发的秘密,同时激发读者对技术进步的思考和对未来的期待。
|
15天前
|
安全 Android开发 Swift
安卓与iOS开发:平台差异与技术选择
【8月更文挑战第26天】 在移动应用开发的广阔天地中,安卓和iOS两大平台各占一方。本文旨在探索这两个系统在开发过程中的不同之处,并分析开发者如何根据项目需求选择合适的技术栈。通过深入浅出的对比,我们将揭示各自平台的优势与挑战,帮助开发者做出更明智的决策。
|
24天前
|
移动开发 开发工具 Android开发
探索安卓与iOS开发的差异:技术选择的影响
【8月更文挑战第17天】 在移动应用开发的广阔天地中,安卓和iOS两大平台各领风骚。本文通过比较这两个平台的编程语言、开发工具及市场策略,揭示了技术选择对开发者和产品成功的重要性。我们将从开发者的视角出发,深入探讨不同平台的技术特性及其对项目实施的具体影响,旨在为即将步入移动开发领域的新手提供一个清晰的指南,同时给予资深开发者新的思考角度。
|
28天前
|
编解码 Android开发 iOS开发
安卓与iOS开发:平台差异下的技术创新之路
在数字时代的浪潮中,移动应用开发如同两股潮流——安卓与iOS,各自携带着独特的技术生态和文化基因。本文将深入探讨这两大平台的开发环境、编程语言和工具的差异,以及它们如何塑造了不同的用户体验和技术趋势。通过比较分析,我们旨在揭示跨平台开发的可能性和挑战,同时探索未来技术创新的方向。让我们一起跟随代码的足迹,穿越安卓的开放草原和iOS的精密园林,发现那些隐藏在平台差异之下的创新机遇。
27 1
|
1月前
|
移动开发 Java Android开发
安卓与iOS开发:选择的艺术与技术的较量
在移动应用开发的广阔天地中,安卓和iOS两大平台各自占据着半壁江山。本文将探讨这两个平台在开发过程中的异同,以及它们如何影响开发者的选择。我们将从技术栈、市场份额、用户群体等方面进行分析,并结合案例来说明不同平台的优势与挑战。无论你是初涉移动开发领域的新手,还是经验丰富的老手,这篇文章都将为你提供有价值的见解。让我们一起探索这片充满机遇与挑战的土地吧!
|
9天前
|
iOS开发 Android开发 MacOS
从零到全能开发者:解锁Uno Platform,一键跨越多平台应用开发的神奇之旅,让你的代码飞遍Windows、iOS、Android、macOS及Web,技术小白也能秒变跨平台大神!
【8月更文挑战第31天】从零开始,踏上使用Uno Platform开发跨平台应用的旅程。只需编写一次代码,即可轻松部署到Windows、iOS、macOS、Android及Web(通过WASM)等多个平台。Uno Platform为.NET生态带来前所未有的灵活性和效率,简化跨平台开发。首先确保安装了Visual Studio或VS Code及.NET SDK,然后选择合适的项目模板创建新项目。项目结构类似传统.NET MAUI或WPF项目,包含核心NuGet包。通过简单的按钮示例,你可以快速上手并构建应用。Uno Platform让你的技术探索之旅充满无限可能。
15 0