반응형

본 글은 책 "혼자 공부하는 컴퓨터 구조+운영체제" 의 "Chapter 9. 운영체제 시작하기"을 읽고 정리한 내용입니다.

 

09-1 운영체제를 알아야 하는 이유

운영체제란

  • 모든 프로그램은 하드웨어가 필요
    • 1+2 계산하는 프로그램은 CPU필요
    • 이미지를 하드 디스크에 저장하는 프로그램은 하드 디스크 필요
  • (시스템) 자원: 프로그램 실행에 마땅히 필요한 요소들로 CPU, 메모리, 보조기억 장치 등이 있음
  • 운영체제(Operating System): 실행할 프로그램에 필요한 자원을 할당하고 프로그램이 올바르게 실행되도록 돕는 특별한 프로그램
  • 운영체제는 매우 특별한 프로그램이기 때문에 항상 컴퓨터가 부팅될 때 메모리 내 커널 영역(kernel space)이라는 공간에 따로 적재되어 실행됨
  • 사용자 영역 (user space): 사용자가 이용하는 응용 프로그램이 적재되는 영역

위의 프로그램들은 누가 메모리에 적재했을까? → 운영체제!

 

응용 프로그램이 실행되려면 CPU가 필요한데 운영체제가 관리함

  • 최대한 공정하게 여러 프로그램에 CPU 자원을 할당

⇒ 운영체제는 응용 프로그램과 하드웨어 사이에서 응용 프로그램에 필요한 자원을 할당하고, 응용 프로그램이 올바르게 실행되도록 관리하는 역할

결론적으로 운영체제를 알면 운영체제를 통해 하드웨어의 상태나 코드의 실행 방식을 알 수 있고 결과적으로 하드웨어와 프로그램을 더 깊이 이해할 수 있음

09-2. 운영체제의 큰 그림

운영체제의 심장, 커널

  • 운영체제의 핵심 서비스를 담당하는 부분

운영체제에는 속하는데 커널에는 속하지 않는 기능은 User Interface

  • GUI
  • CLI

이중모드와 시스템 호출

  • 사용자가 실행하는 프로그램은 자원에 직접 접근할 수 있을까? NO! 자원에 직접 접근은 위험

  • 자원이 무질서하게 관리되고, 응용 프로그램이 조금만 실수해도 컴퓨터 전체에 큰 악영향을 끼칠 수 있음

 

  • 운영체제는 응용 프로그램들이 자원에 접근하려고 할 때 오직 운영체제 자신을 통해서만 접근하도록 하여 자원을 보호

  • 응용 프로그램이 자원에 접근하기 위해서 운영체제에 도움을 요청해야 함
    • 도움을 요청한다 → 운영체제 코드를 실행하려고 한다

 

예를 들어 응용 프로그램이 실행 과정에서 하드 디스크에 접근하여 데이터를 저장하려고 함

  • 응용 프로그램이 운영체제에 도움 요청
  • 운영체제는 커널 영역 내의 하드 디스크에 데이터를 저장하는 코드를 실행하여 응용 프로그램 대신 작업을 수행

 

  • 이중 모드(Dual model) : CPU가 명령어를 실행하는 모드를 크게 사용자 모드와 커널 모드로 구분하는 방식
    • 사용자모드 : 운영체제 서비스를 제공받을 수 없는 실행 모드 (자원 접근 불가)
    • 커널 모드 : 운영 체제 서비스를 제공받을 수 있는 실행 모드

이중 모드는 플래그 레지스터 내의 슈퍼바이저 플래그에 의해 결정됨

슈퍼바이저 플래그를 통해 CPU가 명령어를 실행하는 모드를 파악 후 판단

 

  • 응용 프로그램이 운영체제에게 시스템 호출(System call)을 통해 사용자 모드 → 커널 모드로 전환됨
  • 일종의 소프트웨어 인터럽트

 

하드웨어 인터럽트 처리 방식과 유사

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

 

