cpu 스케쥴은 멀타프로레싱

'OS > OS 파헤치기!' 카테고리의 다른 글

5. 프로세스의 생성 사용 및 소멸  (0) 2010.09.22
4. 프로세스(process)?  (0) 2010.08.25
3. 하드웨어 보호(Hardware Protection)  (0) 2010.08.17
2장 컴퓨터 구조  (0) 2010.08.16
1장. OS란?  (0) 2010.08.12
AND

프로세스를 코드 상에서 생성 사용 소멸 하는 일은 그렇게 어려운 일은 아니다. 하지만 순차적인 프로그래밍 만을 해오던 나에게는 여러개의 프로세서가 돌아가는 환경을 이해하고 프로그래밍 하는 것에 익숙하지않다.
일단 글의 내용과 더불어 정리해 보자 
먼저 한개의 어플은 한개의 부모 프로세스로 시작을 한다 . main()자체가 부모프로세스를 생성시킨다. 
main()안에 fork()라는 콜은 자식 프로세스를 생성케 한다. 
exit() 라는 콜로 부모 프로세스 및 자식 프로세스도 소멸시킨다.

main() 
{ 
   printf("hello world\n"); 
   fork(); 
   printf("goodbye world\n"); 
} 

결과.

hello world 
goodbye world 
goodbye world
이제 다음으로 fork()로 자식 프로세스를 생성후 리던되는 값을 확인해 보도록하자.  코드를 보도록 하자
main(){
	pid_t		pid;
	printf("pid = %d \n", pid);
	printf("fork_= %d\n", fork());
}
결과는 
pid = 9331877  -- pid
fork_= 5999      - 부모 프로세스로 리턴되는 값 = 자식프로세서의 pid
fork_= 0           - 자식프로세스로 리턴되는 값
여기서 pid_t는 process id type로서 integer과도 서로 컨버전이 되는 정수값이다. 이는 바로 프로세스의 이름표이다.
한 시스템 내부의 모든 프로세스들은  각각 고유의 프로세서 id를 가지게 된다. 대부분 일정한 규칙을 가지고  id를 생성하게 되는데 몇몇 개는 시스템 차원에서 고정된값을 가지고 있기도 하다. 
위의 실행 결과에서도 볼 수 있지만, fork()는 부모 프로세스에게 자식프로세서의 pid를 리턴하고 자식프로세스에게는 0을 리턴해주게 된다. 
또한 실행 순서도 알 수 있게된다. 부모프로세스로 리턴 후 자식프로세서 로 리턴 수행
그리고 나서 다음의 코드를 보자
main() 
{ 
   pid_t   pid; 

   if((pid = fork()) == 0) 
      printf("I am a child process\n"); 
   else 서
      printf("I am a parent process\n"); 
} 

결과는 여러분도 예상했다싶이

I am a child process 
I am a parent process 
자, 다음을 분석하면 처음 if문에서  부모프로세스로 리턴되는 값을 pid에 넣고 0 이랑 같음을 비교한다. 0이랑 같지 않으므로 else가 수행되어 두번째 printf가 수행되고 , 다음으로 자식프로세스가 수행되면서 fork()의 리턴값이 0이되므로 if문안에서 첫번째 printf문을 수행하게된다.
재미있는 사실은 보통 자식 프로세스를 생성하게될 때 for문을 사용하여 쭉 생성하고 배열에 pid를 담아두어 각 요소별로 pid의 값을 제어할 수 있도록 프로그래밍 하게 된다. 또한 소스 마지막 부분에는 getpid()하는 함수를 붙여둠으로써 어떤 프로세스가 cpu를 점유하는지 쉽게 알 수 있도록 하고 있다. 
이렇게 여러개의 프로세스를 생성함에 있어서 또 한가지 중요한 개념은 바로 싱크이다. 예를 들어 부모프로세스가 홀수를 출력하고 자식 프로세서가 짝수를 출력할때 홀수다음반드시 짝수 그다음 홀수 이런식으로 프로세서들끼리의 의사소통을 통해서 이러한 순서를 맞추는 과정을 싱크라하는데,  sleep()함수를 통해서도 조절할 수 있지만 차후에 싱크라는 개념을 중요하게 다루게 될것이다. 차후에 적어보도록 하겠다. 
다음으로 차일드 프로세스의 의 용도에 대해 알아보겠다. 크게 두가지로 볼 수 있는데 
첫번째는 강력한 콜인 exec** ()이다. **에는 c,p,l,v 이렇게 네글자가 한쌍으로 조합되어 적용되는데 이는 넘겨주는 매개변수에 따라서 달라진다. 그냥 간단하게 exec콜은 지정한 디렉토리 안에 있는 바이너리를 차일드 프로세스의 몸통과 합체를 시켜버리는 즉, 프로그램 내부에서 다른 프로그램을 차일트프로세스화 시켜버리는 일을 한다. 
두번째는, 서버를 구축할 때 유용하다. 물려들어오는 여러 사용자들에게 자식 프로세스를 하나씩 발행해 주는 것이다. 
이상으로 용도에 대해 알아보았다. 
마지막으로 미아숙청 룰에 대해 이야기하고 마무리 짓도록 하겠다. 유닉스는 엄격한 룰을 가지고 있는데 그것은 바로 미아는 절대로 방치하지 않는 다는 정책이다. 쉽게 말하면 부모프로세스없는 자식프로세스는 존재하지 않도록 발견즉시 종료시켜버린다. 부모프로세스가 종료될때 무조건 자식프로세스들까지 삼족을 멸하거나, 비정상적인 부모프로세스의 종료로 인한 자식프로세스의 미아화가 발견되었을 때는 바로바로 종료시킨다. 이는 소중한 메모리공간이 미아로 가득차는 불상사를 방지하고자 하는 정책이다.




