eXec.plMAGAZYN UŻYTKOWNIKÓW KOMPUTERÓW AMIGA
MAGAZYN UŻYTKOWNIKÓW KOMPUTERÓW AMIGA

wtorek, 23. lipca, 2019, 13:22

Amiga forum / AmigaOS 2.x i starsze / Amiga OS 1.2/2.0/3.0 Procesy i Taski

Czytasz wątek: Amiga OS 1.2/2.0/3.0 Procesy i Taski

68k_tester
Nieaktywny użytkownik starego forum

Amiga OS 1.2/2.0/3.0 Procesy i Taski wysłany: 2009-04-13 20:08

funkcja AddTask() z biblioteki 'exec.library' tworzy nowy Task w systemie Amigi
a funkcja CreateProc() z biblioteki 'dos.library' tworzy nowy Process w systemie Amigi
obydwa te pojęcia w systemach windows nazywane są wątkami i tu pojawia się problem.........

aby zbytnio nie mieszać dalej stosuje słowo "zadanie"

Procesy na Amigach mogą dowolnie operować funkcjami 'dos.library' bo w chwili ich
tworzenia dodawana jest struktura process której jednak Task'i nie posiadają co
oznacza ,że Taski nie mogą np. zapisywać i odczytywać plików. Chcąc jednak uruchomić
kolejny Process z Process'u już istniejącego pojawia się dziwne zjawisko:
jedynym aktywnym zadaniem jest Process potomny natomiast Process pierwotny
oczekuje na funkcji CreateProc() i jest całkowicie zablokowany......
Jeśli tak to w jaki sposób realizować w systemach AmigaOS
równoczesne operacje plikowe w jednym programie??????

Odpowiedz

Grzegorz
Nieaktywny użytkownik starego forum

Amiga OS 1.2/2.0/3.0 Procesy i Taski wysłany: 2009-04-13 21:05

@68k_tester
funkcja AddTask() z biblioteki 'exec.library' tworzy nowy Task w systemie Amigi
a funkcja CreateProc() z biblioteki 'dos.library' tworzy nowy Process w systemie Amigi
obydwa te pojęcia w systemach windows nazywane są wątkami i tu pojawia się problem...



W systemach windowsowych występują procesy (processes) i wątki (threads).

@68k_tester
Chcąc jednak uruchomić kolejny Process z Process'u już istniejącego pojawia się dziwne zjawisko: jedynym aktywnym zadaniem jest Process potomny natomiast Process pierwotny oczekuje na funkcji CreateProc() i jest całkowicie zablokowany...



Prawdopodobnie źle wywołujesz funkcję CreateProc(). Na pewno nie blokuje ona procesu wywołującego. Co prawda nigdy nie używałem tej funkcji, ponieważ pod OS 2.0 i nowszymi znacznie wygodniej tworzy się procesy funkcją CreateNewProc() i ta na 100% nie blokuje procesu wywołującego.

@68k_tester
Jeśli tak to w jaki sposób realizować w systemach AmigaOS równoczesne operacje plikowe w jednym programie??????



Mógłbyś sprecyzować co rozumiesz przez równoczesne operacje plikowe?

Odpowiedz

68k_tester
Nieaktywny użytkownik starego forum

Amiga OS 1.2/2.0/3.0 Procesy i Taski wysłany: 2009-04-14 17:54

Oto cytat "
W Win32 przez process rozumiemy wykonywany egzemplarz programu.
Process Win32 posiada pamięć, otwarte
pliki i inne zasoby, jednak sam process nie jest
wykonywany.
Każdy process Win32 uruchamia nowy wątek, który w
rzeczywistości jest wykonywany.
Jaka jest zatem różnica pomiędzy wątkiem, a procesem?
Żadna dopóki process posiada jeden wątek
Wątek może utworzyć nowe wątki, a process nie.
Wątki w jednym procesie mogą dzielić praktycznie
wszystko, natomiast procesy między sobą już nie.
"

Ustalmy ostatecznie: w systemach windows process jest "przestrzenią adresową aplikacji

wraz z pierwszym przydzielonym jej wątkiem" czyli istnieją tylko wątki(threads) w

rozumieniu przydziału mocy obliczeniowej.Temat włókien w win32 pozostawmy... OK?

