[OS] Process&Thread의 this&that

Jay·2021년 1월 11일
0

Computer Science

목록 보기
5/50
post-thumbnail

스레드와 프로세스에 대한 정리가 끝난 후,
더 궁금해진 부분들과 관련성 있는 이야기들을 따로 정리하고 싶었다.
그래서

프로세스&스레드의 이것&저것


🧐 스택을 스레드마다 독립적으로 할당하는 이유?

우선, 스택은 함수 호출 시 전달되는 인자, 복귀 주소값 및 함수 내에서 선언하는 변수 등을 저장하기 위해 사용 되는 메모리 공간이다.
✅ 스택 메모리 공간이 독립적이라는 것은 독립적인 함수 호출이 가능
➡️ 이는 독립적인 실행 흐름이 추가된다는 것이다.
➡️ 그래서 스레드의 정의에 따라 독립적인 실행 흐름을 추가하기 위한 최소 조건으로 독립된 스택을 할당한다.


🧐 PC 레지스터를 스레드마다 독립적으로 할당하는 이유?

PC 값은 스레드가 명령어의 어디까지 수행했는지를 나타내게 된다.
스레드는 CPU를 할당받았다가 스케줄러에 의해 다시 선점당한다. 그렇기에 명령어가 연속적으로 수행되지 못하고 어느 부분까지 수행했는지 기억할 필요가 있다.
그래서 PC 레지스터를 독립적으로 할당한다.


🧐 Thread Safe

  • 멀티 스레드 환경에서 여러 스레드가 동시에 하나의 객체 및 변수에 접근시, 의도한 대로 동작하는 것.
  • 이러한 상황을 thread-safe 하다 라고 한다.
  • 구현은?
    • 공유 자원에 접근하는 임계 영역(Critical Section)을 동기화 기법으로 제어해야 한다.
      우선, 개념적으로 위와 같이 entry/exit이 있고 임계영역이 존재한다.

      상호 배제
    • 동기화 기법으로는 Mutex, Semaphore가 존재한다.
  • Reentrant (재진입성)

    - 어떤 함수가 Reentrant하다는 것은 여러 스레드가 동시에 접근해도 언제나 같은 실행결과를 보장한다는 것이다.
    - 이를 만족하기 위해, 해당 서브 루틴에서는 공유자원을 사용하지 않으면 된다.
    - ex. 정적(전역) 변수를 사용하거나 반환하면 안되고 호출 시 제공된 매개변수만으로 동작.
    • 그래서 Reentrant하다면 thread-safe이지만 그 반대가 성립하진 않는다.
      Reentrant
profile
Android Developer - Come to my medium (https://medium.com/@wodbs135)

0개의 댓글