'OS > OS 파헤치기!' 카테고리의 다른 글

6. 씨피유 스케줄링  (0) 2010.09.23
4. 프로세스(process)?  (0) 2010.08.25
3. 하드웨어 보호(Hardware Protection)  (0) 2010.08.17
2장 컴퓨터 구조  (0) 2010.08.16
1장. OS란?  (0) 2010.08.12
AND

초기시절 컴퓨터들은 한번에 한개의 프로그램이 실행되는 환경을 제공해 주었다. 즉, 한개의 프로그램은 시스템의 모든 자원을 독점하였다. 사람은 한번에 한가지 일을 빠르고 확실하게 처리하고 다른일을 하는것이 효율적일지 몰라도 컴퓨터의 cpu는 매우(?) 빠르기 때문에 이는 낭비이다.  오늘날 컴퓨터 시스템은 여러개의 프로그램이 메모리에 로딩되고 동시에!실행되는 환경을 유지하고 있다. 이러한 환경을 제공해 주기 위하여 등장하는 것이 바로 프로세스(process)라는 개념이다. 

프로세스란? 간단히 정의내리면 현재 실행중인 프로그램을 의미하게 된다.  이것은 시분할 시스템의 기본 단위이기도 하다. 결국 동시에 어떤 프로그램을 실행시킨다는 것은 시간적으로 여러개의 프로세스를 돌아가면서 실행시키는 것으로 구현하게 되는 것이다. 극단적으로 결국 하나의 씨피유를 가지고는 진정한 의미의 멀티 프로세싱이 불가능하다.
프로세스라는 개념은 오에스차원에서 매우 중요하다. 유저가 원하고자 실행시키는 프로그램 밑 바닥에는 마치 평온한 호수가에서 유유자적하는 어플 프로세스들이 발바닥을 촐싹거리면서 휘어져야 한다. 결국 시스템은 각종 프로세서들의 모음으로 이루어진다고 할 수 있다. 또한 프로세스란 리소스를 점유한채 실행중인 코드 를 의미한다. 
프로세스를 이루고 있는 구성 요소들은 실로 다양하다. 먼저 다음번 코드를 실행시킬 코드가 들어있는 주소를 가리키고 있는 프로그램 카운터, 다른 참조해야할 레지스터들의 값, 잠시 필요한 값을 저장해 두는 스택, 데이터, 그리고 전역변수 등등이 있다. 프로그램 그 자체와 프로세스와의 가장 중요한 차이점은 프로그램 자체는 수동적 존재임에 반해 프로세스는 위의 정보를 바탕으로 살아 움직이는 능동적인 존재라는 점이다. 따라서 프로세스는 나름대로의 상태를 가지고 있다. 총 다섯가지 상태로 크게 나뉘게 되고 각 상태에 대한 흐름도는 책을 찾아보기 바란다. 
프로세스는 같은 프로그램에 귀속될지라도 서로 독립적으로 존재하게 되는데, 그 좋은 심플텍스트와 같은 어플리케션이다. 이러한 프로그램 자체는 하나만 존재하지만, 여러개의 창을 열때마다 각각의 프로세스들이 생성되어서 각각의 윈도우를 관리해 주게 된다. 이 때 좀더 전문적으로 얘기하면 , 각각의 프로세스의 텍스트 섹션은 동일하지만 데이터 섹션은 다르다! 라고 말할 수 있다. 
또 프로세스의 중요한 특징은, 이놈이 살아 꿈틀대는 것만으로도 모자라 이제는 아들, 딸 프로세스 까지 생성이 가능하다는 데에 있다. 무슨말이냐... 한개의 프로세스는 위에서 말한 각종 정보를 가지고 태어나는데, 이녀석이 차일드 프로세스를 만들게 되면 부모프로세스의 데이터 및 스트럭쳐들이 모조리 복사되어 똑같은 붕어빵 프로세스가 태어나게 된다. 이때 생성을 가한 프로세스를 패런트프로세스, 생성된 프로세스를 차일드 프로세스 라고 한다. 
이들 사이의 관계에서는 엄격하면서도 유용한 구석이 있다. 먼저 차일드 프로세스는 글로벌이건 로컬이건 간에 가리지 않고 패런트로부터 모조리 데이터를 복사해 오는데, 복사된 순간부터는 각자의 길을 걷게 된다. 로컬 변슈야 그냥 그러려니 해도 나중에 패런트 프로세스의 글로벌 변수를 고쳐 주어도 차일드는 그냥 씹어버린다. 자신에게 이미 글로벌 복사본이 존재하기 대문이다. 그러면 이러한 두 부자지간의 세대차이를 어떻게 극복해야 하나 하는 문자가 대두 되는데, 이를 해결해 주는 것이 바로 IPC(inter process Communication) 이다. 
자, 이젠 다시 프로세스 고유의 성격을 논해보기로 하자. 프로세스를 논하기 위해서는 먼저 PCB(Process Control Block)을 알아야한다. 각각의 프로세스는 PCB로 대표되어 지는데 이는 프로세스의 상태, 프로그램 카운터, 씨피유 레지스터, 씨피유 스케줄링 정보, 메모리 관리 정보, 어카운팅 정보, 그리고 I/O 상태 정보등을 담고 있게 된다. 거대한 레코드 같은 존재이다. 그러나 하나의 프로세스를 하나의 PCB로 표현할 수 있다는 사실은 프로세스 간의 관계를 정의하고 나타내기 위해서는 매우 유용한 개념이다. 
먼저 프로세스 스케줄링은 멀티프로그래밍의 목적(언제나 활성화되어 있는 프로세스들이 존재함으로써 cpu가 놀지 않고 그 활용도를 극대화 시키는 것)에 걸맞도록 설계 되어야 한다. 
스케줄링을 위해서는 언제나 큐(queue)가 필요하다. 참고로 큐란 FIFO(First In First Out)를 구현하는 데이터 스트럭쳐 이다. 먼저 온놈이 먼저 나간다는 아이디어다. 한개의 프로세스가 시스템에서 생성이되면, 일단 잡큐(job queue)에 쇽, 들어가게 된다. 잡큐에 있던 녀석들이 메모리에 로딩되고 실행할 준비를 마치면 비로서 레디큐(ready queue)로 다시 쇽쇽 들어가는데, 레디큐는 링크드 리스트로 이루어져 있다.  즉, PCB로 링크드 리스트를 만드는 것이다. 이 밖에 필요한 큐로서는 I/O와 관련된 프로세스를 담아주는 디바이스큐( device queue)라는 것이 또 존재한다. 각각의 디바이스는 각자의 디바이스큐를 가지고 있게 된다. 

