http://link2me.tistory.com/40

'컴퓨터 공부 > 컴퓨터구조' 카테고리의 다른 글

인터럽트  (0) 2016.02.03
스택포인터  (4) 2016.01.18

※host name lookup


ip주소 말고 host name으로 서버 접속시 과정은 

www.hyem2.com ->(DNS Resolver cache check ->) DNS Server가 ip주소를 알려줌 

이렇다. 


DNS Server 에 등록 없이 ip주소를 쓰지 않고 host name으로 접속하기 위해서는 DNS Resolver에 직접 알려줘야 한다. 


window 에서는 

Windows/Systems32/drivers/etc/hosts 파일에서 hostname과 ip 설정 (IP lookup)


linux 에서는 

~/etc/hosts 파일에서 hostname과 ip 설정 


ex) 

192.168.0.199     a.hyem2.com



virtual host 설정


가상머신에 깔려있는 리눅스 서버 하나로 여러개의 사이트를 만들기 위해서 가상 호스트 설정이 필요. 

~/etc/apache2/sites-available에 .conf 파일들을 설정해주면 된다. 



여러케


그러면 VirtualHost가 가리키는 디렉토리에 작성되어있는 html파일을 찾아 사이트를 띄운다. 

//DNS lookup


//공인ip??????????

//포트포워딩..................




'컴퓨터 공부 > 운영체제' 카테고리의 다른 글

Process Synchronization  (0) 2016.01.24
1. 컴퓨터 시스템 구조와 프로그램 실행  (2) 2016.01.16

1.인터럽트 개념


인터럽트란 일상 생활에서의 갑작스러운 사건이라고 할 수 있다. 예를 들어

  • 인터럽트 요청: 학생이 질문 하였다면,
  • 상태저장: 강사는 설명하던 것을 잠시 멈추고,
  • 인터럽트 서비스: 학생의 질문에 답변을 한 후에,
  • 인터럽트 복귀: 다시 질문 전에 강의하던 내용으로 돌아와 계속 강의를 진행한다. 

컴퓨터에서도 이와 같은 사건이 발생할 수 있다.

컴퓨터의 정상적인 프로그램 실행을 방해하는 사건이 발생하는 것을 컴퓨터의 실행을 방해한다는 의미로 인터럽트라고 한다. 

인터럽트는 컴퓨터내부와 외부에서 발생할 수 있다.

컴퓨터 내부에서 발생하는 인터럽트가 발생하면 컴퓨터는 더이상 프로그램을 실행할 수가 없다. 


-내부 인터럽트

  • 하드웨어 고장: 데이터 전달 과정에서 비트 오류 혹은 컴퓨터 전원 꺼짐 등 프로그램의 실행과 관계 없음
  • 실행할 수 없는 명령어: 기억장치에서 인출한 명령어의 비트 패턴이 정의되어 있지 않아 CPU가 그 명령어를 실행할 수 없음
  • 명령어 실행 오류: 인출 명령어는 정상적이지만 명령어를 실행할 수 없는 경우.(ex. 인출한 명령어가 나누기인데, 나누는 수가 0)
  • 사용 권한 위배: 운영체제가 컴퓨터자원을 보호하기 위해 사용자가 접근할 수 있는 영역과 접근할 수 없는 영역을 제한해 놓았다. 만약 운영체제만 접근 가능한 영역에                     액세스하려고 한다면 인터럽트가 발생한다. 

-외부 인터럽트 

  • 타이머 인터럽트
  • 입추력 인터럽트: 속도가 느린 입출력장치가 입출력 준비가 완료되었다는 것을 중앙처리 장치에게 알리기 위하여 사용하는 인터럽트


2. 인터럽트 처리 과정


①인터럽트 요청(interrupt request): 임의의 소스가 인터럽트를 요청

②인터럽트 승인(interrupt acknowledge): CPU는 인터럽트 요청을 인식하고, 인터럽트 소스에게 인터럽트를 확인하였을음 알려준다. 

