2008년 4월 28일 월요일

REDBOOT (ver. smdk2410)

 
<< REDBOOT 소스 분석 >>



시스템이 시작되는 곳

arm.ld 소스보기





exception handler 중 reset_vector

vector.S 소스보기





platform마다의 다른 설정(arm9/smdk2410에 맞게 설정)
hardware에 dependent하다.

Hal_platform_setup.h 소스보기





memory management unit 초기화 및 TTB, virtual memory 설정

Smdk2410_misc.c 소스보기

2008년 4월 16일 수요일

프로세스 스케줄링

 


1. 스케줄링

스케줄링의 대상: ready/running상태에 있는 프로세스와 스레드. (kernel process는 스케줄링의 대상이 아님)

스케줄링 queue = ready queue (blocked queue에 있는 것은 스케줄링의 대상이 아님)

스케줄링 = 프로세스를 선택하는 스케줄링 알고리즘 + context_switch(디스패처)

종류: 장/단기 스케줄링, 선점/비선점 스케줄링



2. 스케줄링 알고리즘

­ 시스템의 형태에 따라 기준이 달라진다.

­ 기준의 평균치 최적화와 편차의 최소화를 고려하여 공평하게 해야한다.


선점/비선점 스케줄링

선점 스케줄링: running process로부터 CPU를 뺏을 수 있다. time slice나 priority에 의해서.

ex. Round-robin, Multi-level Queue, Multi-level feedback Queue

비선점 스케줄링: CPU를 빼앗지 못함. time slice가 없고, blocked될 때 CPU를 반환한다.

ex. FCFS(FIFO), SJF, priority algorithm,



3. 비선점 스케줄링

가. FCFS 스케줄링

­ 프로세스 도착순서대로 CPU를 배정한다.

­ 단점: 호위 효과 문제(긴 작업을 수행 하느라 여러 개의 짧은 일이 대기하는 비효율적인 상태)

­ 사용: 장기스케줄러, time slice를 적용하지 않는 시분할 시스템


나. SJF 스케줄링

­ 최단시간이 걸리는 작업에 CPU를 우선적으로 배정한다.(Shortest Job First)

­ 평균대기시간(waiting time)에 있어서 가장 효율적인 알고리즘.

­ 단점: 모든 프로세스의 CPU요구시간을 알기가 어려움, 단기 스케줄링 단계에서 구현하기 어려움

­ 사용: 장기스케줄링을 하는 일괄처리 시스템(작업시간의 제한을 줄 수 있다).


다. 우선순위 알고리즘 스케줄링

­ 각 프로세스 마다 가지고 있는 우선순위를 가지고 우선순위가 가장 높은 프로세스에게 CPU를 할당

­ 우선순위가 같은 경우 FCFS로 처리된다

­ SJF는 우선순위 알고리즘의 특수한 형태이다.

­ 내부적 우선순위: 제한시간, 기억장소 요구량, 사용하는 파일 수, 평균 CPU 버스트, 입출력 시행 비율

­ 외부적 우선순위: 사용료, 정책적인 변수

­ 단점: 기아 발생 (에이징으로 해결할 수 있다)



4. 시분할 시스템의 선점 스케줄링

1) time slice를 소진하여 CPU를 반납하거나 높은 priority의 프로세스에게 CPU를 빼앗긴다.

2) 연산위주 프로세스(CPU bound)/입출력위주 프로세스(I/O bound)에 따라서, 평균 CPU 반환시간(CPU burst)에 따라서, 실시간 프로세스/일반 프로세스에 따라서 동적 우선순위를 가진다.

3) I/O bound process에게 더 높은 우선순위를 주고, 실시간 프로세스에게 더 높은 우선순위를 준다.

4) time slice는 너무 작으면 context_switch overhead가 커지고, 너무 크면 비선점 스케줄링(FCFS)이 될 수 있으므로 평균 CPU 반환시간보다 약간 큰 것이 좋다.

5) non-preemptible kernel의 경우 선점 스케줄링을 사용해도 커널 모드에서는 선점이 일어나지 않는다.


가. Round Robin 스케줄링

­ 실행중인 프로세스가 time slice를 다 쓰면 ready queue의 맨 뒤로 보낸다.

­ time slice를 다 쓰지 않았더라도 I/O 요청을 하면 blocked되고 CPU를 반납한다.

­ 우선순위가 같은 프로세스들끼리의 스케줄링이며 priority가 높은 프로세스는 우선된다.

