//реализуем алгоритм планирования //SJF с вытеснением по оставшемуся времени //подумать по оставшемуся времени ,это по берст тайм public void Next_Step() { if (!cpu.Free() && cpu.active_process.Ended()) { cpu.active_process.End(); cpu.stop_pr(); cpu.act_pr = null; cpu.busy_pr = false; } if (cpu.Free() && piramida.C() != 0 && piramida.Count() != 0)//!piramida.Empty()) { cpu.start_pr(piramida.Item()); piramida.Remove_max(); } if (!cpu.Free() && piramida.C() != 0 && piramida.Count() != 0) { if (cpu.active_process.CompareTo(piramida.Item()) == 1) { // cpu.active_process.End(); Process p = cpu.active_process; cpu.start_pr(piramida.Item()); piramida.Remove_max(); piramida.Put(p); } } }
private void button1_Click(object sender, EventArgs e) { listBox1.Items.Clear(); try { int k = Convert.ToInt32(textBox1.Text); q.Put(k); for (int i = 0; i < q.Count(); i++) { listBox1.Items.Add(q.GetQ[i]); } } catch { MessageBox.Show("Поле не заполнено"); } }
//действия модели на такте работы public void Next_time() { //увеличиваем номер такта clock.Next_time(); //если порог интенсивности не превышен if (rand.NextDouble() < intensive) { Process new_pr = new Process(clock.get_time()); //генерируется интервал обсл процесса процессором new_pr.set_name(); new_pr.burst_time = rand.Next(burst_min, burst_max + 1); //помещаем в очередь готовых процессов //почему-то некоректно вставляется //как сделать сортировку по берст тайм??? ready_pr.Put(new_pr); if (ready_pr.C() > 0 && ready_pr.C() > max_length) { max_length = ready_pr.C(); } zadania++; } if (Need_planirovka()) { Process z_process = cpu.active_process; planner.Next_Step(); if (z_process == null) { takt++; } if ((ready_pr.C() == ready_pr.Count()) && ready_pr.C() > max_length) { max_length = ready_pr.C(); } if (z_process != null && z_process.process_status == "завершенный") { kol_vo++; srednee_waiting += z_process.waiting_time; res = srednee_waiting / kol_vo; srednee_oborot += clock.get_time() - z_process.admission_time; res1 = srednee_oborot / kol_vo; } if (z_process != null && z_process.process_status == "ожидающий") { queue.Put(z_process); } } if (Need_pl_2()) { Process z_process = resource.active_process; pl.Next_step(); if (z_process != null && z_process.process_status == "готовый") { z_process.burst_time = rand.Next(3, 6); z_process.work_on_processor = 0; ready_pr.Put(z_process); if (ready_pr.C() > 0 && ready_pr.C() > max_length) { max_length = ready_pr.C(); } zadania++; } } if (cpu.active_process != null && ready_pr.Count() != 0) { p = ready_pr.Count(); for (int i = 0; i < p; i++) { ready_pr.GetQ[i].Next_time(); } } else if (cpu.active_process != null && ready_pr.C() == ready_pr.Count() && ready_pr.Count() > 0) { p = ready_pr.Count(); for (int i = 0; i < p; i++) { ready_pr.GetQ[i].Next_time(); } } cpu.Next_step(); resource.Next_step(); }