[운영체제] 4. 스레드와 멀티 스레딩

2025. 1. 27. 15:07·운영체제

이전 포스팅에서 프로세스와 프로세스 생명주기 등 프로세스가 OS에 의해 어떻게 관리되는지 알아봤었다. 

그리고 스레드가 프로세스보다 더 작은 단위로서 프로세스를 실행하는 단위가 된다는 것도 알아보았다.

 

그럼 이번에는 그 스레드가 도대체 무엇인지 더 자세히 알아보도록 하겠다. 

 

4 - 1 프로세스의 문제점 

컴퓨터가 처리하고자 하는 일의 단위를 작업(task)라고 한다. 

이 task는 프로세스를 만들어내며,

1980년대까지 Unix기반 OS의 실행 단위는 프로세스였다. 

 

그런데 프로세스가 실행단위일 때 생기는 문제점이 존재했다.

먼저, 1) 프로세스 생성에 걸리는 시간이 크다는 것이다. 이는 프로세스를 생성할 때 큰 오버헤드를 가져온다는 것을 의미한다. 

이전에 알아보았지만 프로세스를 생성하는 과정은 메모리 할당, 메모리 복제, PCB 생성, 매핑 등 많은 과정을 수반한다.

 

다음으로 2) 프로세스간 컨텍스트 스위칭이 큰 오버헤드를 유발한다는 것이다. 이것 또한 이전에 알아보았듯 실행중인 프로세스를 바꾸는 일은 프로세스의 컨텍스트를 저장하고 불러오는 컨텍스트 스위칭을 유발하고, 이는 OS에 부담을 준다. 

 

마지막으로 3)프로세스간 통신의 어려움이 있다. 프로세스는 서로 독립된 메모리 공간에 실행되기 때문에 다른 프로세스에 접근하지 않는다. 따라서 shared memory, signal, pipe, file, socket, semaphore, memory mapped file..등등 다양한 기법으로 커널 메모리와 커널에 의해 마련된 메모리 공간을 통해 프로세스간 데이터를 주고 받았어야 했다. 

이는 커널에 의지해야 한다는 것이고, 응용프로그램들은 운영체제 사이이에 호환성이 떨어지게 되었다. 

 

4 - 2 스레드 개념

스레드 등장 배경

그래서 프로세스보다 작고 데이터를 보다 쉽게 주고받기 위한 실행단위가 필요했다. 

이런 배경을 가지고 스레드는 등장하였다. 

정리해보면 

  • 프로세스보다 작은 실행단위의 필요성
  • 프로세스 생성 및 소멸에 다른 오버헤드 감소
  • 빠른 컨텍스트 스위칭
  • 프로세스 사이의 통신에 대한 어려움 해소 

위와 같은 요구를 만족하기 위해 스레드가 등장하였다.

 

 

스레드 개념 

스레드는 개발자에게는 작업을 만드는 단위이고 OS에게는 실행의 단위이며 CPU에게는 스케쥴링의 단위이다. 

이제 스케쥴링의 단위는 프로세스가 아닌 스레드가 된다. 

 

스레드는 코드, 데이터, 힙, 스택이 담긴 주소공간을 가진 실체이며 실행은 OS에 의해 제어된다. 

OS는 스레드를 제어하기 위해 TCB라는 구조체를 만드는데, 이는 스레드 정보를 관리한다. TCB를 기반으로 OS는 CPU에 스레드를 실행한다. 

 

프로세스는 스레드들의 컨테이너가 되었다. 스레드는 프로세스 안에 존재하고 OS는 응용프로그램을 실행하기 위해 프로세스를 생성한다. 

프로세스는 생성될 때 하나 이상의 스레드를 가지게 된다. 프로세스 실행 시 커널이 1개의 스레드를 프로세스에 생성하는데, 이 프로세스가 main thread이다. 

 

즉 프로세스의 생성은 main thread의 생성을 유발하고, main thread가 다른 스레드들을 생성해낸다. 

 

프로세스마다 PCB를 생성하는 것처럼 

