[c]生产者消费者模式实现

2014-04-19 by muzi

前言

本文主要内容是:使用多线程,运行生产者函数和消费者函数,去实现队列(临界区)的读写操作。

其意义在与熟悉多线程的互斥过程。生产者消费者模式是最好,最简单的选择。

数据结构

首先我们要操作的数据结构是队列。那么我首先要构造一个队列:

queue.h

#ifndef _QUEUE_
#define _QUEUE_


typedef struct _QUEUE_
{
    int maxsize;
    int buffer[10];  //bad design
    int end;
    int begin;

}queue_t;

void queue_init(queue_t* queue); //队列的初始化。如end,beginmaxsize的设置。
int get_len(queue_t* queue);     //获取队列的长度
void ...
read more

[c]time_server

2014-04-18 by muzi

前言

本篇内容主要是介绍如何编写一个通过socket通信,实现获取服务器当前时间的例子。

实现

首先我们需要定义两个函数:

int time_server(int port);
char* get_time(int ip, int port);

这两个函数是用于提供时间获取服务和,客户端调用去获取时间的函数。

以下是time_server.h的内容:

#ifndef _TIME_SERVER_
#define _TIME_SERVER_
#include <sys/socket.h>
#include <string.h>

int time_server(int port);
char* get_time(int ip, int port);
#endif

time_server.c文件是实现time_server中的函数声明。 头文件如下:

#include <stdlib.h>
#include "time_server.h ...
read more

编程真的不简单

2014-04-17 by muzi

前言

以前觉得编程嘛,不就是写代码嘛。谁不会啊!后来,和大男哥聊天的过程中,他说到一句话:大家都说我会c编程,然后我也觉得我会用c。就像我会打篮球,科比也会打篮球一样。

当时真的笑翻了!不过说来也是!编程真的不简单!

编程真的不简单

下面是上个周我做的c语言培训题收获的感想。编程真的不简单啊!

之前都是用python写程序,很少会注意到一些方面,比如头文件之类的,指针之类的。这次的c题培训,让我对编程的认识上升到了另一个阶段。

编码

编程并不是仅仅把功能实现而已。还有许多重要的东西,比如:

  • 逻辑的严谨性:一些边界条件,可能的逻辑分支等,都需要考虑到。

  • 模块化思想:将相对独立的功能写在一个文件中,有利于解耦和移植。提高代码的复用性,同时也为单元测试提供了可能。

  • 头文件的重要性:在C语言中通过include 头文件的方式把某一些模块添加进来。同时一个头文件所包含的的内容应该是静态的声明,而不应该有实现。所有的实现都应该出现在同名的.c文件中。同时,在运行的时候我们必须保证.C的实现与.h的声明一致,某种程度上是对代码的保护。

  • 可读性:可读性的重点是对编程者而言 ...

read more

[C语言]两个栈实现队列

2014-04-15 by muzi

前言

这是学习c语言的第一个训练题。刚开始写得真的非常差!!后来在大男哥的知道下学会了如何写c语言。本篇教程是:如何使用两个栈实现队列的功能。基本上这个代码也是他手把手教的。

算法

如何使用两个栈实现队列? 大家都能想到需要在pop的时候从一个栈到另一个栈倒一下,再pop,这样就有做到先入先出了。但是如何判别哪一个是目前正在使用的,而哪一个又是用来接收第一个栈pop数据的呢?

其实有一个好办法就是,指定一个是专门用于入栈的栈in_stack,所有数据入栈的时候必须入到这个栈中,而出栈的时候,需要将数据pop到另一个栈中,然后再从另一个栈中出栈。第二次出栈的时候直接从out_stack。直到out_stack的数据为空,则将in_stack的数据pop到out_stack中。这样就能保证出栈的顺序是FIFO了。

同时,in_stack的深度就是队列的最小深度。

最大深度是len(in_stack+out_stack).当且仅当第一次push时,全部push到满,然后pop数据,之后继续push直到满。严格意义上来说应该是len(in_stack+out_stack)-1,因为有一个pop掉了。

实现

stack的实现

首先我们要实现stack。以下是stack.h

/*
##################
Author: muzi
Date:2014/4/10
TODO ...
read more

The study notes of East-west Bridge for SDN Network Peering

2014-04-10 by muzi

前言

这是一篇学习笔记,是在阅读了林萍萍女士的论文"East-West Bridge for SDN Network Peering "之后的总结与思考。

东西向接口通信中交换的数据是一个域中的数据。

控制器之间的发现

最简单的方式就是直接指定,但是这明显不是一个合理的方法。比较好的做法是让所有的控制器在开启的时候向一个注册服务器注册自己的信息,然后再获取所有控制器的信息,如IP,PORT,用于建立控制器之间的连接。另有更智能的方法是通过lldp去发现邻居。即LLDP报文中携带本域中控制器的信息。 即有如下三种方式:

  • 通过配置信息设置
  • 访问注册服务器获取
  • 通过LLDP去发现邻居

我认为,第一种方法最简单,但是需要手动配置。第二种方法最易于设计。第三种方法最智能。我觉得使用LLDP去发现邻居是一种不错的方式。每一次接入网络都需要探测自己的邻居,然后发送自己的拓扑信息给邻居,同时当拓扑发生变化时也需要给邻居同步,此处的拓扑发生变化可以包含如下两点:

  • 域内拓扑发生变化,如link down
  • 邻居C拓扑变化传送过来导致本地存储拓扑变化,从而需要更新拓扑,并通知其他邻居。

网络信息的存储

  • 分布式存储在每一个控制器,每一个控制器只保存自己的视图,需要全局数据时再发送请求从别的控制器获取。此方式为主动请求方式,能减少拓扑信息传递的数量。但是耗时大。
  • 分布式存储在每一个控制器,每一个控制器都有全网视图 ...
read more