Jak to jest na Amidze oto jest pytanie?

Pewnie podobne... ale dla mnie ważna jest możliwość wykonywani operacji I/O równocześnie
na porcie RS232 i na kilku otwartych plikach co oznacza posiadanie wielu aktywnych zadań.
Jasne,że da sie to napisać na jeden process tylko jeszcze muszę blokować przerwania
przy zapisie pojedyńczego sektora do Flash'a a i tak już mam przypięty RS232 na przerwaniu
bo bufory odczytu nie wystarczają...

Tymczasem Task'i nie pozwalają na operacje plikowe z 'dos.library'
A process otwarty z procesu blokuje ten pierwszy....

przynajmniej tak jest w Kickstart:

'dos.library' ver 34.3
'exec.library' ver 34.2



Panie Grzegorzu w desperacji napisałem dla testu coś takiego:

Klawiszem 'Esc' powinno się wyjść z programu a jednak nic z tego...
dopiero klawisz 'Spacja' przerywa process potomy i dopiero wtedy
zadziała klawisz 'Esc' więc proszę mi wyjaśnić gdzie robie błąd????



;CPU: MC 68000
;System: Amiga 500 OS v1.3 Kickstart (v34)
;Assembler: DevPac v3.02 (HiSoft)


Exec: equ 4
OldOpenLibrary: equ -408
CloseLibrary: equ -414
CreateProc: equ -138 ;Tworzy nowy proces w systemie.


;Blok podstawowy umieszczamy w pamieci CHIP_RAM

SECTION Program,CODE_C


Start: move.l Exec.w,a6
lea DosName(pc),a1
jsr OldOpenLibrary(a6)
tst.l d0
beq.s Error_0
move.l d0,DosBase
;-----------------------

;ten kod tworzymy nowy process w pamieci

move.l DosBase,a6
move.l #ProcName,d1 ;Nazwa dla nowego procesu.
move.l #2,d2 ;Priorytet procesu (od -128(Najmniejszy) do +127(Najwiekszy))
move.l #SegLista,d3 ;Lista segmentow programu zwracana np: przez funkcje LoadSeg()
divu #4,d3 ;Rej. D3 musi zawierac podzielony przez cztery adres
;kodu wykonywalnego nowo tworzonego procesu!
;UWAGA: A dokładniej ma być to adres o 4 wiekszy od
;adresu startu kodu bo tam powinien być wskaźnik do
;kolejnego modułu HUNK'a programu lub 0 jeśli nasz
;nowy proces składa się tylko z jednej sekcji kodu.

move.l #4000,d4 ;Rozmiar w bajtach (Stosu) przydzielanego procesowi.Wartosc ta musi byc podzielna przez 4.
jsr CreateProc(a6)
tst.l d0 ;Wskaznik na nowo utworzony (IORequest) lub NULL jesli blad.
beq Error_0

Wait_Key_Esc: cmp.b #$75,$BFEC01 ;czekamy na klawisz 'Esc'
bne.s Wait_Key_Esc


Koniec: moveq #0,d0
rts

Error_0: moveq #-1,d0
rts



dc.b 0,0,0 ;wyrównanie obszaru pamięci do podzielnego przez 4 bez reszty.



SegLista: DC.L 16 ;tu rozmiar kodu nowego procesu wartość 16 też działa
DC.L 0 ;tu wskaźnik do kolejnej takiej struktury lub 0 jeśli
;program składa się tylko z jednego bloku kodu...

;.... tutaj kod wykonywalny nowego procesu ....

;UWAGA:Kod wykonywalny nowo tworzonego procesu musi
;być umieszczony w pamięci pod adresem bez reszty
;podzielnym przez 4 bo inaczej guru....

Process_Code: ;---------------------
PP_Loop0: move.w #10,d0 ;Odczekujemy okreslony czas.
PP_Loop2: move.w #$1FFF,d1
PP_Loop1: cmp.b #$7F,$BFEC01 ;czekamy na klawisz 'spacja'
beq Koniec
dbf d1,PP_Loop1
dbf d0,PP_Loop2
bchg.b #1,$BFE001 ;Zmieniamy stan diody PowerLED na przeciwny.
bra.s PP_Loop0
Process_End: ;---------------------



