프로세스와 가상 메모리

모든 프로세스는 자신만의 가상 주소 공간을 가지고 있다. 32비트/64비트 프로세스는 각 비트수에 맞게 최대 4GB/16GB의 주소 공간을 가진다.

모든 프로세스들은 자신만의 주소 공간을 가지기 때문에, 특정 프로세스 내에서 쓰레드가 수행될 때 해당 쓰레드는 프로세스가 소유하고 있는 메모리에 대해서만 접근이 가능하다. 다른 프로세스에 의해 소유된 메모리는 숨겨져 있으며, 접근이 불가능하다.

따라서, A 프로세스가 0x12345678 주소에 무엇인가를 저장하였지만, B 프로세스 역시 0x12345678 주소에 무엇인가를 저장할 수 있으며, 이 주소들은 완전히 독립되어 있는 것이다.

즉, 가상 메모리는 프로세스의 logical memory와 physical memory를 분리하기 위해 생겨난 것

따라서 logical memory가 physical memory보다 커지는 것을 가능케 할 수 있다.

하나의 프로세스 logical memory가 physical memory보다 커지는 것도 가능하며, 여러 프로세스의 logical memory 총합이 physical memory보다 커지는 것도 가능한 것이다.

램이 꼴랑 1기가인 PC를 생각해 보면 이 PC에서 포토샵도 띄우고, 게임도 띄우고, 웹페이지도 띄운다. 하드가 버벅대지만, PC는 멈추지 않고 실행한다.

이처럼, 프로세스가 실제 필요로 하는 부분만 메모리로 올리는 Demand-Paging 기법을 사용한다.

이미 메모리가 소진된 상태에서 위에서 띄운 프로그램의 작업 내용을 기억하기 위해 디스크 공간을 메모리처럼 활용할 수 있는 기능을 가지고 있다.

디스크 상에 존재하는 이러한 파일을 paging file (또는 swap file)이라고 하며,  모든 프로세스가 사용할 수 있는 가상 메모리로 사용된다.

즉 용량이 큰 게임을 실행하면 하드가 돌면서 실행된다. 하드 스왑이라는 페이징 파일에서 실제 물리 메모리로 올리고 내리고 하는 일련의 작업을 이야기하는 것이다.

애플리케이션 관점에서 보면, 페이징 파일을 사용하면 애플리케이션이 사용할 수 있는 램의 크기가 증가한 것과 같은 효과를 가져온다.

만일 PC에 4GB의 램이 있고, 디스크 상에 4GB의 페이징 파일이 있디면, 수행 중인 애플리케이션은 PC에 8GB의 램이 있는 것과 동일한 효과를 누릴 수 있는 것이다 (물론, 8GB 램보다는 4GB 램+ 4GB 페이징 파일이 더 느리다.)

가상메모리란 한정된 물리 메모리의 한계를 극복하고자 디스크와 같은 느린 저장장치를 활용해, 애플리케이션들이 더 많은 메모리를 활용할 수 있게 해 주는 것이 가상 메모리이다.

Page

Page란, 가상 메모리를 사용하는 최소 크기 단위

만약, 페이징 파일에서 물리 메모리로 데이터를 로드할 때, 아무 위치에나 필요한 크기 만큼(무작위) 로드한다고 가정을 해 보자.

이런 경우, 로드하고 언로드하는 데이터의 크기가 모두 제각각이므로, 이를 반복하다 보면 메모리 공간에 fragmentation이 발생하게 된다.

결국 메모리는 남아 있지만, 정작 원하는 크기의 데이터를 물리 메모리로 로드하지 못하게 되는 상황이 생길 수 있는 것이다. 이를 막기 위해, 운영체제가 만든 것이 page라는 최소 크기 단위이다.

Demanding Page

Demanding-page는 실제로 필요한 page만 물리 메모리로 가져오는 방식
필요 page에 접근하려 하면, 결국 가상 메모리 주소에 대응하는 물리 메모리 주소를 찾아내어, 물리 메모리 주소를 얻어와 하는데, 이 때 필요한 것이 페이지 테이블(page table)이다.
페이지 테이블에 valid bit 라는 것을 두고, 해당 page가 물리 메모리에 있으면 set, 그렇지 않으면 invalid로 설정한다.
Page 접근 요청을 하였는데, physical memory에 없는 상태, 즉 valid bit가 clear 되어있는 상황을 Page fault 라 하며 아래와 같은 처리 과정을 거친다.



1) 페이징 하드웨어는 page table entry를 보고 invalid인 것을 확인한 후 OS에게 trap으로 알린다.
 2) OS는 정말로 메모리에 없는 것인지 아니면 잘못된 접근인지 확인한 후 잘못된 접근이었으면 종료시킨다.
3) Empty frame (free page)을 얻는다.
4) Page를 frame으로 swap한다.
5) 프로세스의 page table과 TLB를 page-in/page-out 된 것을 토대로 재설정한다.
6) Page fault를 야기했던 인스트럭션부터 다시 수행한다.

3번 과정에서 empty frame을 얻어와야 하는 상황에서 물리 메모리가 이미 모두 사용중이라면,
그 사용중인 frame 중 하나를 선택해서 page-out (페이징 파일로 이동) 시키고, 그 frame을 사용해야 한다.

