Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Sventox
0 / 0 / 0
Регистрация: 13.04.2011
Сообщений: 4
#1

Написать программу на основе другой - C++

21.05.2011, 21:21. Просмотров 280. Ответов 0
Метки нет (Все метки)

Здрасте, имеется программа которое моделирует работу многопроцессорной сисетмы (Screenshot-172.jpg), нужно переделать её для другой архитектуры (Screenshot-173.jpg).
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
#include <iostream>
#include <queue>
 
#include <time.h>
#include <stdlib.h>
 
#define NUMBER_OF_INSTRUCTIONS 100
#define COEFFICIENT_LATENCY 2
 
using namespace std;
 
class CpuState {
public:
  //класс описывающий один конкретно взятый процессор
    enum STATE {
        READY,
        WAITING_RESPONCE,
        WAITING_MEMORY,
        COMPLITED
    } state;
  //перечисление состояний процессора
    
    CpuState() {
        state = READY;
        waitingBeats = 0;
        passedBeats = 0;
    }
  //функция-конструктор задающая начальные значения переменных описывающих состояние процессора
  
    void addTask(float tsk) { task.push(tsk); }
  //ф-ия "добавить задание"
    float currentTask() { return task.front(); }
  //ф-ия "узнать задание"
    float lastTask() { return task.back(); }
  //ф-ия "узнать последнее добавленное задание (использовалась для вывода и отладки, можно стереть)"
    void complTask() { task.pop(); }
  //ф-ия "завершить задание (первое задание в очереди выкидывается из неё)"
    bool hasTask() { return (task.empty()) ? false : true;}
  //ф-ия "проверка наличия заданий"
 
    void setBeats(int beats) { waitingBeats = beats; }
  //ф-ия "установить колличество тактов ожидания"
    void decBeats() { if(waitingBeats > 0) waitingBeats--; }
  //ф-ия "уменьшить колличество тактов ожидания на 1"
    bool isNotWaiting() { return (waitingBeats == 0) ? true : false; }
  //ф-ия "проверка статуса процессора на то не простаивает ли он"   
    void incPassedBeats(int pBeats) { passedBeats += pBeats; }
  //ф-ия "подсчёта колличества рабочих тактов"
    unsigned int getPassedBeats() { return passedBeats; }
  //ф-ия "получение числа рабочих тактов"
private:
    unsigned int waitingBeats;
    //колличество рабочих тактов
    queue <float> task;
    //очередь заданий процессора
    unsigned long passedBeats;
    //общее колличество тактов
};
 
 
int main() {
    for(int j = 0; j < 10; j++) {
        cout << "замер № " << j + 1 << endl;
 
    CpuState cpu1, cpu2, cpu3;
    //создаём три экземпляра класса "состояние процессора"
 
    cout << "задачи процессоров:" << endl;
    srand(time(NULL));
    for(int i = 0; i < NUMBER_OF_INSTRUCTIONS; i++) {
        cpu1.addTask((rand() % 30000) + 15000);
        cpu2.addTask((rand() % 30000) + 15000);
        cpu3.addTask((rand() % 30000) + 15000);
        cout << "cpu1 = " << cpu1.lastTask() << "   " 
              << "cpu2 = " << cpu2.lastTask() << "   "
              << "cpu3 = " << cpu3.lastTask() << endl;
    }
    cout << "------------------------------------" << endl;
    //случайным образом генерируем 100 задачь для каждого процессора и выводи их на экран
 
    queue<CpuState *> queueForService;
    queueForService.push(&cpu1);
    queueForService.push(&cpu2);
    queueForService.push(&cpu3);
    //очередь процессоров на обслуживание шиной
    
    unsigned long beats = 0, memoryUsed = 0, busOccupied = 0;
    for(;  cpu1.state != CpuState::COMPLITED ||
             cpu2.state != CpuState::COMPLITED ||
             cpu3.state != CpuState::COMPLITED; beats++) {
              //цикл работающий до тех пор пока хотя бы у одного процессора будут задания
              //после каждой итерации увеличивает общее колличество прошедших тактов на 1
        if(busOccupied > 0)
            busOccupied--;
              //проверка условия занятости шины
              //в случае если она занята, колличество тактов которые она ещё будет занята уменьшается на 1
        //  cout << "итерация № " << beats + 1 << endl;
        //  cout << "шина будет занята ещё " << busOccupied << " тактов." << endl;
        //  cout << "слотов памяти использованно " << memoryUsed << endl;
 
        cpu1.decBeats(), cpu2.decBeats(), cpu3.decBeats();
        //уменьшается (если необходимо(проверяется внутри самой функции)) колличество тактов
        //в течении которых процессор ещё будет занят
 
        //  cout << "активных тактов процессора cpu1 прошло: " << cpu1.getPassedBeats()
        //        << ". активных тактов процессора cpu2 прошло: " << cpu2.getPassedBeats()
        //        << ". активных тактов процессора cpu3 прошло: " << cpu3.getPassedBeats() << '.' << endl;
 
        if(busOccupied == 0) {
            //      cout << "------------------------------------" << endl;
            //      cout << "Условие \"шина свободна\" сработало" << endl;
            //      cout << "------------------------------------" << endl;
            CpuState * tmpCpuState = queueForService.front();
 
            if(tmpCpuState->state == CpuState::READY && memoryUsed < 2) {
                tmpCpuState->state = CpuState::WAITING_RESPONCE;
                tmpCpuState->setBeats(COEFFICIENT_LATENCY);
                memoryUsed++;
                busOccupied++;
                tmpCpuState->incPassedBeats(1);
                //          cout << "Условие \"процессор готов и память свободна\" сработало" << endl;
                //          cout << "------------------------------------" << endl;
            }
 
            if(tmpCpuState->state == CpuState::WAITING_RESPONCE && tmpCpuState->isNotWaiting()) {
                //          cout << "Условие \"время ожидания памяти процессором истекло\" сработало" << endl;
                //          cout << "------------------------------------" << endl;
                if(tmpCpuState->hasTask()) {
                    //              cout << "Условие \"у процессора ещё есть задания\" сработало" << endl;
                    //              cout << "------------------------------------" << endl;
                    tmpCpuState->state = CpuState::READY;
                }
                else {
                    //              cout << "Условие \"у процессора больше нет заданий\" сработало" << endl;
                    //              cout << "------------------------------------" << endl;
                    tmpCpuState->state = CpuState::COMPLITED;
                }
 
                tmpCpuState->setBeats(10 * tmpCpuState->currentTask());
                busOccupied += 10 * tmpCpuState->currentTask();
                tmpCpuState->incPassedBeats(10 * tmpCpuState->currentTask());
                tmpCpuState->complTask();
                memoryUsed--;
            }
 
            queueForService.pop();
            queueForService.push(tmpCpuState);
        }
 
        //  cout << "+--------------------------------------------------"
        //        << "--------------------------------------------------+" << endl;
    }
 
    cout << "В итоге: " << endl << "Шина была занята " << beats << " тактов."
          << " Из них на ожидание ушло " 
          << beats - (cpu1.getPassedBeats() + cpu2.getPassedBeats() + cpu3.getPassedBeats()) << " тактов" << endl
          << "В процентном отношение полезное время шины составляет: "
          << ((cpu1.getPassedBeats() + cpu2.getPassedBeats() + cpu3.getPassedBeats()) / (float)beats) * 100.0
          << "%. " << endl
 
          << "Процессор 1 отработал " << cpu1.getPassedBeats() << " тактов" 
          << "что в процентном отношении составляет "
          << (((float)cpu1.getPassedBeats() / (float)beats) * 100.0) << "% времени полезной работы" << endl
 
          << "Процессор 2 отработал " << cpu2.getPassedBeats() << " тактов" 
          << "что в процентном отношении составляет "
          << (((float)cpu2.getPassedBeats() / (float)beats) * 100.0) << "% времени полезной работы" << endl
 
          << "Процессор 3 отработал " << cpu3.getPassedBeats() << " тактов" 
          << "что в процентном отношении составляет "
          << (((float)cpu3.getPassedBeats() / (float)beats) * 100.0) << "% времени полезной работы" << endl;
 
    cout << endl;
    }
    return 0;
}
В принципе описание должно быть понятным как работает данная программа. Может кто поможет, (если что задавай те вопросы)
0
Миниатюры
Написать программу на основе другой   Написать программу на основе другой  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.05.2011, 21:21
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Написать программу на основе другой (C++):