이제 멀티프로그래밍이 구현되는 원리를 살펴보도록 하자. 시스템이 p0라는 프로세스를 실행하고 있다고 하자. 그런데 불현듯 p1을 위한 인터럽트나 시스템 콜이 호출되어 버리면, 오에스는 즉시 p0의 PCB 내부 필드의 값들을 모두 업데이트 시킨다음 상태를 레디상태로 돌려버리고 레디큐에 쑤셔 넣는다. 그대신 p1의 PCB를 런닝상태로 전환시키고 필요한 값들을 씨피유의 레지스터에 주르륵 펼쳐놓고 작업을 하게 된다. 같은 방법으로 다시 p0는 씨피유의 복귀되고 p1은 쫒겨나고 ... 이런식으로 순간순간 여러개의 프로세스들이 자신의 상태를 바꾸어가며 질서있게 각자의 큐에서 씨피유의 호출을 기다리는 것이다. 
이렇게 레디큐에서 기다리는 프로세스들중 어떤 녀석을 씨피유에 불러들이는 과정을 디스패치(dispatched)되었다! 라고 말하는 것이고, 도데체 어떤 프로세스를 어느 때에 디스패치 시킬것인가를 결정하는 알고리즘을 프로세스 스케줄링 알고리즘이라고 한다. 프로세스 스케줄러(구현된 스케줄링 알고리즘)는 또 크게 두가지로 나누는데 첫째는 롱텀 스케줄러(long-term scheduler)또는 잡스케줄러(job scheduler) 라고 일컫는다. 이 녀석은 생성될 프로세스중 어떤 것을 메모리에 로드 시킬것인가를 결정한다. 
또 다른 하나는 숏텀 스케쥴러(short-term scheduler)또는 씨피유 스케줄러(cpu-scheduler)라고 하며 이 녀석이 바로 레디큐에서 어떤것을 디스패치 시킬 것인가를 결정하게 된다. 
 이들의 가장 큰 차이점은 결정의 빈도에 있다고 할 수 있는데, 숏텀스케줄러가 당연히 롱텀 스케줄러보다 빈도수가 많다. 
프로세스 스케줄링 논할 때 롱텀과 숏텀 스케줄링 이렇게 두개 만을 여기서는 소개했지만, 원래는 한개를 더 갖다 붙이기도 한다. 바로 미드텀(mit-term)스케줄링이다. 미드텀 스케줄링은 이미 메모리에 존재하는 프로세스중 몇가지를 제거해 줌으로써 멀티 프로그래밍의 정도, 즉 씨피유의 및 메모리의 부하를 줄이는데 사용되는 기법이다. 이를 다른말로는 스와핑(swapping)이라고도 한다. 이는 메모리 스케줄링에서도 등장하는 말인데 메모리에 프로세스를 올리는 스왑인(swap in), 메모리에서 프로세스를 제거하는(완전히 지우는 것이 아니라하드디스크 같은 기억장치에 보관을 하게됨)스왑 아웃(swap out)등이 있다. 여기서 한가지 느낄 수 있는 사실은 메모리 스케줄링을 잘 하면 결국 프로세스 스케줄링 또한 효율적으로 이루어진다는 것이다. 
씨피유가 한 프로세스를 실행하다가 실행하던 프로세스의 상태를 저장하고 또 다른 프로세스로 순간적으로 전환해서 실행을 하는것이 멀티프로그래밍의 원리라는 사실을 이젠 깨달았을 것이다. 이 때 멋진 단어가 하나 등장한다. 바로 '컨텍스트 스위칭(context switching)'이다. 컨텍스트 스위칭이란 바로 씨피유가 그렇게 프로세스를 전환하는 순간을 일컫는 말이다. 문제는 이것이 정말 순수한 오버헤드라는 사실이다. 멀티 프로그래밍을 구현하기 위하여, 본래의 프로세스들의 내용과는 관계없이 그냥 이루어지는 것이기 때문이다. 이는 오에스 자체보다는 하드웨어적인 환경에 더욱 영향을 많이 받게 된다. 이 컨텍스트 스위칭은 한 시스템의 성능을 평가함에 있어서 병목현상의 주된 원인이 되기도 한다. 그래서 이제는 프로세스들끼리는 필연적으로 컨텍스트 스위칭을 필요로 한다는 사실을 극복하려는 과정에서 태어난 것이 바로 쓰레드(thread)이다. 쓰레드에 대한 설명은 차후에 하도록 하고 일단, 왜 멀티 쓰레딩이 빠른 성능을 보여주는 지에 대한 기본적인 이해가 되었으리라 본다. 바로 컨텍스트 스위칭이 없기 때문이다.
다음장에서는 구체적으로 어떻게 패런트 및 차일드 프로세스를 생성, 이용, 종료 하는지 알아보도록 하자.