③상태 저장(context save): CPU는 현재 실행하던 프로그램을 중단하고 현 상태를 저장한다.

④인터럽트 서비스(interrupt service): CPU는 인터럽트 소스가 요구한 작업을 실행한다.

⑤인터럽트에서 복귀(return form interrupt): CPU는 원래 실행하던 프로그램으로 복귀한다. 


CPU는 인터럽트 소스가 요청한 작업을 수행하여야 하는데, 이것도 기억장치에 저장되어 있는 프로그램이다. 

이프로그램을 인터럽트 서비스 루틴(Interrupt Service Routine, ISR) 혹은 인터럽트 핸들러(interrupt handler)라고 한다. 

인터럽트 서비스 루틴은 인터럽트 종류마다 하나씩 기억장치에 준비되어 있어야 한다. 


CPU가 인터럽트 요청을 인식하고 승인하기 위하여 중앙처리장치의 제어 버스는 다음과 같은 두개의 제어선을 포함하고 있다. 





'컴퓨터 공부 > 컴퓨터구조' 카테고리의 다른 글

인터넷 접속 과정과 nat  (0) 2016.08.11
스택포인터  (4) 2016.01.18

데이터를 활용해 명령어에 따라 실행을 하는 실행 장치는 다음과 같은 과정으로 데이터를 가져오고, 실행 후 저장한다.

①메모리에서 데이터를 가져온 뒤, ②데이터를 활용해 명령어에 따라 실행한다. ③실행 결과를 다시 메모리에 저장한다.

이 과정에서 같은 데이터를 가져오려는 실행장치가 여러 개이면 어떤 실행장치가 해당 데이터를 먼저 가져가고, 결과를 먼저 저장했는지에 따라

결과가 달라질 수 있다는 문제가 발생한다. 


먼저 예시1)은 사용자가 기대하는 기대하는 결과값이 storage box에 저장되는 경우이다. 

예시 2)는 데이터 로드 순서, 실행 순서가 섞이면서 오류가 난 경우이다. 


예시1)

            

(a) A에서 storage box에 있는 데이터 5를 로드한다.

(b) A를 실행 한 결과 값 6 이 storage box에 저장되고, 이 값을 B에서 로드한다.

(c) C를 실행 한 결과 값 5 가 storage box에 저장되어 최종 값은 5가 된다. 

  


예시2)

         


(a) A가 storage box에 있는 데이터 5를 로드한 뒤, A가 실행되기 전 B가 storage box에 있는 데이터 5를 로드한다.


(b) A가 실행된 후 결과 값인 6이 storage box에 저장된다.


(c) B가 실행된 후 결과 값인 4가 storage box에 저장된다. 

          


위에 나타난 예시처럼 하나의 저장공간을 여러 프로그램들이 공유하여 사용하는 경우 결과 값이 달라질 수 있으며 

이러한 상황을 race condition (경쟁 상태) 이라고 한다. 


race condition이 발생할 수 있는 경우는 다음과 같다. 


a. kernel 수행 중 인터럽트 발생시 

b. process가 system call을 하여 kernel mode로 수행 중인데 context switch가 일어난 뒤 다른 process에서도 system call을 하여 kernel mode를 수행할 경우

c. multiprocessor에서 shared memory 내의 kernel data




a. kernel 수행 중 인터럽트 발생시






커널모드에서 count++을 수행하게 되면 세단계를 거친다.

① 메모리에서 cpu레지스터로 count값을 load

② cpu에서 count값 증가

③ 증가 시킨 값을 메모리에 저장


이 과정에서 인터럽트가 중간에 걸려 count값을 감소하는 코드가 실행된다면, 최종 결과값은 기존 count 값이어야 한다. (kernel:count++)+(interrupt:count--)=count

그런데 결과값은 count에서 1증가한 count+1값이 나온다.

