Bài giảng Lập trình an toàn - Chương 3: Kiểm soát xung đột - Lương Ánh Hoàng

3.1 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="">

int_tmain(int args, _TCHAR* argv[]

HANDLE hThread1 = Create Thread(NULL,NULL,Thread,NULL,NULL,NULL); HANDLE hThread2 = CreateThread(NULL,NULL,Thread,NULL,NULL,NULL); WaitForSingleObject(hThread1,INFINITE); WaitForSingleObject(hThread2,INFINITE); printf("X=%d",x); getch(); return o;

 

pdf 9 trang yennguyen 2060
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 - 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 - 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 - Lương Ánh Hoàng
Lương	
  Ánh	
  Hoàng	
  
hoangla@soict.hut.edu.vn	
  
Chương	
  3.	
  Kiểm	
  soát	
  xung	
  đột	
  
Synchronization	
  Technique	
  
3.1	
  Khái	
  niệm	
  3.2	
  Đoạn	
  găng	
  (Critical	
  Section).	
  3.3	
  Đèn	
  hiệu	
  (Semaphore)	
  	
  3.4	
  Mutex	
  3.5	
  Event	
  3.6	
  SRW	
  Lock	
  
Nội	
  dung	
  
47	
  
§  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ụ	
  
3.1	
  Khái	
  niệm	
  
48	
  
int	
  x	
  =	
  0;	
  
DWORD 	
  WINAPI	
  Thread(LPVOID	
  	
  lpParam)	
  
{	
  
	
  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,INFINITE);	
  
	
  WaitForSingleObject(hThread2,INFINITE);	
  
	
  printf("X=%d",x);	
  
	
  getch();	
  
	
  return	
  0;	
  
}	
  
§  Đ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	
  
§  Khai	
  bá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	
  Đoạn	
  găng	
  
49	
  
§  Đè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	
  
3.3	
  Đèn	
  hiệu	
  
50	
  
§  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	
  
3.4	
  Mutex	
  
51	
  
§  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) 	
   	
  //	
  Báo	
  hiệu	
  các	
  luồng	
  khác	
  
	
  ResetEvent(hEvent) 	
  //	
  Chặn	
  các	
  luồng	
  khác	
  
	
  //	
  
	
  CloseHandle(hEvent)	
  
§  Ví	
  dụ	
  
3.5	
  Event	
  
52	
  
§  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	
  
§  Khai	
  báo:	
   	
  SRWLOCK	
   	
  lock;	
  
§  Khởi	
  tạo:	
   	
  InitializeSRWLock(&lock);	
  
§  Sử	
  dụng	
  
	
  AcquireSRWLockShared(&lock)	
  	
  AcquireSRWLockExclusive(&lock)	
  
	
  //	
  
	
  //	
  
	
  ReleaseSRWLockShared(&lock)	
  	
  ReleaseSRWLockExclusive(&lock)	
  
§  Ví	
  dụ	
  
3.5	
  SRW	
  Lock	
  
53	
  
1.  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	
  
2.  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	
  
Bài	
  tập	
  
54	
  

File đính kèm:

  • pdfbai_giang_lap_trinhantoan_chuong_3_kiem_soat_xung_dot_luong.pdf