Hoàng Đăng Hải Học Viên: Lê Đăng Phong [1-22] Vũ Anh Tuấn


Quản lý hàng đợi và định trình gói



tải về 0.59 Mb.
trang12/19
Chuyển đổi dữ liệu13.08.2016
Kích0.59 Mb.
#17954
1   ...   8   9   10   11   12   13   14   15   ...   19

6. Quản lý hàng đợi và định trình gói.


Hàng đợi mô tả vị trí mà tại đó các gói có thể được cất giữ (hoặc bị loại bỏ). Định trình gói có liên quan tới quá trình quyết định được sử dụng để chọn các gói nào được phục vụ hoặc bị loại bỏ. Quản lý bộ đệm có liên quan đến bất kỳ quy định cụ thể nào được sử dụng để điều chỉnh thời gian bộ nhớ của một hàng đợi riêng biệt. Hiện tại, các hỗ trợ về hàng đợi bao gồm: hàng đợi loại bỏ phần cuối (drop-tail queueuing - FIFO), quản lý bộ đệm RED, CBQ (bao gồm một bộ định trình ưu tiên và quay vòng) và các loại khác nhau của hàng đợi cân bằng (Fair Queueing) bao gồm hàng đợi cân bằng (Fair Queueing - FQ), hàng đợi cân bằng ngẫu nhiên (Stochastic Fair Queueing - SFQ), và Deficit Round-Robin (DRR). Trong trường hợp chung khi một phần tử trễ là luồng xuống từ hàng đợi, hàng đợi có thể bị khóa tới khi nó có thể thực hiện lại bởi luồng xuống lân cận nó. Đây chính là cơ chế mô phỏng trễ truyền dẫn. Hơn nữa, hàng đợi có thể bị khóa hoặc mở khóa cưỡng bức tại các thời điểm bất kỳ bởi luồng lân cận (được sử dụng để thực hiện các hàng đợi hợp nhất từ nhiều hàng đợi với sự điều khiển luồng giữa các hàng đợi). Sự loại bỏ gói được thực hiện theo một cách mà hàng đợi có chứa một “điểm giữ các gói được loại bỏ”, tức là, một đối lượng thu giữ tất cả các gói bị loại bỏ ra khỏi hàng đợi. Điều này có thể hữu ích khi thống kê về các gói bị loại bỏ.

6.1. Lớp Queue trong C++


Lớp Queue thừa kế từ lớp cơ sở Connector. Nó cung cấp một lớp cơ sở được sử dụng bởi các kiểu lớp hàng đợi cụ thể, cũng như hàm gọi lại để thực hiện khóa. Các định nghĩa này được phục vụ trong queue.h:

class Queue : public Connector {

public:

virtual void enque(Packet*) = 0;



virtual Packet* deque() = 0;

void recv(Packet*, Handler*);

void resume();

int blocked();

void unblock();

void block();

protected:

Queue();


Int command(int argc,const char*const*argv);

int qlim_; * maximum allowed pkts in queue */

int blocked_;

int unblock_on_resume_; /* unblock q on idle? */

QueueHandler qh_;

};

Các hàm enque và deque là thuần túy ảo, cho thấy rằng lớp Queue được sử dụng như là lớp cơ sở, các hàng đợi cụ thể nhận được từ Queue và thực hiện 2 chức năng này khi cần thiết. Nhìn chung, các hàng đợi cụ thể không nạp chồng hàm recv bởi vì nó gọi đến enque và deque cụ thể.



Lớp Queue không có nhiều trạng thái nội tại. Thông thường các trạng thái nội tại này là các đối tượng giám sát đặc biệt. Hàm thành viên qlim_ được dựng để chỉ thị giới hạn chiểm giữ hàng đợi tối đa, nhưng tự thân lớp Queue không bắt buộc điều này; nó được sử dụng bởi các lớp con hàng đợi cụ thể nếu chúng cần giá trị này. Hàm thành viên blocked_ là hàm trả về giá trị logic Bool để chỉ ra hàng đợi có thể có thể gửi một gói tức thì tới luồng xuống lân cận của nó hay không. Khi một hàng đợi bị khóa, nó có thể đưa các gói vào hàng đợi nhưng không thể gửi các gói đó.

6.1.1 Khóa hàng đợi


Một hàng đợi có thể bị khóa và được mở khóa tại bất kỳ thời điểm định trước nào. Nhìn chung, một hàng đợi bị khóa khi một gói đang chuyển đi giữa nó và luồng xuống lân cận của nó (phần lớn thời gian nếu hàng đợi bị đầy). Một hàng đợi bị khóa sẽ vẫn bị khóa trong khi liên kết luồng xuống của nó bận và hàng đợi có ít nhất một gói được gửi đi. Một hàng đợi được mở khóa chỉ khi hàm resume được gọi (theo cách mà một luồng xuống lân cận định trình nó thông qua một hàm gọi lại), thường là khi không có gói nào được đưa vào hàng đợi. Việc gọi lại được thực hiện bằng cách sử dụng lớp luồng và các phương thức sau:

class QueueHandler : public Handler {

public:

inline QueueHandler(Queue& q) : queue_(q) {}



void handle(Event*); /* calls queue_.resume() */

private:


Queue& queue_;

};

void QueueHandler::handle(Event*)



{

queue_.resume();

}

Queue::Queue() : drop_(0), blocked_(0), qh_(*this)



{

Tcl& tcl = Tcl::instance();

bind("limit_", &qlim_);

}

