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

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

Восстановить пароль Регистрация
 
Sventox
0 / 0 / 0
Регистрация: 13.04.2011
Сообщений: 4
21.05.2011, 21:21     Написать программу на основе другой #1
Здрасте, имеется программа которое моделирует работу многопроцессорной сисетмы (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;
}
В принципе описание должно быть понятным как работает данная программа. Может кто поможет, (если что задавай те вопросы)
Миниатюры
Написать программу на основе другой   Написать программу на основе другой  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.05.2011, 21:21     Написать программу на основе другой
Посмотрите здесь:

Написать программу, которая считывает текст из файла и записывает в другой файл C++
C++ Написать программу , которая считывает текст из файла и записывает в другой файл только предложения , не содержащие заданное с клавиатуры слово можешь
Необходимо написать программу сортирующую эту строки по алфавиту и выводящую результат в другой файл. C++
помогите написать программу, копирующую один файл в другой. Имена файлов программа должна получать из командной строки. C++
C++ Написать программу записи содержимого из одного файла в другой : Тип файла текстовый
C++ Написать программу: считать две матрицы из файла и записать их в другой файл
Написать программу работы с поездами, на основе класса Train C++
C++ Написать программу на основе алгоритма RLE (сжатие/восстановление массива)

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 12:25. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru