Форум программистов, компьютерный форум, киберфорум
ОС на Assembler
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.69/42: Рейтинг темы: голосов - 42, средняя оценка - 4.69
2 / 2 / 0
Регистрация: 27.06.2008
Сообщений: 29

Планировщик процессов

06.05.2009, 18:08. Показов 9199. Ответов 35
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Написал планировщик процессов, но препод считает, что он написан коряво через одно место. Требует, что бы я убрал запрет/разрешение прерываний и процедур процессов. Но если это сделать, то программа повисает.
Как переделать мой планировщик, что бы он был написан не через *опу?)))
Собственно задание: Написать простейший планировщик двух процессов, используя принудительное переключение и циклическую очередь.
Assembler
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
.model small
.stack 100h;                        Стек на 256 байт
.data;                            Сегмент данных:
            num db 0h;            Номер процесса                         
              max db 1bh;            Максимальный процесс                                                     
              st1 db 100h dup(0);        Стек1                    
              st2 db 100h dup(0);        Стек2                                       
              s_SS dw 0h;            Состояние SS                                                                   
              s_SP dw 3h dup(0);              Стек состояний SP
            smesh dw 0h
            segm dw 0h                                                               
.code;                            Сегмент кода:
Main Proc Near
            mov ax, @data                         
              mov ds, ax
            mov ax, 0h
            mov es, ax    
    cli;                        Запрет прерываний
            mov ax, es:[0020h]    
            mov bx, es:[0022h]    
            mov [smesh], ax;        Сохранение стандартной
            mov [segm], bx;            обработки прерывания                            
            mov ax, offset Inter;        Смещение
            mov bx, seg Inter;        Взятие сегмента
            mov es:[0020h], ax;        Замена вектора прерывания
                mov es:[0022h], bx;        на свою программу обработки                            
    sti;                                            Отмена запрета прерываний                    
            mov ax, 0B800h                   
              mov es, ax      
    Pause:              
                   mov bl, num                                                      
              cmp bl, max                            
                              jne Pause
    cli
            mov ax, 0h
            mov es, ax
            mov ax, [smesh]
            mov bx, [segm]            
            mov es:[0020h], ax;        Восстановление стандартной
            mov es:[0022h], bx;        обработки прерывания
    int 21h
    sti    
            mov ah, 4ch;            Выход из программы
    int 21h
Main endp
Inter Proc Far
            mov al, num
            cmp al, 0h
                jne Reset         
            mov si, 0h                                    
                      mov s_SS, ss;            Сохранение исходного                                 
              mov [s_SP], sp;            процесса
            mov ax, ds                            
              mov ss, ax                                         
              mov sp, offset st1+256;        Адрес 1го стека
      pushf;                        Сохранение регистра флагов                               
    push cs;                    Сохранение сегмента команд                              
      push offset proc1;                Сохранение смещения                                                                   
              mov [s_SP+2], sp;        Сохранение 1го процесса                                          
              mov sp, offset st2+256                         
      pushf                          
      push cs                              
      push offset proc2;                                                                                    
              mov [s_SP+4], sp
    Reset:                                             
            add si, 2h                                                                      
              cmp si, 6h                              
                  jne Switch                                
              mov si, 2h;            Сброс состояния                            
    Switch:                                                  
              mov ax, [s_SP+si];        Переключение на                      
              mov sp, ax;            следующий процесс                                                                     
              mov al, num
              inc al;                Следующий номер процесса
            mov num, al                                                      
              cmp al, max;            Если процесс не последний                            
                              jne Exit;            
            mov ax, s_SS                                      
              mov ss, ax;            Восстанавление исходного стека
            mov ax, [s_SP]                               
              mov sp, ax;            и указателя на него
    Exit:        
    jmp dword ptr [smesh];                Переход к стандартной процедуре
Inter endp
proc1 proc
    cli                               
              mov di, 3840                         
              mov ch, num
              add ch, '@'                            
              mov es:[di], ch
    sti                                  
      jmp proc1                            
proc1 endp                                                         
proc2 proc         
    cli                       
              mov di, 3848                         
              mov cl, num;
              add cl, '@'                            
              mov es:[di], cl
    sti          
      jmp proc2                            
