Giáo trình Lập trình An toàn - Chương 3: Kiểm soát xung đột  Synchronization Technique - Lương Ánh Hoàng

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ụ 3.5 Event

pdf9 trang | Chia sẻ: huongthu9 | Lượt xem: 542 | Lượt tải: 0download
Bạn đang xem nội dung tài liệu Giáo trình 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 về máy bạn click vào nút DOWNLOAD ở trên
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  

Các file đính kèm theo tài liệu này:

  • pdfgiao_trinh_lap_trinh_an_toan_chuong_3_kiem_soat_xung_dot_syn.pdf