zebra线程管理源码简析(一)

点击打开链接

1 zebra线程机制概述

       zebra这个软件包整体结构大致可分为两大块:协议模块和守护进程模块。协议模块实现各协议的功能,各协议以子模块的形式加载到zebra中;守护进程模块的功能主要是管理各协议的信令传输、表项操作、系统操作调用等事务,为各协议提供底层信息以及相关的硬件处理等功能支持。Zebra与各协议的交互采用的是C-S模式,在每个协议子模块中均有一个Client端与守护进程模块中的Server端交互,它们所使用的socketzebra内部使用的socket,不与外部交互。

         zebra中的线程是分队列调度的,每个队列以一个链表的方式实现。线程队列可以分成五个队列:eventtimerreadyreadwrite。队列的优先级由高到低排列。但是,readwrite队列并不参与到优先级的排列中,实际操作时,如果readwrite队列中的线程就绪,就加入ready队列中,等待调度。调度时,首先进行event队列中线程的调度,其次是timerready

     实际上,zebra中的线程是假线程,它并没有实现线程中的优先级抢占问题。在zebra的线程管理中,有个虚拟的时间轴,必须等前一时间的线程处理完,才看下一时间的线程是否触发。由于电脑处理速度较快且处理每个线程的时间间隔较小,所以处理其多线程来可以打到类似并行处理的效果。

           zebra源码中有关线程管理的各个函数放置于zebra-0.95a\lib文件夹的thread.hthread.c两个文件中。

2 线程管理源码分析

2.1 重要结构体介绍

2.1.1 thread

     这是线程队列中每一个单个线程的代码描述,线程队列被描述成双向链表的形式,thread结构体是双向链表的元素。共有六种线程:readwritetimereventreadyunused。因此,线程队列也有六种。

struct thread

{

unsigned char type; /* thread类型,共有六种 */

struct thread *next; /* 指向下一thread的指针,双向链表 */

struct thread *prev; /*指向前一thread的指针*/

struct thread_master *master; /* 指向该thread所属thread_master结构体的指针 */

int (*func) (struct thread *); /* event类型thread的函数指针 */

void *arg; /* event类型thread的参数 */

union {

int val; /* event类型thread的第二个参数*/

int fd; /* read/write类型thread相应的文件描述符 */

struct timeval sands; /* thread的剩余时间,timeval类型,此结构体定义在time.h中,有两个元素,秒和微秒 */

} u;

          RUSAGE_T ru; /* 详细用法信息,RUSAGE这个宏在该thread有用法描述时定义为rusage类型,描述其详细进程资源信息,没有用法描述时定义为timeval类型 */

};

2.1.2 thread_list

    一个thread_list结构体描述一个thread双向链表,也即一个进程队列。

struct thread_list

{

struct thread *head;/* 该线程队列头指针 */

struct thread *tail; /* 该线程队列尾指针 */

int count; /* 该线程队列元素数目 */

};

2.1.3 thread_master

    总的线程管理结构体,里面存有六种线程队列,三种文件描述符以及占用空间信息。

struct thread_master

{

//六种线程队列

struct thread_list read;

struct thread_list write;

struct thread_list timer;

struct thread_list event;

struct thread_list ready;

struct thread_list unuse;

//三种文件描述符

fd_set readfd;

fd_set writefd;

fd_set exceptfd;

//thread_master所占空间大小

unsigned long alloc;

};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值