[혼공컴운] CH 09 운영체제 시작하기

sookyoung.k·2024년 1월 24일
0

🤓 [혼공학습단] 

목록 보기
13/23
post-thumbnail

🤓 운영체제를 알아야 하는 이유

🌐 운영체제란

프로그램에 필요한 자원을 할당하고, 프로그램이 올바르게 실행되도록 돕는 특별한 프로그램

모든 프로그램은 하드웨어를 필요로 한다
* 하드웨어 : 사람이 발로 걷어찰 수 있는 부분 (Jeff Pesis, 프로그래머)

프로그램을 실행하기 위해서는 시스템 자원(자원)이 필요하다
→ CPU, 메모리, 보조기억장치, 입출력장치 등의 컴퓨터 부품들이 모두 자원임

그런데 프로그램을 실행하기 위해서 무작정 CPU를 갖다 쓸 수 없기 때문에... 자원을 할당하고 올바르게 실행될 수 있도록 돕는것이 바로 운영체제(operating system)이다!

✅ 운영체제도 프로그램이다!

때문에 메모리에 적재되어야 하는데, 그냥 프로그램이 아니라구요?! 매.우.특.별.한 프로그램이다.

컴퓨터가 부팅될 때 메모리 내의 커널 영역이라는 공간에 따로 적재되어 실행된다

그럼 일반적인 프로그램들은? → 커널영역을 제외한 나머지 영역, 바로 사용자 영역에 적재된다.

* 사용자가 사용하는 일반적인 프로그램을 응용 프로그램(application software)라고 한다.

✅ 운영체제가 하는 일은?

  • 실행할 프로그램을 메모리에 적재
  • 더 이상 실행되지 않는 프로그램을 메모리에서 삭제하며 지속적으로 메모리 자원 관리
  • 최대한 공정하게 여러 프로그램에 CPU 자원을 할당
    • 응용 프로그램에 필요한 자원을 할당하고, 응용 프로그램이 올바르게 실행되도록 관리하는 역할

🔎 운영체제를 알아야 하는 이유

운영체제가 없다면... 정말 끔찍한 상황이 발생한다!

⚠️ 아무리 간단한 프로그램이라도 운영체제가 없다면 하드웨어를 조작하는 코드를 개발자가 모두 직접 작성해야 하기 때문

그렇다면 개발자들이 왜 운영체제를 알아야 할까?

바로 제일 처음에 이야기했던 문제 해결 능력과 관련이 있다.

우리는 운영체제를 통해

✔️ 현재 하드웨어의 상태는 어떠한지
✔️ 코드가 어떻게 실행되었는지
✔️ 하드웨어 상에 어떤 문제가 있었는지 등을 알 수 있다!

이를 통해 문제 해결의 실마리를 찾을 수 있는 것!

운영체제가 하는 말을 제대로 알아듣고, 운영체제에 제대로 명령할 수 있게 된다면 하드웨어와 프로그램을 더 깊이 이해할 수 있게 될 것이다!

🖥️ 운영체제의 큰 그림

🫀 운영체제의 심장, 커널

운영체제는 현존하는 프로그램 중 규모가 가장 큰 프로그램 중 하나다.
대표적인 운영체제 - 리눅스

프로그램은 서비스를 제공한다. 그렇다면 운영체제가 제공하는 서비스엔 어떤 것들이 있을까?

  • 자원에 접근하고 조작하는 기능
  • 프로그램이 올바르고 안전하게 실행되게 하는 기능

이 두 가지가 운영체제의 가장 핵심적인 서비스들이다.

이러한 운영체제의 핵심 서비스를 담당하는 부분을 바로 커널(kernel)이라고 한다!
➡️ 운영체제가 설치된 모든 기기에는 커널이 있다. (어떤 커널을 사용하는지에 따라 많은 것들이 달라질 수 있음)

📲 커널에 포함되지 않는 서비스

대표적으로 사용자 인터페이스(UI)가 있다.
😀 사용자가 컴퓨터와 상호작용할 수 있는 통로

사용자 인터페이스의 종류

  • 그래픽 유저 인터페이스
    • 윈도우 바탕화면이나 스마트폰의 화면처럼 그래픽을 기반으로 컴퓨터와 상호작용할 수 있는 인터페이스
  • 커맨드 라인 인터페이스
    • 명령어를 기반으로 컴퓨터와 상호작용할 수 있는 인터페이스
    • 아이콘이나 다채로운 화면 X
    • 정해진 명령어를 입력함으로써 컴퓨터와 상호작용할 수 있다

사용자 인터페이스는 운영체제가 제공하는 서비스이지만, 컴퓨터와 상호작용하기 위한 통로일 뿐 커널에 속한 기능은 아니다

🖲️ 이중 모드와 시스템 호출

운영체제는 사용자가 실행하는 응용 프로그램이 하드웨어 자원에 직접 접근하는 것을 방지하여 자원을 보호한다

➡️ 오직 자신을 통해서만 접근하도록 하여 자원을 보호한다!

때문에 응용 프로그램이 자원에 접근하기 위해서는 운영체제에 도움을 요청한다 (= 운영체제 코드를 실행하려고 한다)