proc2 endp
end Main
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.05.2009, 18:08
Ответы с готовыми решениями:

Простейший планировщик процессов
Помогите пожалуйста написать программу! В ассемблере разбираюсь плоховато, буду рад любым подсказкам)) Задание: Написать на...

[Оптимизация] Планировщик процессов
Всех приветствую! В данный момент разбираюсь с сие чудом - планировщиком. Вещь интересная, я бы сказал прикольная :) Планировщик...

Планировщик процессов
- Алгоритм FIFS. - Алгоритм RR, - Алгоритм SJF Объясните пожалуйста подробно эти 3 алгоритма Примеры реализации

35
2 / 2 / 0
Регистрация: 27.06.2008
Сообщений: 29
11.05.2009, 12:06  [ТС]
Студворк — интернет-сервис помощи студентам
Evg
Собственно в теории и терминологии я полный ламер)))

Собственно скажи, далека ли моя догадка от истины? В первую очередь интересует механизм входа в прерывание
Вы совершенно верно всё разъяснили в предыдущем посте.

И ещё. Какая разница в наличии/отсутсвие квадратных скобок?
s_SS - переменная для хранения исходного сегмента стека.s_SP - массив из трёх двухбайтовых элементов.
Собственно поэтому во втором случае и нужны скобки.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
11.05.2009, 12:18
Цитата Сообщение от Артин Посмотреть сообщение
Вы совершенно верно всё разъяснили в предыдущем посте.
Собственно, начинаю понимать в деталях, что твоя прога делает. С виду косяков не вижу. Единственное, что не нравится - наличие возможности вложенного прерывания. Т.е. когда мы попали в Inter - не нужно ли нам запрещать прерывания или это делается аппаратно?

И скажи, как и чем твою прогу скомпилять и запустить? Попробую по мелочи поэкспериментировать

Цитата Сообщение от Артин Посмотреть сообщение
s_SS - переменная для хранения исходного сегмента стека.s_SP - массив из трёх двухбайтовых элементов.
Собственно поэтому во втором случае и нужны скобки.
Прямо как в фильме "кин-дза-дза":
- А чем пацак отличается от чатланина?
- Ты что, студент, зелёный от оранжевого отличить не можешь?

Так и у тебя. Какая в пень разница, массив или не массив? Или это чисто требование синтаксиса ассемблера и не более того?
0
2 / 2 / 0
Регистрация: 27.06.2008
Сообщений: 29
11.05.2009, 15:07  [ТС]
Т.е. когда мы попали в Inter - не нужно ли нам запрещать прерывания или это делается аппаратно?
Не нужно, так как в процедуре обработки прерывания прерывания не учитываются автоматически.

И скажи, как и чем твою прогу скомпилять и запустить? Попробую по мелочи поэкспериментировать
На Tasm(Турбо Ассемблер).
http://www.laryushkin.nm.ru/tasm.zip
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
11.05.2009, 17:25
А нажимать-то куда? Получил я объектник. А чем и как его линковать?
0
2 / 2 / 0
Регистрация: 27.06.2008
Сообщений: 29
11.05.2009, 19:15  [ТС]
Заходим в TD(Турбо Дебагер). От туда заходим в DOS SHELL.
Набираем:
tasm <имя программы>
tlink <имя программы>
<имя программы>
Программа запускается. Но программа должна быть сохранена с расширением asm.
(Проще всего набрать в блокноте и сохранить с .asm)
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
11.05.2009, 19:44
Хм... у меня и твой вариант из 1-го поста не работает

Добавлено через 5 минут 22 секунды
Для проверки влепил в начало Main код

