Keep going

스레드 이슈 본문

School/운영 체제

스레드 이슈

코딩천재홍 2021. 4. 17. 00:35

스레드 이슈

  • fork(), exec()
    • 스레드 여러 개 있을 때 어떤 한 스레드가 fork를 하면 새 process 에는 fork 한 스레드 1개만 들어가야 되냐, 모든 스레드가 다 복사되어야 하냐? (쓰레드 1개면 문제 x → 똑같은 시점으로 복사)
  • Signal handling
    • p1, p2 있을 때 p1 p2에게 어떤 사건 일어났다고 알려주기 위해 시그널을 보낸다. (시그널을 일반적으로 정수)
    • (시그널이 발생했다는 걸 알려주고 시그널 몇번이다) 에 따라서 어떤 일이 일어났다 알려주는 것을 signal system
    • p2 스레드 여러 개 있다면 어느 누구한테 signal이 가야 되는지 signal 누가 처리할지에 대한 문제 발생
  • Thread cancellation (스레드 중단)
    • p1 프로세스가 여러 개 가지고 있는데 어떤 스레드가 다른 스레드를 중단 한다면 이 스레드가 어떻게 반응해야하나 (바료 종료 or 연기 한 후 종료)
  • thread local storage (스레드 저장 공간)
    • 스레드별로 별도의 storage 가질 필요 있다. (thread local storage)
  • scheduler activations
    • 다 대다  스레드 모델에서 사용자 스레드 여러개 있고 커널 스레드 여러개 있을 때 통신하는 용도로 사용되는 방법

 

 

fork 

  • 여러 개의 스레드를 가진 process를 fork 시켰을 때 복제된 p는 몇개의 스레드를 가지게 되느냐
    • fork한 스레드만 복사해 가져오서 p2에 돌아가게 하는 것이 일반적
    • 스레드를 다 복사하는 과정

 

exec

  • 여러개의 스레드 돌아가고 있는데 한 스레드가 exec 했다 하면 어떻게 되는가?
    • exec는 프로세스를 다른 프로세스로 덮어쓰는 것으로, 모든 스레드들이 사라지고 새로운 program load 되어 새로운 program 실행하는 하나의 스레드가 실행되는게 자연스러운 의미

 

 

Signal Handling

  • 한 프로세스한테 어떤 사건이 발생했다는 사실을 알려주기 위해서 사용되는 방식
  • 커널이 프로세스에게 어떤 사건이 일어났다 알려줄때도 사용
  • 프로세스가 다른 프로세스나 커널로부터 Signal 받았을 때 어떤 행동 하는가?
    • signal handler : 프로세스가 signal이 자기한테 도착했을 때 어떤 일을 하라고 지정해주는 것
    • signal handler 지정하지 않앗다면 default signal handler가 돌아가게 된다.
    • default signal handler는 signal이 왔다는 것을 발견하게 되면 이 프로세스가 signal을 무시하는가 체크한다.
      • 무시하면 그냥 넘어가고 무시하지 않고 signal handler도 없다고 하면 일반적으로 process를 종료시키는 역할을 하게 된다.
      • signal handler를 지정했다면 그것을 실행하고 다시 돌아가게 된다.
  • signal 보내는 시스템 호출 (유닉스, 리눅스) : kill
    • kill (pid, n) - 시그널 번호를 어떤 프로세스에게 보낸다.
  • signal에 가서 아무일도 안하면 process가 죽게 되는데 다른 아무 process를 만들어서 죽이면 안되니까 부모 프로세스나 커널 같은 경우만 시그널을 보낼 수 있다.
  • 스레드가 여러개면 시그널 보낼 때 어떻게 되느냐?
    • signal 을 보낼 때 어느 프로세스에게 보내라고 지정
    • 그 프로세스한테 갔다면 모든 스레드한테 보내는가 특정 스레드한테 시그널 보낼 것인지 결정
    • 프로세스가 자기한테 오는 모든 시그널은 시그널에 맞는 특정한 스레드를 지정해주는 경우도 있다.

 

 

