1.进程生命周期 Linux操作系统属于多任务操作系统,系统中的每个进程能够分时复用CPU时间片,通过有效的进程调度策略实现多任务并行执行.而进程在被CPU调度运行,等待CPU资源分配以及等待外部事件时会属于不同的状态.下图描述了进程之间的状态关系: 运行状态:表示进程此刻正在运行.注,图示中的“运行”状态,并不对应TASK_RUNNING状态,TASK_RUNNING实际表示当前进程被填入CPU就绪队列,属于图示“等待”状态,后续在源码分析中会详细说明: 等待状态:表示进程外部事件已满足,并已…
本系列文章主要是近期针对Linux进程调度源码进行阅读与分析后的经验总结,分析过程中可能结合部分Linux网络编程的相关知识以便于理解,加深对Linux进程调度的理解和知识分享. 本系列文章主要结合Linux3.10.1内核版本源代码以及部分Linux2.4内核版本源代码进行分析,主要涉及fork(),vfork(),clone()应用层函数的底层实现原理,schedule调度器的实现以及CFS完全公平调度策略算法的分析.…
用户层的fork(),vfork(),clone()API函数在执行时,会触发系统调用完成从用户态陷入到内核态的过程,而上述函数的系统调用,最终实现都是通过内核函数do_fork()完成,本篇着重分析do_forkI()函数的实现过程. Linux操作系统中,产生一个新的进程和产生一个新的线程对于内核来说,最为本质的区别在于资源是否共享.这里的资源包括进程地址空间,文件描述符,信号,命名空间等.由于笔者没有分析过Windows操作系统,故不能说出在上述两种操作系统环境下对于进程和线程的描述. L…
本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 引言 之前的文章已经将调度器的数据结构.初始化.加入进程都进行了分析,这篇文章将主要说明调度器是如何在程序稳定运行的情况下进行进程调度的. 系统定时器 因为我们主要讲解的是调度器,而会涉及到一些系统定时器的知识,这里我们简单讲解一下内核中定时器是如何组织,又是如何通过通过定时器实现了调度器的间隔调度.首先我们先看一下内核定时器的框架 在内核中,会使用strut clock_event_device结构描述硬件…
本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 引言 上期文章linux调度器源码分析 - 概述(一)已经把调度器相关的数据结构介绍了一遍,本篇着重通过代码说明调度器在系统启动初始化阶段是如何初始化和工作的.通过上期文章我们知道,在多核CPU和SMP系统中,每个CPU(多核COU中的每个核)都有自己的struct rq队列,而rq队列中又有着自己的struct cfs_rq和struct rt_rq.在初始化时就是对这三个结构进行初始化. init_tas…
在上一个系列中我们分析了UiAutomator的核心源码,对UiAutomator是怎么运行的原理有了根本的了解.今天我们会开始另外一个在安卓平台上基于UiAutomator的新起之秀--Appium的源码分析之旅. 本文在真个系列中会扮演一个简介的角色,不会分析任何的代码,只会先给大家一个基本的印象,方便大家在持有这个印象的基础上往下和本人一块分析. 1. Bootstrap定义及在Appium中扮演的角色 我们先看一下本人大概一个月之前刚接触appium时整理的一个高层架构图 下面一部分就是…
本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 引言 调度器作为操作系统的核心部件,具有非常重要的意义,其随着linux内核的更新也不断进行着更新.本系列文章通过linux-3.18.3源码进行调度器的学习和分析,一步一步将linux现有的调度器原原本本的展现出来.此篇文章作为开篇,主要介绍调度器的原理及重要数据结构. 调度器介绍 随着时代的发展,linux也从其初始版本稳步发展到今天,从2.4的非抢占内核发展到今天的可抢占内核,调度器无论从代码结构还是设…
Linux网桥源码的实现 转自: Linux二层网络协议 Linux网桥源码的实现 1.调用 在src/net/core/dev.c的软中断函数static void net_rx_action(struct softirq_action *h)中(line 1479) #if defined(CONFIG_BRIDGE) || defined(CONFIG_BRIDGE_MODULE)                         if (skb->dev->br_port != NULL…
内核版本:linux-4.4.18 源码位置:这里 fork相关的代码最终执行的函数为_do_fork(),下面按照顺序分析下_do_fork(): 首先判断是否需要trace(跟踪)这个进程,这一步主要与调试相关,GDB在x86-64 Linux 系统上的原理就是利用ptrace(2)系统调用 [1]. 有关likely和Unlikely,实际上是利用gcc内置函数对分支条件的优化 [2]. if (likely(!ptrace_event_enabled(current, trace)))…
一.network namespace的创建 在对iproute2的源码进行分析后,我们可以知道,当我们调用命令`ip netns add ns1`时,本质上就是调用`unshare(CLONE_NEWNET)`创建了一个新的network namespace.接着,我们进一步对内核中对于unshare系统调用的实现进行分析,从而了解内核是如何创建一个network namespace的. 1.内核对unshare()的实现分为两步,第一步调用unshare_nsproxy_namespaces…