관리 메뉴

기억을 위한 기록들

[윈도우즈 시스템 프로그래밍] - 파트3 멀티쓰레드와 동기화 본문

CS/윈도우즈 시스템 프로그래밍

[윈도우즈 시스템 프로그래밍] - 파트3 멀티쓰레드와 동기화

에드윈H 2023. 11. 16. 15:40

절차적 함수호출 지원 CPU모델

메모리의 스택(stack) 영역은 함수의 호출과 관계되는 지역 변수와 매개변수가 저장되는 영역입니다.
스택 영역은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸합니다.

함수가 호출되면 스택에는 함수의 매개변수, 호출이 끝난 뒤 돌아갈 반환 주소값, 함수에서 선언된 지역 변수 등이 저장됩니다.
이렇게 스택 영역에 차례대로 저장되는 함수의 호출 정보를 스택 프레임(stack frame)이라고 합니다.
이러한 스택 프레임 덕분에 함수의 호출이 모두 끝난 뒤에, 해당 함수가 호출되기 이전 상태로 되돌아갈 수 있습니다.

참고 : https://www.tcpschool.com/c/c_memory_stackframe 

 

 

sp 레지스터와 fp 레지스터

  • sp 레지스터의 백업을 위해 fp레지스터가 있다고도 본다.
  • 함수 호출 인자의 전달방식으로 sp가 가리키는 현재 위치에 전달되는 인자값을 저장하고 나서, sp를 증가시켜 다음 메모리 주소를 가리키게 한다.

함수 호출 규약

  • 함수 호출 시 인자를 전달하는 방식과 스택 프레임을 반환하는 방식을 약속해 놓은 것을 가리켜 함수 호출규약이라한다.
  • 일종의 규약으로 다양한 함수 호출규약이 존재하며, 어떤 호출규약을 명시하지 않으면 디폴트 선언으로 되어 있는 규약을 따른다.

 

쓰레드의 이해

  • 쓰레드는 하나의 프로그램 내에서 여러 개의 실행 흐름을 두기 위한 모델이다.
  • 쓰레드는 프로세스처럼 완벽히 독립적인 구조가 아니다. 쓰레드들 사이에는 공유하는 요소들이 있다.
  • 쓰레드는 공유하는 요소가 있는 관계로 콘텍스트 스위칭에 걸리는 시간이 프로세스보다 짧다.

 

쓰레드의 특성

1. 쓰레드마다 스택을 독립적으로 할당해 준다.

2. 코드 영역을 공유한다.

3. 데이터 영역과 힙영역을 공유한다.

 

 

 

Windws 입장에서 프로세스는 단순히 쓰레드를 담는 상자에 지나지 않는다.

 

 

 

쓰레기 동기화 기법

2가지 관점에서의 동기화로

1. 실행순서의 동기화 -> 쓰레드의 실행순서를 정의하고, 이 순서에 따르도록 하는것이 쓰레드 동기화

2. 메모리 접근의 동기화 -> 메모리 접근에 있어서 동시접근을 막는 것 또한 쓰레드의 동기화에 해당.

 

 

동기화 방법 2가지

1. 유저 모드 동기화 ->커널의 힘을 빌리지 않는 방법. 성능상에 이점이 있지만, 기능 상의 제한도 있다. 

종류 : 임계영역(Critical Section) 기반 동기화/ 인터락 함수 기반 동기화

 

2. 커널 모드 동기화 -> 커널 모드로의 변경이 필요하고, 성능의 저하로 이어진다. 하지만 유저모드보다 기능을 더 많이 사용 할 수 있다.

종류 : 뮤텍스 기반 동기화 / 세마포어 기반 동기화 / 이름 있는 뮤텍스 기반 동기화 / 이벤트 기반 동기화

 

임계 영역(Critical Section) 접근 동기화 ?

- 배타적 접근이 요구되는 공유 리소스(전역변수 같은)에 접근하는 코드 블록을 의미한다.

- 임계영역이 메모리가 아니라 둘 이상의 쓰레드가 동시에 실행하면 발생하는 프로그램상의  코드 일부를 의미.

 

뮤텍스와 세마포어의 차이점 

- 뮤텍스는 세마포어의 일종이다. 

- 세마포어는 카운트를 지닐 수 있다는점이다.

- 카운트를 지닌다는 것은 임계영역에 진입할 수 있는 쓰레드의 갯수를 늘리거나 줄일 수 있다는 뜻이다.

- 임계영역에 진입할 수 있는 쓰레드를 하나로 제한할 경우 세마포어의 카운트를 1로 둬야하는데 이게 바로 뮤텍스이다.

 

 

실행순서 동기화와 이벤트 오브젝트

- 쓰레드의 실행순서가 중요한 이슈인 경우에는 실행순서 동기화를 고려해야한다. 이를 위해서는 Windows에서는 이벤트 오브젝트 기반의 동기화 기법을 제공한다.

 

 

쓰레드 풀링

- 한번 생성한 쓰레드를 재활용해서 시스템의 부담을 덜어주기 위한 기법이다. 이는 쓰레드의 생성과 소멸에 소모되는 리소스가 상당하기 때문이다. 개념은 쓰레드를 여러개 생성하고, 실행해야 할 일이 등록될 때마다 미리 생성해 놓은 쓰레드 중 하나를 할당 한다. 그리고 일이 끝나면 소멸시키지 않고, 보관하는 것이다.