Czytasz wątek: Amiga OS 1.2/2.0/3.0 Procesy i Taski
-
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??????
-
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?
-
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
-
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ę...
-
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?
-
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.
-
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
-
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.
-
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.
- Menu
- Baza wiedzy
- AmigaOS.pl