'Education'에 해당되는 글 58건

  1. 2010.06.28 스레드 컨텍스트 스위치 시점 알 수 있는 방법 by 초상큼발랄
  2. 2010.06.27 geekos by 초상큼발랄 3
  3. 2010.06.22 Android Amulator 설치 by 초상큼발랄 4
  4. 2010.06.22 Android Error - The project cannot be built until build path errors are resolved by 초상큼발랄
  5. 2010.06.21 JDK 설정 by 초상큼발랄
  6. 2010.02.05 인터럽트 by 초상큼발랄
  7. 2009.12.11 chapter 7. Memory by 초상큼발랄 2
  8. 2009.11.24 리눅스 c++ 컴파일 by 초상큼발랄 2
  9. 2009.11.24 Triangle & Rectangle program code by 초상큼발랄
  10. 2009.11.24 피보나치 수열 by 초상큼발랄 2
컨텍스트 스위칭
CPU 할당 시간을 얻게 되는 프로세스가 메인 메모리로 올라가고, 이전에 실행되던 프로세스는 메모리에서 내려와야 한다.
CPU 할당 시간을 얻게 되는 프로세스가 변경되는 시점에서 거쳐야 하는 몇몇 과정이 있다.



Thread가 스위칭되는 시점은 다음과 같은 경우가 있습니다.

1. I/O function이 호출되어 해당 I/O의 응답을 기다려야 할 때
HDD, Network등에서 I/O 작업을 만났을 경우입니다. fopen, fread, fwrite는 해당 디바이스가 명령의 처리를 완료하는 시점이 되어야 다음 코드로 넘어 가기 때문에 이러한 function에서 Thread 스위칭이 일어 납니다.

2. OS에서 제공하는 Thread 관련 API를 호출할 때
Sleep, WaitForSingleObject, WaitForMultipleObjects, EnterCriticalSection 등 OS에서 제공하는 (엄밀히 말해서 CPU가 제공해 주는 atomic한 기능을 OS에서 wrapping한) API를 호출할 경우에도 Thread 스위칭이 일어나 수 있습니다.

3. 메모리 사용에 있어서 Memory Page Fault 가 났을 때
메인 메모리가 부족한 경우 HDD를 메모리의 대체제로 사용하죠. 이 경우 특정 메모리를 접근하게 될 경우 만약 Memory Page Fault가 나는 영역이라면 OS는 Memory-HDD 간의 swapping을 해줘야 합니다. 코드상으로는 메모리를 접근하는 것이겠지만, 실제로는 HDD를 access하는 것이죠. 이 경우에도 Thread 스위칭이 일어 납니다.

4. 해당 Thread의 Time Slice가 다 했을 때
while (true) ; 와 같이 무한 루프라 하더라도 OS가 해당 Thread에게 할당해 준 임의의 시간을 경과해서 계속해서 CPU을 점유하게 되면, OS가 알아서 실행 권한을 뺏어 옵니다. 이 경우에도 Thread 스위칭이 일어날 수 있습니다.

통상적으로 1~2번은 Thread의 스위칭 여부를 코드상으로 알아낼 수는 있지만, 3~4번은 코드로 판별하기가 어렵습니다.


출처 : http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=50&MAEULNO=20&no=821991&ref=821991&page=2

'Education > Operating System' 카테고리의 다른 글

운영체제  (2) 2011.03.11
이벤트 드리븐  (0) 2010.06.28
geekos  (3) 2010.06.27
chapter 7. Memory  (2) 2009.12.11
명령어 수행  (2) 2009.10.22
Posted by 초상큼발랄
l

geekos

Education/Operating System 2010. 6. 27. 12:58

'Education > Operating System' 카테고리의 다른 글

이벤트 드리븐  (0) 2010.06.28
스레드 컨텍스트 스위치 시점 알 수 있는 방법  (0) 2010.06.28
chapter 7. Memory  (2) 2009.12.11
명령어 수행  (2) 2009.10.22
Interrupt  (2) 2009.10.22
Posted by 초상큼발랄
l

 

Android Plugin 설치
 이클립스에서 "Help -> Install New Software..." 메뉴를 선택
 "Add" 버튼을 선택 한 후 다음과 같이 등록
  Name : Android
  Location : http://dl-ssl.google.com/android/eclipse/

 "Developer Tools"의 모든 Plugin을 설치
  정상적으로 설치가 되면 "Window -> Android SDK and AVD Manager" 메뉴가 보인다.
