입출력 시스템 구성: 장치 구동기(device driver), 장치 제어기, 장치(예: HDD, SSD)
장치 구동기는 커널 안에 있음. 커널 안에서 파일 시스템이나 응용프로그램으로부터 장치구동기가 시스템콜을 받아서 장치 제어기로 명령을 내리거나 자료를 주고받음. 장치제어기는 장치를 직접 제어함.
장치 제어기 안에는 명령 레지스터, 상태 레지스터, 자료 레지스터가 존재.
- 명령 레지스터: 장치 가동을 위한 명령 코드 적재
- 상태 레지스터: busy/done 플래그, 오류코드 표현, 컴퓨터 구조
- 자료 레지스터: 장치 내의 하드웨어 버퍼
HW 인터페이스 장치 경영 방식
◦ 접근 방식에 의한 분류(장치제어기의 레지스터 접근 방식)
- 격리형(isolated I/O): 하드웨어 구조상 주변장치를 위하여 메모리와는 별도의 주소공간 사용, 제어기 레지스터 접근을 위해 하드웨어에 특화된 특수한 입출력 명령어 사용. 장점은 입출력이 메모리 공간에 영향을 주지 않는다는 것이고 단점은 메모리 접근 명령어와는 별도의 입출력 명령어로 인해 프로그래밍의 일관성, 이식성이 떨어짐.
- 메모리 사상형(memory-mapped I/O): 장치를 위한 별도의 주소 공간과 명령어를 정의하지 않고 메모리의 논리적 주소 공간에 제어기의 레지스터를 사상(mapping). 별도의 주소 공간과 입출력 명령어가 필요 없음. 단점은 메모리 영역 감소.
◦ 자료이동 방식에 따른 분류
- 직접 입출력 방식: CPU가 메모리와 제어기의 자료 레지스터 사이의 자료 이동을 직접 관장. 매 입출력을 위해 CPU가 인터럽트를 처리해야 하는 단점이 있다. => DMA(Direct Memory Access) 방식으로 개선.
- DMA: CPU의 도움 없이 독자적으로 메모리(시스템 버퍼)에 접근하여 한 입출력 명령으로 많은 자료(블록)을 입출력/전송.(Cycle Stealing - CPU와 DMA가 동시에 메모리에 접근을 요구하면 DMA에 우선권을 주고 CPU는 한 사이클을 쉬게 됨). 한 블록의 입출력 완료시 한 번만 인터럽트를 발생시켜 빈도수를 줄임.
◦ 제어방법에의한분류(제어기상태변화전달방식)
- 폴링(polling): 인터럽트와 비교할 때 대기 방식에 해당. 응용 프로세스로부터 입력이 요청됨 -> 장치 구동기가 장치 제어기의 명령 레지스터에 명령어 적재 -> 장치 가동 -> 상태 레지스터가 busy에서 done이 될 때까지 대기 -> done이 되면 제어기의 자료레지스터 내용을 응용 프로세스 공간으로 복제. 루프를 사용하여 제어기 상태를 체크하기 때문에 CPU 낭비가 심함.
- 인터럽트: 인터럽트가 발생하면 현재 진행중인 프로세스 또는 하위의 ISR(Interrupt Service Routine) 수행을 즉시 중단 -> 프로그램 카운터(PC) alc CPU 레지스터 값들을 보존 -> 현재의 인터럽트에 해당하는 마스크를 설정하여 자신보다 하위 인터럽트가 먼저 처리되지 않도록 함 -> 현재의 인터럽트에 해당하는 ISR로 제어를 넘김(즉 PC를 해당 ISR의 첫주소로 셋팅). 인터럽트 처리가 끝나면 인터럽트 당한 프로세스 또는 수행중이던 하위 ISR을 계속 실행하기 위해 보존된 레지스터 내용을 복구 * 인터럽트 : 중단 - 문맥보존 - 마스크설정 - ISR진입
하드웨어 지원에 의한 보호
보호대상: 불법 입출력(모든 입출력 명령을 특권명령어로 함 - 시스템콜에 의한 트랩을 통해서만 입출력 가능), 불법 메모리 접근, 무한루프
이중모드와 모드비트: 자원 공유 환경에서는 한 응용프로그램의 오작동이 다른 프로그램의 오작동을 야기한다. 때문에 커널이나 다른 프로그램의 오작동을 야기할 소지가 있는 명령어는 커널 내에서만 수행토록 해야 한다. => 이중모드(dual mode) 필요
- 사용자 모드: 사용자 공간 상의 코드만 실행 가능 - 인터럽트나 입출력 제어와 관련된 특권명령어 수행 불가. 특권명령어 수행 시 트랩 발생. 메모리 참조 영역도 제한.
- 커널 모드: 커널 공간 상의 코드만 실행가능하며 특권명령 사용 가능.
- 하드웨어적으로 이중모드를 지원 - CPU의 상태 레지스터 중 1비트를 모드비트로 사용한다. 모드비트 면경도 커널모드에서 특권명령어를 통해서만 가능하다.
부트스트래핑
장화에 달린 고리를 지칭. 그것을 손으로 잡아 장화를 혼자 신을 수 있게 된 것에서부터 개념이 확장되어 남의 도움 없이 자기가 직접 일을 한다는 의미를 갖게 됨. 즉, 운영체제의 시동을 운영체제 일부 기능이 스스로 수행한다는 뜻
- 모노리틱 커널: 통으로 된 커널
- 마이크로 커널: 핵심기능만 커널에 있고 나머지는 서버로 분리.
프로세스
프로세스 문맥의 구성
지역변수는 STACK, 광역변수는 DATA, 초기화하지 않은 광역변수는 bss라 함, 프로그램 코드는 TEXT, 동적할당은 HEAP
커널 수준 문맥
- CPU 내의 특수 레지스터의 내용
– 프로그램 카운터(PC)
– 스택 포인터(SP)
– CPU 상태 레지스터(PSR, Program Status Register) - CPU 내의 각종 범용 레지스터 – 일반 계산용
- 프로세스의 현재의 각종 자원 사용 정보
- 커널의 프로세스 관리 정보
프로세스 상태 천이
- 생성(new) : 프로세스가 생성된 상태
- 준비(ready) : CPU의 배정을 기다리는 상태
- 실행(running) : 프로세스가 CPU에 의해 실행되고 있는 상태
- 대기(blocked) : 프로세스가 어떤 사건(event)이 발생하기를 기다리고 있는 상태 (사건의 예 : 입출력의 완료 또는 시그널의 접수)
- 종료(terminated) : 프로세스가 종료된 상태
프로세스 제어 블록(PCB): 프로세스의 일생 동안 해당 프로세스의 모든 정적 및 동적 정보를 가짐. 커널이 프로세스를 관리하기 위한 실체 = 커널은 PCB를 통해 프로세스 관리.
준비리스트나 대기리스트는 결국 PCB의 리스트임. => 실행상태 시 PCB는 준비리스트에 존재하며, 상태표시만 RUNNING 상태로 변경.
fork() 시스템콜을 통해 프로세스 생성, exit() 시스템콜을 통해 자신의 종료를 요청. 생성한 프로세스와 피 생성된 프로세스는 부모 자식 관계 -> 전체적으로 프로세스 트리가 구성됨. abort() 시스템 콜을 통해 다른 프로세스의 종료 요청. - 부모 프로세스만 가능.
부모 프로세스가 fork()를 호출하지만 fork()로부터의 리턴은 부모 프로세스와 자식 프로세스 두 곳으로 리턴이 일어남. 단, fork()의 리턴 값이 서로 상이: 부모 프로세스에게는 자식 프로세스의 고유번호(PID)가 리턴되고, 자식 프로세스에게는 0이 리턴 됨
쓰레드: TEXT만 공유하는 프로세스와 달리 STACK 빼고 모두 공유. - 시간적 오버헤드와 메모리 낭비가 적음. 전역변수를 쓰레드 간 자료교환 수단으로 활용.
스케줄링
스케줄링이 일어나는 경우: 다음 실행시킬 프로세스의 선정이 필요한 경우 - 현재 실행상태에 있던 프로세스가 다른 상태로 천이하게 되면 그 다음으로 실행시킬 프로세스를 선정하기 위해 스케줄링이 일어남. 스케줄링 대상은 준비리스트에 들어있는 프로세스에 한한다.
슼