Skip to main content

운영체제와 프로세스, 스레드

운영체제

운영체제(OS, Operation System)는 실행할 프로그램에 필요한 자원을 할당하고, 프로그램이 올바르게 실행되도록 돕는 프로그램이다.

운영체제 또한 여느 프로그램과 마찬가지로 메모리에 적재되어야 한다. 운영체제는 컴퓨터가 부팅될 때 메모리 내 커널 영역이라는 공간에 따로 적재되어 실행된다. 커널 영역을 제외한 나머지 영역, 사용자가 이용하는 응용 프로그램이 적재되는 영역을 사용자 영역이라고 한다. 즉, 운영체제는 커널 영역에 적재되어 사용자 영역에 적재된 프로그램들에 자원을 할당하고 이들이 올바르게 실행되도록 돕는다.

운영체제의 역할

  • 프로세스 관리 : 프로세스의 생성, 스케줄링, 종료를 관리한다.
  • 메모리 관리 : 메모리 공간의 할당과 해제를 제어한다.
  • 파일 시스템 관리 : 파일의 저장, 검색, 삭제 등의 작업을 처리한다.
  • 입출력 관리 : 입출력 장치와 데이터를 처리하는 메커니즘을 제공한다.
  • 보안 및 접근 제어 : 사용자의 접근 권한을 관리하고, 시스템 자원을 보호한다.

이중 모드와 시스템 호출

커널

커널은 운영체제의 핵심 부분으로, 하드웨어를 비롯한 자원과 프로세스 및 스레드를 관리한다.

이중 모드

이중 모드란 CPU가 명령어를 실행하는 모드를 크게 사용자 모드와 커널 모드로 구분하는 방식이다. CPU는 명령어를 사용자 모드로써 실행할 수 있고, 커널 모드로써 실행할 수 있다.

  • 사용자 모드

    운영체제 서비스를 제공받을 수 없는 실행 모드이다. 즉, 커널 영역의 코드를 실행할 수 없는 모드이다. 일반적인 응용 프로그램은 기본적으로 사용자 모드로 실행된다. 사용자 모드로 실행 중인 CPU는 입출력 명령어와 같이 하드웨어 자원에 접근하는 명령어를 실행할 수 없다. 따라서 사용자 모드로 실행되는 일반적인 응용 프로그램은 자원에 접근할 수 없다.

  • 커널 모드

    운영체제 서비스를 제공받을 수 있는 실행 모드이다. 즉, 커널 영역의 코드를 실행할 수 있는 모드이다. CPU가 커널 모드로 명령어를 실행하면 자원에 접근하여 명령어를 비롯한 모든 명령어를 실행할 수 있다. 운영체제는 커널 모드로 실행되기 때문에 자원에 접근할 수 있다.

시스템 호출

사용자 모드로 실행되는 프로그램이 자원에 접근하는 운영체제 서비스를 제공받으려면 운영체제에 운영체제에 요청을 보내 커널 모드로 전환되어야 한다. 이때 운영체제 서비스를 제공받기 위한 요청을 시스템 호출이라고 한다.

시스템 호출은 일종의 인터럽트(소프트웨어적인 인터럽트)이다. 인터럽트는 입출력장치에 의해 발생하기도 하지만 인터럽트를 발생시키는 특정 명령어에 의해 발생하기도 하는데, 이를 소프트웨어 인터럽트라고 한다.

시스템 호출을 발생시키는 명령어가 실행되면 CPU는 지금까지의 작업을 백업하고, 커널 영역 내에 시스템 호출을 수행하는 코드(인터럽트 서비스 루틴)를 실행한 뒤 다시 기존에 실행하던 응용 프로그램으로 복귀하여 실행을 계속해 나간다.

시스템 호출의 종류

종류시스템 호출설명
프로세스 관리fork()새로운 프로세스를 생성하는 시스템 호출로, 부모 프로세스를 복사하여 자식 프로세스를 만듦.
exec()프로세스의 메모리를 새로운 프로그램으로 교체하여 새로운 프로그램을 실행.
exit()프로세스를 종료하고, 운영체제에 종료 상태를 알림.
waitpid()부모 프로세스가 자식 프로세스가 종료될 때까지 대기.
파일 관리open()파일 열기
read()파일 읽기
write()파일 쓰기
close()파일 닫기
디렉터리 관리mkdir()디렉터리 생성
rmdir()비어 있는 디렉터리 삭제
chdir()작업 디렉터리 변경
파일 시스템 관리mount()파일 시스템을 특정 디렉터리에 연결함.
umount()파일 시스템을 마운트 해제하여 연결을 끊음.
stat()파일의 상태 정보를 반환함.

프로세스

프로세스는 실행 중인 프로그램을 말한다.

  • 포그라운드 프로세스 : 사용자가 볼 수 있는 공간에서 실행되는 프로세스
  • 백그라운드 프로세스 : 사용자가 볼 수 없는 공간에서 실행되는 프로세스
    • 데몬 : 유닉스 체계의 운영체제에서 사용자와 상호작용하지 않고 정해진 일만 수행하는 백그라운드 프로세스
    • 서비스 : 윈도우 운영체제에서 사용자와 상호작용하지 않고 정해진 일만 수행하는 백그라운드 프로세스

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