Code
1
2
3
4
5
6
mov di, 3848 
mov cl, num;
add cl, '@' 
mov es:[di], cl
mov ah, 4ch; Выход из программы
int 21h
Сие отработало. Но визуально ничего не заметил.
Что вообще надо написать, чтобы хоть что-то хоть где-то на экране отобразилось?
0
2 / 2 / 0
Регистрация: 27.06.2008
Сообщений: 29
11.05.2009, 23:28  [ТС]
А вы из Дос шела запускали?
Turbo Debugger/File/DOS shell
И оттудова линковать прогу, сохранённую с расширением asm.
Должно выводить в самой нижней строке экрана буквы латинского алфавита.
Файл в приложении.
Вложения
Тип файла: rar art3.rar (1.1 Кб, 23 просмотров)
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
12.05.2009, 11:14
Кнопка Start -> Run -> "cmd" это не оно?
Ну и напиши нормально, куда зайти, чего нажать и т.п.
Всё из тебя клещами надо вытягивать
0
2 / 2 / 0
Регистрация: 27.06.2008
Сообщений: 29
12.05.2009, 15:04  [ТС]
Заходим в папку tasm. Заходим в TD. Заходим в меню. Файл. DOS shell. и оттудова линкуем.
Из командной строки ничего не работает, так как расчитано вроде бы на чистую MS DOS.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
12.05.2009, 16:28
Цитата Сообщение от Артин Посмотреть сообщение
оттудова линкуем
Куда при этом нажимаем?
0
2 / 2 / 0
Регистрация: 27.06.2008
Сообщений: 29
12.05.2009, 19:03  [ТС]
В сообщении 23 я прикрепил файл. Внутри паки есть все средства для линкования и Турбо Дебаггер. Кликаем по TD. Далее кликаем по File. Из Меню выбираем DOS shell. Появляется консоль на весь экран, и в ней необходимо сначала получить объектный файл(Набрать: tasm имя_проги), затем ехешник(Набрать: tkink имя_проги). Ну а потом в ней же запустить прогу, набрав её имя.

P.S. На всякий случай прикрепил изображение)))
Миниатюры
Планировщик процессов  
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
12.05.2009, 20:58
Всё. Заработало.
Я так понимаю, что если что-то там зависнет, то это намертво и всё надо будет пускать по-новой?

Добавлено через 5 минут 30 секунд
Вопрос. В начало Main влепил код, кодорый содрал из Proc1

Code
1
2
3
4
5
6
7
mov di, 3850 
mov cl, num;
add cl, 2
add cl, '@' 
mov es:[di], cl
mov ah, 4ch; Выход из программы
int 21h
Почему он на экран ничего не напечатал? Или тут при этом в каком-то месте надо в бубен ударить (по исходнику этого не заметил)?

Добавлено через 2 минуты 27 секунд
Последний вопрос снимаю. Сначала в ES надо загнать B800

Добавлено через 53 минуты 34 секунды
Убрал cli и sti из Proc1. Похоже на то, что в первый раз в обработчик прерываний из Main залетели нормально. Настроились на первый процесс и на него ушли. После чего болтаемся в первом процессе и при этом больше в обработчик прерываний не залетаем. Если вернуть операцию sti, то всё отрабатывает нормально. Вывод такой - после обработки прерываний мы находимся в состоянии, при котором прерывания запрещены. Не может ли такой косяк быть следствием того, что в настоящий обработчик прерывания мы попадаем через jmp и при этом что-то где-то коряво восстанавливается при выходе из стандартного обработчика? И зачем нужно уходить на стандартный обработчик? ТОлько для того, чтобы вернуться в нужный нам процесс? Так может возврат самому написать?
1
2 / 2 / 0
Регистрация: 27.06.2008
Сообщений: 29
12.05.2009, 21:23  [ТС]
Если делать возврат через iret, то во-первых, ничего не изменится(будет виснуть), во-вторых, по мнению препода это будет через одно место.
Выходит процедура обработки прерывания действительно запрещает прерывания при переходе на процесс. Если убрать cli из процедур, то всё будет работать нормально, но вот как обойтись без sti?
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
proc1 proc
    sti                               
              mov di, 3840                         
              mov al, num
              add al, '@'                            
              mov es:[di], al                                 
      jmp proc1                            
proc1 endp                                                         
proc2 proc          
    sti                     
              mov di, 3848                         
              mov al, num;
              add al, '@'                            
              mov es:[di], al         
      jmp proc2                            
proc2 endp
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
12.05.2009, 22:17
Чтобы понять, как обойтись без Sti, надо понять, почему после выхода из обработчика прерываний, сами прерывания остаются запрещёнными. Ты уверен в том, что подсунув через push 3 значения в стек, переключившись на стек и уйдя через jmp на стандартный обработчик прерываний, мы из него выйдем нормально?