스레드도 스레드마다 TCB를 생성해 관리한다. TCB를 스레드 엔티티 혹은 스케쥴링 엔티티라고도 한다. 

 

 

 

위 이미지는 커널 공간에 PCB와 TCB가 어떻게 관리되는지 보여준다. 

 

커널은 CPU스케쥴링 시 전체 TCB 중 하나를 선택해 스레드를 실행한다. 

PCB마다 최소 하나의 TCB를 가지고 있으며, 이것이 main thread 이다. 그리고 main thread가 t2, t3 ..등등 추가적인 스레드를 만들언낸다. 

 

프로세스는 스레드들이 공유할 수 있는 공간을 제공해주는 것이다. 그리고 스레드는 프로세드의 주소 공간을 나누어 사용한다. 

프로세스 주소 공간 내에 스레드 코드를 적재한다. 또한 스레드들은 프로세스 내에 작성된 함수들은 어떤 것이든 호출 가능하다. 

전역변수에도 엑세스 가능하며, 힙공간을 공유한다. 

스레드가 동적 할당 받는 곳 또한 힙이다. 동적 할당 받은 메모리 공간을 다른 스레드가 엑세스 가능하다는 것이다. 

결과적으로 스레드간 데이터를 공유하는게 프로세스와 비교했을 때 더 편리하다. 

하지만 여전히 다른 프로세스의 스레드와 통신하는 것은 어려움이 있다. 

 

스레드는 함수로 작성되고, 사용할 데이터는 함수 내 지역변수로 작성한다. 여기서 함수는 main() 과 같은 메인 스레드가 실행할 작업을 의미한다. 

함수를 만들고 OS에게 스레드를 만들 것을 요청한다. OS는 TCB를 만들고 함수의 시작 주소를 TCB에 저장한다. 이는 스레드 스케쥴링 시 시작 지점이 된다. 이제 커널 내 TCB가 생성되었고 이를 OS 혹은 스레드 라이브러리가 관리하게 된다. 

함수가 종료되면 스레드도 종료된다. 이때 TCB등 스레드 정보를 제거하며, 모든 스레드가 종료되면 프로세스 또한 종료된다. 

 

멀티 스레드드의 사례를 들어보자. 

미디어를 재생하는 미디어 플레이어 응용프로그램이 있다고 할 때, 이 프로그램은 미디어를 입력받는 스레드와, 디코딩 스레드가 존재할 것이고, 또 비디오를 재생하는 스레드, 오디오를 재생하는 스레드도 존재할 것이다. 이렇게 프로그램은 여러 스레드가 적절한 시기에 적절한 로직을 수행하며 실행된다. 

 

또 테트리스 게임을 실행할 응용프로그램이 있다고 해보자, 오디오 재생 스레드, 키 입력을 받을 스레드, 게임 타이머를 체크할 스레드 총 3개의 스레드로 이루어져 있다고 했을 때, TCB는 각각의 스레드에 하나씩 총 3개 존재할 것이다. TCB에는 함수의 시작 주소가 저장되어 있고, 이는 커널이 스레드를 실행할 주소이다. 

 

TCB는 커널에 의해 생성, 관리되며 스레드 함수 코드는 커널에 의해 직접 CPU가 실행되도록 제어된다. 

 

멀티스레딩은 

concurrency(동시성) - 1개의 CPU로 2개 이상의 스레드를 실행할 때 시간을 나누어 실행하는 것 

paralleism(병렬성) - 2개 이상의 스레드가 서로 다른 CPU에서 동시에 실행되는 것 

두가지 경우로 실행 가능하다. 

 

4 - 3 스레드 주소 공간과 스레드 

스레드 주소 공간이란 스레드가 실행 중 사용하는 메모리 공간을 의미한다. 코드-데이터-힙-스택 영역이다. 

스레드 주소 공간은 프로세스 주소 공간에 형성된다. 

프로세스가 스레드를 담는 컨테이너의 역할을 수행하기에 당연한 것이다. 

 

스레드 주소 공간은

1) 스레드 사적 공간

2) 스레드 공유 공간

이렇게 두 가지로 나눌 수 있다.

 

