본문 바로가기
프로그래밍/IT지식

소프트웨어 종류 및 동작 원리, 운영체제, 커널, 프로세스와 스레드

by 준보틱스 2024. 6. 23.

소프트웨어(Software)

소프트웨어란 컴퓨터를 비롯한 시스템에서 특정 작업을 수행하게 하는 프로그램의 집합으로 그 수행에 필요한 절차, 규칙, 문서 등의 총칭을 말한다.
출처 : 한국정보통신기술협회

소프트웨어는 하드웨어에서 구동되는 논리적인 무형물로, 사용자의 명령을 하드웨어에게 전달해주는 시스템 구성 요소 중 하나이다.

하드웨어가 없으면 애초에 소프트웨어를 설치할 수 없고, 소프트웨어가 없는 하드웨어는 빈 껍데기나 다름없다. 서로 반대되는 개념보다는 각자 역할을 갖고 시스템을 이루는 상호 보완적 관계라고 보면 된다.

하드웨어가 쇠붙이, 전자공학적인 부품 그리고 회로 등으로 구성되어 있다면, 소프트웨어는 프로그램으로 구성되어 있다. 프로그램이란 큰 의미에서 소프트웨어가 수행하는 모든 일들을 통칭하는데, 프로그래밍 언어로 작성된 코드로 만들어지며 외부적으로 눈에 보이지는 않지만 그 개념과 기능적 역할은 확실하다.

소프트웨어 분류

소프트웨어는 크게 두가지로 분류되며 컴퓨터 시스템을 구동시키는데 필요한 "시스템 소프트웨어"와 사용자의 구체적인 업무 활동을 돕는 "응용 소프트웨어"가 있다.

(1) 시스템 소프트웨어(System Software)

  • 시스템 구동에 필수로 요구되며, 응용 소프트웨어를 실행하기 위한 플랫폼을 제공해주는 소프트웨어
  • 시스템이 구동된 후 종료 전까지 실행된다.
  • 사용자 명령에 따라 시스템 리소스를 제어하고 관리한다.
  • 운영체제 : Windows, Linux처럼 범용적으로 쓰인다.

(2) 응용 소프트웨어(Application Software)

  • 시스템 구동 후 사용자의 요청 시에 실행되는 특수 용도의 소프트웨어
  • 프로그램 용도에 따라 다르지만, 시스템 구동에 필수적이지 않다
  • 응용 프로그램 : MS Office, Photoshop 처럼 특정 작업을 위해 쓰인다.

※ 예시로, 우리가 발표자료를 만든다고 생각해보면

노트북(하드웨어) → Windows(시스템 소프트웨어) → PPT(응용 소프트웨어)

순으로 구동해야하는 과정으로 이해하면 쉽다.

커널(Kernel)

커널은 운영체제의 심장이자 이를 규정짓는 매우 중요한 소프트웨어로서, 하드웨어의 자원이 필요한 프로세스에 나눠주고 덩달아 프로세스 제어, 메모리 제어, 프로그램이 운영 체제에 요구하는 시스템 콜 등을 수행하는 부분을 말한다.
출처 : 나무위키

커널은 운영체제 중 항상 메모리에 올라가 있는 운영체제의 핵심 부분으로써 하드웨어와 응용 프로그램 사이에서 인터페이스를 제공하는 역할을 하며 컴퓨터 자원들을 관리하는 역할을 한다.

즉, 커널은 인터페이스로서 응용 프로그램 수행에 필요한 여러가지 서비스를 제공하고, 여러가지 하드웨어(CPU, 메모리) 등의 리소스를 관리하는 역할을 한다.

다만 이러한 커널은 항상 컴퓨터 자원들을 바라만 보고 있기에 사용자와의 상호작용은 지원하지 않는다. 따라서 사용자와 직접적인 상호작용을 위해 프로그램을 제공하게 되는데, 대표적으로 쉘(Shell)이라는 명령어 해석기 등이 있다.

커널의 자원 관리

커널의 가장 큰 목표는 컴퓨터의 물리적(하드웨어) 자원과 추상화 자원을 관리하는 것이다. 추상화란 물리적으로 하나뿐인 하드웨어를 여러 사용자들이 번갈아 사용할 수 있도록 마치 여러개처럼 보이게 하는 기술이다.

즉, 커널이 관리함에 따라 각 사용자들을 하나의 하드웨어를 독점하는 것처럼 느낄 수 있도록 한다. 커널이 추상화하여 관리하는 물리적 자원들과 이를 추상화한 자원을 칭하는 용어로 대표적으로는 CPU - Task or Process, 메모리 - Page or Segment, 디스크 - File, 네트워크 - Socket 등이 있다.

  • Task(Process) Managemet : 물리적 자원인 CPU를 추상적 자원인 Task로 제공
  • Memory Managemet : 물리적 자원인 메모리를 추상적 자원인 Page 또는 Segment로 제공
  • File System : 물리적 자원인 디스크를 추상적 자원인 File로 제공
  • Network Managemet : 물리적 자원인 네트워크 장치를 추상적 자원이 Socket으로 제공
  • Device Driver Managemet : 각종 외부 장치에 대한 접근
  • Interrupt Handling : 인터럽트 핸들러
  • I/O Communication : 입출력 통신 관리