일반적으로 응용 프로그램은 실행 과정에서 운영체제 서비스들을 매우 빈번하게 사용

시스템 호출은 운영체제마다 정해져있음

 

운영체제의 핵심 서비스

크게 3가지

  • 프로세스 관리, 자원 접근 및 할당, 파일 시스템 관리

 

프로세스 관리

  • 프로세스 : 실행중인 프로그램
  • 일반적으로 하나의 CPU는 한번에 하나의 프로세스만 실행할 수 있기에 CPU는 이 프로세스들을 조금씩 시간을 나눠 번갈아 가며 실행

 

  • 각 프로세스의 상태와 사용하고자 하는 자원도 다양 → 운영체제는 다양한 프로세스를 일목요연하게 관리하고 실행할 수 있어야 함

 

자원 접근 및 할당

CPU

  • 메모리에 여러 프로세스가 적재되고, 하나의 CPU는 한 번에 하나의 프로세스만 실행
  • 어떤 프로세스부터 CPU를 이용하게 할지, 얼마나 오래 사용할지 결정해야 함 ⇒ CPU 스케쥴링 (11장)

메모리

  • 메모리에 적재된 프로세스들의 크기와 주소도 가지각색이라 운영체제가 어떻게 메모리를 할당하지, 메모리가 부족한 경우에는 어떻게 극복하는지 운영체제가 판단

입출력장치

  • 인터럽트 서비스 루틴은 운영체제가 제공하는 기능으로 커널 영역에 있고 하드웨어 인터럽트도 마찬가지
  • 입출력장치가 cpu에 하드웨어 인터럽트 요청 신호를 보내면 CPU는 하던 일을 잠시 백업한 뒤 커널 영역에 있는 인터럽트 서비스 루틴을 실행

 

파일 시스템 관리

  • 파일 시스템도 운영체제가 지원하는 핵심 서비스 (15장)

참고

  • system call 확인하기위해 linux에서는 strace 명령어 사용
$ strace /bin/ls                                                                                                                                                                                          ok | wschoi@superb-tony | 03:58:16 PM
execve("/bin/ls", ["/bin/ls"], 0x7ffd7c910c40 /* 40 vars */) = 0
brk(NULL)                               = 0x559534620000
arch_prctl(0x3001 /* ARCH_??? */, 0x7ffe470196c0) = -1 EINVAL (Invalid argument)
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=101547, ...}) = 0
mmap(NULL, 101547, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f8e83bfb000
close(3)                                = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libselinux.so.1", O_RDONLY|O_CLOEXEC) = 3
read(3, "\\177ELF\\2\\1\\1\\0\\0\\0\\0\\0\\0\\0\\0\\0\\3\\0>\\0\\1\\0\\0\\0@p\\0\\0\\0\\0\\0\\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=163200, ...}) = 0
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f8e83bf9000
mmap(NULL, 174600, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f8e83bce000
mprotect(0x7f8e83bd4000, 135168, PROT_NONE) = 0
mmap(0x7f8e83bd4000, 102400, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x6000) = 0x7f8e83bd4000
mmap(0x7f8e83bed000, 28672, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1f000) = 0x7f8e83bed000
mmap(0x7f8e83bf5000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x26000) = 0x7f8e83bf5000
mmap(0x7f8e83bf7000, 6664, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f8e83bf7000
close(3)                                = 0

 

 

 

참고

 


1. 책 "혼자 공부하는 컴퓨터 구조+운영체제"
2. 유튜브 "혼자 공부하는 컴퓨터 구조 + 운영체제"
 

반응형

'OS' 카테고리의 다른 글

CPU 스케쥴링  (0) 2024.07.16
프로세스와 스레드  (0) 2024.07.14
캐시메모리  (0) 2024.07.07
메모리  (0) 2024.07.05
CPU 성능 향상 기법  (0) 2024.07.02

+ Recent posts