'OS > OS 파헤치기!' 카테고리의 다른 글

6. 씨피유 스케줄링  (0) 2010.09.23
5. 프로세스의 생성 사용 및 소멸  (0) 2010.09.22
3. 하드웨어 보호(Hardware Protection)  (0) 2010.08.17
2장 컴퓨터 구조  (0) 2010.08.16
1장. OS란?  (0) 2010.08.12
AND

초기의 컴퓨터는 한 사람이 컴퓨터를 조작하고 모든 자원을 썼지만, 시간이 흐르면서 시스템을 여러명이 나누어 쓰는 편이 꽤 효율적이라는 사실을 발견하게 되었다. 시스템을 공유한다는 사실은 효율성을 높여준것이지만 그에 따라 여러가지 문제가 발생하게 되었다. 

따라서 오에스는 시스템을 공유하는 환경에 대해 자기자신을 보호하면서 각자의 환경을 보장해주어야만 하는 임무를 띄게 되었다. 
크게  시스템을 '보호' 하는 방법으로 4가지를 들어 볼 수 있는데, 오에스의 표준이라고 하는 유닉스를 예를 들어 설명해 보겠다. 

첫번째 방법으로 'OS 프로텍션' 이다. 유닉스는 듀얼모드로 동작한다. 이 말은 곧, 유저모드와 시스템모드를 의미하게 되는데 하드웨어 차원에서 본다면 모드비트(mode bit)라는 것이 있어서 현재의 모드를 나타내주는 방법으로 구분 되어진다.  처음 시스템이 부팅될때에 하드웨어가 시스템 모드로 부팅하게 된다. 그리고 운영체제가 띄워지면서 이제사 유저모드로 유저 프로세스를 처리해 주게 되는 것이다. 트랩(trap: 소프트웨어적인 인터럽트) 이나 인터럽트가 발생하면 하드웨어는 즉시 유저모드에서 시스템 모드로 변신을 한뒤 오에스가 처리를 하고 다시 유저 모드로 모드 비트를 셋팅한다음에야 유저에게 프로세스 권한을 넘겨주게 된다. 
이러한 듀얼모드의 필요성을 묻는이가 있는가? 바로 임의의 유저로 부터 시스템을 보호하기 위한 일종의 면역 장치이기 때문이다. 이것이 바로 OS Protection 이다.  일부 극단적인 명령어 셋( instruction set) 들은 시스템 모드에서만 실행이 가능하며, 일반 유저들이 그러한 명령어를 부가하게 되면 시스템이 알아서 불법으로 규정하고 오에스로 하여금 트랩을 발생하도록 하는 것이다. 참고로 수퍼유저, 관리자유저는 시스템 모드에서 놀수 있는 특수한 권한이 부여된다. 

두번째로 I/O 프로텍션을 들 수 있다. 간단하게 얘기해서 오에스를 거치지 않은 입출력을 발생하게 하지 못하게 하는 것이다. 즉, 모든 I/O는 오에스를 통해서- 합법적인 절차를 거쳐서- 발생하게 된다. 

세번째로 씨피유 프로텍션을 들 수 있다. 이것은 유저 프로그램이 프로세스권한을 잡은 채로 무한루프에 빠졌을 상태!(오에스로 컨트롤을 돌려주어야 되는데 그러지 못할때) 를 방지하는 것이다. 어떻게? /.. 바로 간단한 타이머의 도입으로 가능하게 된다.  카운터는 일정시간마다 양수에서 0으로 점차 줄어들게되고 0이되면 인터럽트를 발생시켜 컨트롤을 유저프로그램에게서 빼앗고 프로그램을 강제종료시켜버리는 아주 냉혹한 방법입니다.

마지막으로 메모리 프로텍션을 들 수 있다.  메모리 프로텍션은 왜 필요하냐? 보호되지 않은 메모리 영역에 오에스의 슈퍼유저 공간이 있다고 생각해보자! 일반유저가 인터럽트를 발생시키거나 일반 프로그램이 특정 메모리를 접근하려고 하면 어떻게 되겠는가? 말하지 않아도 알 수 있을 것이다.  일반유저가 수퍼유저가 되거나?... 스플이나 버퍼 영역이 덮여서 망가지거나 엉뚱한 인터럽트 처리가 되거나?... 결과는 참담하다.  그래서 메모리 영역에 대한 보호가 필요한 것이다. 이러한 보호는 오에스에 대해서 뿐만아니라 각 유저 프로그램, 유저 사이에서도 이루어 져야할 사항인것이다. 따라서 메모리 프로텍션은 강력하게 하드웨어 적으로 지원이 되어야 하는데 이는 나중에 페이징, 세그멘터에션, 가상메모리등 다룰때 다시한번 살펴보기로하고 지금은 여러기법 중에 한가지를 소개한다. 