void Queue::recv(Packet* p, Handler*)



{

enque(p);

if (!blocked_) {

/*

* We’re not block. Get a packet and send it on.



* We perform an extra check because the queue

* might drop the packet even if it was

* previously empty! (e.g., RED can do this.)

*/

p = deque();



if (p != 0) {

blocked_ = 1;

target_->recv(p, &qh_);

}

}



}

void Queue::resume()

{

Packet* p = deque();



if (p != 0)

target_->recv(p, &qh_);

else {

if (unblock_on_resume_)



blocked_ = 0;

else


blocked_ = 1;

}

}



Việc quản lý các trình xử lý lỗi ở đây đôi khi rất tinh tế. Khi tạo ra một đối tượng Queue mới, nó bao gồm một đối tượng QueueHandler (qh_) được khởi tạo để chứa một tham chiếu đến đối tượng Queue mới (Queue& Queuehandler: :queue). Điều này được thực hiện bởi hàm dựng Queue sử dụng tham số biểu thức qh_(*this). Khi một Queue nhận một gói, nó sẽ gọi phiên bản lớp con (tức là tạo hàng đợi theo quy định cụ thể) của hàm enque với gói đó. Nếu hàng đợi không bị khóa, nó được phép gửi một gói và gọi hàm deque để xem xét gói gửi, khóa hàng đợi (vì một gói đang được chuyển đi) và gửi gói đến hàng đợi của luồng xuống lân cận. Lưu ý là mọi gói nhận được sau đó của luồng lên lân cận sẽ đến một hàng đợi bị khóa. Khi một luồng xuống lân cận muốn làm cho hàng đợi được mở khóa, nó định trình hàm handle của QueueHandler bằng cách truyền &qh_ đến bộ định trình mô phỏng. Hàm handle gọi hàm resume, hàm này sẽ gửi gói được định trình kế tiếp đến luồng xuống (và vẫn để hàng đợi bị khóa), hoặc mở khóa hàng đợi khi không có gói nào sẵn sàng để được gửi đi. Quá trình này được thực hiện rõ hơn khi tham khảo phương thức LinkDelay::recv().

6.1.2. Lớp PacketQueue


Lớp Queue có thể thực hiện quản lý và định trình bộ nhớ đệm nhưng không thực hiện các chức năng mức thấp trên một hàng đợi cụ thể. Lớp PacketQueue được sử dụng cho mục đích này và được định nghĩa như sau (xem queue.h):

class PacketQueue {

public:

PacketQueue();



int length(); /* queue length in packets */

void enque(Packet* p);

Packet* deque();

Packet* lookup(int n);

/* remove a specific packet, which must be in the queue */

void remove(Packet*);

protected:

Packet* head_;

Packet** tail_;

int len_; // packet count

};

Lớp này duy trì một danh sách liên kết (linked-list) của các gói và thường được sử dụng bởi các nguyên tắc định trình cụ thể và quản lý bộ nhớ đệm để lưu giữ một tập hợp thứ tự các gói. Các sơ đồ định trình cụ thể và quản lý bộ nhớ đệm có thể sử dụng nhiều đối tượng PacketQueue. Lớp PacketQueue duy trì số đếm các gói được lưu giữ trong hàng đợi được trả về bởi phương thức length(). Hàm enque đặt một gói cụ thể vào cuối hàng đợi và cập nhật biến thành viên len_. Hàm deque trả về gói ở đầu hàng đợi và xóa nó khỏi hàng đợi (và cập nhật bộ đếm), hoặc trả về NULL nếu hàng đợi rỗng. Hàm lookup trả về gói thứ n thính từ đầu hàng đợi, hay NULL nếu không có. Hàm remove xóa gói được lưu giữ tại một địa chỉ cho trước khỏi hàng đợi (và cập nhật bộ đếm). Hàm này gây ra sự kết thúc chương bất thường nếu gói không tồn tại.



Каталог: Hoc%20Tap -> Cong%20Nghe%20Wan
Hoc%20Tap -> Point to Point Protocol (ppp) ppp được xây dựng dựa trên nền tảng giao thức điều khiển truyền dữ liệu lớp cao (High-Level Data link Control (hdlc)) nó định ra các chuẩn cho việc truyền dữ liệu các giao diện dte và dce của mạng wan như V
Hoc%20Tap -> Cấu hình Application Port-Mapping với cbac mục tiêu: Cấu hình để router nhận ra các ứng dụng không sử dụng port chuẩn. Mô hình
Hoc%20Tap -> ĐẢng cộng sản việt nam đẢng ủy phưỜng 04
Hoc%20Tap -> CiR = Bc / Tc
Hoc%20Tap -> Mean command : ip ospf mtu-ignore Diagram : Problems
Hoc%20Tap -> R1# ip route 0 0 0 0 FastEthernet0/0 R2# show run
Cong%20Nghe%20Wan -> Câu hỏi về kết nối chi nhánh về Head Office dùng wan
Cong%20Nghe%20Wan -> 1/ Cáp đồng gshdsl
Cong%20Nghe%20Wan -> 1. xu hưỚng chuẩn hoá VÀ CẤu trúc giao thứC

tải về 0.59 Mb.

Chia sẻ với bạn bè của bạn:
1   ...   8   9   10   11   12   13   14   15   ...   19




Cơ sở dữ liệu được bảo vệ bởi bản quyền ©hocday.com 2024
được sử dụng cho việc quản lý

    Quê hương