응용 프로그램의 요청을 받은 운영체제는 응용 프로그램 대신 자원에 접근하여 요청한 작업을 수행한다

♟️ 커널 영역 내의 하드 디스크에 데이터를 저장하는 코드를 실행하여 응용프로그램의 작업을 대신 수행해 준다.

🌀 이중 모드

CPU가 명령어를 실행하는 모드를 크게 사용자 모드커널 모드로 구분하는 방식

  • 사용자 모드란?
    😀 운영체제 서비스를 제공받을 수 없는 실행 모드

즉, 커널 영역의 코드를 실행할 수 없는 모드
→ 사용자 모드로 실행 중인 CPU는 입출력 명령어와 같이 하드웨어 자원에 접근하는 명령어를 실행할 수 없다 = 일반적인 응용 프로그램은 자원에 접근할 수 없다

  • 커널 모드란?
    😀 운영체제 서비스를 제공받을 수 있는 실행 모드

즉, 커널 영역의 코드를 실행할 수 있는 모드
→ CPU가 커널 모드로 명령어를 실행하면 자원에 접근하는 명령어를 비롯한 모든 명령어를 실행할 수 있다

* 사용자 모드인지, 커널 모드인지는 플래그 레지스터 속 슈퍼바이저 플래그를 보면 알 수 있따!

🌀 시스템 호출

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

이때 운영체제 서비스를 제공받기 위한 요청을 시스템 호출이라고 한다!

시스템 호출은 일종의 인터럽트 (소프트웨어적인 인터럽트)

✔️ 인터럽트를 발생시키는 특정 명령어에 의해서 발생하기도 한다 = 소프트웨어 인터럽트

✔️ CPU가 시스템 호출을 처리하는 순서는 인터럽트 처리 순서와 유사하다

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

🖲️ 운영체제의 핵심 서비스

♻️ 프로세스 관리

프로세스: 실행 중인 프로그램

컴퓨터를 사용하는 동안 메모리 안에서는 새로운 프로세스들이 마구 생성되고, 사용되지 않는 프로세스는 메모리에서 삭제된다

✔️ 하나의 CPU는 한 번에 하나의 프로세스만 실행할 수 있다
➡️ 프로세스들을 조금씩 번갈아가며 실행한다

때문에 운영체제는 다양한 프로세스를 일목요연하게 관리하고 실행할 수 있어야 한다

  • 프로세스 동기화가 필수적
  • 교착상태 해결

🔱 자원 접근 및 할당

모든 프로세스는 실행을 위해 자원을 필요로 한다

운영체제가 각 자원을 어떻게 관리하고 어떤 기능을 제공할까?

😀 CPU

  • 공정하게 CPU를 할당하기 위해 어떤 프로세스부터 CPU을 이용하게 할 것인지, 얼마나 오래 이용하게 할지를 결정 (CPU 스케줄링)

😀 메모리

  • 새로운 프로세스가 적재될 때마다 어느 주소에 적재해야 할 지를 결정

😀 입출력장치

  • 인터럽트 서비스 루틴은 운영체제가 제공하는 기능 (커널 영역 안에 있음)
  • 입출력장치가 발생시키는 하드웨어 인터럽트도 마찬가지임
  • 인터럽트를 처리하는 프로그램, 즉 인터럽트 서비스 루틴을 제공함으로써 입출력 작업을 수행

🗂️ 파일 시스템 관리

파일 시스템 역시 운영체제가 지원하는 핵심 서비스

  • 파일을 열고,
  • 생성하고,
  • 삭제하고,
  • 폴더(디렉토리)로 만들어서 관리하는 것

* 가상 머신과 이중 모드의 발전
🖥️ 가상 머신이란 ? 소프트웨어적으로 만들어낸 가상 컴퓨터

→ 가상 머신 또한 응용 프로그램이다! = 사용자 모드로 작동)

😀 가상 머신에 설치된 응용 프로그램이 운영체제 서비스를 제공받기 위해서는 커널 모드로 전환되어야 한다
☹️ 그런데 가상 머신에 설치된 운영체제도 사용자 모드로 작동하면?! 운영체제 서비스를 제공받을 수 없다!

➡️ 때문에 가상화를 지원하는 CPU는 커널 모드와 사용자 모드 이외에 가상 머신을 위한 모드인 하이퍼 바이저 모드를 따로 둔다! 이를 통해 가상 머신에 설치된 운영체제로부터 운영체제 서비스를 받을 수 있게 한다

* 시스템 호출의 종류

종류시스템 호출설명
프로세스 관리fork()새 자식 프로세스 설명
execve()프로세스 실행(메모리 공간을 새로운 프로그램의 내용으로 덮어씌움
exit()프로세스 종료
waitpid()자식 프로세스가 종료할 때까지 대기
파일 관리open()파일 열기
close()파일 닫기
read()파일 읽기
write()파일 쓰기
stat()파일 정보 획득
디렉터리 관리chdir()작업 디렉터리 변경
mkdir()디렉터리 생성
rmdir()비어 있는 디렉터리 삭제
파일 시스템 관리mount()파일 시스템 마운트
umount()파일 시스템 마운트 해제
profile
영차영차 😎

0개의 댓글