이 방법은 베이스(base) 와 리미트(limit) 레지스터를 지정하는 것이다. 이들은 각각 메모리 덩어리가 들어있는(한개의 어플일 수도 있고, 데이터 일 수도 있고,...) 물리적인 메모리의 시작 주소와 전체의 크기를 담아 줌으로써 절대로 그 이상또는 이 하의 주소를 탐내지 못하게 제한하는 기법이다. 이러한 프로텍션은 씨피유가 하드웨어적으로 모든! 유저보드에서 발생하는 어드레스를 이 두 레지스터쌍들과 비교를 함으로써 그 적법함을 판단하는 방식으로 이루어 지며, 두 레지스터쌍들은 반드시 시스템 모드에서만 접근이 가능하기 때문에 함부로 고칠 수 없다. 

이상으로 프로텍션에 대해 간단히 살펴보았다. 윈도우에 익숙해진 관리자 모드 때문인지  우분투 환경에서의 암호입력요구는 때론 번거로울때가 있다. 어느 것이 좋은지는 피부에 와 닿을정도로 느껴지진 않지만 운영체제를 공부하고 있는 나로써는 좀 더 공학적인 마인드로 운영체제를 이해할 필요가 있는 듯하다. 

다음장에서는 프로세스(process)! 란 도대체 무엇인가를 살펴보도록 하자

'OS > OS 파헤치기!' 카테고리의 다른 글

5. 프로세스의 생성 사용 및 소멸  (0) 2010.09.22
4. 프로세스(process)?  (0) 2010.08.25
2장 컴퓨터 구조  (0) 2010.08.16
1장. OS란?  (0) 2010.08.12
[공지]시작하며...꼭 읽어주시길.  (0) 2010.08.11
AND

OS를 구체적으로 논하기에 앞서서 먼저 OS가 담겨질 컴퓨터 구조에 대한 개괄적인 이해를 하는 시간을 갖도록 하자

지금부터 그림을 그리도록하겠다. 초록 들판위, 한가운데 씨피유가 버티고 있고 그 주변에는 디바이스(주변기기)들이 널부러져 있다. 그 사이에는 컨트롤러 라고 하는 톨게이트 같이 생긴것이 떡하니 버티고 서있고 톨게이트를 지나 씨피유와 디바이스를 연결해주는 길이있는데 이는 버스(BUS)라고 불리운다.  어떻게 한폭의 그림이 그려졌는가? 

대충 내부구조가 머리속에 그려졌다면 잠시 컴퓨터 OS의 동작 흐름을 잠시 살펴보도록 하자. 
먼저 컴퓨터의 전원이 들어오는 순간, 제일먼저 Bootstrap 프로그램이라는 것이 실행이 된다. 본 프로그램은 초기화(씨피유내부의 빠르지만 작은 용량의 레지스터라 불리우는 기억소자의 초기화, 디바이스 컨트롤러의 초기화, 메모리의 초기화 등등)를 모조리 시켜버린다.
쉽게 생각해서 컴퓨터 처음켜서 로고나오고 다음화면으로 넘어가기까지!!! 보통... 이 5초도 안걸리는 시간안에 슈루룩~~ 다 해버리고 OS의 커널 영역으로 진입하게 된다. 이후!! 하염없이 기다린다.......................................... 언제까지?  누구를?   .... 정답은 이벤트!
좀더 정확하게 말하자면 인터럽트를 기다린다고 할 수 있다.

인터럽트는 매우 중요한 의미를 가지고 있는 사건이다. 주로 씨피유가 뭔가에 열중하고 있을 때(놀고있는 것도 열중에 포함됨) 인터럽터를 걸어 줌으로 써 씨피유가 인터럽트를 걸은 녀석이 요구하는 일을 수행하게 만드는 것이다. 
그러면 엄청나게 다양한 인터럽트의 경우를 OS는 어떻게 다 알아차려서 정확하게 거기에 맞는 응답을 ,처리를 해줄수 있을까?  ... 그렇다 . 컴퓨터는 모든종료의 인터럽트에 대한 모든 해결법을 이미 준비해 놓은 것이다. 각 인터럽트는 각 서비스 루틴과 일종의 함수관계를 가지고 있고, 씨피유는 단지 중간에서 짝맞추기 게임을 하고 있는 것이다.  어때 이해가 쉽게 가는가?

인터럽트는 또한 하드웨어적인 컨트롤러 뿐만 아니라 소프트웨어가 발생시키기도 한다. 이를 트랩(Trap) 이라고 불리우기도 한다. 이는 '시스템콜' 이라는 형태로 씨피유에 도달하게 된다. 자기만의 OS를 만드는 방법중에 하나가 이렇게 자기만의 시스템콜을 만들어 OS 에 추가시켜 특정한 목적의 OS 를 제작할 수 도 있다. 