ProcName: DC.B "-->PROCESS<--",0
DosBase: DC.L 0
DosName: DC.B "dos.library",0




Odpowiedz

Grzegorz
Nieaktywny użytkownik starego forum

Amiga OS 1.2/2.0/3.0 Procesy i Taski wysłany: 2009-04-14 18:57

@68k_tester
A process otwarty z procesu blokuje ten pierwszy....



Nie blokuje. Chyba że w międzyczasie zablokuje się przerwania albo zrobi coś równie nierozsądnego (o czym niżej).

@68k_tester
Panie Grzegorzu w desperacji napisałem dla testu coś takiego:



Trochę sobie poanalizowałem ten kod... Widzę tu, że proces główny (nazwijmy go A) uruchamia proces B. Po uruchomieniu procesu B, proces A w ciasnej pętli kodu oczekuje na wciśnięcie klawisza ESC. Proces B natomiast, również w ciasnej pętli kodu, oczekuje na wciśnięcie klawisza spacji, z tym że pętla ta ulega przerwaniu po wyzerowaniu obu liczników w rejestrach D0 i D1. Błąd, który Pan popełnił to właśnie użycie tego rodzaju ciasnych pętli (tzw. busylooping). Proces A posiada domyślny priorytet 0, procesowi B nadaje Pan priorytet +2. Oba procesy krążą w pętlach kodu, co przy schedulerze typu round-robin zastosowanym w AmigaOS oznacza, że proces A nie dostanie czasu procesora dopóki proces B się nie zakończy. Do czekania na zdarzenia w systemie wielozadaniowym nie należy stosować pollingu rejestrów i krążenia w pętli. Proponuję zmodyfikować pętlę procesu B w taki sposób aby po sprawdzeniu rejestru klawiatury używała systemowej funkcji Delay() z dos.library z parametrem 1 (co oznacza opóźnienie o około 1/50 sekundy). Wtedy oba procesy będą się wykonywały współbieżnie, z tym że proces A będzie nadal niepotrzebie "busyloopował". To oczywiście nadal "partyzantka", ale pozwoli działać obu procesom.

Proponuję w szerszym zakresie wykorzystać system operacyjny i wejście z klawiatury czytać za pomocą keyboard.device. Wtedy oba procesy znajdą się w stanie "wait" i zostaną aktywowane dopiero w momencie zajścia zdarzeń, na które oczekują. Amiga ma znakomity system wielozadaniowy, tylko trzeba dać mu szansę...

Odpowiedz

68k_tester
Nieaktywny użytkownik starego forum

Re:Amiga OS 1.2/2.0/3.0 Procesy i Taski wysłany: 2009-04-15 16:09

Zadziałało...

Nie mam zbyt wielu informacji o systemie Kickstart (v34) bo gdzie dziś je
zdobyć.Wyjątkowo rozbudowany zakres priorytetów dla zadań sugerował raczej
nieco inną funkcjonalność systemu.Pomijając fakt zbyt intensywnego odpytywania
portu klawiatury nie pomyślałem ani przez chwilę o oddawaniu czasu procesora...
czyli jak w windows bez sleep() ani rusz.


Radość nie trwała zbyt długo... testując kolejne funkcje jakie chce
zastosować w moim programie pojawiają się nowe problemy:

synchronizacja procesu z procesem ??? w includ'ach do DevPac'a znajduje jedynie
funkcję AddSemaphore() i nic bardziej znanego jak Mutex'y czy Token'y pochodzi
to z biblioteki 'exec.library' ale czy działa z procesami...?
Przykłady ,które napisałem na poczekaniu efektownie zawieszają Amigę
ale pewnie znowu moja wina.... testy trwają... do skutku