이와 같이 victim frame을 선택하는 과정에서 Page Replacement Algorithm을 사용한다.


'공부 > OS' 카테고리의 다른 글

Page Replace Algorithm  (0) 2016.06.26
가상 메모리 (virtual memory)  (1) 2016.06.26
데드락(Deadlock)  (0) 2016.06.25
스핀 락(Spin lock), 크리티컬 섹션(Critical section), 세마포어(Semaphore), 뮤텍스(Mutex)  (1) 2016.06.25
OS  (0) 2016.06.25
  1. 무우쓰 2018.11.03 21:41

    근데 64bit CPU 에서 프로세스 가상메모리 주소는 2의 64승 아닌가요??
    그럼 16GB가 아니라 거의 무한 아닌가요?

데드락이란?

프로세스가 자원을 얻지 못해 다음 처리를 하지 못하는 상태

예를 들어 P1과 P2가 리소스 A,B 둘 다를 얻어야 한다고 가정한다. t1(첫 번째 시간)에 P1이 리소스 A를 얻고 P2가 리소스 B를 얻었다면 t2(다음 시간)때 P1은 리소스 B를, P2는 리소스 A를 기다리게 된다. 하지만 서로 원하는 리소스가 상대방에게 할당되어 있기 때문에 이 두 프로세스는 무한정 기다리게 되는데 이러한 상태을 DeadLock상태라고 한다.

데드락 발생 조건

데드락은 아래 네 가지 조건이 동시에 성립 할 때 발생한다. 즉, 아래의 네 가지 조건 중 하나라도 성립하지 않도록 만든다면 데드락을 해결할 수 있다.

상호 배제 (Mutual exclusion)자원은 한 번에 한 프로세스만이 사용할 수 있어야 한다

점유 대기 (Hold and wait)

 최소한 하나의 자원을 점유하고 있으면서 다른 프로세스에 할당되어 사용하고 있는 자원을 추가로 점유하기 위해 대기하는 프로세스가 있어야 한다.

비선점 (No preemption)

 다른 프로세스에 할당된 자원은 사용이 끝날 때까지 강제로 빼앗을 수 없어야 한다
순환 대기 (Circular wait)프로세스의 집합 {P0, P1, ,…Pn}에서 P0 P1이 점유한 자원을 대기하고 P1 P2가 점유한 자원을 대기하고 P2…Pn-1 Pn이 점유한 자원을 대기하며 Pn P0가 점유한 자원을 요구해야 한다.

데드락 처리

교착 상태 예방 및 회피교착 상태가 되지 않도록 보장하기 위하여 교착 상태를 예방하거나 회피하는 프로토콜을 이용하는 방법
교착 상태 탐지 및 회복교착 상태가 되도록 허용한 다음에 회복시키는 방법
교착 상태 무시대부분의 시스템은 교착 상태가 잘 발생하지 않으며교착 상태 예방회피탐지복구하는 것은 비용이 많이 든다.

예방

  • 교착 상태 발생 조건 중 하나를 제거함으로써 해결하는 방법
  • 자원의 낭비가 심하다.
상호 배제 (Mutual exclusion) 부정

여러 개의 프로세스가 공유 자원을 사용할 수 있도록 한다.

점유 대기 (Hold and wait) 부정

프로세스가 실행되기 전 필요한 모든 자원을 할당한다.

비선점 (No preemption) 부정

자원을 점유하고 있는 프로세스가 다른 자원을 요구할 때 점유하고 있는 자원을 반납하고, 요구한 자원을 사용하기 위해 기다리게 한다.

순환 대기 (Circular wait) 부정

 자원에 고유한 번호를 할당하고번호 순서대로 자원을 요구하도록 한다.

회피

  • 교착 상태가 발생하면 피해나가는 방법
  • 은행원 알고리즘 (Banker’s Algorithm)
    • 자원할당 요청 -> 자원이 안전한지 체크 -> (안전하다면) 자원할당
                                                              -> (안전하지 않으면) 할당거부

탐지

  • 자원 할당 그래프를 통해 교착 상태 탐지
  • 자원을 요청할때마다 자원 할당 알고리즘을 실행하면 오버헤드 발생

회복

  • 교착 상태를 일으킨 프로세스를 종료하거나할당된 자원을 해제함으로써 회복

프로세스를 종료하는 방법

  • 교착 상태의 프로세스를 모두 중지
  • 교착 상태가 제거될 때까지 한 프로세스씩 중지

자원을 선점하는 방법

  • 교착 상태의 프로세스가 점유하고 있는 자원을 선점하여 다른 프로세스에게 할당하며해당 프로세스를 일시 정지 시키는 방법
  • 우선 순위가 낮은 프로세스수행된 횟수가 적은 프로세스 등을 위주로 프로세스의 자원을 선점한다.


'공부 > OS' 카테고리의 다른 글

Page Replace Algorithm  (0) 2016.06.26
가상 메모리 (virtual memory)  (1) 2016.06.26
데드락(Deadlock)  (0) 2016.06.25
스핀 락(Spin lock), 크리티컬 섹션(Critical section), 세마포어(Semaphore), 뮤텍스(Mutex)  (1) 2016.06.25
OS  (0) 2016.06.25

스핀 락

