기분좋은  책하나를 발견해서 혼자 진행해 보고있다. 
ㅎㅎ 앞으로 진행하면서  막혔던 부분이나 정리가 필요한 부분을 채워야겠다. 
'도전 ! 임베디드 OS 만들기'  나빌레라님이 작성하신 글이 책으로 나왔다. 2년전에... 이제야알다니 ㅠ
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

컴퓨터1은 xp 이고 컴퓨터 2는 우분투 10.04 이다
가끔 필요한대 삼바설정에서 유저를 등록하는걸 까먹어서 글을 남겨본다. 

1. 우분투에서 xp로 의 공유폴더 연결
기본적으로 우분투에 '위치' 메뉴에 '서버에 연결' 이있는데 고놈을 클릭하면 서비스 종류를 선택할 수 있다. 여기서 windows 공유를 선택하고 서버는 컴퓨터1(xp)의 ip주소를 주소창에 입력후 연결을 누르면 우분투에서 xp로 연결이 가능하다 . 물론 xp에서는 공유폴더 설정해놓고 있어야한다.

2. xp에서 우분투로의 공유폴더 연결
기본적으로 samba가 깔려있지 않으므로 우분투에서 samba를 설치해주어야한다. 설치방법으로는 우분투에서 공유폴더하나를 선택해서 우클릭후 공유설정을 클릭하면 이 폴더 공유 를 체크할 수 있다. 처음으로 실행 하게되면 맨밑에 공유만들기 라는 메뉴는 비활성화 되어 있고 ,이상한거를 설치하라고 하는데 이것이 samba 설치하는 것이다. okok 하고 암호 넣고 하면 공유폴더 만들기 가 클릭할 수 있게 활성화된다.
다른사용자가 이 폴더에 파일 생성 지우는 것 허용에 체크하고. 더불어 우분투에 등록된 사용자만 이용하게 하고자 한다면 사용자 계정이 없는 게스트 접속 허용에 체크하면  된다. 아니면 아무나 접속가능.

여기서 중요한점 이것이 끝이 아니다. samba에서 사용하게될 유저와 암호를 등록해야한다.  이것을 하지 않으면 우분투에 등록이 되어 있다고 하더라도 접근할 수 없게된다. 
콘솔에서 이렇게 쳐주자.

sudo smbpasswd -a 유저아이디(현재우분투에서사용자아이디) 

그러면 관리자암호 입력후 사용자 암호까지 입력할 수 있게된다. 

이후 xp에서 실행창이나 폴더주소창이나 아무때나 우분투 컴퓨터의 ip주소를 치면 접속가능 하다.

AND


이거땜에 삽질한거 생각하면... 별거없다.
커널 변화나 업데이트로 인한 커널모듈 재설치하라는 것이다.  나온데로 /etc/init.d/vboxdrv.dpkg-bak setup라고 치면된다.
명령어가 조금 다른것일 뿐... 아무튼 허무하게 끝났다.
참, 매번 커널 변경시 이거해줘야한다. 
한글이나 ppt excle 등등 편의를 위해 윈도를 사용안할 수 없다.
AND


다른거 다 치우고 쓰는것만 초 간단히 적어본다.

일단 tar 명령은 압축하기 전 파일을 하나의 파일로 합치는 기능을 하고,
gz, zip, bz2등은 실제로 압축을 하기위한 명령어이다.
tar에서는 gunzip, bunzip에서 압축을 풀고 묶은걸 또 푸는 번거로움을 덜고자 옵션을 활용할 수 있다. 문서 마지막 부분에 정리해두었다.


1. [파일이름].tar
압축 : tar -cvf [압축될 파일이름].tar [압축할 파일이름]
풀기 : tar -xvf [압축된 파일이름].tar

2. [파일이름].tar.gz, [파일이름].tgz, [파일이름].tar.z
압축 : tar -zcvf { [파일이름].tar.gz , [파일이름].tgz, [파일이름].tar.z } [압축할 파일이름]
풀기 : tar -zxvf { [파일이름].tar.gz , [파일이 름].tgz, [파일이름].tar.z }

3. [파일이름].tar.bz2
압축 : tar -jcvf [
파일이 름].tar.bz2 [압축당할 파일이름]
풀기 : tar -jxvf [파일이름
].tar.bz2

4. [파일이름].zip
압축 : zip [
파일이름].zip [압축당할 파일이름]
풀기 : unzip [파일이름
].zip

5. [파일이름].gz
풀기 : gunzip [
파일이름].gz

6. [파일이름].bz2
풀기 : bunzip2 [
파일이름].bz2


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

위에 보다시피 옵션은 다 몰라도 기본 사용법은 알고있어야 한다.

그리고 초간단히 요점만 해서  tar 명령어 사용시
확장자가 gz 이면 옵션에 z가 들어가고
확장자가 bz2이면 옵션에 j가 들어간다.
압축 할 땐 옵션에 c들어가고
압출 풀 땐 옵션에 x들어간다.

압축할땐 요 형식을 기억하고 !  tar cvf [압축될 파일이름].tar [압축할 파일이름]

예를 들어 abcd.tar.gz라는 파일을 풀땐, tar xvfz abcd.tar.gz
             abcd.tar.gz라는 파일을 만들땐 tar cvfz abcd.tar.gz abcd     ㅋㅋㅋ 쉽죠잉
예를 들어 abcd.tar.bz2라는 파일을 풀땐 tar xvfj abcd.tar.bz2
             abcd.tar.bz2라는 파일을 만들땐 tar cvfj abcd.tar.bz2 abcd



AND

처음 우분투를 깔고 su명령어를 사용하기 위해 sudo passwd 로 sudo의 암호를 지정해준다.

계속적인 root의 권한이 필요할 시에는 sudo -s라고 하여 root상태를 유지한다.
AND