Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
!1-25.doc
Скачиваний:
11
Добавлен:
28.10.2018
Размер:
2.62 Mб
Скачать

17.3 Повторители Ethernet. Разрешение коллизий.

Это многопортовое устройство, которое позволяет объединить несколько сегментов. Принимая кадр или сигнал коллизии по одному из своих портов, повторитель перенаправляет его вов все остальные порты. Распространены устройства с несколькими портами на витую пару (12,16 и 24 порта RJ-45), одним портом BNC, одним портом AUI. Порты RJ-45 бывают типа MDI и MDI-X. Порт RJ-45 имеет 8 контактов. Кабель называется прямым, когда контакты 1-8 порта RJ-45 на одной стороне соединены с соответствующими контактами на другой стороне. Соединение прямым кабелем можно осуществлять только между разными типами портов. Большинство RJ-45 портов повторителей делаются типа MDI-X, что позволяет подключать рабочие станции при помощи прямого кабеля. Для удобства обычно один порт повторителя имеет переключатель и может поддерживать режим MDI.

Правила работы повторителя:

  1. Когда повторитель получает кадр или сигнал CP (collision presents), он транслирует его во все свои порты;

  2. Когда повторитель получает кадры или CP с 2-х или более портов, то транслирует CP во все порты , пока получает сигналы по 2-м или более портам.

Jabber-функция. В нормальных условиях, когда нет коллизий, кадр максимальной длины 1518 байт передается рабочей станцией в течение 1,2 мс. Затем в течение времени межкадрового интервала линия остается свободной. При сильной загруженности сегмента время, в течение которого линия может быть занята, сильно возрастает. Если такой загруженный сегмент подключен к одному из портов повторителя и инициирует длительный сигнал без замолкания (jabber signal - дословно, .болтовня), то повторитель прекратит ретрансляцию данных и коллизий из этого сегмента в другие сегменты, таким образом полностью исключив перегруженный сегмент. Для этой цели концентратор поддерживает специальную jabber-функцию. Стандартом установлено не конкретное время срабатывания, а окно приема непрерывного сигнала от 20 до 150 мс, при котором концентратор должен исключать "плохой" сегмент. Jabber-функция - полезное свойство повторителя, на основе которой последний может исключать как перегруженный коллизионный сегмент, так и неисправный сегмент, или неисправную станцию .

Отметим, что хотя витая пара (IOBase-Т) и двухволоконный оптический кабель (10Base-FL) являются дуплексными средами, т.е. передача и прием сигнала происходят по независимым каналам, сам по. себе повторитель Ethernet не позволяет обеспечить дуплексную передачу и создает вокруг себя коллизионный момент. при этом сеть функционирует так, как будто реализована шинная топология.

17.4 Написать процедуру, которая осуществляет сложение целых чисел произвольной длины(двухсвязный список)

#include <fcntl.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <io.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

struct list { // стр-ра, ссылающаяся сама на себя

int info;

list *prev;

list *next;

list() { prev=NULL; next=0; info=0; }

};

void insert_post(list **, list **, list**, int);

void printList(list *);

int countItems(list *);

list *first1=0; // голова 1-го списка

list *last1=0; // хвост 1-го списка

list *first2=0; // голова 2-го списка

list *last2=0; // хвост 2-го списка

void main( void )

{

char digit[10], num1[100], num2[100];

unsigned int i;

list *p1, *p2;

printf("Enter first whole number:\n");

scanf("%s", num1);

printf("\nEnter second whole number:\n");

scanf("%s", num2);

for(i=0; i<strlen(num1); i++) {

p1=last1;

sprintf(digit, "%c", num1[i]);

insert_post(&p1, &first1, &last1, atoi(digit));

}

printList(first1);

for(i=0; i<strlen(num2); i++) {

p2=last2;

sprintf(digit, "%c", num2[i]);

insert_post(&p2, &first2, &last2, atoi(digit));

}

printList(first2);

int cnt1 = countItems(first1);

int cnt2 = countItems(first2);

int rem=0, tmp;

p1 = last1;

p2 = last2;

if(cnt1>=cnt2) {

while(p2!=NULL) {

tmp = p1->info + p2->info + rem;

if(tmp>=10) { tmp -= 10; rem = 1; }

else rem = 0;

p1->info = tmp;

p1 = p1->prev;

p2 = p2->prev;

}

if(rem) p1->info += 1;

printList(first1);

}

else {

while(p1!=NULL) {

tmp = p1->info + p2->info + rem;

if(tmp>=10) { tmp -= 10; rem = 1; }

else rem = 0;

p2->info = tmp;

p1 = p1->prev;

p2 = p2->prev;

}

if(rem) p2->info += 1;

printList(first2);

}

}

/* Вставка элемента после текущего */

void insert_post(list **q, list **first, list **last, int value)

{

list *p = new list;

if ((*q) != 0)

{

p->next = (*q)->next; p->prev = *q;

}

p->info = value;

if ((*q) == 0)

{

*first = p; *last = p;

}

else

{

if ((*q)->next == 0) *last = p;

else (*q)->next->prev = p;

(*q)->next = p;

}

}

/* count items in the list */

int countItems(list *q)

{

int cnt=0;

while(q!=NULL) {

cnt++;

q = q->next; }

return cnt;

}

/* Print the list */

void printList(list *q)

{

if (q == 0) printf("List is empty.\n\n");

else {

printf("The list is:\n");

while (q != 0) {

printf("%d-> ", q->info); q = q->next;

}

printf("NULL\n\n"); } }