Spin Lock  이름이 뜻하는대로만약 다른 스레드가 lock 소유하고 있다면  lock 반환될 때까지 계속 확인하며 기다리는 것이다. "조금만 기다리면 바로   있는데 굳이 컨텍스트 스위칭으로 부하를  필요가 있나?" 라는 컨셉으로 개발된 것으로 크리티컬 섹션에 진입이 불가능할때 컨텍스트 스위칭을 하지 않고 잠시 루프를 돌면서 재시도 하는 것을 말합니다. Lock-Unlcok 과정이 아주 짧아서 락하는 경우가 드문 경우(적절하게 크리티컬 섹션을 사용한 경우유용하다Spin Lock  다음과 같은 특성을 갖는다.

  1. Lock 얻을  없다면계속해서 Lock 확인하며 얻을 때까지 기다린다이른바 바쁘게 기다리는 busy wating이다.
  2. 바쁘게 기다린다는 것은 무한 루프를 돌면서 최대한 다른 스레드에게 CPU 양보하지 않는 것이다.
  3. Lock  사용가능해질 경우 컨택스트 스위치를 줄여 CPU 부담을 덜어준다하지만만약 어떤 스레드가 Lock 오랫동안 유지한다면 오히려 CPU 시간을 많이 소모할 가능성이 있다.
  4.  하나의 CPU 하나의 코어만 있는 경우에는 유용하지 않다 이유는 만약 다른 스레드가 Lock 가지고 있고  스레드가 Lock 풀어 주려면 싱글 CPU 시스템에서는 어차피 컨택스트 스위치가 일어나야 하기 때문이다. 주의할  스핀락을 잘못 사용하면 CPU 사용률 100% 만드는 상황이 발생하므로 주의 해야 한다스핀락은 기본적으로 무한 for 루프를 돌면서 lock 기다리므로 하나의 쓰레드가 lock 오랫동안 가지고 있다면다른 blocking 쓰레드는 busy waiting 하므로 CPU 쓸데없이 낭비하게 된다.

장점은 스핀락을  사용하면 context switch 줄여 효율을 높일  있습니다. 무한 루프를 돌기 보다는 일정 시간 lock 얻을  없다면 잠시 sleep하는 back off 알고리즘을 사용하는 것이 훨씬 좋습니다.

크리티컬 섹션

유저 객체. (커널에서 제공 객체X)

커널 객체가 아니므로 가볍고 빠름

그러나 한 프로세스 내의 쓰레드 사이에서만 동기화가 가능. 보통의 경우 가볍고 쉽게 쓸 수 있는 동기화 객체

뮤텍스

커널 객체. 

크리티컬 섹션보다 무거움.

크리티컬 섹션이 한 프로세스 내의 쓰레드 사이에서만 동기화가 가능한 반면, 뮤텍스는 여러 프로세스의 스레드 사이에서 동기화가 가능.

뮤텍스를 가장 흔히 사용하는 예가 프로세스 다중 실행을 막을 때. 이런 기능은 크리티컬 섹션으로는 불가능.

cs(크리티컬 섹션)를 가진 스레드들끼리 실행이 겹치지 않게 단독으로 실행하는 기술

세마포어

커널 객체

위의 크리티컬 섹션, 뮤텍스는 동기화 함에 있어서 동시에 하나의 쓰레드만 실행되게 하지만 이에 반해, 세마포어는 지정된 수만큼의 쓰레드가 동시에 실행되도록 동기화하는 것이 가능.

지정된 수보다 작거나, 같을 때까지 쓰레드의 실행을 허용하고, 지정된 수를 넘어서 쓰레드가 실행되려 하면 실행을 막음.


뮤텍스와 세마포어 차이점

세마포어는 뮤텍스가 될 수 있지만 뮤텍스는 세마포어가 될 수 없음.

세마포어는 소유할 수 없는 반면 뮤텍스는 소유할 수 있고 소유자가 이에 책임을 짐

뮤텍스는 1개만 동기화가 되지만 세마포어는 하나 이상을 동기화 할 수 있음

  • 예) 변기가 하나뿐인 화장실에서는 앞의 사람이 볼일을 마치고 나가야 다음 사람이 들어갈 수 있다. 이렇게 한번에 오직 하나만 처리할 수 있는 대상에 사용하는 것이 뮤텍스, 변기가 세개인 화장실에서는 동시에 세 사람이 볼일을 볼 수 있고 이 세 사람 중 아무나 한명이 나오면 다음 사람이 볼일을 볼 수 있다. 이렇게 동시에 제한된 수의 여러 처리가 가능하면 세마포어이다. 만약 변기 세개짜리 화장실의 각 변기에 대해 뮤텍스를 사용한다면 대기중인 사람은 각 변기 앞에 줄을 서는 것이고 이렇게 되면 옆 칸이 비어도 들어가지 못하게 된다. 이에 비해, 변기 세개에 대해 세마포어를 적용하는 것은 화장실 앞에서 줄을 서서 대기하다가 아무나 한명 나오면 대기중이던 한명이 들어가는 것이다. 만약 변기 세개를 묶어서 뮤텍스를 사용한다면 변기 수에 관계없이 무조건 한명만 사용할 수 있게 된다. 이 예에서 변기는 동기화 대상, 사람은 그 동기화 대상에 접근하는 쓰레드를 나타낸다. 뮤텍스와 세마포어의 목적은 특정 동기화 대상이 이미 특정 쓰레드에 의해 사용중일 경우 다른 쓰레드가 해당 동기화 대상에 접근하는 것을 제한하는 것으로 동일하지만 관리하는 동기화 대상이 몇개인가에 따라 차이가 생기게 되는 것이다.