Problem nr2. Zrobiłem okienko i przyciski z czego kilka to tzw. CheckBox'y
same przyciski działają prawidłowo ale już z atrybutem TOGGLESELECT zaczynają
się schody... co chce uzyskać: jest kilka przycisków z opcjami jeden z nich
jest podświetlony czyli (wybrany) klikamy na inny obok i wtedy on ma być (wybrany) a
wcześniejszemu znika podświetlenie. Banał w GTK1 czy WinAPI pisałem to sto razy
jednak w Amidze działa mi to dziwnie (pozostaje inversja text'u w przycisku) czemu?

Odpowiedz

Grzegorz
Nieaktywny użytkownik starego forum

Re:Amiga OS 1.2/2.0/3.0 Procesy i Taski wysłany: 2009-04-15 16:41

@68k_tester
Nie mam zbyt wielu informacji o systemie Kickstart (v34) bo gdzie dziś je
zdobyć.



U mnie chociażby. Proszę o kontakt mailowy na krashan małpka teleinfo kropka pb kropka edu kropka pl. Problem może być jedynie z formatem, bo jest to format AmigaGuide, który na OS 1.x wymaga dedykowanego programu do przeglądania (można go znaleźć na Aminecie). Zdecydowanie potrzebuje Pan lektury ROM Kernel Maunals, które mogę udostępnić.

@68k_tester
nie pomyślałem ani przez chwilę o oddawaniu czasu procesora...
czyli jak w windows bez sleep() ani rusz.



Amiga ma wielozadaniowość z wywłaszczaniem (jak Windows z kernelem NT i pochodnymi), ale zastosowany scheduler round-robin powoduje, że jeżeli proces o danym priorytecie nie wchodzi w stan "wait" a wciąż krąży w pętli, to procesy o niższych priorytetach nie dostaną czasu CPU, dostaną go jedynie procesy o priorytecie równym lub wyższym. Gdyby Pan obu swoim procesom przydzielił priorytet 0, to oba dostałyby po 50% czasu procesora i wykonywałyby się współbieżnie.

@68k_tester
synchronizacja procesu z procesem ??? w includ'ach do DevPac'a znajduje jedynie
funkcję AddSemaphore() i nic bardziej znanego jak Mutex'y czy Token'y pochodzi
to z biblioteki 'exec.library' ale czy działa z procesami...?



Można semafory, można też sygnały oraz, na nieco wyższym poziomie, porty i wiadomości. Myślę, że lektura wspomnianego RKRM da Panu pełen przegląd możliwości. Mutexów i tokenów jako takich nie ma w AmigaOS.

@68k_tester
Problem nr2. Zrobiłem okienko i przyciski z czego kilka to tzw. CheckBox'y



Tu niestety wysiadam. To co w zakresie GUI udostępnia AmigaOS 1.3 to zamierzchła prehistoria i praktycznie nikt tego od lat nie używa. Jeszcze raz mogę jedynie skierować do RKRM i dokumentacji API AmigaOS.

@68k_tester
Banał w GTK1 czy WinAPI pisałem to sto razy jednak w Amidze działa mi to dziwnie



Proszę pamiętać, że w czasie kiedy powstawał AmigaOS 1.3, ani GTK ani WinAPI jeszcze nie istniały... Radzę nie spodziewać się cudów, GUI w AmigaOS 1.x było jak na dzisiejsze standardy dość prymitywne.

Odpowiedz

68k_tester
Nieaktywny użytkownik starego forum

Amiga OS 1.2/2.0/3.0 Procesy i Taski wysłany: 2009-04-16 08:48

Wysłałem email na podany przez Pana adres z opisem tego co już zgromadziłem o Amidze

Korzystając z okazji zwracam się z prośbą do wszystkich osób mających dobrą wolę udostępnienia mi jakichkolwiek informacji o budowie czy funkcjonowaniu systemów operacyjnych Amiga OS Kickstart od (v34) do (v39).

email: marker-315-217(małpa)o2.pl

Odpowiedz

Grzegorz
Nieaktywny użytkownik starego forum

Amiga OS 1.2/2.0/3.0 Procesy i Taski wysłany: 2009-04-16 15:57

@68k_tester
Korzystając z okazji zwracam się z prośbą do wszystkich osób mających dobrą wolę udostępnienia mi jakichkolwiek informacji o budowie czy funkcjonowaniu systemów operacyjnych Amiga OS Kickstart od (v34) do (v39).



Napisałem.


Odpowiedz

68k_tester
Nieaktywny użytkownik starego forum

Amiga OS 1.2/2.0/3.0 Procesy i Taski wysłany: 2009-04-20 08:52

Moje email’e nie docierają, więc poprzez forum dziękuje za dostarczone mi informacje.
Pozdrawiam.


Odpowiedz

AmigaOS.pl