Android SDK 설치 

 http://developer.android.com/ 사이트에서 "SDK" 탭을 선택 한 후 "android-sdk_r3-windows.zip" 파일을 다운로드 

 다운로드 받은 파일의 압축을 풀어 D:\[T]_Android Install\android-sdk_r05-windows\android-sdk-windows 폴더에 저장  

 "Window -> Preferences -> Android" 메뉴를 선택 

 "SDK Location"에 "D:\[T]_Android Install\android-sdk_r05-windows\android-sdk-windows"를 지정

 "Window -> Android SDK and AVD Manager -> Available Packages" 메뉴를 선택

 모든 설치 가능한 Packages를 선택 하고 하단의 "Install Selected" 버튼을 선택하여 설치


Android용 Virtual Device 생성 

 "Window -> Android SDK and AVD Manager -> Virtual Devices" 메뉴에서 "New..." 버튼을 선택

 다음과 같이 설정한 후 "Create AVD" 버튼을 선택
          Name : Android_Device_2.1
          Target : Android 2.1 - API Level 7
          SD Card
          Size : 1024 MiB
  "Window -> Android SDK and AVD Manager -> Virtual Devices" 메뉴에서 실행할 AVD를 선택 한 후 "Start" 버튼을 선택 하면 Virtual Device를 실행
  주의: OS에서 한글 계정으로 로그인한 경우 제대로 동작하지 않을 수 있다. 사실 한글 계정은 여러곳에서 문제가 됨 

 


emulator: ERROR: bad config: virtual device directory lacks config.ini
emulator: could not find virtual device named 'test_avd_1_6'

위와 같은 오류가 발생하는 이유는, 
컴퓨터의 사용자 이름이 한글이기 때문에 경로 인식을 못해서 오류가 생긴다고 한다.

오류가 발생하는 순서는 아래와 같다.

1. AVD Manager를 실행한다. 현재 AVD가 하나도 없는 상태이다.

 

test 라는 이름의 AVD를 하나 만든다.

 우측의 "Start..." 버튼을 눌러서 AVD를 시작해보자. 시작 옵션 팝업이 뜨면 "Lanunch" 버튼을 클릭


AVD를 실행하였는데 오류가 발생하였다. "Close"버튼을 누르고 창을 종료



결과를 보면, AVD의 Path에 한글이 포함되어 있는 것을 알 수 있다.


한글이 없는 경로로 AVD 파일을 옮겨보자.
C 드라이브에 아래와 같이 AVD 파일을 관리할 디렉토리를 생성한다.
 c:\android_avd\sdk_2.1

이제 AVD 파일을 옮기는 명령을 아래와 같이 입력한다.
(아래 명령은 android SDK설치 디렉토리를 환경변수로 설정한 것을 가정으로 한 것임)
붉은 색으로 표시된 부분이 AVD 이름이다.
 android move avd -n test -p c:\android_avd\sdk_2.1\test_avd_2_1

 

 실행되는 중이다. 기다리자


오예~~



굳굳굳!!!

'Education > Android' 카테고리의 다른 글

Android 2.2 Froyo 소스  (0) 2010.08.04
Android 환경 설정  (1) 2010.07.20
Android Error - The project cannot be built until build path errors are resolved  (0) 2010.06.22
JDK 설정  (0) 2010.06.21
안드로이드 실행  (1) 2009.10.13
Posted by 초상큼발랄
l

 " The project cannot be built until build path errors are resolved " 라는 에러 발생


자바 패스를 잡을때 안드로이드 패키지를 먼저 잡지 않고 자바의 패키지를 잡아서 발생하게되는 에러로서

간단히 해결이 가능하다.이클립스 메뉴 Project - Properties 에서 Java Build Path - Order and Export 탭의 항목을

보면 
Android 2.1 (혹은 다른 버전)이 체크되어 있지 않는데 이를 선택한 다음 우측의 Up 버튼을 눌러서 최상단으로

올리고 OK 를 눌러주면된다.

'Education > Android' 카테고리의 다른 글