'공부 > OS' 카테고리의 다른 글

Page Replace Algorithm  (0) 2016.06.26
가상 메모리 (virtual memory)  (1) 2016.06.26
데드락(Deadlock)  (0) 2016.06.25
스핀 락(Spin lock), 크리티컬 섹션(Critical section), 세마포어(Semaphore), 뮤텍스(Mutex)  (1) 2016.06.25
OS  (0) 2016.06.25
  1. ㅁㅁ 2019.05.02 17:30

    음 근데 궁금한게 있는데요 세마포어는 여러 개 쓰레드에 자원할당을 해줄 수 있는데

    똑같이 그러면 공유 데이터에 접근하는 문제가 생기는 거 아닌가요?

OS란?

컴퓨터의 하드웨어와 소프트웨어를 제어하며, 사용자가 컴퓨터를 쓸 수 있게 만들어주는 프로그램

OS의 목표

  • 어플리케이션을 위한 기본 실행 환경을 제공해 사용자의 프로그램을 정확하게 실행
  • 컴퓨터 시스템을 편리하고 효율적이고 안전하게 사용할 수 있게 만듬

OS의 관점

  • resouce allocator - 컴퓨터 시스템의 자원(소프트웨어, 하드웨어)를 할당해주고 이것들을 효율적으로 관리
  • control program - 사용자 프로그램 실행과 I/o 장치 실행을 통제한다.
  • kernel - 컴퓨터 운영체계의 가장 중요한 핵심으로서 운영체계의 다른 모든 부분에 여러 가지 기본적인 서비스를 제공한다.
  • 멀티 프로세스/ 멀티 테스킹 : 여러 작업은 동 시간에 메인메모리 안에서 유지되고 이러한 프로세스들은 cpu time, I/o 장치, 다른 자원들을 공유한다.

컴퓨터 시스템의 구성요소

  • 하드웨어 - CPU, Memory 등 기본 컴퓨팅 리소스
  • 유저
  • 어플리케이션
  • OS

Interrupt

CPU는 데이터를 메인메모리 ↔로컬 버퍼 로 데이터를 이동시킨다.

I/o 디바이스

각 디바이스 컨트롤러는 로컬 버퍼를 가진다.

cpu와 I/o디바이스는 동시에, 독립적으로 실행된다.

 cpu와 I/o디바이스 사이에 정보를 전달하는 의사소통이 필요하다.

디바이스 컨트롤러는 cpu에게 자신의 처리가 끝났다는 것을 알려야 한다.

 -> Interrupt로 알려줌.

cpu, 다양한 device controller들이 공유하는 메모리에 접근하기 위해 공용버스를 통해 연결됨

cpu가 다른 일을 하고 있다가 interrupt가 걸리면 저장한 다음 멈추고 interrupt를 건 I/o디바이스를 처리한다.

 인터럽트엔 h/w, s/w 가 있음.

하드웨어는 우리가 알고 있는 I/o 디바이스의 신호

소프트웨어에는 cpu 내부에서 0으로 나눴을 때와 같은 오류 인터럽트 (trap)

인터럽트 걸렸을 때, 과정

하던일 멈춤-> 고정 위치에 하던일 저장 -> 인터룹트 서비스 루틴 실행 -> 서비스 루틴 완료한 다음 다시 하던 일 시작


interrupt : 키보드에서 인터룹트 발생

exception: 0을 나눌 때,

듀얼모드

유저모드와 커널모드로 나눔 유저모드에 어플리케이션이 있고 커널모드에서 처리 이 두 사이에 통신을 위해 시스템 콜이 일어남.

function call : caller와 callee는 같은 프로세스 안에 있음

system call : 다른 프로세스에 있음

- 같은 액티비티를 수행하기 위해 os에게 요청 - 매우 비쌈

운영체제가 지원하는 서비스에 대한 프로그래밍 인터페이스

프로세스 관리

 fork() : 부모에서 동일한 차일드 프로세스 생성

c에서 printf를 하는 행동은 유저모드에서 발생. prinf를 하면 c library call이 일어남. 다음 커널 모드에서 write()를 호출하고 write() system call이 불린 후 결과를 역순으로 전달.


system call의 종류 

프로세스 컨트롤, 파일 관리, 디바이스 관리, 정보 유지,


ms-dos - simple structure 듀얼모드 없음

unix - layered 커널에서 모든 것을 관리, 기능이 확장됨에 따라 커널이 넘 커짐


텍스트 : PC(피시 카운터 - 다음번에 실행 될 명령어의 주소를 가지고 있는 레지스터), 프로그램 코드 저장

데이터: 글로벌 변수, 스태틱 변수 저장

 :메모리관리, 동적 메모리 할당(시스템 콜로 관리)

스택: 임시 데이터 저장- 로컬 변수, 리턴 어드레스


한 프로그램은 동시에 여러번 실행할 수 있다.

-> 비록 두 프로세스는 같은 프로그램이라도, 두 개의 분리된 실행 시퀀스로 간주됨