스레드 사적 공간은 말 그래도 하나의 스레드가 공유하지 않고 사적으로 사용하는 주소 공간이며, 스레드 공유 공간은 스레드끼리 공유하는 공간이다. 

 

스레드 사적 공간은 스레드 스택 TLS(스택 영억) 그리고 스레드 로컬 스토리지(데이터 영역)에 존재하고,

스레드 공유 공간은 프로세스의 코드, 로컬 스토리지를 제외한 데이터 영역, 그리고 힙 영역이다.

 

스레드 주소 공간을 다시 정리해보면 

  • 코드 영역은 스레드의 코드가 호출을 통해 프로세스의 함수를 사용하는 공간이다. 
  • 데이터 영역은 스레드가 다른 스레드로부터 안전하게 보호하기 위한 변수를 설정할 스레드 로컬 스토리지와 이를 제외한 나머지 전역 변수공간이 존재한다. 
  • 힙 영역은 동적 할당받는 프로세스의 힙 공간을 스레드들이 힙을 할당 받는 힙 공간으로 공유한다. 
  • 스택 영역(사용자 스택 영역) 은 스레드가 생기면 일부분이 스레드의 스택 영역으로 할당된다. 이 영역에 스레드가 사용자 모드에서 호출한 함수들의 매개변수들과 지역 변수등을 독립적으로 저장한다. 그리고 프로세스의 커널 스택에는 각 스레드 커널 스택을 생성해서 스레드가 시스템 호출로 커널 모드를 통해 진입하도록 돕는다. 

 

사실 스레드 주소 공간이 프로세스 주소 공간을 나눠서 사용한다고 생각하면 그렇게 이해하기 어렵진 않다. 

 

https://camuscoding.tistory.com/17#%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%20%EB%A9%94%EB%AA%A8%EB%A6%AC%20%EA%B5%AC%EC%84%B1%C2%A0-1

 

[운영체제] 3. 프로세스와 프로세스 관리

3 -1. 프로그램과 프로세스이제 프로그램과 프로세스에 대해서 본격적으로 알아볼 때 가 된 것 같다.이 전에도 말했겠지만  프로그램은 하드디스크, USB등 저장 장치에 저장된 실행 가능한 파일

camuscoding.tistory.com

 

 

이전 포스트에서 프로세스의 메모리 구조를 다시 확인해보고 오면 더 이해가 쉬울지도 모르겠다. 

조금 다른 부분이라면 데이터 영역에 스레드가 공유하지 않고 사용하는 스레드 로컬 스토리지 영역이 있다는 것이다.

 

 

 

 

스레드 상태와 스레드 운용 

프로세스의 상태가 존재하는 것처럼 스레드 또한 상태가 존재한다. 

 

ready  -  스레드가 스케쥴을 기다리고 있는 상태

running - 스레드가 현재 cpu에 의해 실행되는 상태 

blocked - 스레드가 입출력을 요청하거나 sleep()과 같은 시스템 호출로 커널에 의해 중단된 상태 

terminated -  스레드가 종료된 상태 

 

프로세스의 상태가 PCB에 저장되는 것처럼 스레드의 상태는 TCB에 저장된다. 

 

스레드 상태

 

스레드의 생성 

프로세스 생성 시 OS는 자동으로 main 스레드를 생성한다. 이 main 스레드를 제외한 나머지 스레드가 스레드를 생성한다. 프로세스처럼 부모-자식 스레드 구조가 만들어지는데 프로세스처럼 중요한 관계는 아니고 자식 TID를 가지고 부모 스레드가 제어하는 수준이다. 

 

스레드가 만들어지면 TCB 구조체가 생성되고, TID를 부여한다.

그리고 TCB의 PC 레지스터에 스레드가 실행할 코드의 주소를 저장한다. 스레드가 사용자 스택에 할당되고, 그 주소를 TCB의 SP에 저장한다.

스레드는 ready 상태로 바뀌고, 준비 리스트에 들어간다. TCB를 PCB와 다른 TCB에 연결하면 스레드 생성이 완료된다. 

 

스레드의 종료 

