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++)>

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

 

docx 9 trang kimcuc 2920
Bạn đang xem 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", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

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

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:

  • docxbai_giang_lap_trinh_an_toan_chuong_3_kiem_soat_xung_dot_sync.docx