이것은 Text section (텍스트영역)은 공유할 수있지만, Data, Heap, Stack 영역은별도로갖음.

쓰레드는 스택을 제외하고 전부 공유


하나의 프로세스는 CPU에서 한번만 실행된다. 나머지는 준비상태나 대기상태의 큐에 존재한다.

각 프로세스는 등록되고 커널(OS)에 의해 관리된다.

 각 프로세스는 PCB에 정보를 저장하고 표현된다.(프로세스 상태, CPU 레지스터, 정보 등)

Context switch

현재 cpu를 사용중인 프로세스의 상태를 저장하고 새로운 프로세스의 상태를 이전에 cpu를 쓰던 상태로 복귀 다음 context 정보들을 pcb에 저장되고 불려짐. 

멀티쓰레드

이전 웹서버는 많은 사용자의 요청이 들어올 경우, 사용자의 요청 당 프로세스 1개씩 생성했다. 문제로 프로세스간 데이터를 공유하기 위해 IPC가 필요했다.

이 문제를 멀티쓰레드로 가능하게 했다. 멀티 쓰레드는 스택영역을 제외하고 텍스트, 데이터, 힙을 공유해 한 프로세스안의 쓰레드 간 공유를 쉽게 할 수 있다.

쓰레드 VS 프로세스

새로운 프로세스를 생성해 fork()를 사용하는 것은 비싸다.(시간 & 메모리)

왜? 

fork는 글로벌 변수, 코드, 스택 부분을 전부 복사해서 새로운 프로세스를 만든다.

thread는 stack만 따로 만든다.(나머지 공유)

멀티쓰레드 모델

many to one : 1개의 커널 쓰래드에 여러개의 유저쓰레드 연결

one to one : 유저 쓰레드 1개당 커널쓰레드 (각기 분리되어있음)

many to many : 여러 커널 쓰레드와 유저 쓰레드를 연결. 통로는 1개로 스케쥴링에 의해 커널 쓰레드를 결정함

스케쥴링

OS의 역할

시간 공유를 위한 자원


Preemptive: 현재 실행중인 프로세스에 인터룹트가 걸리면 레디상태로 이동한다.

non-Preemptive: cpu가 프로세스 하나에 전부 할당되어 일처리가 완료 될 때까지 자원을 놓지 않는다.


스케쥴링 알고리즘 

FCFS

도착한 순서대로 실행, 논 프림티브에 적당, 다 끝나거나 I/O요구하기 전까지 자원을 놓지않음

SJF(shortest-job-first)

두가지 버전이 있다.

non-preemptive - 맨 처음은 들어온 순서대로 수행 후 맨 처음 프로세스가 수행 중 도착한 프로세스 중 burst time(수행시간)이 가장 짧은 순서대로 수행.

preemptive - 맨 처음 도착한 프로세스를 수행 중에 도착한 프로세스들과 burst time을 계속 비교해 가장 짧은 것을 수행한다.

장점 : 평균 waiting time이 가장 짧음, 반응이 빠름

단점 : starvation - burst time이 가장 긴 프로세스가 먼저 들어왔을 경우에 실행이 되지 않을 수도 있음. -> aging으로 해결가능 (시간에 따라 priority를 높힌다.)

Priority 

우선순위에 따라 실행 순서를 결정. 

문제점: 

RR (round robin)

프림티브

time quantum을 사용자가 지정해 프로세스에 할당 시간을 준다.

(예, time quantum 시간을 10이라 잡으면 각 프로세스마다 10이란 시간을 사용하고 다시 큐에 들어가 대기)


(time quantum; 이하 g라 부름] g가 매우길면 fcfs가 되고 매우 짧으면 빈번하게 context switching이 벌어져  오버헤드가 매우 높아진다.)


Syncronize

Race Condition

일반적으로 Race Condition 이란 두 개 이상의 프로세스가 공통 자원을 병행적으로(concurrently) 읽거나 쓸 때, 공용 데이터에 대한 접근이 어떤 순서에 따라 이루어졌는지에 따라 그 실행 결과가 달라지는 상황을 말한다. Race condition이 발생하게 되면 모든 프로세스에 원하는 결과가 발생하는 것을 보장할 수 없으므로 이러한 상황은 반드시 피해야 한다. 이를 피하는 방법은 크게 mutual exclusion과 critical section으로 나누어 볼 수 있다.
예를 들어 A와 B라는 사람이 같은 계좌에 0원이 들어있는 계좌에서 돈을 각각 입금, 출금을 동시에 한다고 했을 때, 이를 처리하는 순서에 따라서 B는 출금을 할 수도 있고 없을 수도 있다.

Mutual Exclusion 

Race condition을 해결하기 위해서는 두개 이상의 프로세스가 공용 데이터에 동시에 접근하는 것을 막아야 한다. 즉 한 프로세스가 공용 데이터를 사용하고 있으면 다른 프로세스가 그 자원을 사용하지 못하도록 막거나, 다른 프로세스가 이미 공용 자원을 사용하고 있으면 이 프로세스가 그 자원을 사용하지 못하도록 막으면 race condition을 피할 수 있다. 각각이 서로 공용자원의 사용을 막는다는 의미에서 이런 접근을 상호 배제(mutual exclusion)이라고 부른다. 

 Critical Section