이러한 인터럽트의 발생을 씨피유는 어떻게 알아차릴까? 바로 특정한 패턴! 의 전기 신호가 시스템 버스를 따라서 씨피유에게 전달됨으로 씨피유는 인터럽트의 발생을 알아차리게 된다. 하드웨어에서 발생하건 소프트웨어에서 발생하건 인터럽트가 발생하게 되면 씨피유는 그 즉히 하던일을 중단해 버리게 된다. 그리고 실행권한을 어떤 '메모리의 고정된 위치'로 던저 주게 된다. 그 위치는 인터럽트 서비스 루틴이 시작되는 지점이며 루틴이 완료된 다음에야 씨피유는 하던일을 계속하게 된다. 

자 여기서 궁금한점이 있지않은가?  바로 위에 문단에 마지막 문장 '루틴이 완료된다음에야 씨피유는 하던일을 계속하게 된다.'
어떻게? 현재 1부터 100까지 세어가는 중 15에서 인터럽트를 만나서 잠깐 일을 처리하고 돌아와 16부터 다시 셈을 해 나가야되는데 15까지 셈을 한것을 어디에 저장하지?  . 컴퓨터에는 내부적으로 현재 실행주소가 항상 저장이 되는 레지스터가 존재한다. 이곳의 내용을 잠시 특정한 메모리 공간에 저장해 놓았다가, 인터럽트 처리후 다시 불러오면 되겠네? .. 정답!   하나하나 과정을 말하면 복잡하니 개념을 이렇게 잡아두자. 인터럽트 발생시 현재의 내용을 특정메모리 영역에 고스란히 저장해 놓았다가 인터럽트 처리가 끝나면 다시 불러온다.  따라서 하나의 인터럽트 처리시 다른 인터럽트가 들어와 특정메모리 영역을 덮어 버리면 어떻게 되는것인가? 그렇게 이전에 내용은 지워저 버려서 감당할 수 없는 결과가 나오게 된다. 여기에 대한 해결방법 한번쯤 생각해보도록...  

위의 설명이 길고 장황하지 않은가?  그만큼 중요하기 때문이다. 이러한 인터럽트를 처리하는 구체적인 방법들이 나름대로 존재하는데 , 직관적이며 대표적인 방법이 '인터럽트 벡터'를 이용하는 것이다.  '인터럽트 벡터' 의 개념은 아무리 인터럽트가 많아도 유한개의 인터럽트 집합이 존재한다는 전제에서 각 인터럽트 핸들링 서비스 루틴이 들어있는 주소를 가르키는 포인터를 테이블 화 한것이 바로 인터럽트 벡터이다. 즉, 인터럽트와 그 인터럽트에 해당되는 서비스루틴의 주소를 매치 시켜놓은 테이블! 이 바로 인터럽트 벡터이다. 
이러한 개념은 여러분들이 잘 아는 MS-DOS 와 UNIX ,LINUX 에 적용되어 있다.   인터럽트가 발생하면 테이블 한번 쭉 훑어 본뒤에 대응되는 서비스 루틴의 시작주소를 한방에 콜! 하는 방식이다. 

뭐 여러가지 다른 인터럽트 처리 방법들이 있지만 궁금한사람은 책을 찾아 보도록....

그럼 인터럽트라고 다 같은 인터럽트냐? 아니다. 인터럽트도 나름대로 계보가 존재하기에 우선순위가 주어지게 된다. 인터럽트가 한꺼번에 여러개가 발생하게 되는 경우 일종의 큐(먼저들어오는 녀석이 먼저 실행되는 구조의 저장공간)에 담아서 보관하게 되는데, 우선순위가 높은 인터럽트는 낮은 인터럽트를 그냥 무시하게 된다. 심지어는 실행되고 있는 낮은 우선순위의 인터럽트를 밀어내기도 한다. 

인터럽트가 발생하였을 때 씨피유가 모든 I/O에게 인터럽트 발생한게 너냐? 라고  물어서 알아내는 방법을 폴링 이라고 한다. 또한 인터럽트를 발생한 디바이스 자체가 자진해서 씨피유에게 알려오는 방법을 인터러브 드리븐 방식이라고 한다. 현대의 OS는 인터럽트 드리븐 방식이다. 

I/O 이야기가 나온김에 잠시 언급하고 넘어가자면 먼저 컨트롤러에 대해 생각해 봐야한다. 초반에 그려두었던 그림이 생각가는가? 거기에서 컨트롤러를 떠 올려보자 . 기본적으로 하나의 주변기기에 하나의 컨트롤러가 달려있지만, 하나 이상의 주변기기를 달아줄 수도 있다. 그 대표적인 예가 바로 스커지(SCSI: Small Computer System Interface) 이다. 이 방식에서 최대 7개 이상의 디바이스들을 데이지 체인 방식으로(서로 꼬리에 꼬리를 물어 연결이 되어있는) 연결이 가능하였다. 이 스커지의 최대 특징은 바로 독립성에 있는 듯한데, 스커지 어뎁터에는 이미 또 한개의 입출력만을 전담하는 독립된 씨피유를 가지고 있기에 그만큼  씨피유에 부과될 인터럽트를 '내선에서~' 처리 가능하게 해주는 믿음직한 장치이다. 하지만 요즘은 씨피유의 능력이 워낙 뛰어나게 발전하여 입출력으로 인한 인터럽트는 껌으로 여긴다. 
이러한 디바이스 컨트롤러는 결국 데이터를 주변 디바이스들간에 옮기는 책임을 전담하고 있는 장치이며, 버퍼를 가지고 있다. 입출력을 시작하기 위하여 일단 씨피유가 디바이스 컨트롤러 내부에 존재하는 레지스터안에 적당한 명령어와 데이터를 셋팅하게 된다. 그럼 디바이스 컨트롤러는 차례로 그 명령어들을 하나씩 읽어봄으로써 어떠한 조치를 취해야 하는지 판단하게 된다. 