그 이유는 interrupt에서 count값 감소 전에 이미 kernel에서 cpu레지스터로 count값을 load해 갔기 때문이다.


해결방법: kernel mode에서 수행 중에는 interrupt disable로 설정



b. kernel모드에서 context switch가 발생하는 경우





각 프로세스는 자신만의 address space를 가지고 있어 data sharing이 없다

그러나 system call을 통해 kernel mode에서 프로세스 수행시에는 kernel address space의 data를 access하게 된다.

이 작업 중간에 CPU를 다른 프로세스에서 preempt해서 이 프로세스가 kernel mode에서 수행하게 되면 race condition이 발생하게 된다. 



프로세스A에서 커널모드로 수행 중 increment 수행을 하기 위해 데이터를 load하고나서, 

프로세스A의 할당 시간이 끝나고 다른 프로세스에게 CPU할당이 되어야 한다. 

프로세스B가 CPU할당을 받은 뒤에 커널모드에서 increment를 수행한다. 예상결과 값은 기존 count에서 2증가한 count+2 지만 1만 증가한 상태가 된다.


해결방법: 커널모드에서 수행 중일 때는 할당시간이 끝나도 CPU를 preempt하지 않음. 커널모드에서 사용자 모드로 돌아갈 때 preempt한다. 



c. multiprocessor에서 shared memory 내의 kernel data




어떤 CPU가 먼저 count값을 load하고 언제 load하느냐에 따라 결과 값이 달라질 수 있다.


해결방법: (1) 한번에 하나의 CPU만이 커널에 들어갈 수 있게 하는 방법

             (2) 커널 내부에 있는 각 공유 데이터에 접근할 때마다 그 데이터에 대한 lock/unlock을 하는 방법

                  : 처음에 접근한 CPU가 공유데이터를 가져갔을 때 그 데이터에 lock을 걸어서 다른 CPU가 가져가지 못하게 하고 

                   먼저 접근한 CPU가 처리를 끝내고 저장하고 나서는 unlock을 해서 다른 CPU가 공유데이터를 가져갈 수 있도록 한다.



'컴퓨터 공부 > 운영체제' 카테고리의 다른 글

network  (0) 2016.03.28
1. 컴퓨터 시스템 구조와 프로그램 실행  (2) 2016.01.16

※스택이란?


FILO(First In Last Out)형태로 데이터를 액세스하는 데이터 구조이다. 즉, 가장 나중에 들어온 것부터 차례로 액세스하는 것이다. 

Heap은 Stack과 반대로 FIFO형태로 데이터를 액세스한다. 

스택은 한 곳으로만 액세스할 수 있으며, 이부분을 스택의 탑이라고 한다. 




FILO의 액세스 순서 : 5 → 4 → 3 → 2 → 1

FIFO의 액세스 순서 : 1 → 2 → 3 → 4 → 5


중앙처리장치는 기억장치의 특정 영역을 스택 영역으로 지정하여 운영한다. 



스택에 저장되는 데이터의 크기는 레지스터의 크기, 데이터 버스의 폭과 같다. 

즉 스택은 컴퓨터의 단어(word)단위로 액세스 된다. 만일 기억장치가 바이트 단위로 구성되어 있고 레지스터의 크기가 16비트이면, 두 개의 기억장소에 한개의 데이터가 저장된다. 


또한 데이터가 스택에 추가 될수록 스택의 주소값은 점점 작아진다

그 이유는 두가지가 있다. 

(1) 스택이 항상 커널의 반대 방향으로 자라기 때문에 커널 영역에 침범하는 일이 없게된다.

(2) 힙 영역은 스택과 달리 새로운 데이터가 추가될수록 더 큰 메모리 주소를 할당 받는다. 때문에 메모리 공간을 알뜰하게 사용할 수 있게 된다.



※스택포인터란?


