늦은 프로그래밍 이야기

프로세스, 스레드, 비동기 본문

내일배움캠프/Computer Science

프로세스, 스레드, 비동기

한정규 2022. 11. 20. 15:55

 - 프로세스, 스레드는 운영체제(OS)에서 배우는 개념이다.

 - 비동기는 CS 개념이라기 보다 개발하다 보면 많이 접하는 개념이다.


운영체제 (Operating System)

 - 사용자가 하드웨어를 사용하기 위해 필요한 소프트웨어.

 - 컴퓨터로 실행하는 모든 프로그램들은 운영체제에서 관리하고 제어한다.

 

목적

시스템 자원 관리

 - 응용 프로그램이 하드웨어에게 일을 시킬수 있도록 돕는다.

 - 자원을 효율적으로 사용할 수 있게 한다.

  • 프로세스 관리 (CPU)
  • 메모리 관리 (RAM)
  • I/O 관리 (디스크, 네트워크)

응용 프로그램 관리

 - 응용 프로그램이 실행되고, 시스템 자원을 사용할 수 있도록 권한과 사용자를 관리한다.

 - 따라서 프로그램은 하드웨어 자원을 직접적으로 사용하지 않고 운영체제가 제공하는 자원만을 사용할 수 있다.

 

구성

 - 커널 : 운영체제가 수행하는 모든 것이 저장되어 있다.

 - 명령어 해석기 : 사용자가 커널에 요청하는 명령어를 해석하여 커널에 요청하고 결과를 출력한다.


프로세스 (Process)

 - 운영체제에서 실행중인 하나의 어플리케이션

 - 운영체제로부터 시스템 자원을 할당 받은 작업의 단위

 - 메모리에 적재되어 실행되고 있는 프로그램의 인스턴스

 

특징

 - 독립된 메모리를 할당 받는다. (프로세스 주소 공간)

 - 프로세스마다 최소 1개의 (메인)스레드를 갖는다.

 - 각 프로세스는 다른 프로세스의 변수나 자료구조에 접근할 수 없으며, 다른 프로세스의 자원에 접근하려면 파이프, 파일, 소켓 등을 이용해 통신해야 한다.

 

구성

 - 프로세스 주소 공간 : 프로세스가 메모리를 관리하기 위해 관리하는 구조. Code, Data, Stack, Heap으로 구성.

  • Code : 코드 자체를 구성하는 메모리 영역 (프로그램 명령)
  • Data : 전역변수, 정적변수 등
  • Stack : 지역변수, 함수 매개변수, 리턴 값 (임시 메모리 영역)
  • Heap : 동적 할당 시 사용 (new(), malloc() 등)


스레드 (Thread)

 - 프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위

 - 코드가 실행되는 하나의 흐름

 

특징

 - 하나의 프로세스가 생성되면 하나의 스레드가 같이 생성되고, 이를 메인 스레드 라고 부른다.

 - 스레드를 추가로 생성하지 않는 한 모든 프로그램 코드는 메인 스레드에서 실행된다.

 - 스레드는 프로세스 내의 Code, Data, Heap 영역은 다른 스레드와 공유하고 Stack 영역을 따로 할당 받는다.

 - 따라서 한 스레드가 프로세스 자원을 변경하면, 이웃 스레드들이 변경 결과를 볼 수 있다.

 

멀티 태스킹 (MultiTasking)

 - 운영체제가 CPU에 작업을 줄 때 시간을 잘게 나누어 배분하는 기법.

 - 두 가지 이상의 작업을 동시에 처리하는 것으로 멀티 프로세스, 멀티 스레드를 의미한다.

 

멀티 프로세스

 - 하나의 프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 하나의 작업을 처리하도록 하는 것.

 

장점

 - 독립된 구조로 안정성이 높다.

 - 여러 자식 프로세스 중 하나가 죽어도 다른 프로세스에는 영향이 확산되지 않는다.

 

단점

 - 멀티 스레드보다 많은 메모리 공간과 CPU 시간을 차지한다.

 - 문맥 교환(Context Switching) 과정에서 오버헤드가 발생하기 쉽다.

 - 캐쉬 메모리 초기화 등의 무거운 작업이 진행.

 - 독립된 메모리 영역 때문에 프로세스 간 자원을 공유할 수 없고, 복잡하고 어려운 통신을 거쳐야 한다.

 

문맥 교환 (Context Switching)

 - CPU에서 여러 Task(process, thread)를 돌아가며 작업을 처리하는 과정.

 - 동작 중인 task는 대기로 넘어가면서 해당 task의 문맥(context)을 프로세스 제어 블록(PCB)에 보관하고, 대기하고 있던 다음 task가 동작을 시작하면서 이전에 보관했던 문맥(context)을 복구한다.

 

멀티 스레드

 - 하나의 프로그램을 여러 개의 스레드로 구성하고 각 스레드가 하나의 작업을 처리하도록 하는 것.

 

장점

 - 프로세스에 비해 메모리 공간과 시스템 자원 소모가 줄어들게 된다.

 - 스레드 간 통신에 별도의 자원을 이용하지 않고 Data, Heap 메모리 영역을 이용해 데이터를 주고 받는다.

 - Context Switching 시 캐시 메모리를 비울 필요가 없기 때문에 비용이 적고 빠르다.

 

단점

 - 하나의 스레드에 문제가 생기면 전체 프로세스가 영향을 받는다.

 - 스레드 간 Data, Heap 영역 등을 공유하므로 한 스레드가 다른 스레드에서 사용중인 변수나 자료구조에 접근하여 충돌이 일어날 수 있는 자원 공유 동기화 문제가 발생한다.


비동기 (Asynchronous)

출처 : https://homoefficio.github.io/2017/02/19/Blocking-NonBlocking-Synchronous-Asynchronous/

Blocking vs Non-Blocking

 - 제어권이 누구한테 있는가

 - 제어권 : 자신(함수)의 코드를 실행할 권리. 제어권을 가진 함수는 자신의 코드를 끝까지 실행한 후, 자신을 호출한 함수에게 돌려준다.

 - 블로킹 : 함수가 다른 함수를 호출한 뒤, 호출한 함수의 리턴값이 올때까지 기다린 후 진행. 즉 제어권을 호출한 함수에게 넘겨준다.

 - 논블로킹 : 함수가 다른 함수를 호출한 뒤, 호출한 함수의 작업완료 여부와 상관없이 진행. 즉, 제어권을 넘겨주지 않는다.

Synchronous vs Asynchronous

 - 호출되는 함수의 작업 완료 여부를 신경쓰는가

 - 동기 : 함수가 다른 함수를 호출할 때, 호출한 함수의 리턴값을 계속 확인하며 신경 쓰는 것.

 - 비동기 : 함수가 다른 함수를 호출할 때, 호출한 함수의 작업완료 여부를 신경 쓰지 않는 것.


'내일배움캠프 > Computer Science' 카테고리의 다른 글

HTTP, HTTPS  (0) 2022.11.25
Comments