자, 여기서 잠깐 알아두고 넘어갈 포인트 ! 사용자에 의해 데이터 입출력이 시작되었을 때 사용권한에 대한 두 가지 경우가 발생하게 된다. 첫번째는 입출력의 과정이 모두 끝날때 까지 기다렸다가 씨피유의 사용권한이 유저에게 넘어가는 경우(이것을 동기적 I/O) 와 I/O가 시작된 것만 확인하고 바로 유저에게 사용권이 넘어가는 경우(비동기적I/O) 가 있다. 어떤경우와에 사용되는지 구현원리를 알고싶은 사람은 책을 찾아보도록...

I/O 라고 해서 다 똑같이 취급해서는 안되는 경우가 있다. 이러한 경우는 특수한 경우의 I/O 인데 대표적으로 DMA 가 바로 이 경우에 해당된다. 보통의 경우  씨피유가 중간에서 중재자 역할을 하게 되는데 이러한 중재자 역할이 초고속 디바이스인 메모리와의 데이터 교환에 있어서는 오히려 번거로운 존재가 되어 버린다. 따라서 일부 디바이스 드라이버는 DMA 컨트롤러의 레지스터에 소스 주소및 데스티네이션 주소, 그리고 단위전송 크기를 셋팅한 뒤 씨피유의 클럭을 찔끔찔끔 훔쳐내면서 원하는 디바이스와 메모리와의 데이터 교환을 직접 하도록 유도해 준다. 
이러한 특수한 형태의 I/O의 예로 memory-mapped I/O 가 있다. 이는 램의 특정 영역이 디바이스 컨트롤러의 레지스터 들과 1:1 대응관계를 갖도록 먼저 약속을 하여 램에 전송할 데이터를 쇽쇽 넣어주게 되는 것이다. 램은 빠르니까... 

오늘은 이만....대충 어렵지 않으리라 생각된다. 나도 정리를 하면서 세삼 다시 알아가는 것 같아 기분이 좋다 ㅎㅎ 

'OS > OS 파헤치기!' 카테고리의 다른 글

5. 프로세스의 생성 사용 및 소멸  (0) 2010.09.22
4. 프로세스(process)?  (0) 2010.08.25
3. 하드웨어 보호(Hardware Protection)  (0) 2010.08.17
1장. OS란?  (0) 2010.08.12
[공지]시작하며...꼭 읽어주시길.  (0) 2010.08.11
AND

1장. OS란?

OS/OS 파헤치기! 2010. 8. 12. 01:39
컴퓨터는 대충 4가지로 나누어 생각해 볼 수 있다. 

먼저 기계덩아리 1)하드웨어, 
하드웨어를 사용가능 하게 해주는 2)운영체제,
운영체제 안에서 돌아가는 3)어플리케이션 프로그램,
이러한 어플리 케이션을 이용하는 4)사용자(유저)

이미 여러분들은 OS에 관해 여러가지 문장으로 정의해 놓은 것을 알고 있을 것이다. 필자는 개인적으로 '하드웨어를 사용가능 하게 해주는 운영체제' 에 다가 조금 더 보태서 '하드웨어를 효율적으로 사용 가능하게 해주는 운영체제' 라고 정의하고 싶다. 

여기에서 '효율적으로' 란 말은 두가지로 살펴볼 수 있다. 하드웨어적인 효율성과  하드웨어와 사람간의 효율성.
간단히 살펴보고 넘어가자.
첫번째, 하드웨어적인 효율성이란 앞으로 계속 살펴보며 전개될 내용의 거의 전부가 하드웨어적인 효율을 높이는 방법들이다.
두번째 하드웨어와 사람간의 효율성이란 다른말로 유저 인터페이스룰 말한다. 재미난건 UI가 너무 잘 되있다고 해서 무조건 좋은것만은 아니라는 점! 그만큼 자원의 소모가 심해지고, 너무 간단하게 UI를 만들면 쓰기가 어려워진다는 양날의 검과같은 점이 있다. 

태초에 컴퓨터가 생기면서 OS의 필요성이 제기 되었는데, 이런저런 역사는 접어두고 OS다운 OS는 심플, 또는 멀티 프로그래밍이 가능한 배치(batch)시스템이 었다. 
배치 시스템의 가장 큰 특징은 순차적으로 A ->B ->C ->D  이런식으로 진행이 되어 지는 시스템인데, 여기에서 유저와의 상호작용이 개입될 여지가 전혀 없다는 점이 포인트이다. 
여기에서 심플배치시스템말고 멀티프로그래밍 배치 시스템은 그 유명한 스풀링(Simulaneous Peripheral Operation On-Line)의 개념을 빌린것인데, 스풀링이란 주변장치들의 속도가  CPU에 비해서 현저히 느리기 때문에 일종의 동기화를 위한 완중장치(buffer)이다.  먼저 처리된 아웃풋들이나 병목현상으로 대기하고있는 인풋을 거대한 디스크와 같은 공간에 깡그리 담아 버림으로써 데이터의 증발을 막는 역할을 한다.  일종의 buffer이기는 하지만 주변기기들과의 I/O 전용으로 사용된다는 접이 다른 buffer와의 차이점이다. 