Android 환경 설정  (1) 2010.07.20
Android Amulator 설치  (4) 2010.06.22
JDK 설정  (0) 2010.06.21
안드로이드 실행  (1) 2009.10.13
안드로이드 설치  (2) 2009.10.13
Posted by 초상큼발랄
l

JDK 설정

Education/Android 2010. 6. 21. 20:37

1. http://java.sun.com/ 사이트에 접속한다.

 

2. Downloads > Java SE 를 선택한다.

 

 

 

3. Java Download 아이콘을 클릭한다.

 

 

4. Plaftform 을 적당히 선택하고 Download 버튼을 클릭한다.

 

 

 

5. Log In for Download 창이 뜨면 하단의 Skip this Step 을 클릭한다.

 

 

 

6. 파일 다운로드 창이 뜨면 저장 버튼을 클릭하여 파일을 저장한다.

 

 


7. 다운로드 받은 파일을 실행한다.

 

 

 

8. 라이센스 화면이 뜨면 Accept 버튼을 클릭한다.

 

 

 

9. JDK를 설치한다.

Install 경로를 그대로 쓰거나, Change 버튼을 클릭하여 변경한다.
여기에서는 C:\jdk1.6.0_20\ 으로 변경하였다.
Next 버튼을 클릭한다.

 

 

 

10. JRE 를 설치한다.
Install 경로를 그대로 쓰거나, Change 버튼을 클릭하여 변경한다.
Next 버튼을 클릭한다.

 

 


11. 브라우저 닫기 팝업이 뜬다면, 브라우저를 모두 닫은 후,
프로그램을 닫고 계속하기 버튼을 클릭한다.

 

 


12. 성공적으로 인스톨이 되면 Finish 버튼을 클릭하여 종료한다.

 

 


13. 탐색기에서 C:\jdk1.6.0_20\ 를 찾아 보면, 프로그램이 인스톨되어 있는 것을 알 수 있다.

 

 

 

14. 설정 > 제어판 > 시스템 > 고급 탭 > 환경 변수 버튼을 클릭 한다.

 

 

 

15. JAVA_HOME 시스템 변수를 설정한다.
시스템 변수의 새로 만들기 버튼을 클릭한 후 값을 설정한다.

 변수 이름  JAVA_HOME
 변수 값  C:\jdk1.6.0_20

 

 

 

16. Path 시스템 변수를 설정한다.
기존에 존재한다면 기존 값에 덧붙인다. 덧붙이는 경우 맨 앞에 추가하도록 한다.
존재하지 않으면 새로 만들기 버튼을 클릭한 후 값을 설정한다.

 변수 이름  Path
 변수 값  .;%JAVA_HOME%\bin;

. (점)은 현재 디렉토리를 의미한다.

%JAVA_HOME% 은 위에서 설정한 환경 변수 이름의 값으로 대체하라는 의미다.

 

 

17. CLASSPATH 시스템 변수를 설정한다.
시스템 변수의 새로 만들기 버튼을 클릭한 후 값을 설정한다.
JDBC 드라이버나 기타 필요한 jar 파일들을 설정한다.

 변수 이름  CLASSPATH
 변수 값  .;

 

 


모두 설정한 후, 확인 버튼을 클릭하여 종료한다.

 

18. 도스 명령창을 띄워 설정된 정보를 확인한다.

set JAVA_HOME

set CLASSPATH

set PATH

 

 

위와 같이 설정된 정보가 나타나면, 설치는 잘된 것이다.

'Education > Android' 카테고리의 다른 글

