[CS/OS] Process & Thread

0
post-thumbnail

CPU의 구조

  • 프로세서 : 기본적인 명령어들을 처리하고 반응하기 위한 논리회로이다.
  • 프로세스 : CPU가 처리하는 작업(Task)라고도 불리며, 실행중인 프로그램을 의미한다.좀 더 구체적으로 디스크에 저장되어 있던 실행 가능한 프로그램이 메모리에 적재되어 운영체제가 관리하는 상태를 의미한다. 1개의 프로세스에는 최소 1개의 스레드를 가지며, 프로세스는 스레드의 정보를 담아 스레드 간의 공유 환경을 제공하는 컨테이너와 같다고 볼 수 있다.
  • 스레드(Thread): 브라우저에서 프로그램을 다운 받으면서 다른 페이지를 돌아다니는 것처럼 컴퓨터가 여러 개 일을 동시에 수행하기 위해 프로세스 내에서도 여러 갈래의 작업들이 동시에 진행하는 여러 개 갈래들이 작동하는데 이를 스레드(Thread)라고 한다.
  • 코어(Core) : 코어는 CPU에서 연산을 담당하는 CPU의 물리적인프로세서이다. CPU는 코어 이외에 컨트롤러, 캐시메모리 등으로 구성되어 있다.

🍕식당으로 비교!

  • 프로세서 : 요리사
  • 프로세스 : 라면 끓이기, 김밥 말기, 햄버거 만들기. 같은 메뉴를 만들 때는 같은 자원과 조리대를 사용하는 것처럼 프로세스들은 작업양에 따라 메모리를 분할해서 쓴다.
  • 스레드: 요리사가 라면 끓이는 섹션에 화구가 4개가 있다 = 프로세서 1개에 스레드가 4개 있다. = 라면을 최대 4개까지 같이 끓일 수 있다.

과거에는 요리사 1명에 1개의 화구를 사용하는 방식으로 요리사의 수를 늘렸으나 요리사의 수를 더 이상 늘릴 수 없게 되자 화구를 2개로 늘려서 요리사 수를 늘리지 않고도 요리 속도를 향상시켰다.


프로세서

  • CPU : 디바이스가 해야할 일을 총 지휘하는 프로세서
  • 싱글코어(single core) CPU: 1개의 CPU 안에 1개의 Core가 존재함
  • 멀티코어(multi-Core) CPU: 1개의 CPU 안에 여러 개의 독립적인 Core들이 계산을 함

동작 방식

  • 동시적(Concurrnet) : 프로세스 하나가 여러 작업을 돌아가면서(context switching) 조금씩수행 ➡ 싱글 코어 프로세서에서 동작
  • 병렬적(Parallel) : 프로세스 하나에 Core가 여러 개있어서 각각 동시에 작업들을 수행하는 것. CPU의 속도가 발열 등의 물리적 제약이 있기 때문에 그 대안으로 Core를 여러 개 달아서 작업을 분담할 수 있도록 함. ➡ 멀티 코어 프로세서에서 동작


메모리(Memory)

  • 메모리(램, RAM): CPU가 처리한 정보들을 기억하고 처리해야할 데이터를 보관하는 곳이다. 예를 들어 CPU에게 tasks 100개가 들어오면 한번에 50개를 처리하고 나머지 50개의 tasks는 메모리에 보관되어 순차적으로 처리되기에 메모리 용량이 적으면 병목현상이 발생하여 CPU의 처리 속도가 느려지게 된다.

PC의 작동 원리

1) PC 사용자가 키보드, 마우스를 통해 명령을 내린다.
2) CPU(중앙처리장치)가 요구 사항을 처리하기 위해 연산을 한다.
3) 이때 처리된 정보들은 일시적으로 메모리에 저장된다.
4) 이를 바탕으로 모니터, 프린터 등의 출력 장치를 통해 결과를 보여준다.