이러한 배치시스템의 처리단위는 통상 잡(job)이었다. 잡이란 프로그램, 데이터, 몇가지 제어정보 를 지닌 일련의 카드라고 일단 생각하기!! 
이러한 잡들의 수행을 빠르게 하기위해 비슷한 잡들끼리 묶어서 그룹으로 컴퓨터에서 수행시켜주되 잡풀이라는 스풀에 담아서 한정된 메모리안에 올렸다가 내렸다가 하면서 수행하는 형태의 시스템이 바로 멀티 프로그래밍 배치 시스템이다.

여기서 우리는 몇 가지 OS 이론의 중요한 주제가 등장하게 된다. 
어떤 잡을? 언제? 올리고 내리고 할지를 결정하는 잡 스케줄링(롱텀스케줄링) 은 나중에 시피유 스케줄링(숏텀스케줄링)
으로 연구가 진행되고 수행을 위해 한정된 주메모리에 올렸다가 내렸다가 해야하기 때문에 그 유명한 메모리 스케줄링 등장하게 된다. 
또한 스풀은 통상 하드디스크로 발전하며, 그 속도와 효율성을 발전시키기위해 디스크 스케줄링 이라는 주제로 승화(?)되어 버리는 사태에 이른다. 
잡은 나중에 프로세스  라는 근사한 단위로 다시 나뉘게 되고 프로세스는 또 쓰레드  라는 현대적 단위로 다시 바라보게 된다. 
방금전 설명한내용은 이후 글이 진행됨과 동시에 하나씩 베일을 벗겨보기로 하자. 

마지막으로 앞으로의 앞으로의 OS의 경향을 살펴보도록하자
현재 컴퓨터는 인텔 코어2듀어니 듀얼코어니 뭐 이런 말을 들어 봤을것이다. 즉, 멀티프로세서! 씨피유가 1개가 아니란 말이다. 이러한 멀티 프로세서시스템은 크게 두가지로 분류된다. 
첫째, 패러랠 시스템
둘째, 분산형 시스템

첫번째, 패러렐 시스템은 tightly coupled system 이라고도 한다. 요거는 씨피유는 여러개이지만 램, 클럭 같은 시스템 자원은 여러개의 씨피유가 공유하게 된다. 포인트는 10개의 씨피유가 달렸다고해서 속도가 10배 빨라지는 것은 아니다. 10배에 가깝도록 만드는 것이 본 시스템을 연구하는 사람들의 목적이라고 할 수 있을 것이다. 본 시스템의 강점은 10개의 씨피유중 하나가 맛탱이 가면 전체 다운 대신에 10%의 성능 감소가 일어나는 안정성!에 있다고 할 수 있다.
 이러한 페러렐 시스템은 2종류로 나뉠 수 있는데, 한가지는 대칭형 멀티프로세싱 시스템(예.BeOS)이고 또다른 하나는 비대칭형 멀티프로세싱 시스템이다.  말그대로 씨피유에 부과되는 부하가 대칭적이냐, 아니냐 를 말하고 있는것까지만 알아두자.

두번째 , 분산형 시스템 은 Loosely couple system이라고도 불리며 이는 바로 최신 OS의 경향이라고 한다. 누가?다들...
이것은 패러렐 시스템과 비교되게 여러개의 씨피유가 각각의 메모리와 클럭등을 가지고 있다. 여기에 네트웍을 기반으로 거대한 한개의 시스템을 구성하는 형태를 가지고있다. 그래서인지 이 시스템의 단위는 씨피유라고 불리기 보다 싸이트(site) 라고 불리게 된다. 

그 밖에 실시간 시스템 등이 있지만 , 그런게 있구나 라고 여기시거나 책을 찾아 보시기 바란다. 

'OS > OS 파헤치기!' 카테고리의 다른 글

5. 프로세스의 생성 사용 및 소멸  (0) 2010.09.22
4. 프로세스(process)?  (0) 2010.08.25
3. 하드웨어 보호(Hardware Protection)  (0) 2010.08.17
2장 컴퓨터 구조  (0) 2010.08.16
[공지]시작하며...꼭 읽어주시길.  (0) 2010.08.11
AND

앞으로 여기에 쓰여질 글은 OS에 관한 요약의 글이다. 
딱히 목차 순서대로 진행되어 지진 않는다. 본 목적은 운영체제의 전반적인 개념을 이해하는데에 있기 때문에 가능한한 임펙트하게 기록될 것이다. 
무엇보다 개인적인 공부의 목적이 크기 때문에 'duffer 경준 (http://vorlon.cwru.edu/~kxm73)'님의 글을 거의 그대로 인용하였지만 내용의 문맥은 내가 이해되도록 수정하였고 , 타이핑함으로써 완전히 내것으로 만들기 위한 목적임을 먼저 밝히는 바이다. 쉽게 말해 나혼자 보려고 쓴글이다. 혹시라도 퍼가실 분들은 영리목적이 아닌이상 출처만 밝히시고 가져가길 바란다. 

그럼 이제 시작해 보자.

'OS > OS 파헤치기!' 카테고리의 다른 글

5. 프로세스의 생성 사용 및 소멸  (0) 2010.09.22
4. 프로세스(process)?  (0) 2010.08.25
3. 하드웨어 보호(Hardware Protection)  (0) 2010.08.17
2장 컴퓨터 구조  (0) 2010.08.16
1장. OS란?  (0) 2010.08.12
AND