Android 환경 설정  (1) 2010.07.20
Android Amulator 설치  (4) 2010.06.22
Android Error - The project cannot be built until build path errors are resolved  (0) 2010.06.22
안드로이드 실행  (1) 2009.10.13
안드로이드 설치  (2) 2009.10.13
Posted by 초상큼발랄
l

 커널의 주요한 역할은 바로 컴퓨터에 연결된 하드웨어를 관리하는 것입니다. 이러한 작업을 위해 커널은 각각의 디바이스와 통신해야 합니다. 이러한 작업을 위해 커널은 각각의 디바이스와 통신해야 합니다. 일반적으로 하드웨어와의 통신속도는 프로세서와의 통신 속도보다 훨씬 느리므로, 커널이 하드웨어에 요청을 보내고 응답이 올 때까지 기다리는 것은 부적절한 경우가 많습니다. 대신, 커널은 통신속도가 느린 하드웨어로부터의 응답을 기다리지 않고 그 동안 다른 작업을 처리하다가, 나중에 하드웨어가 정말로 일을 끝낸 다음에 그 응답을 처리할 수 있습니다. 이렇게 하기 위한 한 가지 방법은 폴링입니다. 즉 커널은 주기적으로 시스템에 있는 하드웨어의 상태를 검사하여 그 상태에 따라 응답을 처리하는 것입니다. 하지만 이 방법은 심지어 하드웨어가 일을 하지 않을 때도 부담이 발생하는데 그 이유는 항상 일정한 간격으로 하드웨어의 상태를 반복해서 체크해야 하기 때문입니다. 더 좋은 해결책은 커널의 처리가 요구될 바로 그 시점에 하드웨어가 커널에게 그 사실을 알려주는 메커니즘을 사용하는 것입니다. 이러한 방법은 인터럽트(Interrupt)라 합니다.

인터럽트

 인터럽트는 하드웨어가 프로세서와 통신할 수 있도록 해줍니다. 예를 들어 키보드를 두드리면 키보드 컨트롤러가 인터럽트를 발생시켜 운영체제로 하여금 처리해야 할 키보드 입력이 있음을 알려줍니다. 인터럽트는 이렇게 하드웨어 디바이스로부터 프로세서로 전달되는 특별한 전기적 신호입니다. 프로세서가 인터럽트를 받으면 프로세서는 운영체제가 새 데이터를 처리할 수 있도록 알려주게 됩니다. 하드웨어 디바이스는 프로세서 클럭에 비동기적으로 인터럽트를 발생시키므로 인터럽트는 어느 때나 발생할 수 있습니다. 다시 말하면 커널은 언제라도 인터럽트에 의해 방해받을 수 있는 것입니다.
 인터럽트는 디바이스에서 물리적인 전기 신호의 형태로 발생하여 인터럽트 컨트롤러의 입력 핀(pin)으로 전달됩니다. 그 다음 인터럽트 컨트롤러는 프로세서로 신호를 보내고, 이 신호를 감지한 프로세서는 인터럽트를 처리하기 위해 현재의 실행을 중단합니다. 이제 프로세서가 운영체제로 인터럽트가 발생했음을 알리면 운영체제는 상황에 맞게 인터럽트를 처리하게 됩니다.
 각 인터럽트에는 고유한 값이 할당되므로 각 디바이스들은 각자 고유한 인터럽트를 갖게 됩니다. 따라서 키보드에서 발생한 인터럽트와 하드드라이브에서 발생한 인터럽트가 구별됩니다. 이러한 식의 운영체제는 인터럽트를 식별하여 어떤 디바이스가 인터럽트를 발생시켰는가를 판단합니다. 또한 운영체제는 각 인터럽트마다 고유한 핸들러를 제공합니다.
 이러한 인터럽트 값을 인터럽트 요청(IRQ, Interrupt Request)이라고 부릅니다. 일반적으로 이것은 숫자로 표현되는데, 예를 들어 PC에서 IRQ 0은 타이머 인터럽트를, IRQ 1은 키보드 인터럽트를 의미하게 됩니다. 하지만 모든 인터럽트 번호가 고정돼있는 것은 아닙니다. 예를 들어 PCI 버스(bus)에 연결돼 있는 디바이스에 대한 인터럽트 번호는 동적으로 할당됩니다. 또한 PC가 아닌 다른 아키텍처에서 인터럽트를 동적으로 할당하는 예가 있기도 합니다. 하지만 여기서 요즘은, 특정 인터럽트는 특정 디바이스와 맞물려 있으며 커널이 이것을 알고있다는 사실입니다. 이제 하드웨어는 인터럽트를 발생시켜 커널의 주의를 끕니다.

