반응형
본 글은 책 "혼자 공부하는 컴퓨터 구조+운영체제" 의 "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가 명령어를 실행하는 모드를 크게 사용자 모드와 커널 모드로 구분하는 방식
- 사용자모드 : 운영체제 서비스를 제공받을 수 없는 실행 모드 (자원 접근 불가)
- 커널 모드 : 운영 체제 서비스를 제공받을 수 있는 실행 모드
이중 모드는 플래그 레지스터 내의 슈퍼바이저 플래그에 의해 결정됨
- 응용 프로그램이 운영체제에게 시스템 호출(System call)을 통해 사용자 모드 → 커널 모드로 전환됨
- 일종의 소프트웨어 인터럽트
하드웨어 인터럽트 처리 방식과 유사
- 시스템 호출을 발생시키는 명령어가 실행되면 CPU는 지금까지의 작업을 백업
- 커널 영역 내에 시스템 호출을 수행하는 코드(인터럽트 서비스 루틴)을 실행
- 다시 기존에 실행하던 응용 프로그램으로 복귀하여 실행
일반적으로 응용 프로그램은 실행 과정에서 운영체제 서비스들을 매우 빈번하게 사용
운영체제의 핵심 서비스
크게 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. 유튜브 "혼자 공부하는 컴퓨터 구조 + 운영체제"
반응형