천천히 빛나는

CS : 운영체제(1) 본문

INTERVIEW/CS

CS : 운영체제(1)

까만콩 •ᴥ• 2023. 11. 8. 14:05

참고 영상 : https://youtu.be/1PEe33_INZc?si=Y-qh8Rpy8q0yp6Nj

1. 운영체제

예시 : Windows, Android, iOS, macOS, Linux

운영체제란

실행할 프로그램에 필요한 자원을 할당하고 프로그램이 올바르게 실행되도록 돕는 소프트웨어 프로그램

 

프로그램이 실행되기 위해서는 메모리에 적재되어 있어야 하는데, 운영체제는 커널 영역에 적재되어서 실행된다. 일반적인 메모장, 웹 브라우저(응용프로그램)는 사용자 영역에 적재된다.

(자원/시스템 자원 : 프로그램 실행에 있어 필요한 것, 컴퓨터 네 가지 핵심 부품도 포함)

 

 

운영체제의 역할

운영체제는 메모리를 관리한다. 우리는 한 번도 응용프로그램을 사용하면서 어느 메모리에 저장해주라고 요청한 적이 없는데 다 운영체제가 하고 있던 것이다

운영체제는 CPU를 관리한다. 인지하지 못할 정도의 미세한 시간으로 여러 개의 프로그램을 번갈아가며 실행한다. 이렇게 동시에 실행하고 있는 중에 어떤 프로그램을 먼저 사용할지 얼마나 오래 실행할지 경정해준다.

 

운영체제는 입출력장치를 관리해서 워드 프로세서랑 메모장이 동시에 프린터 이용하지 못하게 한다. 

또한 보조기억장치에 있는 파일, 폴더를 관리해준다.

 

운영체제가 없으면 프로그램을 메모리에 적재하는 코드와 같이  하드웨어에 접근하는 코드까지 짜야하는 것이다. 

 

커널 - 운영체제의 심장

운영체제가 제공하는 가장 핵심적인 서비스(자원에 접근하고 조작하는 기능, 프로그램이 올바르고 안전하게 실행되게 하는 기능 등)를 담당하는 부분

(안드로이드랑 iOS가 제공하는 기능은 달라도 스마트폰의 전화기능, 문자기능은 제공하는 것처럼)

 

이중모드와 시스템 호출

사용자가 실행하는 프로그램은 자원에 직접 접근할 수 없다.

메모장이 SSD에 접근하고 싶을 때 운영체제한테 부탁해서 접근한다. ( = 운영체제의 코드를 실행한다.)

 

이러한 문지기 역할은 이중 모드로 구현된다.

이중모드란 CPU가 명령어를 실행하는 모드를 크게 사용자 모드와 커널 모드로 구분하는 방식이다. CPU가 명령을 실행할 때 두 가지의 모드로 실행할 수 있다. (사용자 모드 : 자원 접근 불가, 운영체제 서비스 제공 X / 커널 모드 : 운영체제의 서비스 제공 O, 자원 접근의 비롯한 명령어 실행 가능)

시스템 호출을 통해 커널 모드로 전환할 수 있다. 특정 명령어로 인터럽트를 걸어준다. 운영체제 서비스를 제공받기 위해 커널 모드로 전환하는 방법이다.

 

2. 프로세스

실행 중인 프로그램 (메모리에 적재되어서 현재 실행 중인 프로그램)

프로그램은 실행되기 전까지는 보조기억장치에 있는 정보 덩어리이지만 메모리에 적재하는 순간에 프로세스가 된다.

 

포그라운드 프로세스 : 사용자가 볼 수 있는 공간에서 실행되는 프로세스 (메모장, 웹 브라우저 등)

백그라운드 프로세스 : 사용자가 볼 수 없는 공간에서 실행되는 프로세스 (데몬, 서비스 - 사용자와 상호작용이 가능)

 

프로세스들은 돌아가며 한정된 시간만큼 CPU를 사용한다 (자신의 차례에 정해진 만큼 CPU 이용 - 타임 인터럽트)

 

프로세스 제어 블록 (PCB)

프로세스 관련 정보를 저장하는 자료구조이다. 상품에 달린 태그를 생각하면 된다. 프로세스 생성 시 커널 영역에 생성되고 종료 시 폐기된다. 