Написать программу, которая на основе матрицы А nxm - C++
Написать программу, которая на основе матрицы А nxm (заполненная псевдослучайными числами) строит матрицу Bnxmза следующим правилом. Bij (i...

Написать программу работы с поездами, на основе класса Train - C++
Написать программу работы с поездами, на основе класса Train. Программа предлагает ввести с клавиатуры: - Количество поездов; -...

Написать программу на основе алгоритма RLE (сжатие/восстановление массива) - C++
Массив из 0 и 1 целых чисел. Массив надо сжать, а затем восстановить массива. Надо написать программу по алгоритму RLE. Спасибо заранее ...

Написать программу копирования одного стека в другой - C++
Тема: &quot;Стек&quot; Цель работы: изучить теорию и научиться программировать стек. Здравствуйте,задали задание по информатике,а я даже не...

Написать программу, которая умножает один массив на другой - C++
Написать программу, которая умножает один массив на другой, размерность массивов одинаковая. Ввод елементов массива происходит с клавиатуры.

Написать программу которая копирует текст из одного файла в другой - C++
написать программу которая копирует текст из одного файла в другой.Имена исходного и конечного файлов должна передаваться в виде аргументов...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.05.2011, 21:21
Привет! Вот еще темы с ответами:

Написать программу, демонстрирующую движение одной плоской фигуры относительно другой - C++
Ребята помогите! анимация, ни одной идеи в голове:cry: Написать программу, демонстрирующую движение одной плоской фигуры относительно...

Написать программу: считать две матрицы из файла и записать их в другой файл - C++
считать две матрицы из файла и записать их в другой файл. Добавлено через 3 часа 26 минут актуально

Написать программу, которая считывает текст из файла и записывает в другой файл - C++
Написать программу, которая считывает текст из файла и записывает в другой файл все слова, встречающиеся в тексте несколько раз.

Необходимо написать программу сортирующую эту строки по алфавиту и выводящую результат в другой файл. - C++
Уважаемые программисты, помогите пожалуйста девушке. Есть задание, но как-то я давно не садилась за код и не очень помню, ка к правильно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru