Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Министерство Образования и Науки Украины
Одесский Национальный Политехнический Университет
Институт компьютерных систем
Кафедра Компьютерных Систем
Протокол
Лабораторной работы № 24
« Синхронизация процессов »
Выполнил
Студент гр. АЕ 082
Суслов А.Н.
Проверил
Нестерюк А. Г.
Одесса 2011
Цель работы:
5. Задание:
5.1. Изучить приведенные примеры и использованные в них функции.
5.2. Исследовать работу программ. Убедиться, что при попытке запуска программа SlaveSemaphore сразу завершает свою работу.
5.3. Запустить программу MasterSemaphore и открыть с ее помощью файл a.txt. Убедиться, что каждые 5 секунд в окно отладки выводятся сообщения от программы master. Затем запустить программу SlaveSemaphore и убедиться, что она передает в программу master свою информацию.
5.4*. Создать необходимые средства диагностики и доказать, что третий экземпляр SlaveSemaphore находится в режиме ожидания до завершения работы одного из предыдущих процессов SlaveSemaphore.
Листинг программ.
Процедура MasterSemaphore программы :
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
.IF uMsg==WM_CREATE
invoke GetMenu,hWnd
mov hMenu,eax
mov ofn.lStructSize,SIZEOF ofn
push hWnd
pop ofn.hWndOwner
push hInstance
pop ofn.hInstance
mov ofn.lpstrFilter, OFFSET FilterString
mov ofn.lpstrFile, OFFSET buffer
mov ofn.nMaxFile,MAXSIZE
.ELSEIF uMsg==WM_DESTROY
invoke KillTimer,hWnd,0 ;âèäàëèòè òàéìåð
.if hMapFile!=0
call CloseMapFile
.endif
invoke PostQuitMessage,NULL
.elseif uMsg==WM_TIMER
;Show Mapping content
PrintStringByAddr MappingAddress
.ELSEIF uMsg==WM_COMMAND
mov eax,wParam
.if lParam==0
.if ax==IDM_OPEN
mov ofn.Flags, OFN_FILEMUSTEXIST or \
OFN_PATHMUSTEXIST or OFN_LONGNAMES or\
OFN_EXPLORER or OFN_HIDEREADONLY
invoke GetOpenFileName, ADDR ofn
.if eax==TRUE
invoke CreateFile,ADDR buffer,\
GENERIC_READ or GENERIC_WRITE,\
0,\
NULL,OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE,\
NULL
mov hFileRead,eax
PrintHex hFileRead
mov eax,OFFSET buffer
PrintStringByAddr OFFSET buffer
invoke SetWindowText,hWnd,eax
invoke CreateFileMapping,hFileRead,NULL, PAGE_READWRITE,0,0,OFFSET FileMappingName
mov hMapFile,eax
invoke MapViewOfFile,hMapFile,FILE_MAP_ALL_ACCESS,0,0,0
mov MappingAddress,eax
invoke EnableMenuItem,hMenu,IDM_OPEN,MF_GRAYED
invoke EnableMenuItem,hMenu,IDM_SAVE,MF_ENABLED
invoke CreateSemaphore,NULL,2,2,offset SemaphoreName
mov hSemaphore,eax
PrintHex hSemaphore
PrintLine
invoke SetTimer,hWnd,0,5000,0 ;ñòâîðèòè òàéìåð
.endif
.else
invoke DestroyWindow, hWnd
.endif
.endif
.ELSE
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.ENDIF
xor eax,eax
ret
WndProc endp
Процедура SlaveSemaphore программы :
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
.IF uMsg==WM_CREATE
invoke OpenSemaphore,SEMAPHORE_ALL_ACCESS,FALSE,offset SemaphoreName
mov hSemaphore,eax
PrintHex hSemaphore,"Slave OpenSemaphore"
.IF hSemaphore == 0
PrintHex eax,"Slave NoSemaphore"
invoke CloseAll;,hWnd
.else
invoke WaitForSingleObject,hSemaphore, INFINITE
.if eax == WAIT_OBJECT_0
PrintHex 0,"Slave Signaled"
invoke OpenFileMapping,FILE_MAP_ALL_ACCESS,FALSE,\
OFFSET FileMappingName
mov MappingAddress,eax
.IF eax == 0
;Terminate process
PrintHex eax,"Slave OpenFileMapping failed!"
invoke CloseAll;,hWnd
;call CloseAll
.ELSE
PrintHex eax,"Slave MappingHandle Value"
mov hMapFile,eax
invoke MapViewOfFile,hMapFile,FILE_MAP_ALL_ACCESS,0,0,0
mov MappingAddress,eax
.IF eax == 0
PrintHex MappingAddress, "Slave MapViewOfFile failed"
;Terminate process
invoke CloseAll;,hWnd
;call CloseAll
.ELSE
PrintHex MappingAddress, "Slave MapViewOfFile address"
invoke SetTimer,hWnd,0,2500,0 ;ñòâîðèòè òàéìåð
.ENDIF
.ENDIF
.elseif eax == WAIT_TIMEOUT
PrintHex eax,"Slave TimeOut"
mov hSemaphore,0
invoke CloseAll;,hWnd
;call CloseAll
.elseif eax == WAIT_FAILED
PrintHex eax,"Slave WAIT_FAILED"
mov hSemaphore,0
invoke CloseAll;,hWnd
;call CloseAll
.else
PrintHex eax,"Slave What?"
.ENDIF
.endif
.ELSEIF uMsg==WM_DESTROY
invoke CloseAll;,hWnd
;call CloseAll
.elseif uMsg==WM_TIMER
;Change and show counter
inc CNTR
mov eax,CNTR
PrintHex CNTR,"Slave Cntr"
;Change Mapping content
mov edx, MappingAddress
or al,30h
mov [edx],al
.ELSE
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.ENDIF
xor eax,eax
ret
WndProc endp
Выводы : Изучил технологию использования семафоров и мутексов. Изучил технологию организации обмена данными между тремя процессами с помощью объекта именованного файлового отображения и семафора.