보조기억장치에 저장되어있는 데이터 덩어리를 실행하면 프로세스가 생성되고 운영체제는 이 프로세스에게 PCB를 할당해주게 된다. 이 프로세스가 끝나게 되면 PCB를 폐기한다.

  • 프로세스 식별자(Process ID, PID) : 프로세스 식별번호
  • 레지스터 값 : 타임 인터럽트 발생 전까지 CPU의 레지스터에 저장되어 있던 중간 값들을 모두 저장해두고 다시 자기 차례가 오면 복원해서 사용 (프로그램 카운터, 스택 포인터 등)
  • 프로세스 상태 : 입출력 장치를 사용하기 위해 기다리는 상태, CPU를 사용하기 위해 기다리는 상태, CPU를 이용 중인 상태 등
  • CPU 스케쥴링 정보 : 프로세스가 언제, 어떤 순서로 CPU를 할당받을지에 대한 정보
  • 메모리 정보 : 프로세스가 어느 주소에 저장되어 잇는지에 대한 정보, 페이지 테이블 정보
  • 입출력 상태 정보 : 프로세스에 할당된 입출력 장치들, 열린 파일 목록

 

문맥 교환 (context switch)

한 프로세스(프로세스A)에서 다른 프로세스(프로세스B)로 실행 순서가 넘어가면, 기존 실행되던 프로세스 A는 지금까지의 중간 정보(프로그램 카운터 등 각종 레지스터 값, 메모리 정보, 열었던 파일, 사용한 입출력장치 등)를 백업한다. 이러한 중간 정보를 문맥 (context)라고 한다. 다음 차례가 왔을 때 실행을 재개하기 위한 정보이다. 

 

프로세스의 메모리 영역

- 코드 영역 ( = 텍스트 영역 )

실행할 수 있는 코드, 기계어로 이루어진 명령어 자정

데이터가 아닌 CPU가 실행할 명령어가 담기기에 쓰기가 금지된 영역 (read-only)

 

- 데이터 영역

잠깐 썼다가 없앨 데이터가 아닌 프로그램이 실행되는 동안 유지할 데이터 저장 (전역변수)

 

- 힙 영역

프로그램을 만드는 사용자(프로그래머)가 직접 할당할 수 있는 저장공간

 

- 스택 영역

데이터가 일시적으로 저장되는 공간, 데이터 영역에 담기는 값과 달리 잠깐 쓸 값들이 저장되는 공간 (지역변수, 매개변수)

 

프로세스 상태

- 생성 상태

  • 이제 막 메모리에 적재되어 PCB를 할당 받은 상태
  • 준비가 완료 되었다면 준비 상태로 간다

- 준비 상태

  • 당장이라도 CPU를 할당 받아 실행할 수 있지만 자신의 차례가 아니기에 기다리는 상태
  • 자신의 차례가 되면 실행 상태로 간다. 준비 상태가 실행 상태가 되는 것을 디스패치라고 한다.

- 실행 상태

  • CPU를 할당 받아 실행 중인 상태
  • 할당된 시간을 모두 사용하면 (타이머 인터럽트 발생 시 - 하드웨어 인터럽트) 준비상태로 돌아간다
  • 실행 도중 입출력장치를 사용하면 (하드디스크에 저장, 모니터의 출력, 프린트 출력 등) 입출력 작업이 끝날 때까지 대기 상태로 접어든다

- 대기 상태

  • 프로세스가 실행 도중 입출력장치를 사용하는 경우
  • 입출력 작업은 CPU에 비해 느리기 때문에 이 경우 대기 상태로 접어든다
  • 입출력 작업이 끝나면 (입출력 완료 인터럽트를 받으면) 준비 상태로 간다

- 종료 상태

  • 프로세스가 종료된 상태
  • PCB, 프로세스의 메모리 영역을 정리한다

 

프로세스 계층 구조

윈도우는 프로세스가 계층적으로 되어있진 않지만 리눅스나 macOS와 같은 운영체제에서는 프로세스 계층 구조를 사용한다.

프로세스는 실행 도중 시스템 호출을 통해 다른 프로세스를 생성할 수 있다. 이 때, 새 프로세스를 생성한 프로세스를 부모 프로세스, 부모 프로세스에 의해 생성된 프로세스를 자식 프로세스라고 한다.

부모 프로세스와 자식 프로세스는 별개의 프로세스이므로 각기 다른 PID를 가진다. 일부 운영체제에서는 자식 프로세스 PCB에 부모 프로세스 PID(PPID)를 명시하기도 한다. 

부모 프로세는 fork 시스템 호출을 통해 자신의 복사본을 자식 프로세스로 생성하고 자식 프로세스는 exec 시스템 호출을 통해 자신의 메모리 공간을 다른 프로그램으로 교체한다.

 

3. 스레드 (thread)

하드웨어 스레드