중앙처리 장치 안에는 스택에 데이터가 채워진 위치를 가리키는 레지스터인 스택 포인터(SP)를 갖고 있다. 스택포인터가 가리키는 곳까지가 데이터가 채워진 영역이고, 그 이후부터 스택 끝까지는 비어있는 영역이다. 

스택에 새로운 항목이 추가되거나 스택에서 데이터가 제거되면, 스택 포인터의 값이 증가하거나 감소한다. 


스택은 PUSH와 POP 두가지 동작에 의하여 액세스된다. 

  • PUSH : 스택에 데이터 추가

  • POP : 스택에서 데이터 제거

PUSH 오퍼랜드   //오퍼랜드를 스택에 저장하라.

POP 오퍼랜드    //스택에서 제거한 데이터를 오퍼랜드에 저장해라.



※스택과 스택포인터의 작동 예시


다음 그림은 어느 한 순간 레지스터와 스택의 모습이다. 이 예는 다음과 같은 가정을 하고 있다.

    • 범용 레지스터 R0와 R1의 크기는 16비트이다.

    • 기억장치는 바이트 단위로 주소가 지정되며, 스택은 16비트 단위로 액세스 된다.

    • 기억장치의 주소는 16비트이다. 따라서 SP의 크기도 16비트이다.

    • SP의 값은 1008h이고, SP가 가리키는 장소까지 데이터가 저장되어 있다.

    • 기억장치의 100ch번지부터 스택영역이고, 현재 세 개의 데이터가 스택에 저장되어 있다. 






중앙처리 장치는 PUSH[오퍼랜드] 명령어를 다음과 같은 두 단계의 동작으로 실행한다.


SP ← SP - [단어의 크기]     // SP를 단어 크기만큼 증가시킨다.

Mem[SP] ← 오퍼랜드       // 스택에 오퍼랜드를 저장한다.


(b) PUSH R0 실행 후

① 스택 TOP의 주소값인 스택포인터가 1008h 에서 1006h로 감소

② 기억장치 1006h번지에 R0의 값 4444h가 저장됨


중앙처리 장치는 POP[오퍼랜드] 명령어를 다음과 같은 두 단계의 동작으로 실행한다.


SP ← SP - [단어의 크기]     // SP를 단어 크기만큼 증가시킨다.

Mem[SP] ← 오퍼랜드       // 스택에 오퍼랜드를 저장한다.


(c) POP R1 실행 후

① R1의 값이 4444h로 변경

② SP의 값이 1008h로 증가

* POP 이후로는 1008h (SP)위의 메모리는 사용하지 않는다. 1006h번지의 4444h값은 남아있으나, 무의미한 쓰레기값이며, 이후 다른 PUSH명령어가 실행되면 이 값은 다른 값으로 대체된다. 



[출처] 생능출판사 한눈에 보이는 컴퓨터 구조 - 전중남




'컴퓨터 공부 > 컴퓨터구조' 카테고리의 다른 글

인터넷 접속 과정과 nat  (0) 2016.08.11
인터럽트  (0) 2016.02.03


sitemap.xml





컴퓨터의 기본 구조는 이렇다.

컴퓨터를 부팅하고 나면 OS는 항상 메모리에 올라와 있으면서 사용자가 컴퓨터를 사용하는 것에 있어서 모든것을 관장한다. 

컴퓨터 실행은 위 그림과 같은 과정을 반복하는 것이 전부이다. 

인출단계: 메모리에서 프로그램 명령어를 읽어온다.

실행단계: 명령어에 따라 실행한다.

인터럽트: 실행단계 중 인터럽트가 들어왔나 확인한다. 인터럽트가 있었으면 인터럽트 단계를 실행하고 없었으면 인출단계부터 다시 반복

CPU가 하는 일이라곤 메모리에서 명령어(instruction)을 읽어와서 실행하는 것뿐이다.

어떤 일을 할지는 어떤 interrupt가 걸릴지, 어떤 프로그램의 명령어를 읽어오는 지에 달려있는 것이다. 