Thread cancellation

  • 일반적으로 부모 스레드는 자식 스레드를 취소 시킬 수 있다.
  • 취소되는 스레드를 target thread라고 한다.
  • Asynchronous cancellation (비동기적 취소)
    • cancel되는 즉시 중단
  • Deferred cancellation (지연 취소)
    • cancel 지시하면 cancel 시켰다는 표시한다. 
    • 자기 자신이 표시한 것 알아내고 자발적으로 종료
  • 취소 들어왔을 때 자식이 어떤 행동,처리 하는지 상태(mode)를 지정할 수 있다.
    • off → 부모 요청 무시 (요청 정보 남아있지만 확인 x)
    • deffered → 표시 후 알아서 나중에 함 (default)
    • asynchronous → 바로 중다나 (완전하지 않아서 잘 사용 안함)
  • CleanUp handler
    • 스레드 취소 요청에 의해 스레드가 취소 될때, 경우에 따라서 정리가 필요한 부분을 정리하지 않고 스레드가 취소되어 종료되면 문제가 발생할 여지가 생기기 대문에 정리가 필요한 부분이 있으면 핸들러를 통해 정리한다.
    • deffered cancellation인 경우 → 하던 작업 완료하고 취소 요청 검사하기 위해 커널 함수 호출
    • 커널에서 부모한테 cancellation 왔는지 보고 왔으면 process로 돌아가는 것이 아니라 cleanup handler 호출한다.

 

 

Thread local storage

  • 스레드마다 유일하게 할당된 메모리 블럭 '스레드 컨트롤 블럭'에 위치하며, 다른 스레드와 공유되지 않는 영역이다.
  • TLS는 정적, 전역 변수를 각각의 스레드에게 독립적으로 만들어 주고 싶을 때 사용하는 것. 다시 말해 분명히 같은 문장을 실행하고 있지만 실제로는 스레드 별로 다른 주소 공간을 상대로 작업하는 것
  • 스레드가 살아있는 동안 가지고 있는 data 저장하는 공간 (전역 변수 느낌이라고 생각하면 편함)
  • 프로세스 내의 스레드 들은 프로세스의 자원 (주소 공간, 파일 핸들, 전역변수, 정적 변수, 힙 등)을 공유한다. 즉 스레드 내의 지역변수를 제외한 힙, 전역변수, 정적변수는 다른 모든 스레드에서 접근 가능하다.

 

 

Scheduler Activations

  • 학교 설명
    • 커널 스레드가 1개에 여러개의 사용자 스레드가 대응될 수 있기 때문에 이 커널 스레드가 어떤 애들을 실행을 할까하는 것을 정해야 한다. 
    • 스레드 라이브러리가 커널 스레드를 유저스레드에 배분하게 되는데 배분할 때사 사용하는 자료구조는 LWP라고 한다.
    • 스레드 라이브러리 모델에서 볼때는 LWP가 cpu라고 생각하고, lwp는 multiflexing 하여 유저 스레드를 배분한다.
  • 스레드 라이브러리와 커널의 통신 문제에 다대다 및 Two level model에서 반드시 해결해야 할 문제
  • 이 모델 들에서 사용자 스레드와 커널 스레드 사이에 중간 자료 구조를 둔다. (LWP : 가상처리기)
  • 커널은 유저 스레드에게 가상 처리기의 집합을 제공하고 유저 스레드는 사용자 스레드를 가용한 가상 처리기로 스케줄 한다.
  • 커널은 유저 스레드에게 특정 사건에 대해 알려줘야 한다. 이프로 시저를 upcall이라고 부른다.
  • upcall
    • 커널 스레드가 라이브러리한테 어떤 사건 일어났다고 알려주는 상황 
    • 사용자 스레드 I/O 처리 때문에 block → 커널 스레드도 block → 스레드 라이브러리한테 알려눠야 함. 스레드 라이브러리가 놀고 있는 LWP 잡아서 스레드 라이브러리 코드를 실행하면서 user스레드는 중지 되어야하므로 user 스레드를 상태 저장하고 LWP와 유저스레드를 분리하고 다른 스레드에게 스케줄링 해준다. 
    • upcall handler 돌아갈 때도 lwp 필요하다.

 

'School > 운영 체제' 카테고리의 다른 글

우선순위 스케줄링  (0) 2021.04.20
CPU 스케줄링  (0) 2021.04.19
스레드 라이브러리  (0) 2021.04.16
스레드  (0) 2021.04.14
프로세스 간 통신 (Interprocess communication)  (0) 2021.04.14
Comments