프로세스의 입장에서 보면 프로세스의 어떤 부분은 자신만의 데이터를 가지고 열심히 계산만 하는 부분이 있고 공용데이터에 값을 저장하거나 읽어오는 부분이 있다. 공용 데이터에 접근하는 부분을 특별히 critical region 또는 critial section이라고 부른다. 따라서 프로세스란 측면에서 보았을 때 어떤 두 프로세스가 동시에 critical section에 들어가지 않도록 할 수 있다면 race condition을 피할 수 있다.

Syncronize 문제점

read와 write는 동시에 나올 수 없다.

read는 동시에 여러개가 가능하지만 write는 무조건 1개만 실행되어야 한다.


'공부 > OS' 카테고리의 다른 글

Page Replace Algorithm  (0) 2016.06.26
가상 메모리 (virtual memory)  (1) 2016.06.26
데드락(Deadlock)  (0) 2016.06.25
스핀 락(Spin lock), 크리티컬 섹션(Critical section), 세마포어(Semaphore), 뮤텍스(Mutex)  (1) 2016.06.25
OS  (0) 2016.06.25

1. IP 주소란?

먼저 IP 주소가 무엇인지를 알아보자. IP 주소란 위키백과에 다음과 같이 정의되어 있다.

IP 주소(Internet Protocol address, 표준어: 인터넷규약주소)는 컴퓨터 네트워크에서 장치들이 서로를 인식하고 통신을 하기 위해서 사용하는 특수한 번호이다. 네트워크에 연결된 장치가 라우터이든 일반 서버이든, 모든 기계는 이 특수한 번호를 가지고 있어야 한다. 이 번호를 이용하여 발신자를 대신하여 메시지가 전송되고 수신자를 향하여 예정된 목적지로 전달된다. IP 주소를 줄여서 IP라고 부르기도 하나 IP는 인터넷 규약 자체를 가리키는 말이기 때문에 엄밀하게는 구별해야 한다.

요약하자면 IP 주소란 인터넷에 접속하기 위해 컴퓨터나 스마트폰 등에 부여하는 고유한 주소라고 정의할 수 있겠다. 따라서, 모든 장비에는 IP 주소가 부여되어야만 한다는 의미로 이해하면 되겠다.

2. IPv4 주소 체계

앞절에서 정의한 IP 주소를 부여하는 방식으로 현재 쓰이는 것이 IPv4 (IP version 4) 규약이다. 이 주소는 우리도 흔히 알듯이 32비트로 구성된 주소체계로 0~255 사이의 십진수 넷을 구분하여 부여한다. 흔히 우리가 주변에서 IP 주소를 168.126.63.1 과 같이 네자리의 10진수로 나눠서 부를 때 이것이 IPv4 주소라고 보면 된다. IPv4 주소 체계에서는 이론적으로 부여할 수 있는 주소의 총 수는 0.0.0.0 ~ 255.255.255.255 로 256 x 256 x 256 x 256 = 42억 9496만 7296개가 최대가 된다.

 3. 공인 IP

앞에서 설명한 IPv4 주소는 임의로 우리가 부여하는 것이 아니라 전세계적으로 ICANN이라는 기관이 국가별로 사용할 IP 대역을 관리하고 우리 나라는 인터넷 진흥원(KISA)에서 우리나라 내에서 사용할 주소를 관리하고 있다. 따라서, 임의로 아무 IP 주소나 내 컴퓨터에 지정한다고 인터넷이 되는 것이 아니라 할당받은 주소를 부여해야만 인터넷에 접속할 수 있게 된다.

IPv4는 크게 4자리의 대역에 따라서 다음과 같이 분류할 수 있다. http://ko.wikipedia.org/wiki/IPv4 에 자세한 내용이 설명되어 있다.

  • A 클래스는 네자리의 IP 주소 대역 중에서 두번째, 세번째, 네번째 주소를 마음대로 부여할 수 있는 최상의 클래스로 클래스 당 255 x 255 x 255 개의 주소를 가질 수 있다.
  • B 클래스는 네자리의 IP 주소 대역 중에서 세번째, 네번째 주소를 마음대로 부여할 수 있는 클래스로 클래스 당 255 x 255 개의 주소를 가질 수 있다.
  • C 클래스는 맨 뒤 네번째 자리만 마음대로 부여할 수 있는 주소로 클래스 당 255개의 주소를 갖는다.

이와 같이 클래스를 분류해뒀는데, 문제는 IP가 부족하다보니 서버 운영 시에 원하는 대로 IP 주소를 부여받을 수 없고, 서버 운영 업체나 기관 들에 할당된(미리 돈을 지불하고 산다) 주소 중에서 자신의 컴퓨터에 주소를 할당 받아야 한다.

최근의 IP 부족 사태는 인터넷 발전 초기에 IP 주소를 무계획적으로 배분했기 때문에 발생하는 문제이다. 대표적으로 미국의 일반 기업인 IBM이나 모토롤라 등은 초기에 인터넷 주소를 부여받으면서 A 클래스를 부여받았고, 우리나라내에서도 KAIST나 서울대 등은 B 클래스를 보유하여 학교내의 PC들에게도 마구 공인 IP를 부여하고 있는 웃지 못할 상황이다. 반면 최근에 IP를 신청하는 기업은 많은 비용을 지불하고도 C 클래스 대역조차 얻기가 쉽지않은 현실이다.

