최근에 리눅스/유닉스를 활용해서 프로젝트를 구동 및 제어하고, ssh를 통해 다른 pc에 접속하고 등 여러 작업을 진행하고 있다.
이 중 하나로, 프로젝트의 기존 파일을 새로 수정한 것으로 대체하기 위해서 watchdog라는 것을 종료시켰다가, 새로운 파일을 올리면 다시 watchdog를 실행해야 하는 부분이 있었다.
이 watchdog를 공부하다 보니 커널에 대한 부분이 나와서, 커널 공부를 하다 보니, OS에 대한 내용이, 더 나아가 SW에 대한 내용이 나왔다.
컴공 출신이기에 대략적으로 시험 때문이라도 SW / 응용 프로그램 / OS / 커널 / 시스템 프로그램에 대한 것을 벼락치기로 공부했었지만... 돌이켜 보면 내 머릿속에 남은 것이 없었던 것 같다.
그래서 이 참에 SW에 대해서 공부해 내 머릿속에 각인시키지는 마음가짐으로 공부해서, 정리한 것을 이 포스팅에 올려본다.
이 글을 읽는 분들도 SW / 응용 프로그램 / OS / 커널 / 시스템 프로그램을 공부하다 보면 서로 연관이 있다는 것을 느낄 텐데, 이 포스팅이 여러분의 가려운 곳을 긁어주기를 희망한다.
SW 핵심 요약
SW = 응용 프로그램 + OS(커널 + 시스템 프로그램)
- 응용 프로그램
- 응용 프로그램 = 번거롭게 운영체제의 명령어를 통해 얻을 수 있는 결과물의 불편함을 해소하고자 만들어진 것
- (한글, 엑셀, 파워포인트, 인터넷 익스플로러, 메모장 등)
- 시스템 프로그램
- 시스템 프로그램 = (하드웨어 동작 지시 / 제어 / 관리)하는 프로그램
- (컴파일러 / 어셈블러 / 링커 / 로더 등)
- 커널
- 커널 = 하드웨어와 응용 프로그램 사이에서 인터페이스를 제공 + 컴퓨터 자원들을 관리하는 역할
보다시피, OS는 커널과 시스템 프로그램의 결합이다.
즉, 컴퓨터 자원을 관리하는 "커널"과 하드웨어를 움직이게(?)하는 "시스템 프로그램"이 합쳐진 것이 바로 OS이다.
그리고 개발자라면 유닉스/리눅스를 통해서 또는 프로그래밍을 통해서 뭐 메모장을 생성하기도 하고 계산기 프로그램을 개발하기도 하고 하는데, 실질적으로는 이러한 개발 결과물을 유닉스/리눅스의 명령어를 통해서도 구현 가능하다.
하지만, 어떤가? 어떤 기능을 사용하고자 할 때마다 명령어를 한 줄 한 줄 치면, 뭔가 개발자 smell이 나는 것 같아 기부니가 좋을 때도 있지만, 그것도 한두 번이었을 것이다. 왜냐??? 귀찮고 짜증나거든.... 그리고 모든 명령어를 다 알 수도 없는 노릇이고...
이러한 귀찮음을 해결하고자 만들어진게 응용 프로그램이고, 대표적인 응용 프로그램이 메모장 / 계산기가 있다.
응용 프로그램 / 시스템 프로그램 / 커널에 대해서 아래에서 좀 더 자세히 보도록 하자.
응용 프로그램
- 한글, 엑셀, 파워포인트, 인터넷 익스플로러, 메모장 등의 프로그램을 의미
- 운영체제만으로도 원하는 결과물을 얻을 수 있지만…
- 운영체제만 활용하면 원하는 작업을 할 때마다 명령어를 사용자가 일일이 쳐야 함
- 이 귀찮음을 없애고자 만들어진 것 = 응용 프로그램
시스템 프로그램 (컴파일러 / 어셈블러 / 링커 / 로더 등)
시스템 프로그램 개념
핵심 개념 = 시스템 프로그램은 (하드웨어 동작 지시 / 제어 / 관리)하는 프로그램
- 응용프로그램과 사용자를 위해 컴퓨터 시스템 자체를 운영, 제어하는 프로그램
- 컴퓨터를 효율적으로 운영할 수 있도록 하드웨어의 동작을 지시하고 제어, 관리하는 다양한 기능을 갖도록 하는 프로그램
시스템 프로그램 수행 과정
원시 프로그램 번역 -> 다른 프로그램과 연결 -> 실행 명령어들을 메모리에 적재-> 실행
시스템 프로그램 종류
- 컴파일러(compiler) : 원시프로그램(source program)=> 목적프로그램(object program)으로 번역
- 어셈블러(Assembler) : 어셈블리어를 0과 1로 구성된 기계어코드로 변환
- 매크로 프로세서(macro processor) : 반복적으로 수행되는 부분을 모아 기호화된 이름으로 묶어서 사용하는것을 모듈로 만든것
- 링커(linker) : 서로 독립적으로 작성되고 번역된 모듈간에 연관을 맺어주는 작업을 하는 프로그램
- 로더(loader): 기계명령어와 자료(실행가능프로그램)들을 기억장치에 배치시키는 일을 수행하는 프로그램
로더의 기능 및 순서
- 주기억장치 할당(allocation) : 주기억장치 내의 공간을 확보
- 연결(linking) : 여러 목적프로그램 또는 라이브러리 루틴 과의 링크작업
- 재배치(relocation) : 실제 주기억 장소에 맞추어 재배치
- 적재(loading) : 실제로 주기억 장소에 적재
커널
커널 개념 및 특징