인터럽트 핸들러

 인터럽트를 처리하는 커널 함수가 바로 인터럽트 핸들러(Interrupt Handler) 혹은 인터럽트 서비스 루틴(ISR, Interrupt Service Routine)입니다. 각각의 디바이스가 발생시키는 인터럽트에는 그와 관련된 인터럽트 핸들러가 존재합니다. 즉 시스템 타이머 인터럽트를 처리하는 핸들러 함수가 있다면 키보드 인터럽트를 처리하는 또다른 핸들러 함수가 있는 식입니다. 이러한 각 디바이스의 인터럽트 핸들러는 모두 디바이스 드라이버(디바이스르 관리하는 커널 코드)의 일부분입니다.
 리눅스에서의 인터럽트 핸들러는 일반적인 C 함수입니다. 물론 커널에서의 표준화된 처리를 위해 특정한 프로토타입으로 되어 있기는 하지만, 그 밖에는 다른 일반 함수와 크게 다를 바가 없습니다. 그러나 인터럽트 핸들러가 다른 커널 함수들과 구별되는 가장 큰 차이점은 커널이 인터럽트를 처리하기 위해 바로 이 핸들러 함수를 호출하면 특별한 컨텍스트, 즉 인터럽트 컨텍스트에서 실행된다는 점입니다.
 인터럽트는 언제라도 발생 가능하므로 인터럽트 핸들러 역시 언제라도 실행될 수 있습니다. 인터럽트 핸들러에서는 그 실행 속도가 중요한데, 왜냐하면 인터럽트에 의해 중단된 코드를 가능한 빨리 실행되도록 해야 하기 때문입니다. 따라서 인터럽트를 발생시킨 하드웨어에 즉각 응답하는 것도 중요하짐나 인터럽트 핸들러의 실행을 최대한 짧게 하는 것 역시 전체 시스템의 관점에서 매우 중요합니다. 최소한의 경우를 고려하면 인터럽트 핸들러의 역할은 하드웨어에게 인터럽트를 받았음을 알리는 일이 될 것입니다. 하지만 일반적으로 다른 작업을 함께 수행해야 하는 경우가 많습니다. 예를 들어 네트웨크 디바이스를 위한 인터럽트 핸들러의 경우, 하드웨어에 응답하는 것 뿐만 아니라 하드웨어에서 메모리로 패킷을 복사하고, 프로세싱하고, 적절한 프로토콜 스택(protocol stack)이나 응용 프로그램으로 밀어 넣는 작업을 함께 수행해야 합니다. 분명 이 모든 작업은 상당한 시간이 필요할 것입니다.

톱하프와 보톰하프

인터럽트 핸들러를 최대한 빨리 수행해야 하지만 한편으로는 많은 추가적인 일을 해야하는 두 가지 목표는 분명 상호대립적입니다. 따라서 대개 인터럽트의 처리를 두 단계로 분리합니다. 이 두 단계 중 인터럽트 핸들러는 톱하프(top half)에 해당합니다. 즉 인터럽트가 발생하는 즉시 실행되어 타임 크리티컬한 작업들, 예를 들면 인터럽트의 수신을 알리고 하드웨어를 리셋하는 작업 등을 수행하는 것입니다. 나중에 해도 무관한 작업들은 보톰하프(bottom half)가 실행될 때까지 지연됩니다. 보톰하프는 좀 더 편한 시간에, 모든 인터럽트를 활성화시킨 상태에서 실행됩니다(일반적으로 인터럽트 핸들러가 리턴되면 실행됩니다). 리눅스에서는 이러한 보톰하프를 위한 여러가지 메커니즘을 제공합니다.
 네트워트 상황을 이용하여 쉽게 설명해보자면, 랜카드는 네트웨크로부터 패킷을 받게 되면, 커널에 그 사실을 알려야 합니다. 이 과정은 네트워크 최대 처리량과 지연시간을 최적화하고, 타임아웃을 방지하기 위해 신속하게 이루어져야 합니다. 따라서 즉시 인터럽트를 발생시킵니다.
 그러면 커널은 랜카드가 등록한 인터럽트를 수행합니다. 인터럽트는 실행되면서, 하드웨어에 자신의 실행 사실을 알린 후, 새로 도착한 네트워크 패킷들을 메인 메모리로 복사합니다. 그리고, 랜카드가 또 다른 패킷들을 받을 수 있도록 준비작업을 합니다. 이러한 작업들은 중요하고, 지체하기 힘들며, 하드웨어에 따라 그 특성이 다릅니다. 해당 패킷들에 대한 처리과정의 남은 부분들은 보톰하프에 수행됩니다.