4. 사설 IP

전체 IP 대역 중에서 특수한 목적으로 사용하기 위해서 몇 개의 대역을 제외하고 공인 IP 대역으로 할당하고 있는데, 제외된 대역 중에서 사설 IP로 사용되는 대역은 사용자가 임의로 부여하고 사용할 수 있지만 인터넷 상에서 서로 연결되지 않도록 되어 있다. 전체 IP 대역 중에서 다음의 대역이 사설 IP 대역이다.

  • A 클래스 : 10.0.0.0 ~ 10.255.255.255
  • B 클래스 : 172.16.0.0 ~ 172.31.255.255
  • C 클래스 : 192.168.0.0 ~ 192.168.255.255

위의 3개의 클래스 대역은 사용자가 자신의 컴퓨터에 임의로 부여해도 되는 IP 주소 대역이 된다.

따라서 회사 내부나 집에서는 공인 IP를 부여받지 않은 상태에서 위의 주소 대역 중에서 아무 주소나 할당을 해도 문제가 발생하지 않는다는 것이다.

따라서 공인 IP 주소가 모자랄 경우 사설 IP로 회사나 가정 내의 IP 주소를 부여하고 공유기 등에 고정 IP를 부여한 다음에 인터넷에 접속하는 방식이 널리 퍼지게 되었고, 대부분의 장비가 현재는 사설 IP를 부여하고 공유기나 라우터(사실 공유기가 라우터다)를 통해 인터넷에 접속하게 된다. 단 사설 IP를 부여한 컴퓨터는 공인 IP에서 알아볼 수가 없다는 점이 특징이다.


위의 그림을 보면 컴퓨터에 부여된 IP 주소인 192.168.0.2 ~ 192.168.0.4과 공유기의 내부 주소인 192.168.0.1은 사설 IP이고 공유기가 인터넷에 연결된 168.126.63.1은 공인 IP가 된다. 서버에 설치된 IP인 164.124.101.2도 공인 IP이다. 따라서 인터넷 상에서  164.124.101.2라는 주소를 치면 서버에 접속할 수 있지만 192.168.0.x 대역에 있는 피시와 노트북에는 접속할 수 없다. 가정에 설치된 공유기 관리 화면에 접속해보면 위의 같은 형태로 IP가 부여되어 있음을 알 수 있을 것이다.

 5. 고정 IP와 유동 IP

고정 IP는 컴퓨터에 고정적으로 부여된 IP로 한번 부여되면 IP를 반납하기 전까지는 다른 장비에 부여할 수 없는 IP 주소를 말한다. 유동 IP는 장비에 고정적으로 IP를 부여하지 않고 컴퓨터를 사용할 때 남아 있는 IP 중에서 돌아가면서 부여하는 IP를 뜻한다. 부여받은 IP가 10개이고 접속해야할 컴퓨터가 20대라면 10대는 고정 IP를 부여할 경우 IP가 모자라므로 유동 IP로 10개를 20대가 돌아가면서 사용할 수 있다.

이상으로 간략하게 공인 IP와 사설 IP, 고정 IP와 유동 IP에 대해서 살펴봤는데, 결론적으로 인터넷 상에서 서버를 운영하고자 할 때는 공인 IP를 고정 IP로 부여해야 한다는 것이 중요하다. 즉, 공인 IP를 부여받지 못하면 다른 사람이 내 서버에 접속할 수가 없고, 고정 IP를 부여하지 않으면 내 서버가 아닌 다른 사람의 서버로 접속이 될 수도 있기 때문이다.

반면에 우리가 집에서 사용하는 인터넷 서비스 업체는 각 가정마다 공인 IP를 유동 IP로 부여하고, 공유기 내부에서는 사설 IP를 유동 IP로 부여하는 것이 일반적이라고 보면 될 것이다.

'공부' 카테고리의 다른 글

JIT(Just-In-Time)  (0) 2016.07.06
MVC패턴  (0) 2016.06.26
싱글톤패턴(singleton pattern)  (0) 2016.06.26
공인 IP, 사설 IP, 고정 IP, 유동 IP  (0) 2016.06.23
쓰레드(thread)와 프로세스(process)  (0) 2016.06.23
비동기(Async)통신과 동기(Sync)통신  (0) 2016.06.23

Thread란

하나의 프로그램내에서 여러 개의 실행 흐름을 두기 위한 모델

하나의 프로세서(실행 중인 프로그램)에서 각 독립적인 일의 단위인 스레드(Thread)로 여러 작업을 처리할 수 있다. 즉 하나의 프로세서에서 병렬적으로 여러 개 작업을 처리하기 위해서는 각 작업을 스레드화하여 멀티스레딩이 가능하게 해야 한다.

Process란

간단하게 말하면 실행중인 프로그램.

프로세스는 사용 중인 파일, 데이터, 프로세서의 상태, 메모리 영역 주소 공간, 스레드 정보, 전역 데이터가 저장된 메모리 부분 등 수 많은 자원을 포함하는 개념. 종종 스케쥴링의 대상이 되는 작업이라고 불리기도 함

쓰레드와 프로세스의 차이점

프로세스는 완벽히 독립적이기 때문에 메모리 영역(Code, Data, Heap, Stack)을 다른 프로세스와 공유를 하지 않지만, 쓰레드는 해당 쓰레드를 위한 스택을 생성할 뿐 그 이외의 Code, Data, Heap영역을 공유한다.