폰 노이만 구조 vs 하버드 구조

  • 폰 노이만 구조 : 인간 사고 과정을 참고하여 설계된 구조. 어떤 연산을 할 때 머릿 속의 기억을 불러와서 계산하는 과정과 유사. 계산을 빠르게 처리(CPU 성능)할 수 있어도 기억을 불러오는 속도(메모리에 접근하는 속도)가 느리면 전체 속도가 느려짐.
    (폰 노이만 병목현상: 기억 장치의 속도가 전체 시스템 성능 저하를 야기한다.)

  • 하버드 구조: 명령용 버스와 데이터용 버스를 물리적으로 구분해서 CPU가 명령어와 데이터를 동시에 사용할 수 있도록 함. > 명령어 처리가 끝나는 동시에 다음 명령을 읽어들일 수 있음 > 폰 노이만 구조보다 빠른 속도


프로세스 메모리 구조

스택(Stack)

  • 프로그램이 사용하는 임시 메모리 영역으로 지역변수, 매개변수, 리턴 값과 가이 잠시 사용되었다 사라지는 데이터를 저장하는 영역이다. 함수 호출 시 생성되고 함수 실행이 끝나면 제거된다.

힙(Heap)

  • 런 타임에 크기가 결정된다.
  • 동적 할당을 위한 메모리 영역이다. 예를 들어 데이터 배열의 크기가 확실치 않고 변동성이 있을 때 Heap영역을 활용해서 데이터를 할당한다.
  • 스택보다 메모리 공간이 많은 장점이 있으나, 포인터로 메모리 영역에 접근해야하기에 다른 구조에 비해 데이터를 읽고 쓰는게 느리다.

데이터(Data)

  • 프로그램이 실행될 때 생성되고 프로그램이 종료되면 시스템에 반환되며 전역변수, 정적 변수, 배열 등이 저장된다.
  • 함수 내부에 선언된 정적 변수는 프로그램 실행 시 공간 할당이 된 후 함수 실행 시 초기화 된다.
  • 전역변수와 정적 변수를 참조한 코드는 컴파일 후에 Data 영역의 주소값을 가르킨다.

코드(Code)

  • 컴파일 타임에 크기가 결정되며 중간에 코드를 바꿀 수 없다.
  • 프로세스가 실행할 코드, 매크로 상수가 기계어의 형태로 저장된다.

PCB(Process Control Block, 프로세스 제어 블록) 구성

모든 프로세스는 고유의 PCB를 가진다. 이 PCB는 프로세스 생성 시 만들어지고 프로세스가 실행을 완료하면 폐기된다.

Context Switching

CPU를 차지하던 프로세스가 나가고 새로운 프로세스를 받아들이는 작업이다. 실행 상태에서 나가는 PCB에 지금까지의 작업 내용을 저장하고, 실행 상태로 들어오는 PCB의 내용으로 CPU가 다시 설정된다. 이렇게 두 프로세스의 PCB를 교환하는 작업이 Context Switching이다.

프로세스 스케줄링

  • 프로세서는 하나인데 동시에 실행되어야 할 프로세스가 여러 개 있을 때 이 프로세스를 일정 기준에 맞춰 순서를 정해 실행하는 것
  • 스케줄링은 스케줄링 알고리즘을 통해 CPU할당 순서와 방법을 결정한다.
  • 프로세스 상태에는 Ready, Blocked, Running 상태가 있다.

스레드(Thread)

  • 논리적 스레드 : 프로세스 내에서 실행되는 세부 작업의 단위. 프로세스 실행의 흐름. 논리적 스레드는 물리적 스레드와는 다르게 소프트웨어적으로 얼마든지 할당이 가능하다. (물리적 스레드 * 프로세스 = 논리적 스레드)
  • 프로세스 내 스레드는 같은 Code, Data, Heap을 공유하고, 스레드 각각에 Stack을 갖는다. (Stack까지 공유해버리면 스레드별 데이터를 넣었다 빼는게 너무 복잡해지기 때문)

단일 스레드 vs 멀티 스레드

웹 워커(Web Workers) : Javascript에서 스레드 활용하기

  • 자바스크립트는 Single Thread로 작동하기에 멀티 스레딩을 구현할 수 있는 방법은 없지만, 자바스크립트가 동작하는 브라우저에 있는 웹 API를 사용하면 멀티 스레딩과 같은 기능을 구현할 수 있다.

참고


0개의 댓글