하나의 코어가 동시에 처리하는 명령어 단위

멀티스레드 프로세서, 멀티 스레드 CPU: 오른쪽 그림과 같이 하나의 코어가 여러 개의 명령어를 동시에 처리할 수 있는 프로세서

 

전통적으로 CPU란 명령어를 가져와서 실행하는 부품이고 그런 부품이 하나만 있었다. 오늘날에는 명령어를 인출하고 해석하고 실행하는 부품이 여러 개 존재한다.

코어란 CPU 내에서 명령어를 실행하는 부품으로 여러 개 있을 수 있게 되었다.

 

하나의 명령어를 실행하기 위해 꼭 필요한 레지스터들을 편의상 ‘레지스터 세트’라고 한다. (프로그램 레지스터(실행할 명령어 위치), 명령어 레지스터, 스택 레지스터 등을 합쳐서 부름)

프로그램 레지스터가 두 개면 다음으로 실행할 명령어 2개 저장가능하다. 스택 레지스터가 2개면 2개의 스택의 꼭대기를 가리켜서 스택 2개 가질 수 있다.

레지스터로 멀티스레드 프로세스를 설계할 수 있따. (레지스터만 필요하다는 뜻은 아님)

 

소프트웨어 스레드

프로세스를 구성하는 실행 흐름의 단위

하나의 프로세스는 하나 이상의 스레드를 가질 수 있다

소프트웨어 스레드는 프로그램을 만드는 개발자가 직접 스레드의 수를 정의할 수 있다.

실행 흐름이 하나인 프로세스를 단일 스레드 프로세스, 실행 흐름이 여러 개인 프로세스를 멀티 스레드 프로세스라고 한다.

 

스레드의 구성 요소

스레드는 스레드 ID, 프로그램 카운터를 비롯한 레지스터 값, 스택 등 실행에 필요한 최소한의 정보를 가지고 있다.

모든 스레드들은 프로세스의 자원을 공유한다. 

 

멀티 프로세스 VS 멀티 스레드

동일한 작업을 수행하는 단일 스레드 프로세스 여러 개 실행 vs 하나의 프로세스를 여러 스레드로 실행

 

hello, os라고 출력하는 프로그램이 있을 때 세 번 fork를 해서 실행을 하면 똑같은 프로세스가 3개 만들어져서 실행이 된다. hello, os라는 문자열이 세 번 동시에 실행되어서 동시에 세 번 출력이 될 것이다. 

hello, os라는 프로세스에 실행 흐름을 세 개 만들면 똑같이 세 번 출력이 될 것이다.

프로세스를 fork 하면 코드/데이터/힙 영역 등 모든 자원이 복제되어 저장된다. 저장된 메모리 주소를 제외한 모든 것이 동일한 프로세스 두 개가 통째로 메모리에 적재된다. (자원 공유 X)

 

스레드들은 각기 다른 스레드 ID, 별도의 실행을 위해 꼭 필요한 프로그램 카운터 값을 포함한 레지스터 값, 스택을 가지고 프로세스가 가지는 자원을 공유한다.

 

프로세스끼리는 자원을 공유하지 않지만, 스레드끼리는 같은 프로세스 내 자원을 공유하므로 협력과 통신이 유리하다. 하지만 하나의 스레드에 문제가 생기면 전체 프로세스에 문제가 생기는 단점이 있다.

 

프로레스 간에도 자원을 주고 받을 수 있는 프로세스 간 통신 (IPC)가 있긴하지만 스레드만큼 쉽지 않을 뿐이다. 파일을 통한 프로세스 간 통신, 공유 메모리를 통한 프로세스간 통신이 있다.

 

하드웨어 스레드와 소프트웨어 스레드의 관계

단일/다중 프로세스이고 다중 스레드일 때, 하드웨어가 1코어 1스레드라면 하드웨어 스레드에서 프로세스의 A 스레드와 B스레드를 번갈아가며 수행한다. (스케줄러 알고리즘에 따라 교체되는 시기 결정)

단일 프로세스, 다중 스레드일 때 하드웨어가 2 코어 1스레드라면 각각의 코어에 프로세스 A스레드, 프로세스 B스레드를 수행할 수 있다.

단일 프로세스, 다중 스레드일 때 하드웨어가 2코어 4스레드라면 동시에 4개의 소프트 웨어 스레드 처리가 가능하다.

 

 

 

'INTERVIEW > CS' 카테고리의 다른 글

CS : 운영체제(3)  (1) 2024.02.13
CS : 운영체제(2)  (1) 2023.11.13