본 게시물은 운영체제 과목의 강의영상과 강의자료를 바탕으로 작성한 학습용 게시물입니다.
커널과 시스템 호출
# 커널 vs. 시스템 프로그램
- 커널
- 운영체제의 핵심부분, 메모리에 상주하는 부분
- 주로 자원 관리 및 자원 사용에 관한 서비스
- 시스템 호출을 제공 - 시스템 프로그램
- 커널 이외의 프로그램
- 운영체제 개발자가 기본적으로 제공하는 라이브러리나 운영체제 사용 도구
- ex) 편집기, 컴파일러, 디버거, 쉘, 쉘 명령어 등
# 커널
- 기능적 측면의 구성요소 - 부팅 단계의 기능
- 하드웨어 진단 및 초기화
- 디스크 상의 커널 프로그램을 메모리로 적재 - 기능적 측면의 구성요소 - 부팅 후 기능
- 프로세스 경영
- 중앙처리장치 경영
- 주기억 장치 경영
- 파일 시스템과 보조 기억장치 경영
- 시스템 클럭 경영
- 네트워크 경영
- 입출력 장치 경영
- 보안 및 정보보호 기능 - 형태적 측면의 구성요소
- 시스템 호출 함수들의 집합
: 응용 프로그램에게 제공되는 시스템 호출을 수행하기 위한 함수들의 집합
- 인터럽트 처리기의 집합
: 시스템 클럭 및 대부분의 입출력 장치와 관계된 장치 드라이버의 핵심들이 됨
# 시스템 호출
- 파라메터 전달 방법
- Linux, Solaris → 레지스터를 통한 주소 전달
: 메모리 상의 블록이나 테이블에 파라메터 값을 기록하고 시작 주소를 레지스터에 기록하면 커널에서 레지스터 상의 주소를 얻어 파라메터에 접근
- 다른 방식 → 스택 활용
: 스택에 파라메터 값을 Push하면 커널에서 Pop - 시스템 호출 실행
: 시스템 호출 번호를 파라메터 전달용 레지스터와는 다른 CPU 내 레지스터에 기록하고 소프트웨어적인 인터럽트인 트랩 명령어(소프트웨어 인터럽트)를 실행 - 국제 표준 - POSIX
# 응용프로그램의 입출력 관점 - 동기식 vs. 비동기식
- 응용 프록램이 장치를 사용하는 관점의 문제
- 동기식 (blocking call)
- 입출력을 시작시키고 끝날 때까지 대기
- 대기하는 동안 CPU를 다른 프로세스가 사용
- read 후 넘어오면 다음 라인 실행, read가 실행되는 동안 멈춰있음 - 비동기식 (non-blocking call)
- 입출력을 시작시키고 바로 다음 연산을 수행
- 입출력이 이루어지는 동안 자신도 CPU를 사용할 수 있음
- 프로그램에게 입출력 종료를 알려주는 방법이 필요 ㅣ 이벤트
입출력 시스템
- 커널과 입출력 장치의 인터페이스
- Device driver가 Device Controller를 통해, 장치를 제어 ㅣ HDD
- 레지스터
- 명령 레지스터 : 장치가동을 위한 명령 코드 적재
- 상태 레지스터 : busy/done 플래그, 오류코드 표현
- 자료 레지스터 : 장치 내의 하드웨어 버퍼
# 세 종류 인터페이스
- 응용 프로그램과 커널 사이 → 시스템 콜
- 커널과 장치제어기 사이 → HW인터페이스
- 장치 생산업체에서 제공
- 디바이스 드라이버는 시스템 콜을 하드웨어 기능으로 번역해 HW 인터페이스를 통해 장치 제어기에 전달 - 커널과 디바이스 드라이버 사이
- 디바이스 드라이버가 바뀔 경우 커널 전체를 recompile 할 수는 없는 노릇
- 장치 업체의 다변화로 장치구동기와 커널의 인터페이스를 표준화해 필요한 드라이버만 재구성할 수 있도록 함
: plug & play
# HW 인터페이스
- 장치 경영 방식
- 접근 방식에 의한 분류 (레지스터 접근 방식)
: 격리형 / 메모리 사상형
- 자료이동 방식에 따른 분류
: 직접 입출력 방식 / DMA
- 제어 방법에 의한 분류 (제어기 상태 변화 전달 방식)
: 폴링(polling) / 인터럽트
# 레지스터 접근 방식
- 격리형 입출력 (Isolated I/O , I/O mapped I/O )
- 하드웨어 구조상 주변장치를 위하여 메모리와는 별도의 주소공간 사용
- 제어기 레지스터 접근을 위해 하드웨어에 특화된 특수한 입출력 명령어 사용
- 장점 : 입출력이 메모리 주소 공간의 크기나 할당에 영향 x
- 단점 : 메모리 접근 명령어와는 별도의 입출력 명령어를 사용하게 되어 프로그래밍의 일관성이나 이식성 ↓ - 메모리 사상형 (Memory-Mapped IO) 입출력
- 장치를 위한 별도의 주소 공간과 명령어를 정의하지 않고 메모리의 논리적 주소 공간에 제어기의 레지스터를 사상(mapping)
- 별도의 주소 공간과 입출력 명령어가 필요 없고 기존의 메모리 접근을 위한 명령어를 사용
- 장점 : 명령어 개수 ↓, 일관성과 이식성 좋음
- 단점 : 입출력을 위해 메모리의 일부를 사용하므로 메모리 영역 ↓(큰 손해는 x)
# 자료 이동 방식
- 직접 입출력
- CPU가 메모리와 제어기의 자료 레지스터 사이의 자료 이동을 직접 관장
- 장점 : CPU가 입출력을 동시에 처리할 수 있음
- 단점 : 매 입출력을 위해 인터럽트를 처리해야 함 (블록장치의 경우에는 문제)
-> DMA 방식으로 개선 - DMA ( Direct Memory Access)
: CPU 도움 없이 독자적으로 메모리에 접근해 한 입출력 명령으로 많은 자료를 입출력/전송
- 한 블록의 입출력 완료 시 한번만 인터럽트 발생시켜 빈도 수 ↑
# 제어 방법에 의한 분류
- 폴링 방식 - 인터럽트와 비교할 때 대기 방식에 해당
1. 응용 프로세스로부터 입력이 요청됨
2. 장치구동기가 장치제어기의 명령 레지스터에 명령어 적재 → 장치 가동
3. 상태 레지스터가 busy 상태에서 done으로 바뀔 때까지 대기
4. done이 되면 제어기의 자료레지스터 내용을 응용 프로세스 공간으로 복제
- 루프를 사용해 제어기 상태를 체크하는 것은 CPU 낭비
- 인터럽트가 제공되지 않는 장치의 경우 일정시간 주기적으로 제어기 상태 조사 필요 - 인터럽트 방식
- (인터럽트가 발생하면)
1. (중단) 현재 진행중인 프로세스 또는 하위의 ISR 수행을 즉시 중단
2. (문맥보존) 프로그램 카운터 및 CPU 레지스터 값들을 보존
3. (마스크설정) 현재의 인터럽트에 해당하는 마스크를 설정해 자신보다 하위 인터럽트가 먼저 처리되지 않도록 함
4. (ISR 진입) 현재의 인터럽트에 해당하는 ISR로 제어를 넘김
- (인터럽트 처리가 끝나면)
: 인터럽트 당한 프로세스 또는 수행중이던 하위 ISR을 계속 실행시키기 위해 보존된 레지스터 내용을 복구
→ 운영체제의 결정이 필요
인터럽트
# 다수준 인터럽트와 인터럽트 마스크
- 시스템의 모든 장치에 대해 비트번호를 지정
- 인터럽트 마스크를 통해 interrupt priority level 적용
- 임의 인터럽트가 들어오면 해당 인터럽트와 현재의 마스크를 비교해(마스킹) 우선순위 판단
- 상위 수준의 인터럽트가 들어오면 처리 중이던 인터럽트 처리를 임시로 중지
- ISR 시작에 앞서 인터럽트 마스크를 재설정하고, ISR 종료시 원상복구
# Fast Interrupt Handler
- Fast Interrupt
: 특별히 빠른 처리 혹은 빠른 반응을 위해 다른 인터럽트 처리를 disable ㅣ clock interrupt - Time critical 하지 않다면 일반적으로 다수준 인터럽트 적용
- clock interrupt (tick)
- 클럭 인터럽트는 time critical한 작업이지만, 타임슬라이스 관리와 스케쥴링, 주기적 작업 수행, 메모리 부족상태 검사 및 처리 등 많은 작업을 동반
- 순수 인터럽트 처리와 나머지 작업을 분리
- System Call
- read 명령 적재 (ptr함께)
- sleep() & sched()
- DMA
- Interrupt
- Jump
- sched() & Wake-up
- Copy
- Return
보호 ㅣ 하드웨어에 의한 보호
# 보호 대상
- 불법 I/O
- 불법 메모리 접근
- 무한 루프
# 이중모드와 모드비트
- 자원 공유 환경에서는 한 응용 프로그램의 오작동이 다른 프로그램의 오동작을 야기
- 불법 명령 사용, 운영체제나 타 프로그램 주소 접근, 불법 입출력 등
- 커널이나 다른 프로그램의 오동작을 야기할 소지가 있는 명령어는 커널 내에서만 수행토록 해야함
-> 이중모드 필요 - 하드웨어적으로 이중모드를 지원
- CPU의 상태 레지스터 중 1비트를 모드비트로 사용
- 모드비트 변경도 커널모드에서 특권명령어로 가능
: user mode → mode bit = 1 , kernel mode → mode bit = 0 - 사용자 모드 : 사용자 공간 상의 코드만 실행 가능
- 인터럽트나 입출력 제어와 관련된 특권명령어 수행 불가
- 특권명령어 수행 시도 시 트랩 발생
- 메모리 참조 영역도 제한 - 커널 모드 : 커널 공간 상의 코드만 실행가능, 특권명령어 사용 가능
- 사용자 프로그램의 트랩, 인터럽트 처리, 명령어 수행 오류 발생 시 발생하는 트랩 처리
- 하드웨어적인 제한이나 보호를 수행 x
# 불법 I/O 차단
- 모든 I/O 명령을 특권명령어로 함 → 시스템 호출에 의한 트랩을 통해서만 I/O 가능
- 메모리의 커널 영역 보호 수단과 함께 사용
- 인터럽트 처리 루틴 (ISR) 및 장치 구동기 영역
- 시스템 버퍼 영역
- 인터럽트 벡터 영역
# 무한 루프 방지
- 타임슬라이스를 구현함으로써 CPU 공유 실현
- 최고 우선순위 인터럽트 설정, 인터럽트 인터벌 설정 등 모두 특권 명령어로 수행 - 프로그램의 실행 시간을 제약함으로써 무한루프 수행 방지
캐시와 기억 장치 구조
# 캐시
- CPU에서 메인메모리에 접근시 그 자료를 메모리보다 속도가 빠른 캐시에 복사
# 부트스트래핑 (bootstrapping)
- 운영체제의 시동을 운영체제 일부 기능이 스스로 수행
# 모노리틱 커널 vs. 마이크로 커널
- 모노리틱 커널 ㅣ 리눅스
- 메모리 관리, 프로세스 관리, 파일 시스템 등 모든 기능을 커널 내부에 포함
- 장점 : 시스템 호출 서비스 빠름
- 단점 : 이식성 ↓, 의존성 높아져 디버깅 어려워짐 - 마이크로 커널 ㅣ CMU의 Mach
: 프로세스간 통신, 메모리관리, 클럭 인터럽트 처리와 CPU 스케쥴링 등 아주 핵심기능만을 커널에 포함시키고 나머지는 서버 형태로 두어 사용자 모드의 프로세스로 수행
- 장점 : 유연성 좋음 , 소형 내장형 시스템 활용에 유리
- 단점 : 문맥교환과 메시지 전송이 빈번해져서 속도 ↓
'LECTURE > [2021-1] 운영체제' 카테고리의 다른 글
[운영체제] 6. 상호작용 프로세스와 동기화 (0) | 2021.06.17 |
---|---|
[운영체제] 5. 실시간 스케쥴링 (0) | 2021.06.17 |
[운영체제] 4. 프로세스 스케쥴링 (0) | 2021.06.17 |
[운영체제] 3. 프로세스 (0) | 2021.06.15 |
[운영체제] 1. 운영체제의 태동과 발전 (0) | 2021.06.14 |