인터럽트 핸들러 등록

 인터럽트 핸들러들은 해당 하드웨어를 운용하는 디바이스 드라이버가 제공해야 합니다. 각 디바이스는 관련된 드라이버를 하나씩 가지고 있으며, 대개의 경우가 그렇듯 디바이스가 인터럽트들을 이용하는 겨우, 해당 드라이버는 각 인터럽트 핸들러를 등록해야 합니다. 디바이스 드라이버는 다음과 같이 특정 인터럽트가 주어진 핸들러에 의해 처리되도록 인터럽트 핸들러를 등록할 수 있습니다.

int request_irq(unsigned int irq,
                     irqreturn_t (*handler)(int, void*, struct pt_regs*),
                     unsigned long irqflags,
                     const char* devname,
                     void* dev_id)

 첫 번째 매개변수 irq는 할당할 인터럽트 번호입니다. 시스템 타이머나 키보드와 같은 구형 PC 디바이스의 인터럽트 번호는 대개 직접 코딩되어 있지만 다른 디바이스의 경우에는 탐색을 하여 찾거나 정의된 절차에 따라 동적으로 결정합니다.
 두 번째 매개변수 handler는 해당 인터럽트를 처리할 실제 핸들러의 함수 포인터입니다. 운영체제는 인터럽트가 발생할 때마다 이 함수를 호출하게 됩니다. 핸들러 함수는 특정한 형식이 요구되며 3개의 매개변수와 irqreturn_t형의 리턴값을 갖습니다.
 세 번째 매개변수 irqflags는 0 혹은 다음에 해당하는 비트마스크 값을 갖습니다.

SA_INTERRUT : 이 플래그는 해당 인터럽트 핸들러가 빠른 인터럽트  핸들러임을 가리킵니다. 역사적으로 리눅스는 빠른, 그리고 느린 인터럽트 핸들러를 구분해 왔습니다. 빠른 핸들러란 빨리 수행되지만 자주 호출되는 것으로 과거에는 빠른 핸들러를 최대한 빨리 수행하는 것이 인터럽트 처리의 목표 중 하나였습니다. 하지만 현재는 두 핸들러 사이에 단 한가지 차이점만이 있는데, 즉 빠른 핸들러는 모든 인터럽트를 비활성화한 상태로 로컬 프로세서에서 실행된다는 점이 바로 그것입니다. 인터럽트를 비활성화하는 것은 빠른 핸들러로 하여금 다른 것들에 의해 방해받지 않고 최대한 빨리 수행될 수 있도록 하는 역할을 합니다. 이 플래그가 없을 경우, 실행중인 핸들러의 인터럽트를 제외한 모든 인터럽트가 발생가능합니다. 타이머 인터럽트를 제외한 대부분의 인터럽트는 이 플래그를 사용하지 않습니다.

SA_SAMPEL_RANDOM : 이 플래그는 해당 디바이스에 의해 발생한 인터럽트가 커널 엔트로피 풀에 영향을 끼친다는 것을 의미합니다. 커널 엔트로피 풀은 다양한 랜덤 이벤트로부터 추출한 진정한 의미의 랜덤 숫자를 제공합니다. 이 플래그가 사용될 경우, 디바이스로부터의 인터럽트 발생 타이밍이 엔트로피 풀에 적용됩니다. 디바이스가 예측 가능한 주기로 인터럽트를 발생시키거나(예: 시스템 타이머) 혹은 외부의 영향으로 변화될 경우(예: 네트워크 디바이스) 이 플래그를 사용해선 안됩니다. 하지만 다른 대부분의 경우 하드웨어가 비결정적인 타이밍으로 인터럽트를 발생시키므로 엔트로피(무질서도)의 좋은 소스가 됩니다.