프로세스 종료시 모든 스레드는 종료되는데, 프로세스가 종료되는 경우는 main 스레드가 종료되거나, exit()와 같은 시스템 호출 혹은 모든 스레드가 종료됐을 경우이다. 

스레드만 종료시키기 위해서는 pthread의 exit 함수를 사용해 main 스레드만 종료시킬 수 있다. 

 

스레드가 종료될 때는 TCB가 먼저 제거되고, TCB에 연결된 링크들을 해제한다. 그리고 스레드 할당 영역은 프로세스 영역에 남아있게 된다. 

 

스레드 조인 

스레드가 다른 스레드의 종료를 기다리는 행위를 스레드 조인이라고 한다. 

 

스레드 조인 과정

이렇게 스레드가 자식 스레드를 만들고, 각자 일을 수행한 뒤, 부모 스레드가 자식 스레드의 종료까지 join()을 통해 기다리는 것이다. 

 

스레드 양보 

실행중인 스레드가 다른 스레드에게 CPU를 양보하기 위해 스스로 실행을 중단하는 것.

양보한 스레드는 ready 상태로 큐에 들어간다. 

 

 

OS마다 스레드들의 상태들을 다르게 구현한다. 참고로 java는 new, runnable, blocked, waiting, timed_waiting, terminated 6가지 스레드 상태를 관리한다.  

 

스레드 컨텍스트, TCB 

스레드 컨텍스트는 스레드가 현재 실행중인 일체의 상황을 의미한다. CPU의 레지스터와 메모리에 스레드 컨텍스트가 담겨 있는데, 

CPU 레지스터의 PC에는 실행중인 스레드 코드 주소가, SP에는 스레드 스택의 탑 주소가 담겨있으며 메모리에는 코드와 데이터, 스택에 현제 실행중인 함수의 매개변수와 지역변수들이 담겨 있다. 

 

즉 CPU가 스레드를 실행하고 있을 때 CPU레지스터의 값들이 스레드 컨텍스트인 것이다. 

 

스레드 컨텍스트를 관리하기 위해 스레드마다 TCB 구조체가 커널에 의해 생성되어있다. 

TCB의 컨텍스트 정보는 스레드 실행이 종료되어 컨텍스트 스위칭 될 때 CPU 레지스터 값들이 저장된다. 

스레드 초기 실행 시작 주소와 할당 스택 주소가 PC와 SP에 각각 저장되어있다. 

 

TCB에는 

  • 스레드 정보(TID, state)
  • 컨텍스트 정보(PC, SP, 다른 레지스터)
  • 스케줄링 정보(우선순위, CPU 사용시간)
  • 관리를 위한 포인터들(PCB 주소, 다른 TCB 주소, 블록 리스트, 준비 리스트)

들이 담겨 있다. 

 

커널의 실행단위는 더 이상 프로세스가 아니다. 

프로세스들은 스레드들이 생기고 활동하는 자원의 컨테이너이며, 커널이 실행단위로 인식하는 실체는 TCB이다. 

 

추가로 스레드를 관리하기 위한 ready thread lilst와 blocked thread list가 존재한다. 

 

스택의 중요성 

PC레지스터에는 실행 시작 주소가 들어 있어 중요하다는 것을 알겠지만, 스택은 왜 SP 레지스터를 따로 사용해 관리하는 것일까? 

스택에는 함수 호출시 함수의 지역변수와 매개변수가 저장된다. 

함수가 끝나면 이 영역은 사라지지만, 다른 함수 호출시 이 값은 남아있게 된다. 

즉 스택 영역에는 함수가 진행 중 다른 함수를 호출할 수록 지역 변수와 매개 변수가 쌓여 있게 되는 것이다. 

함수 실행 중 호출한 함수가 끝나면 다시 스레드 스택의 주소로 복귀해 정상적으로 호출하던 함수가 실행될 수 있도록 돕기 위함이다. 

하지만 스택 영역은 무한한 공간이 아니다. 할당된 스택 공간을 넘어선다면 스택 오버플로우라는 에러가 발생하게 된다. 

보통 재귀함수를 사용하면 스택 오버 플로우 현상이 자주 발생하게 된다. 

 

