본문 바로가기
운영체제

Threads and Process

by 세인트킴 2024. 3. 25.

커널은 커널 단위로 CPU 스케줄링을 처리한다. 프로세스를 하는 것에 비해서 성능이 좋아진다. 

그러나 쓰레드는 sys.call로 구현되야 하기 때문에 OS가 필연적으로 개입되게 된다. 그래서 유저 레벨 쓰레드를 사용하기로 결정

유저 레벨 쓰레드는 PC, 레지스터, 스택, 그리고 작은 쓰레드 블럭으로 만들어서 가볍고 빠르다. 절차적 호출을 향해 쓰레드의 생성, 전환, 씽크를 맞춘다. 커널이 관여하지 않기 때문에 속도가 빠르다.

유저 레벨 쓰레드의 단점

  • OS한테 맡기기 때문에 OS가 잘못된 결정을 할 수가 있다.
  • 쓰레드가 I/O를 초기화 할 때 프로세스가 막을 수 있다. 심지어 쓰레드가 실행중일 때도 마찬가지이다.

POSIX(Portable Operating System Interface for UNIX)

쓰레드의 부모 - 자식 관계는 복제가 아니라, 프로세스 안에서 서로 자원을 공유하는 관계이다. fork()처럼 복제가 아니다.


공유를 하면 생기는 불편함. 쓰레드의 사용 목적

  1. share - 자원 공유
  2. coordinate - 실행 순서

문제의 요점

문제는 두 개의 쓰레드가 동기화 없이 공유 자원에 접근 할 때 발생한다. 그걸 race condition이라고 한다. 

race condition을 막는 방법은 공유하는 자원이 있다면, 자원에 접근해서 하기 전 공유 자원에 접근하는 코드에 대해서 mutex(상호 배제)를 해야한다. 즉, 쓰레드의 우선순위를 둬야 문제가 발생하지 않는다. 


Disabling Interrupts - H/W 

  • 프로세스의 작업이 끝날 때 까지 자원을 공유하지 않도록 한다. 그래서 race condition이 발생하지 않지만, 유저에게 프로세스의 파워를 주는 것은 좋지 않다.
  • 멀티 프로세스를 사용하기 위해서는 효과적이지 않다.

Lock Variables - S/W

  • 소프트웨어적으로 잠금장치를 만드는 법. 쓰레드가 critical Region에 접근하면 1이라는 lock 플래그를 세운다. 그리고 나올 때 0이라는 open 플래그를 세워서 다른 쓰레드가 접근할 수 있도록 해준다. 

critical region에 들어가려면 확인하고, 세팅하는 사이에 스케쥴링이 발생한다. 만약 0인걸 확인할 때, CPU가 프로세스를 변경하고, 똑같이 1로 바꾼 걸, 0으로 변경하고, 다른 프로세스끼리 동시에 접근하는 경우가 발생한다. 

Strict Alternation

  • 이 부분은 찾아보기 - 논리적 사고를 요한다.

문제를 잘 해결하지만 약점이 존재한다. application이 계속 수행해야 하는 경우엔 이 방법을 사용하지 못하므로 사용법이 제한적이다. 그리고 조건문을 기다리는 동안 CPU를 계속 소비한다. 이런 상황을 busy waiting이라고 한다.

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

Critical Section Problem  (0) 2024.03.27
Fork & exec  (0) 2024.03.18