시스템 구조 및 프로그램의 실행 Part1
#.컴퓨터 시스템의 구조
-컴퓨터 : CPU + Memory(cPU 작업공간)
> CPU : Memory의 instruction 사용, interrupt line 확인 과정 반복
>> 컴퓨터 on : os가 가지고 있음
>> register : 정보를 저장하는 공간
>> mode bit : cpu 안에서 사용되는 것이 운영체제인지 사용자 프로그램인지 구분하는 것
>> interrupt line : cpu로 현재 수행 중인 모든 작업을 중지하고 다른 작업을 수행하도록 지시하는 신호
하나의 instruction 마친 후, interrupt 발견될 경우 cpu가 사용자 프로그램으로부터 자동 os로 넘어감
>> I/O device : Disk, 키보드 모니터 등등
각 I/O device 마다 device controller(작은 cpu + local buffer)
#.mode bit
- 사용자 프로그램의 잘못된 수행으로 다른 프로그램 및 운영체제에 피해가 가지 않도록 하기 위한 보호장치
-mode bit 통해 하드웨어적으로 두 가지 모드 operation 지원
> 커널 모드(모니터 모드, 시스템 모드) : os 코드 수행
>> os에서 cpu를 가지고 있는 경우
>> 모드 비트가 0 으로 세팅되어 있으며, 모든 명령 수행할 수 있음
> 사용자 모드 : 사용자 프로그램 수행
>> 사용자 프로그램이 cpu를 가지고 있는 경우
>> 모드 비트가 1 로 세팅되어 있으며, 제한된 명령 수행할 수 있음
> 보안을 해칠 수 있는 중요한 명령어는 모니터 모드에서만 수행 가능한 "특권명령"으로 규정
> interrput 나 Exception 발생 시 하드웨어가 mode bit을 0으로 바꿈
> 사용자 프로그램에게 cpu를 넘기기 전에 mode bit 1로 셋팅
#.Timer
- 특정 프로그램이 cpu를 독점하는 것을 막기 위함
> 정해진 시간이 흐른 뒤 운영체제에게 제어권이 넘어가도록 interrupt 발생
> 매 클럭 틱 때 마다 1씩 감소
> 값이 0 이 되면 timer interrupt 발생
- cpu 의 time sharing 구현하기 위해 널리 이용됨
- 현재 시간을 계산하기 위해 사용
!!간단 정리
컴퓨터 켰을 경우 : 운영체제가 cpu 가지고 있음
사용자 프로그램이 실행될 경우 timer에게 어떤 값을 설정한 후, cpu 넘겨줌
사용자 프로그램 A 이 실행
- I/O device 사용이 필요할 경우 사용자프로그램이 interrupt를 걸어서 cpu를 os에게 넘겨줌
- os가 device controller에게 해당 작업을 명령
- device controller 의 요청한 작업이 끝나기전까지 다른 프로그램 B 에게 cpu를 넘김
- 언제 다시 cpu를 얻는지 ?
- device controller 의 요청한 작업이 끝나서 interrupt를 보냄
- interrupt가 들어올 경우 다른 프로그램이 실행중이더라도 cpu 제어권 os에게 넘어감 ?
- B 프로그램의 남은 timer 만큼 돌린 후, A 프로그램을 실행 (스케줄링 종류에 따라 다름)
- device controller 의 요청한 작업이 끝나서 interrupt를 보냄
- timer 시간안에 실행이 될 경우
- cpu는 다음 instruction 을 실행
- timer 시간안에 실행되지 않는 경우
- timer에서 cpu에게 interrupt 보냄
- cpu는 실행중이던 instruction 끝낸 후 interrupt line 확인함 interrupt 확인이 되면 cpu를 자동 os로 넘김
- 다음 프로그램에게 timer 를 세팅해서 cpu를 넘겨줌
#.Device Controller
- Device Controller는 I/O 장치들을 전담하는 작은 cpu이며, 제어 정보를 위해 Controller register, status register를 가진다.
- 장치들에게 입출력할 실제 데이터를 저장하는 local buffer를 가짐
- 메인 메모리는 cpu에만 접근하고 I/O 장치에는 직접 접근하지 않는다. 각 장치들을 통제하는 것은 CPU가 아닌 Device Controller
! - I/O장치들이 너무 자주 인터럽트를 발생시키면 빠른 장치인 CPU가 성능을 발휘하지 못한다. 이를 해결하기 위해 *DMA Controller를 사용
-Device Controller(장치 제어기)는 각 장치를 통제하는 일종의 작은 CPU인 하드웨어
-Device Driver(장치 구동기)는 OS 코드 중 각 장치를 처리하기 위해 접근할 수 있는 인터페이스를 제공하는 소프트웨어
#.입출력과 인터럽트(Input- Output and interrupt)
- 사용자 프로그램이 cpu를 사용하다가 입출력이 발생하면 I/O장치에 직접 접근하지 못하고 운영체제를 통해 접근해야한다. 그러면 사용자 프로그램은 자진해서 운영체제에 입출력을 수행해달라고 CPU를 넘겨준다. => *시스템 콜(System Call)
-인터럽트란?
> 프로그램을 실행하는 도중에 예기치 않은 상황(입출력 등)이 발생할 경우 현재 실행 중인 작업을 중단하고, 발생된 상황에 대한 우선 처리가 필요함을 CPU에 알리는 것
> 입출력 연산이 CPU 명령 속도보다 현저히 느리기 때문에, 주변장치와 입출력 장치는 인터럽트 메커니즘을 통해 관리된다.
> 인터럽트는 2 가지 종류로 분류
>> 하드웨어가 발생시킨 인터럽트
>> 소프트웨어가 발생시킨 인터럽트(Trap)
>>> Excption : 프로그램이 오류를 범한 경우
>>> System call : 프로그램이 커널 함수를 호출하는 경우
-인터럽트 서비스 루틴(ISR) : 인터럽트를 처리하는 커널 함수, 운영체제의 코드 영역에는 인터럽트 별로 처리해야하는 내용이 존재 = 인터럽트 핸들러
- 인터럽트 벡터 : 인터럽트 서비스 루틴의 보관 공간, 해당 인터럽트의 처리 루틴 주소를 가지고 있다.
인터럽트 과정
- process A가 실행 중
- process A가 시스템 콜을 통해 (ex. 키보드 입력) 인터럽트 발생
- 현재 실행중인 프로세스 정보(문맥)를 저장(PCB에 저장)
- 인터럽트 백터에서 해당 ISR을 찾는다.
- 키보드 처리를 위한 ISR 주소로 변경
- 키보드 인터럽트 처리
- ISR의 끝에 IRET(Interrupt Return) 명령어에 의해 인터럽트가 해제
- IRET 명령어가 실행되면, 대피시킨 PC(Program Counter) 값을 복원하여 이전 실행 위치로 복원
#. 시스템 콜 (System call)
- 사용자 프로그램이 운영체제의 서비스를 받기 위해 부탁하는 것. 즉. 사용자 프로그램이 운영체제의 커널 함수를 호출하는 것
- 운영체제는 커널 모드와 사용자 모드로 나뉘어 구동
- 운영체제에서 프로그램이 구동되는데 있어 파일을 읽고 쓰거나, 화면에 메세지를 출력하는 등 많은 부분이 커널 모드를 사용
-시스템 콜은 이러한 커널 모드의 영역을 사용자 모드가 사용 가능하게, 즉 프로세스가 직접 접근해서 필요한 기능을 사용할 수 있게 해줌
? - 시스템 콜은 왜 필요할까?
-우리가 일반적으로 사용하는 프로그램은 응용프로그램이다.
-유저 레벨의 프로그램은 유저레벨의 함수들만으로는 많은 기능을 구현하기 힘들기 때문에, 커널의 도움을 반드시 받아야한다, 이러한 작업은 응용프로그램으로 대표되는 유저 프로세스에서 유저 모드에서는 수행 불가
-반드시 커널에 관련된 것은 커널 모드로 전환해야 해당 작업을 수행할 *권한이 생긴다. 커널 모드를 통한 이러한 작업은 반드시 시스템 콜을 통해 수행하도록 설계되어 있다.
*권한은 왜 필요한가?
-해커가 피해를 입히기 위해 악의적으로 시스템 콜을 사용하는 경우나 초보 사용자가 하드웨어 명령어를 잘 몰라서 아무렇게 함수를 호출했을 경우, 시스템 전체를 망가뜨릴 수 있기 때문
-이러한 명령어들은 특별하게 커널 모드에서만 실행할 수 있도록 설계되었고, 만약 유저 모드에서 시스템 콜을 호출할 경우에는 운영체제에서 불법적인 접근이라 여기고 trap을 발생시킨다.
- 시스템 콜 예시
- cp in.txt out.txt
-윈도우 운영체제라면 마우스가, 리눅스라면 키보드가 사용자로부터 입력을 받는데 이 때 I/O 시스템 콜을 사용
-위와 같은 문장을 입력 받아서 ‘cp’ 프로그램을 실행시키면 먼저 ‘in.txt’ 파일이 현재 디렉토리에서 접근할 수 있는 파일인지 검사하기 위해 시스템 콜을 호출
-존재하지 않는다면 에러를 발생시키고, 프로그램을 종료하는데 이 때 시스템 콜을 사용
-존재한다면, 복사한 파일을 저장하기 위해 ‘out.txt’ 파일명이 있는지 검사
-마찬가지로 이 파일 명이 존재하는지 검사하기 위해 시스템 콜을 통해 확인
파일 명이 이미 존재한다면, 덮어 씌워야 할지 아니면, 이어서 붙여야 하는지 User에게 물어볼 수 있습니다. 만약 저장하고자 하는 파일 이름이 겹치지 않다면, 파일을 저장해야 하는데 이 때도 시스템 콜을 이용합니다.