И ещё, пока рыл в гугле, где-то встретил фразу про то, что надо перехватывать на прерывание 8, а 1c. Это было в самом начале поисков, пока я ещё не особо понимал, что такое прерывание 8. Если не ошибаюсь, вопрос там был такой, что кто-то пишет оболочку а-ля norton commander и ему нужно отображать в углу время. Есть соображения по этому поводу?

Добавлено через 16 минут 50 секунд
Проверил вариант без переключения стеков. Т.е. болтается процесс в цикле и при этом дёргаем обработчик прерываний. Возврат через jmp на стандартный обработчик работает нормально, прерывания при этом не блокируются. Значит косяк в манипуляциях со стеком

Добавлено через 8 минут 37 секунд
Когда мы делаем pushf, то среди флагов нет ли флага, означающего запрет прерывания?

Добавлено через 6 минут 22 секунды
http://sasm.narod.ru/apps/eflags/main.htm
Флаг состояния содержит бит IF, отвечающий за разрешение прерываний. Находясь в обработчике он уже взведён в 0 (т.е. прерывания запрещены). Поэтому перед тем, как сделать pushf нам этот бит надо взвести в 1 (чтобы при восстановлении из обработчика всё стало нормально)

Добавлено через 3 минуты 26 секунд
В-общем заработало. Вместо pushf надо (в двух местах)

Code
1
2
3
4
    pushf 
    pop ax
    or ax, 0200h ; взводим бит IF флага состояний, чтобы при возврате в процесс прерывания были разрешены
    push ax
2
2 / 2 / 0
Регистрация: 27.06.2008
Сообщений: 29
13.05.2009, 15:48  [ТС]
Огромное спасибо!
Я даже и подумать не мог, что дело всё было во флагах.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
13.05.2009, 18:03
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от Артин Посмотреть сообщение
Огромное спасибо!
Я даже и подумать не мог, что дело всё было во флагах.
Если интересен процесс разбора, то было так.

Вначала я налепил отладочных печатей в разные места, благодаря которым понял, что из обработчика прерываний мы ушли в процесс, сам процесс работал, т.к. вывалилась печать, но второй раз в обработчик мы не попали. Из этого сделал вывод, что было заблокировано прерывание (пост #32)

Дальше у меня возникло подозрение на предмет того, а правильно ли мы восстанавливаемся из обработчика. Я убрал все махинации со стеком и при начальном старте сразу же запускал один из процессов. Отладочная печать мне показала, что в обработчик по таймеру мы попадаем нормально. Отсюда следовало, что косяк был именно в махинациях со стеком. Из всех операций хоть как-то прерывания могло затронуть только работа с флагами. Порыл в гугле, увидел, что среди флагов есть бит запрета прерываний. Дальше всё стало очевидно (пост #34)
3
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.05.2009, 18:03

Планировщик процессов windows 7
Пытаюсь написать что-то вроде антируткита, для windows 7. Пришел к тому, что нужно манипулировать со структурами планировщика. Читал на...

Найти среди выполняющихся процессов имена процессов, имеющих одинаковые ProductVersion
нахождения среди выполняющихся процессов имен процессов, имеющих одинаковые ProductVersion. Добавлено через 5 часов 10 минут Совсем...

Нахождение среди выполняющихся процессов имён процессов с наименьшим значением BasePriority
Разработать командлет для нахождения среди выполняющихся процессов имен процессов с наименьшим значением BasePriority.

Нахождение среди выполняющихся процессов имён 3-х процессов, использовавших более всего процессорного времени
Помогите выполнить задание! Нахождения среди выполняющихся процессов имен трех процессов, использовавших более всего процессорного...

Нахождение среди выполняющихся процессов имён процессов, у которых значения параметра WorkingSet одинаковы
Необходимо создать командлет, который находит среди выполняющихся процессов имена процессов, у которых значения параметра WorkingSet...


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

Или воспользуйтесь поиском по форуму:
36
Ответ Создать тему
Новые блоги и статьи
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru