Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++에서 여러 스레드 간의 메모리 충돌 찾기

<시간/>

RAM이 있고 RAM이 블록으로 구성되어 있다고 가정합니다. 시스템에서 여러 프로세스가 실행 중입니다. 우리는 모든 프로세스가 다음 정보를 얻는다는 것을 명심해야 합니다. (Thread T, Memory Block M, time t, R/W) 이것은 스레드 T가 주어진 시간 t에서 메모리 블록 M을 구현하고 있었고 작업이 읽기(R)일 수 있음을 나타냅니다. ) 또는 쓰기(W).

다음의 경우는 메모리 충돌 여부를 나타냅니다. -

  • 동일한 위치에서 둘 이상의 읽기 작업이 충돌의 원인이 아닙니다.

  • 쓰기 작업이 x+5에서 x-5 사이에서 M의 위치까지 수행될 때 x는 시간이라고 하는 x 시간에 위치 M에 액세스하는 스레드에 대한 충돌을 일으키는 책임이 있습니다.

따라서 스레드 T1이 x+1 시간에 메모리 위치 M에 액세스하고 스레드 T2가 x+6 시간 이전에 M 위치에 액세스하면 T1과 T2 중 하나가 쓰기 작업을 수행할 때 충돌이 발생합니다.

메모리 위치에 액세스하는 스레드 목록이 있는 경우. 모든 충돌을 찾아야 합니다.

따라서 입력이 [(1, 932, 1, R), (2, 512, 2, W), (3, 932, 3, R), (4, 512, 4, R), (5 , 432, 5, R), (6, 512, 6, R),(7, 835, 7, W), (8, 432, 8, R)], 출력은 충돌 스레드(2, 4 ) 및 (2, 6) 및 기타 모든 작업은 동일합니다.

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • id, memory_block, 시간 및 작업으로 스레드 생성

  • 메모리 블록이 같을 때 시간을 사용하여 메모리 블록을 기준으로 배열 th_arr을 정렬합니다.

  • initialize i :=1의 경우 i − n일 때 업데이트(i를 1만큼 증가), −

    • th_arr[i].memory_block이 th_arr[i - 1].memory_block과 같으면 -

      • th_arr[i].time <=th_arr[i-1].time+5이면 -

        • j :=나는 - 1

        • (th_arr[i].memory_block은 th_arr[j].memory_block 및 th_arr[i].time <=th_arr[j].time+5 및 j>=0과 동일함), 수행 -

          • th_arr[i].operation이 'W'와 같거나 th_arr[j].operation이 'W'와 같으면 -

            • 충돌 스레드 th_arr[j] 및 th_arr[i]

              표시
          • (j를 1만큼 감소)

예시(C++)

이해를 돕기 위해 다음 구현을 살펴보겠습니다. −

#include<bits/stdc++.h>
using namespace std;
class Thread {
   public:
   int id, memory_block, time;
   char operation;
};
bool compare(const Thread& x, const Thread& y) {
   if (x.memory_block == y.memory_block)
      return x.time < y.time;
   else return x.memory_block < y.memory_block;
}
void display_conflicts(Thread th_arr[], int n) {
   sort(th_arr, th_arr+n, compare);
   for (int i = 1; i < n; i++) {
      if(th_arr[i].memory_block == th_arr[i-1].memory_block) {
         if (th_arr[i].time <= th_arr[i-1].time+5) {
            int j = i-1;
            while (th_arr[i].memory_block == th_arr[j].memory_block && th_arr[i].time <= th_arr[j].time+5 && j >= 0) {
               if (th_arr[i].operation == 'W' || th_arr[j].operation == 'W') {
                  cout << "Conflicting threads [" << th_arr[j].id << ", " << th_arr[i].id << "]\n";
               }
               j--;
            }
         }
      }
   }
}
int main() {
   Thread th_arr[] = {{1, 932, 1, 'R'},{2, 512, 2, 'W'},{3, 932, 3, 'R'}, {4, 512, 4, 'R'},{5, 432, 5, 'R'}, {6, 512, 6, 'R'},{7, 835, 7, 'W'}, {8, 432, 8, 'R'}};
   int n = sizeof(th_arr)/sizeof(th_arr[0]);
   display_conflicts(th_arr, n);
}

입력

{{1, 932, 1, 'R'},{2, 512, 2, 'W'},{3, 932, 3, 'R'}, {4, 512, 4,
'R'},{5, 432, 5, 'R'}, {6, 512, 6, 'R'},{7, 835, 7, 'W'}, {8, 432, 8,
'R'}}

출력

Conflicting threads [2, 4]
Conflicting threads [2, 6]