Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- fatal:not a git repository
- 주니어개발자멘토링
- not a git repository
- 파이썬 클래스
- print("""
- 개발자스터디
- 99클럽 #99일지 #코딩테스트 #개발자스터디 #항해 #til
- print sep
- 항해99
- 10430번
- 백준
- 99일지
- 99클럽
- 파이썬 sep
- Til
- 코딩테스트
- cp949
- 파이썬
- EnvCommandError
- 파이썬 int()
- Fatal Python error: init_fs_encoding: failed to get the Python codec of the filesystem encoding
- MomentumParameters
- 항해
- 개발자사이드프로젝트
- vscode cp949
- 파이썬 map 함수
- 파이썬 |
- 주니어개발자역량강화
- 항해플러스
- 코딩부트캠프후기
Archives
- Today
- Total
선발대
[KOCW] 운영체제 1강, 2강 / 반효경 본문
1강 (1) 강의소개
강의 목표
- 운영체제는 컴퓨터 하드웨어 바로 위에 설치되는 소프트웨어 계층으로서, 모든 컴퓨터 시스템의 필수적인 부분임.
- 본 강좌에서는 이와 같은 운영체제의 개념과 역할, 운영체제를 구성하는 각 요소,
- 그 알고리즘의 핵심적인 부분에 대해 기초부터 학습함.
강의 내용
- 운영체제 개요, 컴퓨터시스템의 구조, 프로세스 관리
- CPU 스케줄링, 병행 제어, 데드락, 메모리 관리, 가상 메모리
- 파일 시스템, 입출력 시스템, 디스크 관리
운영체제란 무엇인가?
- 운영체제(Operating System, OS)란?
- 컴퓨터 하드웨어 바로 위에 설치되어 사용자 및 다른 모든 소프트웨어와 하드웨어를 연결하는 소프트웨어 계층
- 하드웨어에 직접 접근하지 않고 운영체제와 인터페이스하면 된다.
- 협의의 운영체제(커널): 운영체제의 핵심부분으로 부팅 이후로 항상 메모리에 상주하는 부분.
- 광의의 운영체제: 커널 뿐만 아니라 메모리에 사용하지 않는 각종 주변 시스템 유틸리티를 포함한 개념
- 전공자 입장에서 운영체제는 보통 커널을 의미함
운영 체제의 목표
- 컴퓨터 시스템을 편리하게 사용할 수 있는 환경을 제공함
- 운영체제는 동시 사용자/프로그램이 각각 독자적 컴퓨터에서 수행되는 것 같은 환상을 제공
- 컴퓨터는 한 대뿐이지만 그 컴퓨터의 운영체제가 각각 사용자들이 독자적으로 쓰는 것처럼 보여줌.
- 하드웨어를 직접 다루는 복잡한 부분을 운영체제가 대행함
- 컴퓨터 시스템의 자원을 효율적으로 관리함 (자원 관리자) / 번갈아가면서 실행해준다. (CPU 스케줄링)
- 사용자간의 형평성 있는 자원 분배 및 주어진 자원으로 최대한의 성능을 내도록 관리함
- 자원: 프로세서(CPU), 기억장치(메모리), 입출력 장치 등
- 하드웨어 자원 뿐만 아니라 소프트웨어 자원도 관리함
- 사용자 및 운영체제 자신을 보호함
- 프로세스, 파일, 메시지 등을 관리함
1강 (2) Introduction to Operating Systems
강의목표
- 운영체제란 무엇인가, 운영체제의 목적, 운영체제의 분류, 운영체제의 예, 운영체제의 구조
운영체제의 분류
- 동시작업 가능여부
- 사용자의 수
- 처리 방식
운영체제의 분류 (동시 작업 가능의 여부)
- 단일 작업(Single tasking)
- 한 번에 하나의 작업만 처리함. 과거에 이렇게 사용함.
- 예: MS-DOS 프롬프트 상에서는 한 명령의 수행을 끝내기 전에 다른 명령을 수행시킬 수 없음
- 다중 작업(Multi tasking)
- 동시에 두 개 이상의 작업을 처리함. 현재 이용하는 것.
- 예: UNIX, MS Windows 등에서는 한 명령의 수행이 끝나기 전에 다른 명령, 프로그램 수행 가능.
운영체제의 분류 (사용자의 수)
- 단일 사용자(Single user)
- 예) MS-DOS, MS Windows
- 다중 사용자(Multi user)
- 한 컴퓨터에 여러 사용자의 계정을 만들어서 동시에 접근하여 사용할 수 있는지가 기준임
- 사용자가 많으면 형평성 있게 자원을 관리하거나, 보안이 철저해야 함. 현재 주로 이용하는 방식.
- 예) UNIX, NT server
운영체제의 분류 (처리 방식)
- 일괄 처리 (Batch processing)
- 작업 요청의 일정량을 모아서 한꺼번에 처리함
- 작업이 완전히 종료될 때까지 기다려야 함
- 현대 운영체제에서 찾아보기 어려움
- 예) 초기 Punch Card 처리 시스템
- 시분할 (Time sharing)
- 여러 작업을 수행할 때 컴퓨터 처리 능력을 일정한 시간 단위로 분할하여 사용
- 일괄 처리 시스템에 비해 짧은 응답 시간을 가짐
- Interactive한 방식임. 내가 컴퓨터를 조작했을 때 바로 화면에 결과가 나온다.
- 현대 운영체제에서 주로 사용됨. 일반적인 범용 컴퓨터에서 사용. 우리가 수업 시간에 배우게 될 것.
- 목적: 사람이 빠르다고 생각하도록 처리하고 주어진 자원을 최대한 활용하기. 사람에 특화됨.
- 예) UNIX
- 실시간 (Realtime OS)
- 정해진 시간 안에 어떠한 일이 반드시 종료됨이 보장되어야하는 실시간 시스템을 위한 OS
- 특수 목적을 가진 컴퓨터에서 주로 사용함. 한 공정 밀리면 전체 공정이 밀리게 됨.
- 최근에는 범용 프로그램에서도 필요한 경우가 있어서 실시간성에 대한 연구가 진행 중임.
- 예) 원자로/공장 제어, 미사일 제어, 반도체 장비, 로보트 제어
- 실시간 시스템의 개념 확장
- Hard realtime system (경성 실시간 시스템): 데드라인이 있고 치명적인 오류가 남.
- Soft realtime system (연성 실시간 시스템): 데드라인은 있지만 크게 어긋나지 않음.
몇 가지 용어 정리
- Multitasking
- Multiprogramming
- Timesharing
- Multiprocess
- 구분
- 위의 용어들은 컴퓨터에서 여러 작업을 동시에 수행하는 것을 의미함.
- 하나의 프로그램이 끝나기 전에 다른 프로그램을 실행하는 방식으로 번갈아가며 실행함.
- 빠른 속도로 번갈아가며 실행하기 때문에 마치 동시에 진행되는 것처럼 보인다.
- Multiprogramming: 여러 프로그램이 메모리에 올라가 있음을 강조함
- Time sharing: CPU 시간을 분할하여 나누어 쓴다는 의미를 강조함
- 다른 부분
- Multiprocessor: 다중 처리기. 하나의 컴퓨터에 CPU(processor)가 여러 개 붙어 있음을 의미함.
- 얘도 Multitasking은 되겠지만 일단 하드웨어적으로 차이가 있음. CPU가 다수 있는 것임.
- 후에 고성능 컴퓨팅을 배우면 여러 개 CPU가 있는 곳에서 어떻게 병렬적으로 처리하는지 배운다.
운영체제의 예
- 유닉스(UNIX)
- 초기에 대형 컴퓨터(서버)를 타겟으로 만들어졌음. 멀티태스킹이 되는 것부터 시작함.
- 개인이 쓰기에도 좋은 특징을 가지고 있음.
- 코드의 대부분을 C언어로 작성함 (아예 프로그래밍 언어를 새로 만듦)
- 높은 이식성: 하나의 컴퓨터에서 작동하는 유닉스는 다른 컴퓨터에서도 작동된다. (C언어로 작성되었기 때문)
- 최소한의 커널 구조
- 복잡한 시스템에 맞게 확장 용이
- 소스 코드 공개
- 프로그램 개발에 용이
- 다양한 버전이 있음: System V, FreeBSD, SunOS, Solaris / Linux
- DOS(Disk Operating System)
- MS사에서 1981년 IBM-PC를 위해 개발
- 단일 사용자용 운영체제, 메모리 관리 능력의 한계 (주 기억장치: 640KB)
- 그러나 하드웨어 발전 속도가 매우 빨라서 누더기 같은 코드가 됨
- MS Windows
- 개인 사용자를 위해 개발됨. 따라서 초기에 단일 사용자, 단일 작업을 지원하는 방향으로 개발됨.
- MS사의 다중 작업용 GUI 기반 운영체제
- Plug and Play, 네트워크 환경 강화
- DOS용 응용 프로그램과 호환성 제공
- 초기엔 불안정성 높았음. 그래도 지금은 많이 해결됨.
- 풍부한 자원 소프트웨어
- Handheld device를 위한 OS
- PalmOS, Pocket PC (WinCE), TinyOS
운영 체제의 구조
- CPU 스케줄링: 누구에게 CPU를 줄지 결정함. CPU는 매우 빠른 자원임.
- 짧게 CPU를 쓰려는 프로그램에게 주면 전체 성능이 좋아짐.
- 그렇지만 짧은 시간 간격으로 번갈아가며 진행하는 방식 채택. 뒤에 또 나옴.
- 메모리 관리: 한정된 메모리를 어떻게 쪼개어 쓸지 결정함
- 메모리에 한번에 많은 프로그램을 동시에 올려놓지 말고,
- CPU가 원활하게 실행되기 위해 필요한 메모리 용량만 받을 수 있도록 함. 얘네 끝나면 다음.
- 무조건 1/n이 아니라 특정 프로그램에 몰아주면 더 원활하게 실행될 수 있음.
- 파일 관리: 디스크에 파일을 어떻게 보관할지 결정함
- 엘리베이터 작동 방식과 비슷함.
- 먼저 들어온 걸 먼저 처리하지 않고, 스케줄링을 통해 헤드가 가는 길에 있다면 겸사겸사 처리함.
- CPU 스케줄링과 디스크 스케줄링은 서로 좀 성격이 다르다.
- CPU 스케줄링은 너무 빠르기 때문에 이것을 어떻게 관리할지가 중요.
- 디스크 스케줄링은 헤드의 움직임을 최소화하면서 많은 요청을 빠르게 처리할 수 있는지가 중요.
- 입출력 관리: 각기 다른 입출력장치와 컴퓨터간에 어떻게 정보를 주고 받게 할지 결정함
- I/O device는 CPU나 메모리 등보다 매우 느리다.
- CPU는 매우 빠르게 자기 할 일을 하고 있다가 I/O device가 보고할 일이 있으면 interrupt 발생시킴.
- 그러면 CPU가 다음 작업 시작하기 전에 확인함. CPU의 작업을 중간에 방해하지 않게 됨.
운영체제 과목의 수강 태도
- 본 과목은 OS 사용자 관점이 아니라, OS 개발자 관점에서 수강해야 함
- 대부분 알고리즘은 OS 프로그램 자체의 내용임
- 인간의 신체가 뇌의 통제를 받듯, 컴퓨터 하드웨어는 운영체제의 통제를 받음.
- 그 운영체제를 사람이 프로그래밍 하는 것임.
- 본인을 Windows XP나 Linux 같은 운영체제라고 생각하고 본인의 할 일이 무엇인지 생각하면
- 이번 학기 배울 내용이 무엇인지 명확히 알 수 있음.
2강 (1) System Structure & Program Execution 1
강의 목표
- 컴퓨터 시스템 구조, Mode bit, Timer, Device Controller, 입출력(I/O)의 수행
- 동기식 입출력과 비동기식 입출력, 시스템콜(System Call), 인터럽트(Interrupt)
컴퓨터 시스템 구조
- CPU의 작업 공간은 메모리임. 매번 메모리에서 instruction을 읽는다.
- Device controller: I/O device를 전담하는 작은 CPU 역할을 한다. CPU의 역할이 아님.
- Local buffer: CPU의 작업 공간이 메모리이듯, Device controller의 작업공간은 local buffer임.
- Register: CPU 안에는 메모리보다 빠르면서 정보를 저장할 수 있는 작은 공간이 있는데 이걸 말함.
- 다음에 어떤 instruction을 실행해야 되는지 주소를 가지고 있음. CPU는 쉴새없이 일만 해
- Mode bit: CPU가 실행되는 것이 운영체제인지 사용자 프로그램인지 구분해줌.
- Interrupt line: CPU는 메모리에서 계속 instruction만 읽어오는데 I/O 장치에서 어떻게 읽어오는가?
- CPU가 device controller한테 데이터 읽어오라고 시킨다. 그러고 local buffer에 저장해둠.
- CPU는 메모리, local buffer에 접근할 수 있지만, device controller는 local buffer에만 접근 가능함.
- CPU가 local buffer에 접근해서 메모리에 데이터 복사한다. 그 반대로도 가능.
- I/O 장치에서 interrupt 들어오면 CPU가 OS로 넘어가서 local buffer 데이터를 메모리로 카피해옴.
- 만약 프로그램이 무한루프를 돌게 되면 CPU를 독점하게 됨. 그래서 Timer라는 하드웨어 등장함.
- Timer: 특정 프로그램이 CPU 독점하는 것을 막음.
- 제일 처음에는 운영체제가 CPU를 가지고 있다가 Timer 값을 설정하고 사용자 프로그램에 넘겨줌.
- CPU는 instruction 실행하고 매번 interrupt line을 체크한다. Timer는 시간이 다 되면 interrupt 걸어줌.
- 그러면 CPU는 다시 운영체제로 돌아온다. (강제로 뺏을 수는 없음)
- 사용자 프로그램은 본인이 직접 I/O 장치에 접근할 수 없음 (보안 문제)
- I/O 장치에 접근할 수 있는 instruction은 무조건 운영체제를 통해서 하도록 막아두었음.
- 따라서 사용자 프로그램이 I/O 장치에 접근하려면 스스로 CPU를 운영체제에 넘겨주고,
- 운영체제가 I/O controller한테 시킴. 시간이 오래 걸리므로 운영체제는 또 다른 사용자 프로그램에 CPU 넘김.
- I/O 장치에 입력이 들어와서 local buffer에 데이터가 쌓이면 device controller가 CPU에 interrupt 걸어줌.
- 어떤 작업이 실행중이지만 기본적으로 interrupt가 들어오면 운영체제로 CPU가 넘어감.
- 그럼 운영체제가 local buffer의 데이터를 요청한 프로그램 메모리에 카피해줌.
- 작업이 중단된 프로그램의 타이머 값이 남았다면 다시 CPU를 넘겨주고,
- 시간이 넘어갔다면 I/O 장치 데이터를 받은 프로그램에 CPU가 넘어감. (차례를 기다리면)
Mode bit
- 사용자 프로그램의 잘못된 수행으로 다른 프로그램 및 운영체제에 피해 가지 않도록 보호장치 필요.
- Mode bit을 통해 하드웨어적으로 두 가지 모드의 operation 지원함
- 1 사용자 모드: 사용자 프로그램 수행 / 제한된 instruction만 CPU에서 실행 가능
- 0 모니터 모드: OS 코드 수행 / 운영체제가 CPU에서 실행 중일 때
- 보안을 해칠 수 있는 중요한 명령어는 모니터 모드에서만 수행 가능한 특권명령으로 규정
- 사용자 프로그램에서 실행할 수 있는 명령어는 일반명령임.
- Interrupt나 Exception 발생시 하드웨어가 mode bit을 0으로 변경
- 사용자 프로그램에게 CPU를 넘기기 전에 mode bit을 1로 셋팅
Timer
- 정해진 시간이 흐른 뒤 운영체제에게 제어권이 넘어가도록 인터럽트를 발생시킴
- 운영체제가 사용자 프로그램에 CPU 넘겨줄 때는 타이머에 정해진 시간을 할당한 다음 넘겨줌
- 타이머는 매 클럭 틱 때마다 1씩 감소함
- 타이머 값이 0이 되면 타이머 인터럽트 발생함
- CPU를 특정 프로그램이 독점하는 것으로부터 보호함
- 타이머는 time sharing을 구현하기 위해 널리 이용됨
- 타이머는 현재 시간을 계산하기 위해서도 사용됨
Device Controller
- I/O device controller
- 해당 I/O 장치 유형을 관리하는 일종의 작은 CPU
- 제어 정보를 위해 control register, status register를 가짐
- 데이터를 저장하는 local buffer를 가짐 (일종의 data register)
- I/O는 실제 device와 local buffer 사이에서 일어남
- Device controller는 I/O가 끝났을 경우 interrupt로 CPU에 그 사실을 알림
- DMA controller (Direct Memory Access)
- 원래 메모리에 접근할 수 있는 건 CPU 뿐이었는데 DMA controller가 있으면 얘도 접근 가능함.
- 둘이 메모리에 동시에 접근하면 memory controller가 중재함. (데이터 일관성 깨지지 않도록)
- I/O 장치에서 interrupt 너무 많이 걸리면 CPU가 너무 바쁘다. 이걸 도와주려고 DMA 사용함.
- 작업이 완료되어서 local buffer에 데이터가 쌓이면 DMA controller가 메모리에 데이터를 복사하고,
- CPU에 interrupt를 한번만 건다. (내가 일 다 끝내뒀수다)
- Device driver(장치구동기): OS 코드 중 각 I/O 장치별 처리 루틴. I/O 장치에 명령 내림. → software
- 그렇지만 실제로 디스크 헤드를 조작한다는 등의 행동은 device controller가 하고 있음
- Device controller(장치제어기): 각 장치를 통제하는 일종의 작은 CPU → hardware
입출력(I/O)의 수행
- 모든 입출력 명령은 특권 명령
- 사용자 프로그램은 어떻게 I/O를 하는가?
- 무조건 운영체제를 통해서만 가능함.
- 시스템콜(System call)
- 사용자 프로그램이 운영체제에 I/O를 요청하는 것을 의미
- 사용자 프로그램이 운영체제의 커널 함수를 호출하는 것을 말한다.
- 근데 조금 복잡함. 단순한 메모리 주소 변경으로는 안됨.
- trap을 사용하여 인터럽트 벡터의 특정 위치로 이동함
- 제어권이 인터럽트 벡터가 가리키는 인터럽트 서비스 루틴으로 이동함
- 올바른 I/O 요청인지 확인 후 I/O 수행함
- I/O 완료 시 제어권을 시스템콜 다음 명령으로 옮김 (I/O 컨트롤러가 일을 한다)
- 사용자 프로그램은 바로 운영체제로 넘어갈 수 없음. (mode bit 1인 상태)
- 그래서 프로그램이 interrupt line을 실행하는 instruction을 실행함.
- CPU는 instruction 하나를 실행하면 interrupt line을 체크함.
- 즉 프로그램이 운영체제에 뭔가를 요청하기 위해 소프트웨어적으로 직접 interrupt를 거는 것임.
- CPU는 interrupt가 들어왔기 때문에 CPU 제어권이 운영체제로 넘어가고 mode bit도 0으로 변경됨.
인터럽트 (Interrupt)
- 인터럽트
- 인터럽트 당한 시점의 레지스터와 program counter를 save한 후,
- CPU의 제어를 인터럽트 처리 루틴에 넘김.
- 현대의 운영체제는 인터럽트에 의해 구동됨. 운영체제는 CPU를 사용할 일이 없음
- 운영체제는 항상 사용자 프로그램이 사용하다가, 인터럽트가 들어올 때만 CPU가 운영체제로 넘어감.
- Interrupt (넓은 의미)
- Interrupt (하드웨어 인터럽트): 하드웨어가 발생시킨 인터럽트. 일반적인 의미. (아니면 컨트롤러가)
- Trap (소프트웨어 인터럽트):
- (1) Exception: 프로그램이 오류를 범한 경우
- (2) System call: 프로그램이 커널 함수를 호출하는 경우
- 사용자 프로그램이 I/O 요청할 때는 OS한테 소프트웨어 인터럽트 (System call),
- 그러면 OS가 controller한테 일을 시킨다. CPU는 운영체제에서 다른 프로그램으로 넘어감.
- 일이 다 끝났을 때는 컨트롤러가 CPU한테 하드웨어 인터럽트를 건다.
- Timer 인터럽트: CPU를 특정 프로그램이 독점하는 것을 방지
- I/O controller 인터럽트: 요청한 작업이 다 끝났거나 입력이 들어온 것을 알려주는 역할
- 인터럽트 관련용어
- 인터럽트 벡터: 해당 인터럽트 처리 루틴 주소를 가지고 있음. 각 인터럽트가 생겼을 때 어떤 함수로 가야하는지 적힌 테이블
- 인터럽트 처리 루틴(=Interrupt Service Routine, 인터럽트 핸들러): 해당 인터럽트를 처리하는 커널 함수
시스템콜 (System Call)
- 사용자 프로그램이 운영체제의 서비스를 받기 위해 커널 함수를 호출하는 것
- 사용자 프로그램은 운영체제 코드를 직접 수행하는 것이 불가능하기 때문임.
- 사용자 프로그램이 interrupt line을 세팅하면 CPU 제어권이 운영체제로 넘어감.
- 그럼 운영체제의 권한으로 이것저것 할 수 있음
2강 (2) System Structure & Program Execution 2
강의목표
- 컴퓨터 시스템 구조, 인터럽트(Interrupt), 동기식 입출력과 비동기식 입출력, 시스템콜(System Call),
- DMA(Direct Memory Access), 서로 다른 입출력 명령어, 저장장치 계층 구조
- 프로그램의 실행(메모리 load), 커널 주소 공간의 내용, 사용자 프로그램이 사용하는 함수, 프로그램의 실행
동기식 입출력과 비동기식 입출력
- 동기식 입출력 (synchronous I/O)
- I/O에 요청 후 입출력 작업이 완료된 후에야 제어가 사용자 프로그램에 넘어감
- 구현 방법 1
- I/O가 끝날 때까지 CPU를 낭비시킴
- 매시점 하나의 I/O만 일어날 수 있음
- 구현 방법 2 (보통 동기식 입출력은 이 방법으로 구현함)
- I/O가 완료될 때까지 해당 프로그램(I/O를 요청한 프로그램)에게서 CPU를 빼앗음.
- 만약 다음 프로그램도 I/O 요청을 한다면 I/O 처리를 기다리는 줄에 그 프로그램을 줄 세움
- 다른 프로그램에게 CPU를 줌. CPU는 안 놀고 I/O 장치도 여러 개 돌아감
- I/O 장치가 끝나면 인터럽트로 알려주고 그 요청 프로그램에게 CPU가 넘어감
- 비동기식 입출력 (asynchronous I/O)
- I/O가 시작된 후 입출력 작업이 끝나기를 기다리지 않고 제어(CPU)가 사용자 프로그램에 즉시 넘어감
- 동기식, 비동기식 입출력 둘 다 I/O 완료는 인터럽트로 알려줌
- I/O는 커널을 통해서만 할 수 있음
- 사용자 프로그램이 I/O 요청을 운영체제 커널에 하게 되면 디바이스 드라이버 > 하드웨어
- 사용자는 그동안 기다린다. asynchronous는 그동안 CPU 제어권을 얻어서 다른 작업을 함
- I/O가 완료된 것은 인터럽트를 통해서 알려준다.
- I/O 요청을 했지만 디스크에서 읽어온 데이터와 상관없이 그냥 할 수 있는 작업들이 있음
- 그 동안 그 작업을 하도록 한다. READ여도 Asyn하게 할 수 있음.
- Write는 Asyn하도록 하는게 자연스럽다. 정말 데이터가 스토리지에 잘 되었는지 확인하고 싶다면 syn로 해도 됨
- 사용자 프로그램이 I/O 요청을 하는데 이건 오래 걸림. CPU 가지고 가만히 있는 건 낭비임
- 메모리에 접근할 수 있는 건 CPU 밖에 없음
- 그래서 CPU가 I/O 장치의 데이터를 복사해서 메모리에 붙여넣어 장치로 보냄
- 작은 일에도 CPU가 interrupt 너무 많이 당하면 오버헤드 발생함
- 그래서 DMA controller를 장착하고 얘도 메모리 접근할 수 있게 함.
- 작은 일들은 buffer에 특정 크기(block)이 될 때까지 모아둠. CPU가 interrupt 당하는 빈도 줄이기.
DMA (Direct Memory Access)
- CPU 말고도 메모리에 접근할 수 있는 컨트롤러.
- I/O의 데이터를 메모리에 카피해서 올려놓고, 어느 정도 모이면 인터럽트를 건다.
- 빠른 입출력 장치(interrupt 빈번하게 건다)를 메모리에 가까운 속도로 처리하기 위해 사용
- CPU의 중재 없이 device controller가 device의 buffer storage의 내용을 메모리에 block 단위로 전송
- 바이트 단위가 아니라 block 단위로 인터럽트를 발생시킴
서로 다른 입출력 명령어
- I/O를 할 수 있는 방법은 2가지가 있음
- I/O를 수행하는 special instruction에 의해: 메모리에 접근하는 address 따로, device address 따로 있음
- Memory Mapped I/O에 의해: 구분 없이 I/O device에도 메모리 주소 할당하여 접근함
저장장치 계층 구조
- 맨 위에는 CPU가 있음
- 위로 갈수록 Speed ↑, 단위 공간당 Cost ↑, 용량 ↓, 휘발성 유 (분홍색은 휘발성 무)
- Primary(Executable): CPU가 직접적으로 접근가능한 저장장치. byte 단위로 접근 가능해야 함
- 하드디스크는 byte 단위 접근이 안되고 섹터 단위로 접근함. 따라서 Executable 하지 않음
- Caching: 용량 부족으로 당장 필요한 것만 밑에서 위로 올려서 작업함. 재사용이 목적임.
- 같은 걸 또 요청하면 굳이 밑으로 안 가도 됨. 새로운 것이 들어오면 기존의 것을 쫓아낸다.
- 이런 캐싱은 뒷 쪽의 메모리 관리 파트에서 자세히 설명될 것임
프로그램의 실행 (메모리 load)
- 프로그램은 실행파일 형태로 하드디스크에 저장되어 있음
- 실행을 시키게 되면 메모리로 올라가서 프로세스가 됨. 그 이후 실행됨.
- 물리적인 메모리로 바로 올라가지 않고 가상 메모리(Virtual memory) 거쳐서 올라감.
- 프로그램을 실행하면 그 프로그램만의 독자적인 주소 공간(Address space)이 생김
- 이런 주소 공간은 stack, data, code로 구성된다.
- code: CPU에서 실행할 기계어 코드를 담고 있음
- data: 변수와 같은 프로그램이 사용하는 자료구조를 담고 있음
- stack: 함수를 호출하거나 리턴할 때 데이터를 쌓았다가 꺼내가는 용도로 사용함
- 커널 영역은 부팅하면 메모리에 항상 상주해있음.
- 사용자 프로그램들은 실행시키면 주소 공간이 생겼다가, 프로그램 종료시키면 사라짐.
- 당장 필요한 코드들만 물리적인 메모리에 올림. 사용 안하면 나중엔 쫓아냄.
- 디스크의 Swap area: 현재는 사용하지 않아도 나중에 필요할 수도 있는 것들을 쌓아둔다.
- 하드디스크가 왼(Swap area), 오(File system) 둘 다 그려져 있는데 서로 용도는 다름.
- File system 안의 데이터는 전원이 나가도 유지됨. 비휘발성 용도.
- Swap area 안의 데이터는 전원이 나가면 의미 없음. 가상 메모리 날아갔는데. 메모리 연장공간임
- 각 가상 메모리는 프로셋 독자적임. 즉, 0번지부터 시작함. 당연히 실제 메모리 주소와 다름.
- Address translation: 논리적인 메모리 주소(가상 메모리)가 물리적인 메모리 주소로 변환됨.
커널 주소 공간의 내용
- Code 영역: 운영체제는 자원을 효율적으로 관리하는 일, 사용자에게 편리한 인터페이스를 제공하는 역할을 함.
- 이외에도 많은 기능들이 코드로써 들어오게 된다.
- Data 영역: 운영체제가 직접 하드웨어를 관리하기 때문에 각 하드웨어를 관리하기 위한 자료구조가 존재함.
- 이것들을 추상화하여 나타낸 모양임.
- 운영체제는 각 프로세스를 관리하므로 프로세스마다 운영체제가 관리하고 있는 자료 구조도 필요함.
- 이것을 PCB(Process Control Block)이라고 함. 다음 챕터에 나옴.
- Stack 영역: 커널 코드도 함수 구조로 짜여져 있으므로 스택영역이 필요함.
- 각 프로세스마다 시스템 콜로 커널을 실행할 수 있으므로, 어떤 프로세스가 커널 호출했는지 구분 필요.
- 따라서 커널 스택 영역에는 사용자 프로그램마다 커널 스택이 따로 존재함.
사용자 프로그램이 사용하는 함수
- 함수(function)
- 모든 프로그램은 다 함수 구조로 짜여져 있음
- 함수에는 3가지 종류가 있음.
- 사용자 정의 함수: 자신의 프로그램에서 정의한 함수
- 라이브러리 함수: 자신의 프로그램에서 정의하지 않고 갖다 쓴 함수
- 사용자 정의 함수, 라이브러리 함수 둘 다 자신의 프로그램의 실행 파일에 포함되어 있음
- 프로그램 실행파일에 커널 함수가 없으므로 시스템 콜로 CPU 제어권을 넘기는 것임. 네가 해줘!
- 커널 함수: 운영체제 프로그램의 함수. 커널 함수의 호출 = 시스템 콜
프로그램의 실행
- User mode: 프로그램이 직접 CPU 잡고 있음
- 사용자 정의 함수를 사용해도 여전히 User mode 안에서 돌아감
- System call을 하게 되면 운영체제 커널의 주소 공간에 있는 코드가 실행됨
- 그 때는 커널 모드에서 CPU가 동작중임.
- 시스템 콜이 끝나면 A 프로그램에 CPU 제어권이 돌아오고 본인의 주소 공간에 있는 코드 실행됨.
- 경우에 따라서 라이브러리 함수를 호출하지만, 여전히 자신의 주소 공간에 있는 코드가 실행됨.
- 또 시스템 콜이 이뤄지면 CPU 제어권이 또 커널로 넘어가고, 커널 주소 공간의 코드가 실행됨.
- 프로그램은 계속 유저 모드, 커널 모드가 반복됨.
- 위의 그림은 인터럽트나 타이머 등은 배제한 그림임
Comments