­ 시분할 시스템을 위해 고안


나. 다단계 Queue 스케줄링

­ 우선순위마다 ready queue를 가지고 있다.

­ 일반적으로 fixed priority를 가지며 같은 level의 queue에서는 RR이나 FCFS를 사용한다.

­ 시스템형, 대화형, 일괄처리 등의 프로세스 성격에 따라 우선순위를 부여한다.


다. 다단계 Feedback Queue 스케줄링

­ fixed priority가 불공평성이 있으므로 kernel이 상황에 따라 priority를 조정한다.

­ time slice를 소진해서 CPU를 반납할 경우 priority를 떨어뜨린다. (CPU bound process)

­ CPU를 많이 사용할수록 priority가 낮아지는 특징이 있다.

­ 너무 오랫동안 CPU를 사용하지 못한 프로세스의 priority를 올려주기도 한다.

­ priority가 낮을수록 CPU를 많이 사용하는 프로세스이므로 경우에 따라서 time slice를 많이 줄 수도 있다.



5. Linux의 스케줄링 정책

가. SCHED_OTHERS (일반 사용자 프로세스)

­ time slice 존재, dynamic priority(kernel이 resource의 효율적 이용을 위해서 임의로 바꿀 수 있다)

­ real_time process는 super user만이 생성할 수 있다.

나. SCHED_RR (Round Robin)

­ time slice 존재. fixed priority(우선순위를 바꾸는 것이 가능하기는 하나 kernel이 임의로 바꾸지는 않음)


다. SCHED_FIFO

­ no time slice, fixed priority

☆ 아무튼 priority가 높은 process에게 CPU를 빼앗긴다 ☆


라. 그 외 특징

­ Linux에서는 blocked된 시간으로 priority를 조정하지만 Unix는 blocked된 이유로 priority를 조정한다.

­ 실시간 프로세스는 매우 높은 priority를 가지며 fixed priority를 가진다. (다단계 queue 스케줄링)

­ 커널 모드 프로세스는 커널에서 blocked되었다가 ready가 되면 resource를 차지하고 있는 것이므로 priority를 높여준다. (빨리 resource의 사용을 끝낼 수 있도록)

­ 사용자 모드 프로세스는 Blocked되었다가 돌아오면 그 동안 CPU를 사용하지 못했으므로더 높은 priority를 가지게 된다.


마. 예) clock interrupt 처리

­ clock interrupt는 slow interrupt이므로 두 단계로 나눠서 처리된다.

­ 그러므로 do_irg()함수를 수행하면 do_timer()함수와 timer_bh()함수를 호출하게 된다.

1) do_timer()함수

­ clock interrupt handler의 irq handler부분으로 interrupt를 disable시키고 동작하며 진짜 해야할 중요한 일들만을 처리

­ jiffy값을 증가시키고 하위처리기가 수행되도록 mask를 set하고 return한다.

2) timer_bh()함수

­ interrupt처리는 끝났지만 softirq 부분 처리가 남았으므로 bottom half 부분을 수행.

­ interrupt enable상태에서 동작.

­ 다른 interrupt나 system call보다는 우선순위가 낮으나, user process보다는 우선순위가 높다.



운영체제 구조

 


1. 커널

메모리에 항상 상주하며 process가 요청하는 일을 빠르게 처리해준다.

private같은 존재로 system call등의 member function을 통해 접근한다.


가. 커널의 기능

1) process(thread) management

2) processor management(scheduling)

3) memory management: process의 공간(text, data, stack, heap)할당 및 회수 (동적메모리도 관리한다)

4) device driver(interrupt handling): power fault > clock interrupt > I/O device

5) IPC: local 및 network와 distributed까지

6) file system

7) system 보안 및 보호


나. 커널의 종류

Monolithic kernel: 한 덩어리 커널. 커널안에서 할 일이 매우 많다.

1) 장점: 시스템 호출에 의한 서비스가 빠르다.

2) 단점: 운영체제 기능 변경 시(device driver 추가 등) 커널 컴파일이 필요. 이식성이 떨어짐.

Micro kernel: 커널에서 아주 필수적인 요소만 뽑아 크기를 줄여 만든 것

1) network, 다양한 IPC, file system, interrupt가 빠졌다. (매우 기본적인 것만 제공) 필요하다면 process로 만들어서 사용할 수 있다.

