[SW사관학교 정글 6기]WIL - Pintos Project 1 : Threads

ssh00n·2023년 4월 27일
0

SW사관학교 정글

목록 보기
6/8

Pintos Project 1 : Threads - WIL(Weekly I Learned)

Background

프로그램(Program)

프로그램(program)은 특정한 task를 수행하기 위해 작성된 instruction들의 집합이다. instruction들은 프로그래밍 언어로 작성된다. 작성된 코드는 컴파일 되어 실행 가능한 파일이 만들어 지고,이 파일을 프로그램(Program)이라고 한다.

💡 컴파일(Compile)
→ 인간이 이해할 수 있는 언어로 작성된 소스코드(고수준 언어 : C, C++, Java, ..)를 CPU가 이해할 수 있는 언어로 번환하는 작업
컴파일 과정은 4가지 단계(전처리 - 컴파일 - 어셈블리 - 링킹)로 나누어 진다.
https://velog.velcdn.com/images/ssh00n/post/4d106732-6aad-4168-8cb6-422e22755eef/image.png

  • 전처리(Pre-processing) : 전처리기(Preprocessor)를 통해 소스 코드(.c)를 전처리된 소스코드 파일(.i)로 변환
    • 주석 제거 : 소스 코드에서 주석을 전부 제거(컴퓨터는 주석에 대해 인식할 필요 없기 때문)
    • 헤더 파일 삽입 : #include 지시문을 만나면 해당하는 헤더 파일을 찾아 모든 내용을 복사하여 소스코드에 삽입한다.
    • 매크로 치환 및 적용 : #define 지시문에 정의된 매크로를 저장하고 매크로 이름을 만나면, 정의한 값으로 바꿔준다.
  • 컴파일(Compilation) : 컴파일러(Compiler)를 통해 전처리된 소스 코드 파일(.i)을 어셈블리어 파일(.s)로 변환
    • 언어의 syntax 검사와, static한 영역(data, bss)들의 메모리 할당 수행
  • 어셈블리(Assembly) : 어셈블러(Assembler)를 통해 어셈블리어 파일(.s)을 오브젝트 파일(.o)로 변환
  • 링킹(Linking) : 링커(Linker)를 통해 오브젝트 파일(*.o)들을 묶어 실행 파일로 만드는 과정
    • 오브젝트 파일들과 라이브러리 파일들을 링크하여 하나의 실행파일을 만든다.

프로세스(Process)

프로세스(Process)실행중인 프로그램(program in execution)을 의미한다. 실행파일로 존재하던 프로그램이 memory에 적재되어 CPU에 의해 실행(연산)되는 것을 process라고 한다.

메모리는 code(text), data, heap, stack 영역으로 구성되어 있다.

스레드(Thread)

https://velog.velcdn.com/images/ssh00n/post/11c8a4c7-dc16-41ee-83d7-5bd22ae2242c/image.png

스레드(Thread)는 하나의 프로세스 내에서 실행되는 실행 흐름 및 동작의 단위이다. 각 thread는 속해있는 프로세스의 Stack 영역을 제외한 나머지 memory 영역을 공유할 수 있다. 프로세스는 동시에 실행될 수 있고 같은 메모리 영역을 공유하는 여러 개의 스레드를 가질 수 있다. 각 스레드마다 독립적으로 PC(Program counter), Register set, Stack을 가진다.

💡 CPU의 추상화의 관점에서, 스레드는 single physical processor 내에서 동작하는 virtual processor들로 생각될 수 있다. OS는 CPU의 스레드들을 스케줄링하고 빠르게 switching 함으로써, 스레드들이 parallel하게 동작하는 것처럼 보이도록 한다.

CPU의 관점에서, 쓰레드들이 같은 physical resources를 공유할지라도 각 스레드는 독립적으로 실행되는 것처럼 보인다. 이것은 time-sharing, 즉 CPU가 스레드들을 빠르게 switching하여 여러 개의 스레드들이 동시에 실행되는 것처럼 보이도록 함으로써 달성할 수 있다. 스레드는 프로그램의 여러 부분들을 concurrent하게 실행될 수 있도록 하기 때문에 program들의 parallelism을 이용하기에 용이하다. 따라서 프로그램의 전반적인 performance와 efficiency를 향상시킬 수 있다.

추가적으로, 스레드들은 user interface의 responsiveness를 향상시키는 데 이용될 수 있다. main thread를 blocking하지 않고, background에서 time-consuming task를 수행할 수 있기 때문이다.

Multi-thread

멀티 스레드(Multi thread)란 하나의 프로세스가 동시에 여러개의 일을 수행할 수 있도록 하는 것이다. 따라서 하나의 프로세스(process)에서 여러 작업을 병렬로 처리하기 위해 multi thread를 사용한다. multi thread에서는 한 process내에 여러 개의 thread가 있고, 각 thread들은 Stack 메모리를 제외한 나머지 영역(Code, Data, Heap)을 공유한다.

Stack memory & PC register

thread가 함수를 호출하기 위해서는 인자 전달, Return Address 저장, 함수 내 지역변수 저장 등을 위한 독립적인 stack memory 공간을 필요로 한다. 결과적으로 thread는 process로부터 stack memory영역은 독립적으로 할당받고, Code, Data, Heap 영역은 공유하는 형태를 갖게 된다.

Multi-Process vs. Multi-thread

  • multi process는 multi thread보다 많은 메모리 공간과 CPU 시간을 차지한다.
  • multi thread는 multi process보다 적은 메모리 공간을 차지하고 Context Switching이 빠르다.
    • multi process는 주소 공간을 공유하지 않기 때문에 Context switching을 위해 프로세스 간 통신(IPC)이 필요하므로 통신으로 인한 오버헤드가 크다
  • multi process는 하나의 process가 죽더라도, 다른 process에 영향을 주지 않아 안정성이 높다.
  • multi thread는 동기화 문제로 하나의 thread에서 발생한 문제로 인해 전체 thread가 종료될 위험이 존재한다.

Synchronization (동기화)

Synchronization은 여러 개의 스레드 또는 프로세스의 실행을 조정하여 올바르게 작동하고 예상 결과를 생성하도록 하는 프로세스를 말한다. 여러 스레드 또는 프로세스가 메모리, 파일 또는 하드웨어 장치와 같은 공유 리소스에 액세스할 때 동기화가 필요한 경우가 많다.

적절한 동기화가 이루어지지 않으면 여러 스레드가 동일한 리소스에 동시에 액세스하여 race condition, deadlock과 같은 문제가 발생할 수 있다.

race condition

  • 두 개 이상의 프로세스 또는 스레드가 동시에 같은 공유 리소스에 액세스하려고 시도하여 예측할 수 없는 동작을 초래할 때 발생한다.
  • 경쟁 조건에서 프로그램의 결과는 프로세스 또는 스레드의 실행 타이밍과 순서에 따라 달라진다.
    • 이로 인해 데이터 손상, 잘못된 결과 또는 프로그램 충돌과 같은 오류가 발생할 수 있다.

deadlock

  • deadlock은 일련의 프로세스가 리소스를 놓고 경쟁하고 있는데 다른 프로세스 중 하나가 리소스를 해제할 때까지 어느 프로세스도 진행할 수 없을 때 발생한다.
  • deadlock은 소프트웨어와 하드웨어 시스템 모두에서 발생할 수 있다.
  • deadlock이 발생할 경우 시스템이 응답하지 않거나 충돌을 일으킬 수 있다.
profile
Whatever I want

0개의 댓글