인터럽트가 걸리는 예시는 다음과 같다.

첫번째, 입출력 장치 구동이 필요할 때

프로그램A를 수행하는 중엔 CPU권한이 사용자 프로그램A에게 있다.

프로그램A를 수행하다가 I/O 입력을 받아야 되면 interrupt를 건다.

interrupt를 걸면 CPU권한이 OS로 넘어간다. OS에서는 프로그램A가 일으킨 interrupt코드를 수행한다. (interrupt코드는 커널함수에 포함되어 있음)

OS는 I/O device 수행에 관련된 일을 Device controller에게 넘기고

I/O에서 데이터를 읽어오는 것은 오래걸리므로 입출력이 끝날때까지 OS는 CPU 스케쥴링을 통해 다른 프로그램을 수행하도록 한다. CPU권한은 OS가 권한을 넘겨준 프로그램B에게 넘어가게 된다.


두번째, timer interrupt



하나의 사용자 프로그램이 CPU를 독점하는 것을 막기위해 timer를 사용하는데, 미리 설정해둔 시간이 지나면 사용자 프로그램에서 I/O입출력을 요청하지 않아도 interrupt를 timer에서 발생시켜 CPU권한을 OS로 넘겨준다. 사용자 프로그램A는 4번째 명령어를 실행하다가 인터럽트가 걸려 5번째 명령어를 실행하지 못하고 OS로 CPU권한이 넘어가는 것이다.

이렇게 하지 않으면 사용자프로그램에서 무한루프를 도는 경우 하나의 다른 프로그램을 실행할 수 없다. 

처음 내가 착각했던 것은 사용자 프로그램에서 OS로 CPU권한을 넘겨주는 것이 가능하다고 생각했다. 하지만 CPU권한을 누구에게 줄지를 결정하는 것은 OS만이 할 수 있다. 이 때문에 CPU권한을 다른 사용자 프로그램에게 넘기는 것이던, OS에게 넘기는 것이던 interrupt를 걸어서 일단 CPU권한을 OS로 넘겨줘야 한다.


운영체제가 하는 일은 이렇게 OS던 사용자 프로그램이던 프로그램이 실행되면서 자원을 사용하게 되는데 인터럽트를 이용해서 모든 프로그램이 자원을 공평하게 사용할 수 있도록 하는 것이다.

복잡한 컴퓨터 시스템 구조는 다음 그림과 같다. 차근차근 살펴보도록 하자.

 


1.1. Mode bit

  • 사용자 프로그램의 잘못된 수행으로 다른 프로그램 및 운영체제에 피해가 가지 않도록 하기 위한 보호장치가 필요하다. 예를 들어 사용자 프로그램이 운영체제 코드에 접근하여 수정을 했는데 오류가 있다면 이는 심각한 문제를 초래할 것이다.  
  • 이를 막기위해 Mode bit가 존재한다. 

    1 사용자 모드: 사용자 프로그램 수행

    0 모니터 모드: OS 코드 수행

-Iterrupt나 Exception이 발생하면 mode bit를 0으로 바꾼다.

- 사용자 프로그램에게 CPU를 넘기기 전에 mode bit를 1로 바꾼다.

  • 한마디로 Mode bit가 0일 때는 어떤 일이든 실행가능하지만, 1일 때는 제한된 명령어만 실행 가능하다.


1.2 Timer

  • 정해진 시간이 흐른 뒤 운영체제에게 제어권이 넘어가도록 인터럽트를 발생시킴
  • 타이머는 매 클럭 틱 때마다 1씩 감소
  • 타이머 값이 0이 되면 타이머 인터럽트 발생
  • CPU를 특정 프로그램이 독점하는 것으로부터 보호


'컴퓨터 공부 > 운영체제' 카테고리의 다른 글

network  (0) 2016.03.28
Process Synchronization  (0) 2016.01.24

+ Recent posts