본문 바로가기

Boostcamp

프로세스와 스레드

오늘은 OS, Process, Thread, Scheduling에 관한 내용이다. 워낙 많이 들어봐서 익숙하지만, 또 막상 마주하면 어려운 친구들이다.

우선 프로세스는 CPU가 처리하는 작업(Task)라고 생각할 수 있고, 실행중인 프로그램을 의미한다. 프로세스는 프로그램을 실행하면 생성되고, 프로그램을 종료하면 소멸한다. 프로세스는 프로그램을 실행하는데 필요한 데이터와 메모리 등의 자원, 쓰레드로 구성되어 있다. 좀 더 구체적으로 디스크에 저장되어 있던 실행 가능한 프로그램이 메모리에 적재되어 운영체제가 관리하는 상태를 의미한다.

근데 컴퓨터에는 하나의 프로세스만 있는게 아니다. 수십 수백 수천 수만개의 프로세스가 동시에 실행되고 있다. 이 프로세스들은 각각 독립된 메모리 영역을 가지고 있어, 서로 영향을 주지 않는다. 그래서 프로세스는 독립적인 실행 흐름을 가지고 있다고 볼 수 있다. 그럼 이런 프로세스들을 어떻게 관리할까? 이번과제의 가장 주된 주제인 "프로세스 스케줄링"이다.

 

프로세스 스케줄링은 CPU가 여러 프로세스를 실행하는데 있어서 어떤 프로세스를 먼저 실행할지, 얼마나 실행할지 등을 결정하는 것이다. 프로세스 스케줄링은 프로세스의 상태 변화에 따라서 이루어진다. 프로세스는 생성 -> 준비 -> 실행 <-> 대기 -> 종료까지 크게 5가지 상태가 있다. 프로세스 스케줄링은 이런 상태 변화에 따라서 이루어진다. 스케줄링 기법은 다음과 같다.

1. 기한부 스케줄링 (deadline scheduling)

   > 작업들을 동작 시간을 주어진 마감 시간까지 완성하도록 계획한 스케줄링이다.

2. 우선순위 스케줄링 (priority scheduling)

   > 프로세스 실행 중에 우선순위가 높은 프로세스를 먼저 실행하는 방식으로 낮은 우선순위가 계속 밀릴 수 있다.
   > 우선순위가 동적으로 바뀌는 방법도 있고, 고정적인 우선순위로 운영되기도 한다.

3. FIFO 스케줄링 (FIFO scheduling)

   > 비선점 스케줄링으로 프로세스가 생성된 순서대로 대기큐에 넣어놓고 순서대로 스케줄링하는 방식이다.

4. SJF 스케줄링 (Shortest Job scheduling)

   > 비선점 스케줄링 방법으로 작업이 끝날 때까지 실행 시간이 가장 작은 것부터 먼저 스케줄링하는 방식이다.

5. 라운드로빈 스케줄링 (Round Robin scheduling)

   > 선점 스케줄링 방식으로 FIFO처럼 순차적으로 실행하지만, CPU에서 제어하는 시간을 일정하게 나눠서 스케줄링하는 방식이다.
   > CPU 시간이 마무리될 때까지 작업이 끝나지 않으면 다음 프로세스로 넘어간다.

 

스레드

내가 느끼기에 오늘 배우는 개념들 중 가장 이해하기 까다로운 개념이라고 생각된다.
스레드는 경량 프로세스 (Light Weight Process)라고 부르기도 하며, 프로세스에서 실행 제어만 분리해서 처리하는 단위를 말한다.
스레드는 같은 그룹의 스레드와 코드, 메모리 주소 공간, 운영체제 리소스를 공유한다. 프로세스는 하나 이상의 스레드를 가지고 각 스레드는 다음 같은 동작을 담당한다.

- 스레드 실행에 대한 상태 관리
- 실행을 위한 별도 스택
- 지역 변수와 스레드 특정 데이터를 저장하는 데이터 저장소
- 프로세스의 메모리와 자원에 대한 접근을 기록하는 컨텍스트 정보


이 내용을 가지고 이들이 하는 일과 비슷한 역할을 하는 객체를 만들어봤다. 우리 팀원들과 캠퍼들의 의견과 내 의견 너무 제각각이어서 의사결정에 어려움을 겪었다. 개념적으로 명확히 알기 모호하긴하지만, 그래도 알고있다면, 프로그래밍의 식견을 넓힌다는 것에는 의심이 없는 지식이었다. 사실 이에 관한 내용들은 이미 여러번 학습을 했고, 몇주전에도 강의와 책을 통해서 배웠지만 이를 구현한다는 것은 다른 레벨의 일인거 같다. 주말을 이용해서 복습을 확실히 해야겠다.

'Boostcamp' 카테고리의 다른 글

3주차 후반부  (0) 2023.07.28
3주차 전반부  (0) 2023.07.25
8일차 정리  (0) 2023.07.20
함수형 프로그래밍  (0) 2023.07.19
두번째 주 시작  (0) 2023.07.18