SA_SHIRQ : 이 플래그는 인터럽트 번호가 여러 인터럽트 핸들러에 의해 공유될 수 있음을 나타냅니다. 이 플래그가 없는 경우에는 각 번호마다 오직 하나의 핸들러만이 존재해야 합니다.

 네 번째 매개변수 devname은 해당 디바이스의 ASCII 텍스트 이름입니다. 예를 들어 PC의 키보드 인터럽트의 경우 이 값은 "keyboard"입니다. 이 텍스트 이름은 유저와의 통신을 위해 /proc/irq와 /proc/interrupts에 의해 사용됩니다.
 다 섯번째 매개변수 dev_id는 주로 공유 인터럽트를 위해 사용됩니다. 인터럽트 핸들러가 해제될 때, dev_id는 해당 인터럽트에서 특정 인터럽트 핸들러만을 제거하기 위해 사용됩니다. 이 매개변수가 없으면 커널은 해당 인터럽트에서 어떤 핸들러를 제거할 것인가를 결정할 수 없게 됩니다. 공유 인터럽트가 아닌 경우에는 여기에 NULL을 줄 수 있지만 공유 인터럽트인 경우 반드시 식별 가능한 유일한 값을 지정해야 합니다. 또한 이 포인터는 호출마다 인터럽트 핸들러로 전달되므로 드라이버의 디바이스 구조체 포인터를 여기로 넘겨 나중에 핸들러 내부와 디바이스 모델에서 유용하게 사용할 수도 있습니다.

인터럽트 핸들러 제거

 드라이버를 언로드할 때, 관련 인터럽트 핸들러의 등록을 취소하고, 어쩌면 인터럽트도 비활성화해야 합니다. 이를 위해 다음의 함수를 호출합니다.

void free_irq(unsigned int irq, void* dev_id)

 만약 지정된 인터럽트 번호가 공유되지 않았다면 이 함수는 해당 인터럽트 핸들러를 제거하고 이 인터럽트를 비활성화시킵니다. 만약 공유된 경우라면 dev_id가 가리키는 핸들러만이 제거되고 인터럽트 번호는 모든 핸들러가 제거되었을 때만 비활성화됩니다. 이것이 바로 유일한 dev_id값을 사용해야 하는 이유입니다. 공유 인터럽트를 사용할 때에는 이와 같이 다수의 핸들러 중에서 특정 핸들러를 free_irq()로 제거하기 위한 유일한 식별자가 필요합니다. 또 어떠한 경우에든지 만약 dev_id가 NULL이 아니라면 해당 핸들러와 관련이 있는 포인터를 사용해야 합니다. free_irq()는 반드시 프로세스 컨텍스트에서 호출해야 합니다.

'Education > Linux Kernel' 카테고리의 다른 글

우분투 10.04 네트워크 설정  (1) 2010.07.07
vmware 키보드 먹통  (2) 2010.07.07
oops 강제 발생  (1) 2009.11.24
vim 설정  (0) 2009.11.18
커널 소스 트리  (0) 2009.11.18
Posted by 초상큼발랄
l

chapter 7. Memory


· 메모리 관리가 만족시켜야 하는 요구 조건

1. 재배치(Relocation)

2. 보호(Protect)

3. 공유(Sharing)

4. 논리적 구성

5. 물리적 구성

2-pass assembler

지금 수행된 application Memory 초과에도 사용될 수 있는 방법

· Fetch policy : 불러들이는 방법

· Placement policy :

· Replacement policy :

· 단편화(Fragmentation)

- 내부 단편화(Internal Fragmentation) : 파티션 내부 공간의 낭비가 발생하는 현상

- 외부 단편화(External Fragmentation) : Compaction 수행 방법 필요

장점: 메모리 효율성 大, 공간 활용도 大

단점: 메모리 할당 속도↓, 할당 · 해지가 계속적으로 반복

해결책 → Compaction(메모리 집약): 프로세스가 사용하는 파티션을 이동시켜 각 파티션이 연속적이 되도록 인접하게 만들고 메모리의 모든 빈 공간이 하나의 블록이 되도록 한다.

· 메모리 분할 (Memory Partition)

- 고정 분할(Fixed Partitioning)

균등 분할: 각 분할이 모두 같은 크기를 작도록 균등 분할

문제점 1) 프로그램이 파티션보다 클 수 있다.

2) 주기억장치 이용률이 매우 저조 - 내부단편화 발생(Internal Fragmentation)

비균등 분할: 위의 문제점 해결

고정된 partition을 사용할 경우 잉여 공간(내부 단편화)이 다량으로 발생

- 동적 분할(Dynamic Partitioning) :

외부 단편화 → compaction

· Placement algorithm ≒ Fit policy

1. Best Fit : 요청된 크기와 가장 근접한 크기의 메모리 선택