텍스트 : PC(피시 카운터 - 다음번에 실행 될 명령어의 주소를 가지고 있는 레지스터), 프로그램 코드 저장

데이터: 글로벌 변수, 스태틱 변수 저장

 :메모리관리, 동적 메모리 할당(시스템 콜로 관리)

스택: 임시 데이터 저장- 로컬 변수, 리턴 어드레스

스택을 독립적으로 할당하는 이유

  • 스택은 함수 호출 시 전달되는 인자, 되돌아갈 주소값 및 함수 내에서 선언하는 변수 등을 저장하기 위해 사용되는 메모리 공간이다. 따라서 스택 메모리 공간이 독립적이라는 것은 독립적인 함수 호출이 가능하다는 것이고, 이는 독립적인 실행 흐름이 추가되는 것이다. 결과적으로 실행 흐름의 추가를 위한 최소 조건이 독립된 스택을 제공하는 것이다. 

코드 영역을 공유

  • 프로세스는 독립적인 구조이기 때문에 다른 프로세스의 Code영역에 있는 함수를 호출할 수 없다.
  • 쓰레드는 Code영역을 공유하기 때문에 두 개 이상의 쓰레드가 자신이 포함된 프로세스의 Code영역에 있는 함수를 호출할 수 있다.

데이터 영역과 힙 영역을 공유

  • 전역 변수와 동적 할당된 메모리 공간을 공유할 수 있고, 이를 통해 쓰레드 간 통신을 할 수 있지만  동시에 메모리에 접근하기 때문에 주의해야 한다.

멀티 프로세스의 문제점

  • 두 개의 프로세스는 완전히 독립된 두 개의 프로그램 실행을 위해서 사용되기 때문에 컨텍스트 스위칭(프로세스의 상태 정보를 저장하고 복원하는 일련의 과정)으로 인한 성능 저하가 발생
  • 쓰레드는 하나의 프로그램 내에서 여러 개의 실행 흐름을 두기 위한 모델이다.
  • 쓰레드는 프로세스처럼 완벽히 독립적인 구조가 아니다. 쓰레드들 사이에는 공유하는 요소가 있다.
  • 쓰레드는 이 공유하는 요소로 인해 컨텍스트 스위칭에 걸리는 시간이 프로세스보다 짧다.

쓰레드가 프로세스보다 컨텍스트 스위칭이 빠른 이유

 쓰레드가 프로세스보다 컨텍스트 스위칭이 빠른 이유는 메모리 영역을 공유하기 때문이다. 실제로 공유되는 데이터가 있고 아닌 데이터가 있다.

sp(Stack Pointer), fp(Frame Pointer), pc(Program Counter) 레지스터

  • pc는 실행해야 할 명령어의 위치를 가리키는 레지스터이다.
  • 쓰레드별로 main함수를 독립적으로 가지고 있고, 함수 호출도 독립적으로 진행되기 때문에 쓰레드별로 현재 pc값은 달라야 한다. 따라서 pc는 공유되지 않는다.
  • 쓰레드는 독립적인 스택을 가지기 때문에 스택의 정보를 담고 있는 sp와 fp는 공유되지 않는다.

범용적으로 사용가능한 레지스터

  • 시스템을 어떻게 디자인 하느냐에 따라 달라지는 것이기 때문에 일반적으로 공유된다고 할 수 없다.

캐시메모리

  • 캐시 메모리는 CPU에서 한번 이상 읽어 들인 메인 메모리의 데이터를 저장하고 있다가 CPU가 다시 그 메모리에 저장된 데이터를 요구할 때 메인 메모리를 통하지 않고 바로 값을 전달하는 용도로 사용된다.
  • 프로세스 사이에서 공유하는 메모리가 하나도 없기 때문에 컨텍스트 스위칭이 발생하면 캐쉬에 있는 모든 데이터를 모두 리셋하고 다시 캐쉬 정보를 불러와야 한다.
  • 쓰레드는 캐쉬 정보를 비울 필요가 없기 때문에 프로세스와 쓰레드의 컨텍스트 스위칭 속도의 차이는 이때 발생한다.

Windows에서의 프로세스와 쓰레드

  • Windows 입장에서 프로세스는 쓰레드를 담는 상자에 지나지 않는다.
  • 또한 Windows에서 프로세스는 상태(Running, Ready, Blocked)을 지니지 않는다. 상태를 지니는 것은 스레드이다.
  • 스케줄러가 실행의 단위로 선택하는 것도 프로세스가 아닌 스레드이다.
  • 프로세스 컨텍스트 스위칭 역시 실제로 오버헤드가 발생하는 부분은 서로 다른 프로세스에 포함된 스레드 간의 컨텍스트 스위칭시 발생한다.


'공부' 카테고리의 다른 글

JIT(Just-In-Time)  (0) 2016.07.06
MVC패턴  (0) 2016.06.26
싱글톤패턴(singleton pattern)  (0) 2016.06.26
공인 IP, 사설 IP, 고정 IP, 유동 IP  (0) 2016.06.23
쓰레드(thread)와 프로세스(process)  (0) 2016.06.23
비동기(Async)통신과 동기(Sync)통신  (0) 2016.06.23

+ Random Posts