스레드 컨텍스트 스위칭 

CPU가 실행중인 스레드를 중단하고 CPU에게 새 스레드를 실행시키는 것이 스레드 컨텍스트 스위칭이다. 

 

실행중인 스레드가 스케줄링 되고 -> 상태를 TCB에 저장하고  -> TCB에서 가져와 CPU에 적재한다. 

 

스레드가 컨텍스트 스위칭 되는 경우는 

  • 자발적 양보 - yield(), sleep(), wait()
  • I/O 요청에 의한 Blocked 상태 
  • 타임 슬라이스 소진에 의한 할당된 사간 초과 
  • I/O 호출 

자발적 양보와 blocked 상태는 시스템 호출에 의한 것이고, 할당된 시간이 초과되거나 I/O 호출은 인터럽트 서비스 루틴에 의한 것이다. 

 

즉 시스템 호출 혹은 인터럽트 서비스 루틴의 실행 도중 커널에 의해 컨텍스트 스위칭은 이루어진다. 

컨텍스트 스위칭이 이루어지면 CPU 레지스터에 현재 컨텍스트 값을 저장하고 대기 큐로 복귀한다.

 

오버헤드 

 동일한 프로세스 내의 다른 스레드와 스위칭 될 때는 

1) 컨텍스트를 저장하고 준비큐로 북귀시킴

2) TCB리스트 조작 시간 

3) 캐시 플러시 - 현재 CPU 캐시에 담겨 있는 스레드 코드와 데이터를 지우거나 변경된 데이터를 메모리로 복사함 

이렇게 3가지의 오버헤드가 발생한다. 

 

그런데 다른 프로세스의 스레드로 스위칭된다면 

위 3가지 오버헤드와 더불어 

1) 메모리 관련 오버헤드 - 논리 주소를 물리 주소로 매핑해 MMU 장치내 맵 테이블을 교체함 

2) 추가적인 캐시 오버헤드 발생 - CPU에 담긴 프로세스 코드와 데이터를 모두 무효화하고 캐시 미스가 발생한 후 다시 채워짐 

이렇게 2가지 오버헤드가 추가로 발생된다. 

 

이는 CPU가 실행하는 주소 공간이 완전히 바뀌었기 때문이다.

 

4 - 4 커널 레벨 스레드, 사용자 레벨 스레드 

스레드는 스케줄링의 주체에 따라서 

  • kernel level 스레드
  • user level 스레드 

두가지로 나눠진다. 이는 TCB를 생성하고 소유하는 주체가 누군인지에 따라서 나눈다고 봐도 된다. 

 

커널 레벨 스레드는 

TCB가 커널에 의해 커널 공간에 만들어지고, 커널에 의해 존재가 인지되며, 커널에 의해 스케줄링되는 스레드를 의미한다. 

오직 시스템 호출에 의해 작동되고 스레드 조인, 동기화 등 스레드 운용의 거의 모든 기능을 커널에 의해서만 제공된다. 

커널 레벨 스레드는 병렬적으로 작동된다. 

 

사용자 레벨 스레드는 

스레드 라이브러리에 의해 사용자 공간에 생성, 관리, 스케줄링되는 스레드이다.

응용프로그램에 링크되어 응용프로그램의 바이너리 코드에 합쳐진다. 응용프로그램 적재시 사용자 영역에 적재되며, 응용프로그램은 스레드 라이브러리 함수를 호출하며 스레드를 생성한다. 

스레드 라이브러리는 생성한 TCB를 사용자 공간에 저장하고 모든 관리가 사용자 공간에서 이루어진다. 스레드 라이브러리는 사용자 레벨 스레드가 실행되는 환경의 역할(일종의 가상머신)을 수행한다. 

사용자 레벨 스레드의 스케줄링은 스레드 라이브러리 스케줄링 함수가 다른 사용자 레벨 스레드의 주소로 점프시키며 이루어진다. 즉 커널의 도움 없이 스케줄링을 실행하기에 컨텍스트 스위칭을 줄여준다. 

중요한 부분은 커널은 사용자 스레드의 존재를 전혀 알지 못한다는 것이다. 

