목차
커널
커널은 하드웨어와 소프트웨어 간의 통신을 관리하며 낮은 수준의 시스템 작업을 제어합니다.
커널이 존재하는 이유
소프트웨어에서 메모리와 프로세스등을 직접 관리하지 않고 커널에게 위임하는 이유는 안정성, 보안, 효율성, 추상화 등 여러 가지 중요한 이유 때문입니다.
1. 안정성
•
메모리 보호 : 커널이 메모리 관리를 담당함으로써, 각 프로세스는 독립된 메모리 공간을 할당받게 됩니다. 이는 한 프로세스의 잘못된 메모리 접근이 다른 프로세스나 시스템 전체에 영향을 미치는 것을 방지합니다. 예를 들어, 유니티 게임 개발 중에 발생할 수 있는 메모리 누수나 오류가 다른 응용 프로그램의 실행에 영향을 주지 않도록 합니다.
•
프로세스 격리 : 각 프로세스는 커널에 의해 관리되는 독립된 실행 환경을 가집니다. 이로 인해 프로세스 간의 충돌을 방지하고, 시스템의 전반적인 안정성을 유지할 수 있습니다.
예를 들어, A,B 라는 프로그램이 커널의 도움을 받지 않고 메모리를 사용한다면 서로 사용하는 메모리가 겹치거나 꼬일 수 있는 문제가 발생할 수 있습니다.
2. 보안
•
접근 제어 : 커널은 시스템 리소스에 대한 접근을 엄격하게 제어합니다. 사용자 또는 응용 프로그램이 시스템 리소스를 접근하려면, 커널을 통해 권한을 검증받아야 합니다. 이는 무단 접근으로부터 시스템을 보호하는 중요한 방어 수단입니다.
•
데이터 보안 : 커널이 메모리 관리를 담당함으로써, 데이터가 안전하게 보호되고, 비인가된 접근으로부터 안전하게 유지됩니다.
프로그램이 무단으로 시스템 리소스(하드웨어)에 접근하는 것을 제어하는 부분입니다. 이것은 최소한의 안전장치입니다.
3. 효율성
•
자원 관리 : 커널은 시스템 자원을 효율적으로 관리하고 할당합니다. 프로세스 스케줄링, 메모리 관리 등을 통해 시스템 리소스를 최적화하며, 여러 응용 프로그램이 동시에 실행될 때 시스템의 성능을 최대화합니다.
•
입출력 관리 : 커널은 파일 시스템과 장치 드라이버를 관리함으로써, 입출력 요청을 효율적으로 처리합니다. 이는 응용 프로그램의 입출력 성능을 최적화하는 데 기여합니다.
위에서의 직접적인 소프트웨어와 하드웨어의 통신을 제외하고도 운영체제의 프로세스 스케줄링과 같은 부분도 커널을 통해 이루어집니다.
4. 추상화
•
프로그래밍 용이성 : 커널이 하드웨어와의 직접적인 상호작용을 추상화함으로써, 개발자는 하드웨어의 복잡성을 신경 쓰지 않고, 더 높은 수준의 프로그래밍에 집중할 수 있습니다. 예를 들어, C#과 같은 고수준 언어를 사용하여 개발할 때, 메모리 관리나 프로세스 스케줄링 같은 저수준의 세부 사항을 직접 처리할 필요가 없습니다. (시스템 콜 인터페이스)
커널의 주요 기능
1.
프로세스 관리 : 커널은 프로세스 생성, 스케줄링, 관리 및 종료를 담당합니다. 프로세스는 실행 중인 프로그램의 인스턴스로, 유니티 게임 내에서 다양한 스크립트와 작업들이 병렬로 실행될 때, 운영 체제의 커널이 이를 적절히 관리합니다.
2.
메모리 관리 : 커널은 시스템의 물리적 및 가상 메모리를 관리합니다. 메모리 할당, 페이지 교체, 스와핑 등의 기능을 포함합니다. 예를 들어, 유니티에서 큰 용량의 자원을 로드할 때, 커널의 메모리 관리 기능이 시스템의 효율적인 작동을 보장합니다.
3.
장치 드라이버와의 통신: 커널은 하드웨어 장치와의 통신을 중재하며, 장치 드라이버를 통해 하드웨어를 제어합니다. 예를 들어, 유니티 게임에서 사용자의 입력 장치나 그래픽 출력 장치를 통한 상호작용이 이루어질 때, 이러한 장치들과의 통신을 커널이 관리합니다.
4.
시스템 콜 인터페이스 : 커널은 사용자 공간의 응용 프로그램과 커널 공간 사이의 인터페이스를 제공합니다. 시스템 콜을 통해 응용 프로그램은 커널에 서비스를 요청할 수 있습니다. C#에서 시스템 리소스를 요청하거나, 파일 시스템 작업을 수행할 때 이러한 시스템 콜을 사용할 수 있습니다.
시스템 콜 인터페이스 예시
시스템 콜 인터페이스는 응용 프로그램이 운영 체제의 커널 서비스를 요청할 수 있게 하는 메커니즘입니다.
유니티와 C# 개발 환경에서도, 시스템 리소스를 요청하거나 파일 시스템 작업을 수행하는 등의 작업을 할 때 내부적으로 시스템 콜이 발생합니다.
이 과정은 대부분의 경우 개발자가 직접적으로 시스템 콜을 호출하는 것이 아니라, 고수준 언어의 API를 통해 간접적으로 이루어집니다.
using System.IO;
using UnityEngine;
public class LoadData : MonoBehaviour
{
private string filePath;
void Start()
{
filePath = Application.persistentDataPath + "/gameData.txt";
string data = LoadFromFile();
Debug.Log("Data loaded: " + data);
}
string LoadFromFile()
{
// 파일이 있는지 검사하는 부분 이 부분도 커널을 통해 하드디스크의 메모리에 접근
if (File.Exists(filePath))
{
// 파일을 읽는 부분 이 부분도 커널을 통해 읽기
string data = File.ReadAllText(filePath);
return data;
}
else
{
Debug.LogError("File not found");
return "";
}
}
}
C#
복사