→ 커널 개념
- 운영체제 중 항상 메모리에 올라가 있는 운영체제의 핵심 부분
- 하드웨어와 응용 프로그램 사이에서 인터페이스를 제공하는 역할
- 하드웨어
- 중앙 처리 장치(CPU)
- 기억 장치
- 입출력 장치
- 컴퓨터 자원들을 관리하는 역할
- 여기서 말하는 컴퓨터 자원이 뭘까? ⇒ 그것은 밑에 나와 있음!
→ 커널의 특징
- 커널은 항상 컴퓨터 자원들을 바라보고 있음 ⇒ 사용자와의 상호작용 지원 X
- 사용자와의 상호작용을 하려면? ⇒ 쉘(Shell)이라는 명령어 해석기 등을 활용
커널의 자원 관리

커널의 가장 큰 목표 = 컴퓨터의 물리적(하드웨어) 자원과 추상화 자원을 관리 하는 것
- 추상화 = 물리적으로 하나뿐인 하드웨어를 여러 사용자들이 번갈아 사용할 수 있도록 마치 여러개처럼 보이게 하는 기술 → 커널의 관리 정도에 따라, 각 사용자들을 하나의 하드웨어를 독점하는 것처럼 느낄 수 있음
→ 커널의 작업
- Task(Process) Management : 물리적 자원인 CPU를 추상적 자원인 Task로 제공
- Memory Management : 물리적 자원인 메모리를 추상적 자원인 Page 또는 Segement로 제공
- File System : 물리적 자원인 디스크를 추상적 자원인 File로 제공
- Network Managment : 물리적 자원인 네트워크 장치를 추상적 자원인 Socket으로 제공
- Device Driver Management : 각종 외부 장치에 대한 접근
- Interrupt Handling : 인터럽트 핸들러
- I/O Communication : 입출력 통신 관리
인터페이스로써의 커널

커널은 다양한 자원을 관리 ⇒ for 사용자가 물리적인 하드웨어에 접근하고 사용할 수 있도록 매개하기 위해서
- 커널 = 사용자가 System Call을 통해 컴퓨터 자원을 사용할 수 있게 해주는 자원 관리자
- 커널 핵심 기능
- Process Management
- Memory Management
- Device Management
커널과 운영체제
커널 + 애플리케이션, 유틸리티 = 운영체제
→ 커널은 운영체제의 핵심 구성요소이고, 이러한 커널에 사용자 애플리케이션과 유틸리티가 추가되면 운영체제가 된다.
→ 리눅스 자체는 (File System Utilites, Windowing Systems, Graphical System, Text Editors, Compilers) 등과 같은 사용자 애플리케이션을 포함 X && 핵심기능만 포함 O ⇒ 커널
- 리눅스 자체 = 커널
- Ubuntu, CentOS
- 리눅스를 기반으로 운영체제를 제공하는 회사들은 기본 리눅스 커널에 다양한 확장 애플리케이션을 추가하여 운영체제를 제공
커널의 유형

→ 모놀리식 커널(Monolithic Kernel), 마이크로 커널(MicroKernel)
- 이거에 대한 자세한 거는 더 공부 필요 ⇒ 레퍼런스 블로그 내용 다시 보기!
Reference
→ 시스템 프로그램이란
→ 운영체제와 응용프로그램이란?
→ [OS] 커널(Kernel)이란
느낀점
개념적으로 공부한 것이고, 아직 내가 시스템 프로그램 / 커널 등을 직접 제어해보지는 못했다.
하지만, 이번 계기를 통해 SW = 응용 프로그램 + OS(시스템 프로그램 + 커널) 이라는 것을 확실히 내 머릿속에 각인시킬 수 있었다.
뭐 누구는 커널을 통해서 간지가 철철 넘치는 프로젝트를 구상하고 실현하기도 하는데... 나도 그런 사람이 될 수 있으면 좋겠당... (실제로 이룰 것이다.)
내가 공부한 것이, 이 글을 읽는 모든 분들에게 도움이 되길 빈다. 안뇽!