커널은 스레드의 존재를 TCB를 통해 인식하는데 사용자 레벨 스레드의 TCB는 인식하지 못한다. 응용프로그램이 호출하는 스레드 라이브러리가 스레드를 생성, 관리, 스케줄링 하기 때문에 커널 입장에서는 이를 알 방법이 없다.

 

컨텍스트 스위칭과 스레드 관리 측면에서는 사용자 레벨 스레드가 더 효율적이다. 

또한 이식성 또한 OS에 종속되지 않고 응용프로그램내에서 실행되는 사용자 레벨 스레드가 더 효율적이라고 할 수 있다.

하지만 병렬성 부분에서는 커널 레벨 스레드가 더 좋다. 

 

4 - 5 멀티 스레드 구현 

응용프로그램에서 생성된 사용자 레벨 스레드의 코드가 CPU에 의해 실행되려면, 궁극적으로는 커널에 의해 스케줄링 되어야 한다. 

그런데 커널은 커널 레벨 스레드 밖에 알지 못한다. 따라서 사용자 레벨 스레드와 커널 레벨 스레드가 매핑 되어야 한다. 

 

이 방법에는 N:1, 1:1, N:M 매핑 방법이 존재한다. 

 

N:1 매핑 

하나의 프로세스에 속한 모든 사용자 스레드를 하나의 커널 스레드로 매핑하는 작업이다. 

즉 N개의 user TCB를 1개의 TCB에 메핑하는 것인데, 응용프로그램당 하나의 커널 레벨 스레드가 생성되고, 커널이 스케줄링을 통해 커널 레벨 스레드를 선택하면여기서 또 스케줄링을 통해 사용자 스레드를 실행하는 것이다. 

모든 프로세스를 기본적으로 단일 스레드 프로세스로 다루는 것이다. 

따라서 커널 레벨 스레드가 실행되어야만 사용자 레벨 스레드가 실행될 수 있게 된다. 

이 방식의 장점은 단일 코어 CPU에서 속도가 빠르다는 것이다. 스레드 라이브러리에 의해 사용자 공간에서 모든 것이 이루어질 수 있기 때문이다. 

하지만 멀티 스레드의 장점인 병렬성을 얻을 수 없는 방법이기에 멀티코어에서는 단점이 매우 크다. 응용프로그램 내 한 사용자 스레드가 불록 상태가 되면 나머지 사용자 스레드 모두 실행할 수 없게 된다. 따라서 현재 사용하지 않는 매핑 방식이다. 

 

1:1 매핑

가장 단순한 매핑 방식이다. 

사용자 레벨 스레드 하나당 커널에 의해 스케줄 가능한 엔티티(TCB)를 하나 연결한다. 

즉 사용자 레벨 스레드와 커널 레벨의 TCB를 하나 연결하는 것이다. 

이 방식의 장점은 구현이 쉽다는 것이다. 또한 여러 코어에서 동시 실행할 수 있는 병렬성을 확보할 수 있다. 그리고 사용자 레벨 스레드가 블록되더라도 달느 사용자 레벨 스레드가 동작한다. 

단점은 OS의 부담이 크다는 것이다. TCB를 비롯한 여러 구조체를 생성하고 관리해야하기에 커널의 부담이 커진다. 그렇지만 구현이 쉽고 멀티코어의 병령성을 살릴 수 있기에 많이 사용하는 방식이다. 

 

N:M 매핑 

응용프로그램에 속한 사용자 레벨 스레드 중 N개의 스레드들을 M개의 커널레벨 스레드에 연결시키는 방식이다.

2단계 스케줄링이 실행되는데

커널 스케줄에 의해 M개의 커널 레벨 스레드 중 하나가 선택되고, N개의 사용자 레벨 스레드 중 하나가 스레드 라이브러리에 의해 스케줄링 돼 선택된다. 

이 방식은 커널의 부담이 더 적고, 사용자 레벨 스레드가 블록되어도 전체 스레드가 블록될 확률이 더 적다는 장점이 있지만, 구현이 매우 복잡해 잘 사용하지 않는 방식이다. 

 