2) 장점: 다양하게 사용가능(확장성, 재구성 용이), 임베디드 시스템에 많이 사용, size가 작다, 메시지 전달만을 한다.

3) 단점: process가 많아지면 단지 function을 호출하는 monolithic커널과 달리 메시지 전달이 많아지므로 느리다.



2. 프로세스

현재 실행되고 있는 프로그램을 말한다.

각 프로세스는 상태와 context를 가진다.


가. 프로세스의 상태

1) Ready: CPU를 할당받기를 기다리고 있는 상태, 언제든 수행될 준비가 되어있다.

2) Blocked: request 혹은 원하는 event가 끝날 때까지 기다리고 있는 상태.

3) Running: CPU를 할당받아 현재 수행되고 있는 상태.

4) 상태전이: ready상태에 있던 프로세스가 scheduling을 받으면 cpu를 할당받아 수행하며 running상태로 바뀐다. running상태의 프로세스는 time slice를 모두 소진하면 ready상태로 다시 넘어가며, 수행 중에 I/O 요청이 들어오거나 어떤 event나 메시지를 기다려야 한다면 cpu를 넘기고 blocked상태로 간다. blocked상태에 있는 프로세스는 I/O작업이 끝나거나 기다리던 event가 발생하면 ready상태로 가서 다시 scheduling받기를 기다린다.


나. 프로세스 관리: 모든 프로세스는 PCB를 가지고 있다. (pid, uid, file info, priority, state, memory info, context 등을 저장하고 있음)


다. 프로세스 문맥(context)

1) user-level: text, data, stack영역

2) system-level: PC를 포함한 각종 register, resource사용정보, process관리정보

3) context switch

- CPU를 할당받거나 반납할 때, CPU가 다른 프로세스에게 할당되게 되는데, 이전에 수행시키던 프로세스의 context를 보존하고 새로 실행될 프로세스의 context를 활성화 시키는 것.

- 이전에 context_switch가 일어났던 곳에서 재개된다.

☆ Process는 kernel에서 죽고 kernel에서 살아난다. ☆


라. 프로세스 관리: ready queue와 block queue 안에서 관리된다.



3. 인터럽트 처리(interrupt handler)

가. Disk Interrupt Handler

1) 주요기능: 입출력이 완료된 프로세스를 ready상태로 만들어 ready queue로 옮기고 다음 입출력 요청을 수행하도록 시킨다.

2) handling과정: 이전에 수행 중이던 프로세스의 문맥을 저장하고 interrupt mask를 세팅한 후, I/O queue의 맨 첫 번째에 들어있는 block을 꺼내고, blocked queue에 들어있는 PCB를 가져와서 ready상태로 바꾸어주고 ready queue에 넣는다. 만약에 I/O queue에 요청이 남았다면 입출력을 시킨다.


나. Clock Interrupt Handler

1) 주요기능: 시간에 관련된 서비스 제공, 주기적인 system의 일, time slice 업데이트, system 시간 유지

2) handling과정: system time을 업데이트하고 timeout함수를 호출하고, 깨워줄 process가 있다면 그 process를 깨워준다. time slice가 다 되었다면 scheduling flag를 세팅해두고 후에 interrupt handling을 끝내고 빠져나올 때 flag를 검사해서 scheduling이 필요하다면 context_switch를 호출한다.


☆ Interrupt Handling 도중에는context_switch는 없다 ☆

→ kernel mode에서는 time slice에 의해 수행이 중단되지 않으며 스스로 cpu를 반납하기 전에는 context_switch가 없다. 그러나 real time process가 생길수도 있으므로 2.6버전부터 preemptible kernel이 생겼다.



출처: 운영체제개념 발췌

컴퓨터 구조



1. 입출력시스템

가. 입출력 시스템의 구성 요소

Interface

API(application과 device driver사이)

H/W interface(device driver와 device controller사이)

Device Driver(OS와 Device Controller사이)가 존재

Device Controller: 상태/명령/자료 레지스터를 가지고 있고 buffering수행

Device Driver: API를 통해 접근가능하며 세부사항(controller등)을 숨긴다.

나. 입출력 시스템의 구성

최상위 계층에는 응용프로그램(application)이 있고, 운영체제 커널에는 device driver들이 있다. application은 API를 이용하여 device driver에 접근할 수 있고, device driver는 h/w interface를 통해서 controller에 연결되고, controller는 입출력 장치에 연결된다. 각 device는 controller를 사용하여 data Bus와 address에 연결된다.



