Bài giảng Lập trình an toàn - Chương 3: Kiểm soát xung đột Synchronization Technique - Lương Ánh Hoàng
■ Xung đột là vấn đề phát sinh khi nhiều luồng của chương trình chạy trên bộ vi xử lý đa nhân cùng truy nhập một tài nguyên hệ thống.
■ Ví dụ
int x = 0;
DWORD WINAPI Thread(LPVOID IpParam)
{
for (int i=0;i<2000000;i++)>2000000;i++)>
return 0;
} _
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hThread1 = CreateThread(NULL,NULL,Thread,NULL,NULL,NULL); HANDLE hThread2 = CreateThread(NULL,NULL,Thread,NULL,NULL,NULL); WaitForSingleObject(hThread1,IN FI NITE);
WaitForSingleObject(hThread2,INFIN ITE);
printf("X=%d",x);
getch();
return 0;
}
3.1 Đoạn găng
■ Đoạn găng (Critical Section) là đoạn chương trình được bảo vệ bởi hệ điều hành sao cho tại mọi thời điểm chỉ có một luồng được phép thực thi.
■ Sử dụng
■ Khaibáo: CRITICAL_SECTION cs
■ Khởi tạo: InitializeCriticalSection(&cs)
■ Sử dụng
EnterCriticalSection(&cs)
/ / Bắt đầu đoạn găng / / Kết thúc đoạn găng
LeaveCriticalSection(&cs)
//
DeleteCriticalSection(&cs)
■ Ví dụ
■ Đặc điểm: chỉ có tác dụng trong cùng một tiến trình
3.2 Đèn hiệu
■ Đèn hiệu (Semaphore) dùng để giới hạn số lượng luồng tối đa được phép thực thi cùng một đoạn chương trình.
■ Sử dụng
■ Khai báo: HANDLE hSemaphore
■ Khởi tạo: hSemaphore = CreateSemaphore(NULL,5,5,NULL)
■ Sử dụng
WaitForSingleObject(hSemaphore, 0L)
//
// _ _
ReleaseSemaphore(hSemaphore,1,NULL)
// „ „ '
CloseHandle(hSemaphore)
■ Ví dụ
■ Đặc điểm
■ Dùng chung được giữa các tiến trình
Tốc độ chậm hơn CRITICAL_SECTION
Tóm tắt nội dung tài liệu: Bài giảng Lập trình an toàn - Chương 3: Kiểm soát xung đột Synchronization Technique - Lương Ánh Hoàng
Chương 3. Kiểm soát xung đột Synchronization Technique Lương Ánh Hoàng hoangla@soict.hut.edu.vn Nội dung Khái niệm ■ Đoạn găng (Critical Section). Đèn hiệu (Semaphore) Mutex Event SRW Lock Khái niêm Xung đột là vấn đề phát sinh khi nhiều luồng của chương trình chạy trên bộ vi xử lý đa nhân cùng truy nhập một tài nguyên hệ thống. Ví dụ int x = 0; DWORD WINAPI Thread(LPVOID IpParam) { for (int i=0;i<2000000;i++) x++; return 0; } _ int _tmain(int argc, _TCHAR* argv[]) { HANDLE hThread1 = CreateThread(NULL,NULL,Thread,NULL,NULL,NULL); HANDLE hThread2 = CreateThread(NULL,NULL,Thread,NULL,NULL,NULL); WaitForSingleObject(hThread1,IN FI NITE); WaitForSingleObject(hThread2,INFIN ITE); printf("X=%d",x); getch(); return 0; } Đoạn găng ■ Đoạn găng (Critical Section) là đoạn chương trình được bảo vệ bởi hệ điều hành sao cho tại mọi thời điểm chỉ có một luồng được phép thực thi. ■ Sử dụng Khaibáo: CRITICAL_SECTION cs Khởi tạo: InitializeCriticalSection(&cs) Sử dụng EnterCriticalSection(&cs) / / Bắt đầu đoạn găng / / Kết thúc đoạn găng LeaveCriticalSection(&cs) // DeleteCriticalSection(&cs) Ví dụ Đặc điểm: chỉ có tác dụng trong cùng một tiến trình Đèn hiệu Đèn hiệu (Semaphore) dùng để giới hạn số lượng luồng tối đa được phép thực thi cùng một đoạn chương trình. Sử dụng Khai báo: HANDLE hSemaphore Khởi tạo: hSemaphore = CreateSemaphore(NULL,5,5,NULL) Sử dụng WaitForSingleObject(hSemaphore, 0L) // // _ _ ReleaseSemaphore(hSemaphore,1,NULL) // „ „ ' CloseHandle(hSemaphore) Ví dụ Đặc điểm Dùng chung được giữa các tiến trình Tốc độ chậm hơn CRITICAL_SECTION Mutex Mutex dùng để bảo vệ tài nguyên của chương trình, tại một thời điểm chỉ cho phép một luồng của một tiến trình truy nhập. Sử dụng Khai báo: HANDLE hMutex; Khởi tạo: hMutex = CreateMutex(NULL, FALSE, NULL) Sử dụng WaitForSingleObject(hMutex, INFINITE) // // ReleaseMutex(hMutex) Ví dụ Đặc điểm Chậm hơn CRITICAL_SECTION Có thể đồng bộ giữa các tiến trình Event Event dùng đồng bộ hoạt động của các luồng thông qua cơ chế báo hiệu. Sử dụng Khai báo: HANDLE hEvent; Khởi tạo: hMutex = CreateEvent(NULL, TRUE, FALSE, “MyEvent”) Sử dụng WaitForSingleObject(hEvent, INFINITE) // SetEvent(hEvent) ResetEvent(hEvent) / / Báo hiệu các luồng khác / / Chặn các luồng khác // CloseHandle(hEvent) ■ Ví dụ SRW Lock SRW Lock (Slim Reader Writer Lock )dùng đồng bộ hoạt động của các luồng thông tương tự như đoạn găng Sử dụng Khaibáo: SRWLOCK lock; Khởi tạo: InitializeSRWLock(&lock); Sử dụng AcquireSRWLockShared(&lock) AcquireSRWLockExclusive(&lock) // //_ ReleaseSRWLockShared(&lock) ReleaseSRWLockExclusive(&lock) Ví dụ Bài tập Viết chương trình chat Client và Server với kênh truyền đã mã hóa bằng thuật toán AES-256, sử dụng thư viện OpenSSL và CryptoAPI. Mật khẩu mã hóa là : 123456. Việc mã hóa và việc nhận dữ liệu được thực hiện đồng thời trên 2 luồng riêng biệt, sử dụng cơ chế đồng bộ CrITICAL_SECTION Viết chương trình mã hóa và giải mã tệp tin theo thuật toán AES-256, với tên nhập từ bàn phím, mật khẩ?u mã hóa là :nopass. Sử dụng thư viện OpenSSL và CryptoAPI
File đính kèm:
- bai_giang_lap_trinh_an_toan_chuong_3_kiem_soat_xung_dot_sync.docx