4- 6 멀티스레드 이슈 

프로세스는 여러 스레드들의 코드와 데이터, 힙, 스택이 생성, 실행되는 주소공간이자 공유공간이다. 

프로세스는 OS가 응용프로그램을 적재하는 단위이며 실행단위는 스레드이다. 

PCB에는 TCB가 언제나 연결되어 있다. 프로세스는 무조건 하나의 main thread를 가지기 때문이다. 

PCB기 모든 스레드가 공유하는 환경 컨텍스트라면, TCB는 현재 실해중인 실행단위 정보만 저장하는 실행 컨텍스트이다. 

동일 프로세스안의 스레드간의 컨텍스트 스위칭이 더 빠른 것고 이 때문이며, 모든 스레드가 종료되면 프로세스 또한 종료된다 

 

멀티 스레딩은 

  • 높은 실행성능
  • 사용자에 대한 우수한 응답성 - 한 스레드가 블록되도 다른 스레드가 스케줄링 됨 
  • 서버 프로그램의 우수한 응답성
  • 시스템 차원 사용의 효율성
  • 응용프로그램 구조 단순화 - 독립적인 여러 작업으로 분할 
  • 작성하기 쉽고 휴얼적인 통신 - 스레드간 통신 

이러한 장점을 가지고 있지만 

 

프로세스에 여러 개의 스레드가 있을 때, 한 스레드가 fork() 시스템 호출을 이용해 자식 프로세스를 실행하면 자식 프로세스에는 부모 프로세스에서 fork()를 호출한 스레드만 살아 main 스레드를 만들고 나머지 4개의 스레드는 종료되어 버린다. 

따라서 멀티 스레등 환경에서 fork() 사용을 주의해야한다. 

또한 스레드가 exex() 시스템 호출 시 모든 스레드를 종료시키고 프로세스 주소 공간에 새로운 응용프로그램을 적재해 실행시키기에, 개발자는 exec() 가 가져올 결과를 잘 알고 사용해야만 한다. 

마지막으로 스레드 사이의 동기화 문제이다. 여러 스레드가 공유 데이터에 동시에 접근하면 공유 데이터를 훼손시킬 수 있기에 주의해야한다. 잘못된 결과를 얻게되거나 교착상태에 빠질 위험성이 있다. 

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

[운영체제] 6. 스레드 동기화  (0) 2025.03.12
[운영체제] 5. CPU 스케줄링  (0) 2025.02.12
[운영체제] 3. 프로세스와 프로세스 관리  (4) 2025.01.14
[운영체제] 2. 컴퓨터 시스템과 운영체제  (3) 2025.01.06
[운영체제]1-2 운영체제의 태동  (5) 2024.12.19
'운영체제' 카테고리의 다른 글
  • [운영체제] 6. 스레드 동기화
  • [운영체제] 5. CPU 스케줄링
  • [운영체제] 3. 프로세스와 프로세스 관리
  • [운영체제] 2. 컴퓨터 시스템과 운영체제
코뮝
코뮝
  • 코뮝
    코뮝의 기술 블로그
    코뮝
  • 전체
    오늘
    어제
    • 분류 전체보기 (25)
      • DB (1)
      • JAVA (0)
      • 운영체제 (11)
      • Spring (9)
      • 알고리즘 (2)
      • 카테캠 3기 (1)
      • DevOps (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    OS
    명품 운영체제
    자바
    타조 알고리즘
    카태켐
    운영체제 공부
    원자 명령
    김영한
    가변 크기 할당
    운영체제
    분할 메모리 할당
    스레드 매핑
    참조의 지역성
    기초 cs
    백엔드
    커널 레벨 스레드
    기아 스레드
    코스만 조건
    카테캠 백엔드
    Java
    역페이지테이블
    고정 크기 할당
    Spring
    생산자 소비자 문제
    카태켐3기
    CS
    시스템 콜
    스프링
    프로그래머스 유연근무제
    스프링 기본
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
코뮝
[운영체제] 4. 스레드와 멀티 스레딩
상단으로

티스토리툴바