모의면접으로 학습하는 CS 스터디
- 운영체제 2주차
스레드

-
스레드 정의
- CPU 입장의 작업 단위
- 여러 개의 스레드가 모여 프로세스를 이룸
- CPU스케줄러가 CPU에 전달하는 일 하나가 스레드
- 예시
- 집짓기를 생각하면 토지구입, 토목공사 ← 스레드
- 이 모든게 모여 집짓기 작업 ←프로세스
-
스레드 구조
- 스레드 ID , PC 포함한 레지스터값, 스택
- 스레드는 프로세스의 자원(Code, Data, Heap)을 다른 스레드와 공유함
- Stack만 각각의 스레드가 별도로 가지고 있음
- Stack에는 함수 호출 시 전달되는 인자, 리턴할 주소값, 매개변수 등을 저장하는 공간
- 이를 스레드가 가짐으로써 독립적인 함수호출이 가능함
- 특징
- 프로세스와 달리 스레드는 강하게 연결되어있음
- 프로세스와 달리 스레드는 프로세스 내부에 존재하기에 데이터영역에 접근 가능
- 스레드들끼리 서로의 데이터 접근 가능. IPC 필요없음
- 하나의 프로세스 내 자원을 공유하기 때문에 문맥교환 비용도 적게 듦
- 프로세스 종료되면 스레드도 강제종료
- 장점
- 응답성 향상
- 스레드 간 작업 분할 + 병렬처리로 인해 빠른 응답성 제공
- 자원 공유 효율성 향상
- 하나의 프로세스 내에서 실행되기 때문에 프로세스 자원을 공유하여 접근할 수 있음
- 별도의 메모리 공간을 할당할 필요 없이 내부에서 데이터 관리를 하면 됨
- 동시성
- 여러개의 스레드가 동시에 실행될 수 있어서 작업 병렬 처리 가능
- 간결성
- 단점
- 하나의 스레드에서 발생한 문제가 프로세스 전반에 영향을 줄 수 있음
- 자원 공유하기 때문에 동기화 문제 발생
스레드 제어 블록(TCB)
-
TCB 정의
- 스레드를 관리하는 자료구조
- 스레드 정보의 단위
-
특징
-
TCB 구조
- TID : 고유 ID
- 스레드 상태 정보
- 스레드 우선순위
- 프로그램 카운터, 레지스터 값
- 프로세스 포인터
사용자 수준 스레드 & 커널 수준 스레드
-
사용자 수준 스레드

- 정의
- 사용자가 스레드 라이브러리를 사용하여 스레드를 구현
- 여러 개의 스레드가 커널의 스레드 하나와 연결되기 때문에 1 to N 모델 이라고도 함
- 특징
- 사용자 스레드 라이브러리가 커널이 지원하는 스케줄링, 동기화 기능을 대신 구현
- 커널 입장에서 사용자 스레드는 하나의 프로세스 처럼 보임
- 장점
- 문맥 교환이 필요없음 -> 속도가 빠름
- 라이브러리가 직접 스케줄링하고 작업에 필요한 정보를 처리하기 때문
- 단점
- 스레드가 입출력 작업에 의해 대기 상태로 들어가면 모든 사용자 스레드가 같이 대기해야함
- 하나의 커널 스레드에 연결되어 있어서 커널 입장에선 스레드가 여러개여도 하나의 프로세스로 인식되기 때문
- 한 프로세스의 타임 슬라이스를 여러 스레드가 공유
- 커널 입장에서 하나의 프로세스로 인식되어서 CPU가 여러개여도 동시에 사용할 수 없음
- 보안에 취약함
- 커널 레벨에 있는 공유 변수를 보호하는 서비스를 라이브러리에서 구현해야 하기 때문
-
커널 수준 스레드

-
정의
- 커널이 멀티스레드를 지원하는 방식
- 하나의 사용자 스레드가 하나의 커널 스레드와 연결되기 때문에 1 to 1 모델 이라고도 함
-
특징
- 독립적으로 스케줄링되므로 특정 스레드가 대기 상태에 들어가도 다른 스레드는 작업 지속 가능
- 커널이 제공하는 보호 기능 같은 모든 기능 사용 가능
-
장점
-
단점
멀티 스레드 프로그래밍
-
멀티 스레드 정의

- 프로세스 내 작업을 여러 개의 스레드로 분할함으로써 작업의 부담을 줄이는 프로세스 운영 기법
-
장점
- 응답성 향상
- 한 스레드가 입출력으로 인해 작업이 진행되지 않아도 다른 스레드가 작업을 계속해서 작업 요구에 빨리 응답할 수 있음
- 자원 공유
- 독립적인 스레드를 생성하면 프로세스가 가진 자원을 모든 스레드가 공유하게 되어 작업 원할히 할 수 있음
- 효율성 향상
- 여러 개의 프로세스를 생성할 필요 없어 불필요한 자원의 중복을 막음
- 비용 감소
- 문맥 교환 시 스레드 간 공유 자원을 제외한 스레드 정보만 교체함
-
단점
- 안정성
- 하나의 스레드가 문제 발생하면 다른 스레드들도 영향을 받음
- 해결방안 : 예외처리, 스레드 풀에서 잔여 스레드를 가지고옴 등
- 동기화로 인한 성능저하
- 여러개의 스레드가 동시에 공유자원에 접근해서 동기화 문제 발생
- 해결 방안 : 임계영역, 뮤텍스, 세마포어
- 임계 영역 : 공유 자원을 접근하는 코드 영역
- 뮤텍스 : 공유 자원에 대해 접근 제어를 위한 상호 배제 기법 중 하나
- 세마포어 : 동시에 접근 가능한 스레드의 개수를 정하는 기법
- 데드락
- 다수의 프로세스나 스레드가 자원을 점유, 점유한 자원을 기다리는 상황에서 발생하는 교착 상태
- 여러 개의 스레드가 서로 대기하면서 무한정 기다리게 되는 것
- 해결 방안 : 상호배제, 점유와 대기, 비선점, 순환 대기 등의 알고리즘 이용
Thread-Safe
-
정의
- 멀티 스레드 프로그래밍에서 어떤 함수, 변수 등이 스레드로부터 동시에 접근이 이루어져도 문제가 생기지 않음
-
설계 방법
-
재진입성
- 어떤 함수가 한 스레드에 의해 호출되어 실행중일 때, 다른 스레드가 그 함수를 호출해도 결과는 각각 올바르게 주어져야 함
-
상호 배제
- 공유 자원을 사용할 경우, 해당 자원에 대한 접근을 세마포어와 같은 Lock로 통제
-
임계 구역
- 구역을 정의해 해당 구역에선 한번에 하나의 스레드만 접근할 수 있도록 함
-
스레드 지역 저장소
- 공유 자원의 사용을 최대한 줄여 각각의 스레드에서만 접근 가능한 저장소를 사용 -> 동시 접근을 막음
- 동기화 방법과 관련. 공유 상태 피할 수 없을 때 사용
-
원자 연산
- 공유 자원에 접근할 때, 원자 연산 또는 원자적으로 정의된 접근 방법을 사용해 상호 배제를 구현
-
불변 객체