observe_db

[OS] 4. Thread 본문

학교 공부/운영체제(OS)(3-1)

[OS] 4. Thread

쩡윤 2023. 4. 5. 20:18

4/3

 

Part 1.

thread: 본뜻은 실.

  • : 프로세스 내에서 실행되는 흐름의 단위를 말한다. 일반적으로 1개인 단일 쓰레드.
  • OS 스케줄러에 의해 관리될 수 있는 가장 작은 단위의 프로그램 조각
  • main 프로그램과 독립적으로 실행되는 함수
  • 프로세스 내의 다른 쓰레드와 주소와 전역변수 등의 데이터는 공유.
  • 레지스터, 스택, 시그널 등은 쓰레드 별로 별도

물리적(실제로 multicore를 이용한 동시)/개념적(시분할 등을 이용한 사실상 동시)

쓰레드당 개별로 PCB(프로그램 컨트롤 블럭)을 가진다.

 

등장 배경

  • 소프트웨어 설계 요구: 병렬처리 작업이 자연스러운 시스템 개발 필요(90's)
  • 하드웨어 병렬처리 지원: 멀티코어, 멀티프로세서 컴퓨터 보편화
  • 효율적 협업 필요: IPC보다 공유 공간을 이용한 데이터 교환 효율성

 

사용자 수준 스레드(user-level thread)

  • 사용자 공간 쓰레드 라이브러리로 관리
  • 사용자 수준에서 쓰레드 구현
  • 실행시간 시스템(run-time system)에 의해 관리
  • 생성(create)/전환(switch)/동기화(synchronize)가 사용자 수준에서 수행
  • 쓰레드 스케줄러 라이브러리 제공
  • 커널은 이 쓰레드의 존재를 알지 못함.
  • 커널 수준 쓰레드는 가상의 프로세서로 간주
  • 사용자 수준 쓰레드가 번갈아가며 커널 수준 쓰레드 사용
  • N:1의 다대일 관계
  • libc_r(FreeBSD의 쓰레드 라이브러리)
  • 커널 스택: 외부 인터럽트/예외상황/시스템 콜로 커널로 진입할 때 진행중인 프로세스의 문맥정보를 저장하고 해당 핸들러가 동작하며 사용하는 프로세스별 커널영역에 할당된 공간

커널 수준 스레드(kernal-level thread)

  • 커널에 의해 지원
  • 각 사용자 수준 쓰레드별로 별도 커널 실행문맥 생성
  • 각 쓰레드는 커널 자원 사용(생성가능한 갯수 제한 발생)
  • 멀티프로세서 성능활용 가능(동시 실행 가능 쓰레드 지원)
  • 같은 구조에 담아서, 같은 주소를 공유한다.
  • 1:1의 관계
  • 쓰레드간 문맥교환 시간 부담
  • 시스템콜을 통한 쓰레드 연산 부담.
  • 쓰레드 단위
  • Linux의 Thread
    • 사용자 수준 쓰레드를 프로세스와 동일하게 간주
    • 쓰레드와 프로세스를 task로 관리

하이브리드 방식

  • 다대다 대응방식
  • ex) Solaris의 LWP(Light-weight process)
    • 사용자 수준 쓰레드가 커널 수준 쓰레드에 매핑되면서 프로세서에서 실행

 

Part2.

쓰레드 생명 주기(life cycle)

 

 

쓰레드 관련 작업(operation)

  • 생성(create)
  • 종료(exit, terminate)
  • 일시중지(suspend)
  • 재시작(resume)
  • 수면(sleep)
  • 깨우기(wake up)
  • 취소(cancel): 특정쓰레드가 완료되기 전에 종료
  • 조인(join): 특정 쓰레드가 종료될 때까지 대기

 

시그널 처리(signal handling)

  • 프로세스에 전달된 시그널은 해당 프로세스의 모든 쓰레드에 전달
  • 각 쓰레드는 받고싶은 시그널만 수신하도록 masking 가능(특정/전체/일부에 전달 가능)
  • 동일 프로세스에 등록된 시그널의 처리기는 쓰레드들이 공유
  • 실행 상태가 아닌 쓰레드에 전달되는 시그널은 대기 시그널 대기열(pending signal queue)에 저장
    • 실행상태이면 대기열 시그널 처리
  • 시그널에 의해 쓰레드가 종료되면 해당 쓰레드는 포함하는 프로세스의 전체 쓰레드 종료.

 

Part 3.

Pthreads

  • 쓰레드 생성 및 동기화를 위한 POSIX(Portable Operating System Interface) 표준 API
  • API는 쓰레드 라이브러리의 동작에 대해서만 명세
  • UNIX 계열 OS에서 대부분 지원
  • Pthreads 함수의 예
    • Pthread_create
    • Pthread_exit
    • Pthread_join
    • Pthread_yield: 양보
    • Pthread_attr_init
    • Pthread_attr_destroy

Linux 쓰레드

  • 프로세스와 쓰레드를 모두 task로 칭함.
  • 자식 태스크 생성을 위해 fork() 사용
  • 쓰레드 생성을 위해 clone() 사용

CLONE_FS: 파일시스템 정보 공유

CLONE_VM: 메모리 공간 공유

CLONE-SIGHAND: 시그널 처리기 공유

CLONE_FILES: 열린 파일 공유

CLONE_PID: 부모 프로세스와 같은 프로세스 식별번호 사용

CLONE_NEWUTS: 새로운 UTS 네임스페이스 생성

SIGCHLD: 종료시 부모 프로세스에 SIGCHILD 시그널 전달

 

Java 쓰레드

  • Thread 클래스를 상속한 클래스의 run() 정의
  • Runnable 인터페이스를 구현한 클래스의 run() 정의
Comments