2. 인터럽트시스템

1) busy waiting의 CPU낭비를 줄이기 위한 개념

2) controller가 입출력이 끝나면 interrupt를 발생시켜 CPU에게 완료를 알려주고, buffer에 있는 다음 일을 제공한다.


가. 인터럽트 처리루틴

1) 인터럽트가 발생하면 현재 진행 중인 프로세스는 즉시 중단되고 인터럽트를 처리를 하기 위해서 현재의 PC 및 사용하던 register들을 저장한다.

2) 인터럽트 Mask를 설정한다. 상위 우선순위를 가지는 interrupt는 켜고, 하위는 끈다. 인터럽트 Mask를 설정할 때는 interrupt disable상태에서 수행하고, 설정이 끝나면 interrupt enable 상태로 돌려놓는다.

3) interrupt handler로 넘어가 interrupt를 처리한다. (interrupt vector table사용)

4) interrupt 처리가 끝나면 이전에 보존된 register의 내용을 복구하거나 누적된 다른 interrupt를 처리한다. 보존된 register의 내용을 복구할 때도 interrupt disable상태에서 수행한다.


나. Linux의 interrupt

fast interrupt: interrupt handling이 간단하고 쉽다.

        ex. keyboard

slow interrupt: interrupt handling이 길다

        ex. RTC(clock interrupt)

→ 두 부분으로 나누어 처리한다(interrupt 처리는 길지 않아야 하고 최대한 빨리 끝내야 한다).



3. 장치경영(Driver management)

가. 접근방식에 의한 분류

1) 격리형 입출력 방식(isolated I/O): 특수한 입출력 명령어 사용

2) 메모리 사상형 방식(memory-mapped I/O): controller의 register를 특정 메모리에 저장. 메모리에 읽고 쓰는 연산만으로 I/O instruction을 사용할 수 있다. 사용이 용이하고 명령어 개수를 줄일 수 있어 많이 사용한다.

나. 제어방식에 의한 분류

1) Polling: busy waiting방식

2) Interrupt: 입출력이 진행되는 동안 cpu가 다른 일을 수행할 수 있으며 입출력의 효율을 높여주고 전체적으로 시스템 자원의 활용도가 높아진다.

다. 자료전달방식에 의한 분류

DMA와 non-DMA가 있다



4. I/O 프로세스의 처리

동기입출력(synchronous I/O): 다음 명령어 수행에 관련이 있는 I/O는 하고 가야하기 때문에 입출력 완료시까지 대기한다.

비동기입출력(asynchronous I/O): 입출력 완료시까지 기다리지 않고 즉시 return하여 다른일을 수행한다. cpu와 I/O device를 동시에 사용할 수 있다.

I/O Controller의 일

1) I/O가 끝나면 process를 block상태에서 ready상태로 바꿔주고 ready Q에 넣어줌.

2) 하나의 I/O가 끝나면 I/O Queue에서 대기하고 있던 다음 request를 실행하게 한다.



5. 하드웨어에 의한 보호

가. Dual Mode

1) CPU의 등급을 User Mode/Kernel Mode 두 가지로 사용한다.

2) 어떤 instruction은 Kernel Mode에서만 돌아가며 이것을 특권명령어라 한다. (ex. I/O명령어, 메모리 protection설정, fault-cpu stop)

3) 자원보호와 커널보호를 위해 dual mode를 사용한다.

4) 단점: Kernel/User Mode일 때 instruction과 memory영역이 다르다. → overhead발생

5) 임베디드 시스템의 경우 dual mode를 사용하지 않는다. (빠르긴 하지만 디버깅이 힘들다)

6) User Mode에서 Kernel Mode로 전환될 때: system call, interrupt, fault/exception 시

나. Time Slice

1) CPU 독점 방지.

2) clock interrupt가 발생할 때마다 시간을 계산하여 cpu를 나누어 쓴다.

다. 이 외에 메모리보호, I/O보호 등이 있다.

보호mode는 user mode에서만 동작하며 kernel mode에서는 어느 부분도 접근할 수 있다.

ex. segmentation fault 등



6. 기억장치의 계층

Register - Cache - Memory - 자기Disk - 광Disk - 자기Tape

1) 속도, 가격, 용량에 의한 계층

2) 성능개선을 위하여 Cache나 Buffering사용

3) Cache 사용 시, replacement알고리즘 필요

4) 일관성의 문제 발생


출처: 운영체제개념 발췌