프로세스 제어 블록은 프로세스와 관련된 정보를 저장하는 자료구조로 프로세스를 식별하기 위한 정보들이 저장된다. PCB는 커널 영역에 생성된다.

  • 프로세스 ID (PID)

    특정 프로세스를 식별하기 위해 부여하는 고유한 번호이다.

  • 레지스터 값

    해당 프로세스가 실행하며 사용했던 프로그램 카운터를 비롯한 레지스터 값들이 담긴다.

  • 프로세스 상태

  • CPU 스케줄링 정보

  • 메모리 관리 정보

    PCB에는 베이스 레지스터, 한계 레지스터 값과 같은 정보들이 담긴다. 또한 프로세스의 주소를 알기 위한 페이지 테이블 정보도 담긴다.

  • 사용한 파일과 입출력장치 목록

컨텍스트 스위칭

컨텍스트 스위칭은 기존 프로세스의 문맥을 PCB에 백업하고, 새로운 프로세스 문맥을 PCB로부터 복구하여 새로운 프로세스를 실행하는 과정이다. 이를 통해 여러 프로세스가 끊임없이 빠르게 번갈아 가며 실행된다.

프로세스의 메모리 영역

하나의 프로세스는 사용자 영역에 크게 코드 영역, 데이터 영역, 힙 영역, 스택 영역으로 나뉘어 저장된다.

  • 코드 영역

    기계어(실행할 수 있는 코드)로 이루어진 명령어가 저장된다. 크기가 고정된 정적 할당 영역이다.

  • 데이터 영역

    프로그램이 실행되는 동안 유지할 데이터가 저장된다. 대표적으로 전역 변수가 있다. 코드 영역과 마찬가지로 정적 할당 영역이다.

  • 힙 영역

    프로그램을 만드는 사용자가 직접 할당할 수 있는 저장 공간이다. 프로세스 실행 과정에서 크기가 변할 수 있는 동적 할당 영역이다.

  • 스택 영역

    데이터를 일시적으로 저장하는 공간이다. 대표적으로 매개 변수, 지역 변수가 있다. 힙 영역과 마찬가지로 동적 할당 영역이다.

새롭게 할당되는 주소가 겹칠 일이 없게 하기 위해 일반적으로 힙 영역은 메모리의 낮은 주소에서 높은 주소로 할당되고, 스택 영역은 높은 주소에서 낮은 주소로 할당된다.

프로세스 상태

  • 생성 (new)

    프로세스를 생성 중인 상태. 메모리에 적재되어 PCB를 할당받은 상태이다. 생성 상태를 거쳐 실행할 준비가 완료된 프로세스는 준비 상태가 되어 CPU의 할당을 기다린다.

  • 준비 (ready)

    CPU를 할당받아 실행할 수 있지만, 아직 자신의 차례가 아니기에 기다리고 있는 상태이다. 준비 상태인 프로세스가 실행 상태로 전환되는 것을 디스패치라고 한다.

  • 실행 (running)

    CPU를 할당 받아 실행 중인 상태이다. 프로세스가 할당된 시간을 모두 사용한다면(타이머 인터럽트가 발생하면) 다시 준비 상태가 되고, 실행 도중 입출력장치를 사용하여 입출력장치의 작업이 끝날 때까지 기다려야 한다면 대기 상태가 된다.

  • 대기 (blocked)

    입출력장치의 작업을 기다리는 등 실행이 잠시 중단된 상태이다.

  • 종료 (terminated)

    프로세스가 종료된 상태이다. 프로세스가 종료되면 운영체제는 PCB와 프로세스가 종료한 메모리를 정리한다.

프로세스 계층 구조

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

프로세스 생성 기법

부모 프로세스는 fork를 통해 자신의 복사본을 자신 프로세스로 생성해내고, 만들어진 복사본(자식 프로세스)은 exec를 통해 자신의 메모리 공간을 다른 프로그램으로 교체한다.

fork와 exec는 시스템 호출이다. 부모 프로세스는 fork 시스템 호출을 통해 자신의 복사본을 자식 프로세스로 생성한다. 즉 fork는 자식 프로세스의 복사본을 만드는 시스템 호출이다. 자식 프로세스는 부모 프로세스의 복사본이기 때문에 부모 프로세스의 자원들이 자식 프로세스에 상속된다. fork를 통해 복사본이 만들어진 뒤에 자식 프로세스는 exec 시스템 호출을 통해 새로운 프로그램으로 전환된다. exec는 자신의 메모리 공간을 새로운 프로그램으로 덮어쓰는 시스템 호출이다. exec를 호출하면 코드 영역과 데이터 영역의 내용이 실행할 프로그램의 내용으로 바뀌고, 나머지 영역은 초기화된다.

스레드

스레드란 프로세스를 구성하는 실행의 흐름 단위이다. 스레드는 프로세스 내에서 각기 다른 스레드 ID, 프로그램 카운터 값을 비롯한 레지스터 값, 스택으로 구성된다. 각자 프로그램 카운터 값을 비롯한 레지스터 값, 스택을 가지고 있기에 스레드마다 각기 다른 코드를 실행할 수 있다. 실행에 필요한 최소한의 정보만을 유지한 채 프로세스 자원을 공유하며 실행된다.

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

  • 멀티프로세스

    여러 프로세스가 동시에 실행되는 방식으로, 각 프로세스는 독립적인 메모리 공간을 갖는다. 프로세스 간의 통신은 복잡하지만, 안정성과 보안 측면에서 유리하다.

  • 멀티스레드

    하나의 프로세스 내에서 여러 스레드가 동시에 실행되는 방식이다. 스레드 간의 자원 공유로 인해 통신 비용이 적고, 효율적이지만, 동기화 문제가 발생할 수 있다.


참조

https://www.hanbit.co.kr/store/books/look.php?p_code=B9177037040&utm_source=hongong

https://csnote.net