공간 효율성 大, 남아있는 잉여구간이 적지만 사용가능성이 적다.

비어있는 구간을 모두 다 비교해야하므로 시간이 많이 걸린다.

2. First Fit : 메모리의 처음부터 검사해 크기가 충분한 첫 번째 사용가능한 메모리 블록을 선택

메모리 공간 효율성 小, 시간이 적게 걸림(가장 마지막 메모리 위치 효율성 ↓)

3. Worst Fit : 메모리 잉여 공간이 가장 큰 메모리 할당

생각보다 비효율적이지 않다. 분할된 구간이 커짐

→ 큰메모리 구간을 남겨둬서 1차적 사용가능

4. Next Fit : 가장 최근에 배치되었던 메모리 위치에서부터 검사를 시작해 크기가 충분한 다음 위치의 사용가능한 메모리 블록을 선택

5. Last Fit :


· 리눅스/유닉스에서 내부 단편화(Internal Fragmentation)를 해결하기 위해 Slab Allocator

Architecture 마다 다르지만 일반적으로 32Bits System에서 4KB 단위의 page Frame이 고정된 크기로 분할되어있다.

If, 메모리가 400KB를 요청한다면 Page 배수가 된다.

즉 Fixed partition과 Page 묶음으로 할당 해지하는 Dynamic partition으로 사용된다.

· 리눅스는 내부 단편화(Internal Fragmentation)를 해결하기 위해서 슬랩 할당자(Slab Allocator)를 도입하고, 버디 할당자(Buddy Allocator)는 메모리 관리의 부하가 적으며 외부 단편화(External Fragmentation)를 줄일 수 있다는 장점을 제공한다.



'Education > Operating System' 카테고리의 다른 글

스레드 컨텍스트 스위치 시점 알 수 있는 방법  (0) 2010.06.28
geekos  (3) 2010.06.27
명령어 수행  (2) 2009.10.22
Interrupt  (2) 2009.10.22
Scheduling  (0) 2009.10.22
Posted by 초상큼발랄
l
C++에서는 C와 겹쳐지는 함수 이름들을 위해 #include에 새로운 형식을 사용한다.
#include <iostream> 처럼 .h를 생략하고 사용한다.
그리고, namespace라는 것을 이용합니다.
C에서 사용하던 헤더 화일들에는 c를 앞에 붙입니다.

예를 들면, #include <stdio.h> 의 경우에는
C++을 위해선 #include <cstdio>로 표기하는 것이 맞다.
물론, C와의 호환을 위해 <stdio.h>로도 사용이 가능합니다.

#include <iostream>

using namespace std;


hello.cpp 파일 컴파일시,,,,,, 

$ g++ -o hello hello.cpp

'Education > C++ programming' 카테고리의 다른 글

Compiler  (0) 2012.01.13
Variable  (1) 2012.01.13
Triangle & Rectangle program code  (0) 2009.11.24
피보나치 수열  (2) 2009.11.24
Posted by 초상큼발랄
l

Triangle & Rectangle program code

2009. 11. 24. 16:07 by 초상큼발랄

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

< 재귀 함수 사용>

#include <iostream.h>

int fibona(int a);

void main()
{
int count, result;
cout<<"Enter the number: ";
cin>>count;

if(count < 0)
cout<<"error"<<endl;
else
{
result = fibona(count);
cout<<"The result is : "<<result<<endl;
}
}

int fibona(int a)
{
if ( a == 1) return 1;
if ( a == 2) return 1;
return fibona(a-2) + fibona(a-1);
}

============================================================================================================

< 반복문 사용>

#include <iostream.h>


void main()
{
int result, i,count;
int arr[100];

cout<<"Enter the number: ";
cin>>count;

for(i=0; i<2; i++)
{
arr[i] = 1;
}

for( i =0; i< count; i++)
{
arr[i+2] = arr[i] + arr[i+1];
cout<< arr[i] <<endl;
}
cout<<"The result is : "<< arr[count-1] <<endl;

}


'Education > C++ programming' 카테고리의 다른 글

Compiler  (0) 2012.01.13
Variable  (1) 2012.01.13
리눅스 c++ 컴파일  (2) 2009.11.24
Triangle & Rectangle program code  (0) 2009.11.24
Posted by 초상큼발랄
l