인터페이스로서 커널

커널은 다양한 자원을 관리하는데 이는 사용자가 물리적인 하드웨어 접근하고 사용할 수 있도록 매개하기 위해서이다. 즉, 인터페이스로서 사용자가 컴퓨터만의 언어와 규칙으로 하드웨어와 통신할 수 있도록 도와주는 역할을 한다.

앞서 말한 커널 구성요소들이 존재하는 공간을 Kernel Space라고 할 수 있다. Kernel Space 위에서는 사용자로 여겨지는 User Space가 있으며 여기에는 Task, Process들이 존재한다. 이 User Space와 Kernel Space 사이에는 보이지 않지만 System Call Interface가 있다.

User Space의 Task 또는 Process들이 커널이 관리하는 자원에 접근해야할 필요가 있을때 System Call Interface를 통해 Kernel Space의 자원관리자에게 요청이 전달되든 방식이다. 그렇게 되면 커널은 사용자 요청에 맞는 하드웨어에게 명령을 전달하고 작업을 수행하는 역할을 한다.

즉, 커널은 사용자가 System Call을 통해 컴퓨터 자원을 사용할 수 있게 해주는 자원 관리자라고 할 수 있다.

프로그램, 프로세스, 스레드

(1) 프로그램(Program)

  • 사용자가 작업을 하기 위해 실행할 수 있는 단위
  • 프로그래밍 언어로 수행 절차를 표현해놓은 명령어들의 집합으로, 그 데이터가 파일로 묶여 보조기억장치에 저장된다.

(2) 프로세스(Process)

  • 운영체제로부터 필요한 자원을 할당받은, 실행중인 프로그램
  • 프로그램이 실행되면, 프로세스는 메모리 주소 공간(Code, Data, Stack, Heap)을 할당받는다.

Code 사용자가 작성한 프로그램 함수들의 코드가 CPU에서 수행되는 기계어 형태로 변환되어 저장되는 공간(Read Only)
Data 전역 변수(global), 정적 변수(static), 배열(array), 구조체(structure) 등 프로그램이 사용하는 데이터를 저장하는 공간
Stack 호출된 함수의 수행을 마치고 복귀할 주소 및 데이터(지역 변수, 매개 변수, 리턴 값)를 임시로 저장하는 공간
Heap 프로그래머가 필요 시 동적으로 사용하는 메모리 영역

 

(3) 스레드(Thread)

  • 프로세스가 할당받은 자원을 이용하여 실행하는 단위이자 프로세스 내에서 실행되는 여러 흐름의 단위
  • 프로세스는 최소 한개 이상의 스레드를 가지며, 프로세스가 OS로부터 자원을 할당받으면 그 자원을 스레드가 사용한다.
  • 각 스레드는 독자적인 Stack 영역을 가지며, 나머지 주소 공간인 Code, Data, Heap 영역은 스레드 간 공유된다

이렇게 프로세스보다 더 작은 단위 개념인 스레드가 나오면서, 하나의 프로세스 내에서 동시 작업을 수월하게 처리할 수 있게 되었다.

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

(1) 멀티 프로세스

  • 하나의 프로그램을 여러 프로세스로 나누어 작업을 병렬 처리하는 방식
  • 단일 CPU 환경보다는 당연히 속도도 빠를 것이고 하나의 CPU에 문제가 생겨도 시스템 자체에 문제가 생기지 않는다.(문제 발생 시, 속도는 느려질 수 있음)
  • 각 CPU는 서로 메모리를 공유하지 않으므로 작업량이 많아지면 성능 저하가 발생할 수 있다.

(2) 멀티 스레드

  • 하나의 CPU에 여러 스레드로 자원을 공유하고 작업을 나눠 수행하는 방식
  • 서로 간 자원(Stack 영역 제외)을 공유하기 때문에, 자원을 효율적으로 사용할 수 있고 서로 간 통신이 간단함
  • 서로 공유해서 사용하므로 자원 선점(Deadlock) 및 동기화 등의 문제가 발생할 수 있다.(하나의 스레드가 문제 생겨도 프로세스에 문제가 발생할 수 있음)

'프로그래밍 > IT지식' 카테고리의 다른 글

URI, URL, URN 차이점  (0) 2024.06.24
클라우드(Cloud)란?  (0) 2024.06.23
펌웨어(Firmware)  (0) 2024.06.23
[개발용어] C, C++, C# 언어의 차이점  (0) 2024.06.23
[개발용어] 컴파일, 디버깅, 빌드, 배포  (0) 2024.06.23