- 주의 : 본 포스팅은 의식의 흐름기법에 의해서 작성되는 막글입니다. 필요한 부분만 보시면 되겠습니다.
........사실 이 블로그에 올라오는 글 모두가 그렇지만.



심심해서 풀어보는 1869년 하버드 입시문제
ARITHMETIC 파트 1번.



잡설 : 날씨는 점점 따뜻해지고 벛꽃이 피거나 말거나 시험기간이 2주 남은 상황에서 최근들어 수학문제를 풀지않아서 수학 뇌가 굳어가는게 아닌가 걱정이 될 무렵, 트위터에 올라온 것이 있었으니 바로 1869년 하버드 입시문제지. 라틴어, 그리스어, 역사 및 지리학 파트는 가볍게 건너뛰고(.) 관심가는 수학 문제들만 풀어보고 싶었고 왠지 모르게 포스팅거리라고 생각되어 그냥 포스팅. 이 풀이와 번역이 정답인지 아닌지는 별로 중요하지 않다고 생각하며 잡설을 마친다. 



*원문 : Reduce 184800/1180410 to its lowest terms.
What is a prime number? When are two numbers said to be prime to each other?
Reduce the numerator and denominator of the above fraction to their prime factors.

*(매우 주관적인 발)번역 : 184800/1180410 을 기약분수로 만들어라.
소수란 무엇인가?  두 숫자가 서로에게 소수가 된다는 것은 어떤 때인가?
위의 분수의 분자와 분모의 소인수를 사용해서 약분하라.
 

*단어
prime number : 소수
prime factor : 소인수
fraction : 분수
numerator : 분자
denominator : 분모


*문제에 대한 생각
 소수란 것은 1과 자기 자신 이외에 다른 약수가 없는 양의 정수를 말한다.
 0.1 같은 소수(decimal)랑은.....................그냥 알아서 구별해야한다.

두 숫자가 서로에게 소수가 된다는건 내가 번역을 잘못한 건지 이해력이 부족해서 그런건지 모르겠지만,
분모와 분자가 더 이상 약분할 수 없는 상태, 즉 1 이외의 공통된 인수가 없는 분수를 "기약분수"라고 표현한다.
그 '1 이외의 공통된 인수가 없는 상태'를 '서로에게 소수가 되는 상태'라고 표현하는 것이 아닐까.

뭐 한번에 두 숫자의 최대공약수를 찾아내어 한번의 약분으로 기약분수를 만든다면 정말 대단한 것이지만, 6자리와 7자리숫자의 최대공약수를 찾기가 꽤 어렵.........기도 하지만 그걸 찾고 있을시간에 그냥 눈에 보이는 인수들로 약분약분약분하는게 더 빠를듯 

*풀이
184800/1180410
= 18480/118041 = 2640/16863 = 880/5621 = 8*110 / 7*803 = 80 / 7*73 = 80 / 511

 
결국 두 수의 최대공약수는 2310 이었다.

답은 80/511.



1. 왜 경제상식이 중요한가?

- 경제상식은 일상사에서 합리적인 의사결정을 할 수 있도록 도와주어 장기적으로 개개인의 행복을 크게 해주는 역할을 한다.
- 나라의 경제운영 성과는 국민의 경제상식 수준에 비례한다.

2. 생활은 선택의 연속

- 일상생활은 경제활동의 연속이다.
* 경제활동 : 사람에게 필요한 재화와 서비스를 생산/분배/소비하는 모든 활동
* 희소성 : 한 사회가 가지고 있는 자원의 유한성
* 경제재 : 돈이나 노력을 지급해야 얻을 수 있는 유형의 물건.
- 경제문제는 이용 가능한 자원이 희소성을 가지고 있기 때문에 생긴다. 그래서 합리적인 선택을 해야한다.
- 선택과 포기는 항상 함께 일어난다.

* 기회비용 : 선택하지 못한 것 중에서 제일 아쉬운 것의 가치.
명시적/회계적 비용뿐만 아니라 암묵적 비용도 포함하여야 한다.

3. 기본개념을 알자.

* 매몰비용 : 지불되고 난 뒤 회수할 수 없는 비용
- 경제적 사고방식에 의한 의사결정은 선택에 따르는 추가적인 행복과 추가적인 희생을 비교하여 선택하는 것이다.

* 유인(인센티브 : incentive) : 의사결정에 영향을 미치는 주변 여건의 변화.

* 수요 : 소비자가 어떤 상품을 일정한 가격을 치르고 사려고 하는 의도
* 공급 : 생산자가 어떤 가겨에 판매하고자 하는 의도
- 수요는 행복을 최대화하려는 소비자의 합리적 의사결정 결과이다.
- 공급은 이윤을 최대화하려는 생산자의 합리적 의사결정 결과이다.

* 균형가격,거래량 : 수요와 공급을 일치시키는 가격과 이때의 수요량/공급량.

* 시장경제 : 수많은 기업과 가계가 시장에서 상호작용하면서 분산된 의사결정에 의해 자원배분이 이루어 지는 경제체제
- 시장은 자유로운 의사에 따라 교환에 참여하는 당사자 모두에게 이익을 준다.
- 시장에서 결정되는 가격은 생산자와 소비자 사이에서 정보를 전달하는 신호의 역할을 하여 자원배분이 효율적으로 이루어지게 한다. (자원이 정해져있을땐 최대의 효과, 목적을 달성하기 위해 최소의 자원.)

* 계획경제 : 나라의 경제운영이 국가의 통일된 의사 밑에서 계획적으로 시행되는 경제체제.
- 계획경제는 인센티브가 없어서 기술적 진보나 생산성 향상을 기대하기 힘들고, 자원이 적재적소에 배분되기 힘들다.
- 시장경제는 소득분배의 차이를 줄이지 못하는 단점을 가지고 있다.
* 혼합경제 : 시장경제를 기본으로 하고 정부가 공적개입을 통해 계획경제의 요소를 일부 혼합한 경제체제




'학부 전공 > 경제이야기' 카테고리의 다른 글

7. 국민소득과 경제성장  (0) 2011.06.20



 1.  입출력 시스템의 구성


1) 개요
- 입출력은 메모리와 입출력장치 사이의 자료 이전이다.
- 입출력장치는 논리 회로와 입출력장치 자체로 구성된다.
- 입출력시스템의 최상위에는 응용프로그램이 있고, 운영 체제 커널에는 장치 구동기들이 있는데, 응용 프로그램과 장치 구동기 사이의 인터페이스로서 API가 존재한다.
- 장치 구동기는 하드웨어 인터페이스를 통해서 제어기에 연결되고 제어기에 입출력 장치가 연결된다.
- 각 구성요소 사이의 인터페이스가 결정되어야 한다.

2) 제어기 ( Device Controller )
- 주변장치는 제어기에 연결된다.
- 인터페이스 3종세트; API(응용프로그램과 커널의 장치구동기 사이)
                               HW 인터페이스(장치구동기와 제어기 사이); 장치생산업체에서 제공
                               장치구동기 - 커널 인터페이스
- 제어기와 주변장치 사이의 인터페이스는 운영체제에 속하지 않고 장치를 생산하는 업체에서 제공한다.
- 제어기와 운영체제 사이의 인터페이스는 장치 구동기( Device Driver )이다.
- 입출력을 수행하기 위해서 필요한 것은 입출력을 수행하는 장치 구동기와 제어기 사이의 상호작용이다.
- 제어기에는 busy와 done의 상태와 오류를 나타내는 상태레지스터, 장치에 대한 명령을 적재할 수 있는 명령레지스터, 그리고 자료레지스터(버퍼)가 있다.

 * 응용 프로그램에서 입력요구 발생시
1. 장치구동기가 제어기의 상태레지스터를 확인한다.
2. busy/done 모두 clear 상태이면 입력 명령을 명령레지스터에 적재하고
   제어기를 가동시키고 busy 플래그를 set한다.
3. 제어기가 장치에서 버퍼로 자료 이전을 완료하면 busy 플래그를 clear, done플래그를 set한다.
4. 인터럽트를 발생시켜 CPU에게 통보한다.
5. CPU가 장치구동기를 가동하여 버퍼에서 메모리로 데이터를 읽어온다. 그리고 done 플래그를 clear로 바꾼다.


 * 응용 프로그램에서 출력요구 발생시
1. 장치구동기가 제어기의 상태레지스터를 확인한다.
2. busy/done 모두 clear이면 busy플래그를 set한다.
3. 장치구동기가 메모리에서 버퍼로 데이터를 이동시킨다.
4. 출력 명령을 명령레지스터에 적재하여 제어기를 가동시킨다.
5. 출력이 완료되면 busy플래그를 clear, done플래그를 set한다.
6. 인터럽트를 발생시켜 CPU에게 통보한다. 그리고 done플래그를 clear로 바꾼다.

- 입력과 출력은 거의 비슷하다. done플래그를 set하는것은 입력에서는 '입력을 받아서 지금 버퍼에 받아놨다.'라는 의미이고, 출력에서는 '출력을 완료했다."라는 의미이다. 입력에서는 인터럽트가 발생되고 done플래그가 set되고 난 후 CPU가 버퍼에서 메모리로 읽어오는 작업을 하지만, 출력에서는 인터럽트가 발생되고 done플래그가 set되면 그걸로 끝이다.


3) 장치구동기 ( Device Driver )
- 운영체제에서 해당되는 제어기를 통제하여 입출력을 수행하는 부분이 장치 구동기이다.
- 장치 구동기는 두가지의 인터페이스를 제공해야한다. 응용프로그래머를 위한 API와 커널과 장치구동기 사이의 인터페이스가 그것이다.
- API는 표준API를 사용하여 추상화 된 명령을 제공한다
( open/close, read/write, seek )
- 장치구동기-커널 인터페이스는 디바이스드라이버가 바뀔때마다 커널을 다시 컴파일할 수는 없으니 표준화한것.
( plug & play 기능)

 2. 인터럽트 시스템
- CPU가 제어기에게 입출력 명령을 내리고 그 응답을 기다리는 것은 CPU를 낭비하는 것이므로, 인터럽트를 사용하여 제어기가 CPU에게 작업완료를 통보하고, 그때까지 CPU는 다른 작업을 처리하는 방법을 사용한다.
- 다수준 인터럽트 : 인터럽트가 들어오면 그 인터럽트보다 낮은 수준의 인터럽트의 처리를 중지한다.
 (인터럽트마다 우선순위를 결정하는 것)
 * 인터럽트가 발생하면
1. 현재 진행중인 프로세스 또는 하위의 ISR(Interrupt Service Routine) 수행을 중단한다.
2. 프로그램 카운터 및 레지스터 값들을 보존한다.
3. 인터럽트에 해당하는 마스크를 설정한다.
4. ISR로 제어를 넘긴다. ( 프로그램 카운터를 ISR의 첫주소로 세팅 )

 * 인터럽트 처리가 끝나면 -> 보존된 레지스터의 내용을 복구한다.


 3. 장치 경영 접근방식

1) 격리형 입출력 방식과 메모리-사상형 입출력 방식
- 격리형 입출력 방식에서는 제어기의 명령레지스터에 해당하는 명령을 적재하며, CPU와 제어기의 버퍼사이에 자료를 교환한다. 따라서 주변장치를 위해서 개별적으로 레지스터를 확보해야한다. (일종의 주소 공간)
- 메모리-사상형 입출력방식에서는 메모리의 논리적 주소 공간을 그대로 사용하여 제어기의 레지스터를 메모리에 사상시킨다. 이 방식은 명령의 개수를 줄이고 사용하기에 용이해서 많이 사용되고 있다.
(즉, 이 방식에서는 제어기에 실제 레지스터가 존재하지 않고, 메모리의 일부를 할당해서 사용하는 것이다.)

2) 폴링과 인터럽트 입출력
- 폴링은 바쁜 대기 방식으로서, 입출력 명령을 내리고 난 후, 입출력이 완료될 때까지 기다린다.
 이 때, 계속해서 상태를 조사하는 방법과 일정 시간마다 상태를 조사하는 방법이 있는데 주로 후자가 쓰인다.
- 인터럽트방식은 바쁜 대기를 해소하고 입출력이 완료될때까지 CPU가 다른 작업을 할 수 있게 한다.
- 입출력 명령을 내린 프로세스는 입출력이 끝나는 것을 기다리거나 프로세스에게 그대로 제어를 넘기도록 할 수 있다. 전자를 동기 방식, 후자를 비동기 방식이라 한다.
- 동기방식의 경우 CPU는 다른 프로세스를 처리할 수 있다.

3) 직접 입출력과 DMA 입출력
- 직접 입출력은 CPU가 메모리와 제어기의 자료 레지스터 사이의 자료 이전을 직접 관장하는 것이다.
- CPU와 입출력을 동시에 사용할 수 있지만, 매 입출력을 위해 인터럽트를 처리해야하는 단점이 있다.
 이것은 문자장치의 경우에는 문제가 되지 않으나, 디스크와 같은 블록장치의 경우에는 문제가 된다.
- 이러한 문제를 해결하기 위해 CPU의 도움 없이 독자적으로 메모리에 접근하여 한 입출력 명령으로 많은 자료(블록)를 입출력 및 전송하고, 한 블록의 처리가 끝날때마다 한번의 인터럽트를 발생시키는 방법을 쓴다.
 이 방식이 직접 메모리 접근(DMA) 방식이다.
- 즉, DMA입출력에서는 매 바이트마다 인터럽트가 발생하지 않고 한 블록에 한 인터럽트가 발생한다.

- 디스크에서 사용하는 시스템 버퍼는 블록 단위로 시스템 버퍼 풀에서 배정된다.
- 디스크 입출력 요구가 많아질 경우 작업의 큐로 형성되고 인터럽트 처리기에 의해 스케쥴되어 실행된다.
 디스크의 seek time 최적화를 위한 것이다.

- cycle stealing : CPU와 DMA가 동시에 메모리 접근을 요구하게 되면 DMA에게 우선권을 주고 CPU는 한 사이클을 쉰다.


 4. Buffering과 Spooling

1) 버퍼링 (Buffering)
- 서로 속도가 다른 하드웨어 사이에 자료 레지스터를 추가하여 속도를 개선하는 방법을 버퍼링이라 한다.
- 프로세스가 제어기의 자료레지스터A에 있는 자료를 읽는 동안, 제어기는 자료레지스터B에 다음 자료를 적재하는 것 같은 방법을 이중 버퍼링이라 한다.

2) 스풀링 (Spooling)
- 출력 명령이 주어지면 먼저 그 데이터를 디스크의 일정 장소에 저장하고, 별도의 출력 프로그램이 저장된 데이터를 순차적으로 프린터에 내보내는 방식을 스풀링이라 한다.
- 출력을 전담하는 프로그램을 스풀러라고 한다. 스풀러는 스풀 영역의 큐 정보를 감시하다가 생성되면 파일을 출력하는 기능을 한다.


 5. 입출력 프로세스의 처리

1) 비동기 VS 동기 입출력
- 비동기/동기 입출력은 응용 프로그램쪽에서 장치를 사용하는 관점에서의 차이가 있다.
- 동기식은 입출력을 시작시키고 그 작업이 끝날때까지 프로세스가 대기한다. CPU가 다른 프로세스에 사용된다.
- 비동기식은 입출력을 시작시키고 바로 다음 연산을 수행한다. 입출력과 상관없이 그 프로세스가 계속 CPU를 사용할 수 있다.
 입출력 종료를 알려주는 방법이 필요하다. ex)이벤트.
- 따라서 비동기식에서는 Call-back function을 구현해야 하며, Kernel thread를 사용할 수 있어야 한다.

2) 입출력장치 큐
- 입출력 장치는 빈번하고, 입출력장치의 속도는 느리기 때문에 입출력 프로세스들은 큐를 사용해서 작업을 대기시킨다.
- 키보드나 마우스처럼 언제 입력이 들어올지 모르는 장치들은 요구가 없는 상태에서도 인터럽트 처리기를 통해 버퍼링해 놓는다.

 6. 하드웨어에 의한 보호

- 운영 체제가 하는 일이 많아지고 입출력과 관계하여 할 일이 많아지게 되자, 시스템의 효율성을 높이기 위해서 시스템내의 많은 자원을 여러 프로그램이 동시에 공유하도록 하였다. 한 프로그램이 CPU를 사용하는 동안 다른 프로그램들이 입출력을 수행할 수 있게 되었고(다중 프로그래밍과 인터럽트), 여러 프로그램이 동시에 메모리를 사용할 수도 있게 되었다.
- 이런 자원의 공유는 시스템의 활용도를 높이는 반면에, 사용하는 자원을 보호해야하는 문제가 생겼다.
- 운영체제가 처리할 수 있는 오류(계산상의 오버플로우 등) 같은 경우는 기계가 멈추지 않지만, 프로그램이 운영체제의 영역을 침범하여 손상시키거나 입출력 프로그램에서 인터럽트를 잘못다루는 경우가 생기면 기계가 멈출 수 있다.


1) 이중 모드
- CPU의 상태레지스터 중 1비트를 모드 비트로 사용한다. 0이면 커널모드이고 1이면 사용자모드이다.
- 사용자 프로세스의 코드영역에 있는 명령어를 실행하는 경우, 사용자 모드로 실행한다. 인터럽트나 시스템/입출력 제어와 관련된 특권 명령을 수행할 수 없다. 메모리 참조 영역도 메모리 보호 하드웨어에 의해서 제한된다.
- 운영체제 코드영역에 있는 명령어를 실행하는 경우, 커널 모드로 실행한다. 하드웨어적인 제한이나 보호를 수행하지 않는다.
 사용자 프로그램에서 시스템 호출(트랩), 인터럽트 처리, 감지된 사용자 오류(트랩) 발생 시에 커널 모드가 된다.
- 사용자모드에서 커널모드로의 전환은 프로그램에서 독자적으로 할 수 없다.

2) 입출력 보호
- 불법 IO명령을 막기 위해 모든 IO명령을 특권 명령으로 구성하는 방법이 있다.
- 프로세스가 IO명령을 하기 위해서는 커널 모드로의 전환(특권 획득)이 필요한 것이다.

3) 메모리 보호
- 일반적으로 사용자는 사용자 모드에서 운영체제 영역 안의 인터럽트 테이블 및 처리기를 포함한 모든 영역에 접근하거나 수정할 수 없다. 또한 사른 사용자의 영역에도 마찬가지이며 자신의 코드 영역에 쓰는 것도 불가능하다.
- Base와 Limit레지스터를 사용하여 프로그램 공간을 정의해 놓음으로서 보호한다.
- 사용자 모드에서 주소를 생성했을 때에 확인하여 만약 범위(Base~Limit)를 벗어난 주소가 나오면 커널로 트랩한다.
- 리눅스나 유닉스커널에서는 segmentation fault가 발생한다.

4) CPU 보호
- 사용자 프로그램이 무한 루프에 들어가서 운영체제에게 제어를 넘기지 않으면 문제가 되므로, 제어권을 가져올 방법이 필요하다.
- 타이머 또는 클럭이라고 부르는 장치로 정해진 시간마다 인터럽트를 발생시킨다. 이 인터럽트는 정전이나 하드웨어 결함을 제외하고 가장 높은 우선순위의 인터럽트이다.
- 타이머가 있기 때문에 프로그램의 실행 시간이 제한되고 무한루프로 인한 CPU 독점을 방지할 수 있다.


 7. 기억장치 구조

- 하드웨어는 CPU, 메모리 그리고 주변장치로 구성된다.

- 메모리와 프로세서 안에 있는 레지스터들은 CPU가 접근할 수 있는 유일한 장치들이다.
- 메모리 접근 속도가 레지스터에 비해 상대적으로 느리기 때문에, CPU의 속도를 좌우하는 것은 메모리의 속도이다.
- CPU의 연산속도와 메모리 접근시간의 격차를 줄이기 위한 하드웨어적 기법으로 캐시 메모리를 사용한다.

- 디스크의 접근시간은 seek time, rotational delay, 입출력시간 및 전송시간으로 이루어진다.
- 디스크의 seek time은 CPU에 비해 매우 느리기 때문에 시스템의 성능을 저하시킨다.
- 디스크의 seek time을 줄이기 위해 버퍼링 기법이나 디스크 스케줄링을 사용한다.


 8. 기억장치 계층

- 다양한 기억장치는 속도와 가격에 따라서 계층 구조를 갖도록 조직할 수 있다.
- 계층구조는 속도, 용량, 가격의 비교 뿐만이 아니라, 하드웨어나 운영체제에 의한 버퍼링의 개념이 추가되어야 완성된다고 할 수 있다.
- 계층구조의 궁극적인 목적은 용량은 최하위 기억장치의 크기처럼, 접근 속도는 최상위 기억장치의 속도처럼 사용하는데에 있다.

1) 캐시
- 두 기억장치 사이에 접근시간이나 이동속도의 격차가 있을 때, 이를 완화하기 위해서 사용한다.
- CPU에서 메모리에 접근하는 경우 그 자료를 메모리보다 속도가 빠른 캐시에 복사하는 용도로도 사용한다.
- 알고리즘에 따라서는 90%이상의 확률로 캐시가 필요한 데이터를 가지고 있을 수 있다.




'학부 전공 > 운영체제' 카테고리의 다른 글

6. 병행 프로세스  (0) 2011.06.17
1. 운영체제 소개  (0) 2011.03.09

 운영체제는 컴퓨터 사용자와 컴퓨터 하드웨어간의 중개자로서 동작하는 프로그램이다.

 

 1. 운영체제란
 - 컴퓨터 시스템은 하드웨어, 운영체제, 응용프로그램, 사용자 부분으로 나눌 수 있다.
 - 운영체제는 일종의 정부이다. 시스템을 운영하여 자원을 적절하게 사용할 수 있게 한다.
 - 운영체제의 목적은 사용자에게 편의를 제공하는 것과 시스템을 효율적으로 운영하는데에 있다.
 
 2. 초기 시스템
 - 운영체제가 만들어지기 이전에는 컴퓨터가 굉장히 느렸기때문에, 사용자는 사용할 시간을 예약해서 그 시간 동안에만 사용해야했다.
 - 프로그램은 빨리 끝날수도, 늦게 끝날 수도 있기 때문에, 이런 방법은 컴퓨터를 효율적으로 사용할 수 없다.

 3. 초기 일괄처리 시스템
- 초기 시스템이 너무나 비효율적이라 운영자를 고용하여 사용자의 작업을 대신 실행하였다. 
그러나 작업의 준비시간이 너무 길고 여러 단계가 너무 복잡하여 운영자의 기능을 프로그램으로 대치하게 되었는데 
이것이 초기의 운영체제이다.
  
 1) 배치
- 요구수준이 비슷한 작업들을 함께 묶어서 실행함으로써 준비 시간을 줄일 수 있다. 
- 입력과 결과가 별도의 오프라인 카드리더나 테이프에 기록된다.

 2) 입출력 표준화 
- 테이프에 대한 입출력이 빈번해짐에 따라서 시스템에서는 표준 프로그램을 제공하여 편의를 제공하고 오류를 방지하였다.

 4. 일괄처리 시스템
 1) 하드웨어
채널 : 제한된 기능을 가지는 컴퓨터. 입출력장치의 제어를 위해서 설계되었다.
 명령 구조, 약간의 레지스터, 입출력장치와 통신하기 위한 하드웨어를 가진다. 메모리를 CPU와 공유하여, 메모리로부터 명령을 가져오고 명령에 의해 자료를 메모리와 주변장치 사이로 이동시킨다. 
 채녈은 CPU에서 입출력 정보를 받아 명령을 실행하기 시작하면, CPU와 독립적으로 작동한다.
(단 메모리 사이클에 대한 경쟁은 제외)

- CPU와 채널 입출력을 동시에 활용하기 위해 버퍼를 둔다. 연산하는 동안 읽거나 쓸 수 있게하여 입출력 대기시간을 없앤다.
인터럽트의 등장으로 대기루프 없이 CPU연산과 입출력 버퍼링을 병렬로 수행가능하게 되었다.
- 인터럽트는 하드웨어에 의하여 자동으로 호출되며, 메모리의 특정부분에 위치한 함수를 호출하는 것이다.

 2) 상주 모니터
- 입출력 관리자 또는 인터럽트 처리기를 메모리에 영구적으로 상주시켜야 할 필요성이 생겼다.
- 작업 제어 명령어, 적재기, 작업 순서 제어기를 상주시키에 되어 이 프로그램의 집합을 상주 모니터라 부르게 되었다.
- 상주 모니터의 설치로 처리율이 급격히 증가하였으나, 사용자가 늘어남에 따라 하드웨어와 소프트웨어의 표준을 어기는 일이 빈번해졌다. 상관없는 다른 프로그램을 지워버린다거나 입출력 오류로 비정상적 신호를 보낸다거나 하는 일이다.

3) 보호
- 잘못된 사용자 프로그램에서 상주 모니터가 있는 부분에 접근하여 자료를 덮어쓰는 일이 발생하자 상주 모니터를 보호할 방안이 필요하게 되었다.
- 모든 프로그램에서 입출력을 위해 상주 모니터의 루틴을 사용하게 하고, 시스템에서 요청된 연산을 미리 작성된 허용치를 참조하여 검사하게 함으로써 위험한 동작을 미연에 방지할 수 있게되었다.
- 사용자가 출력 상한선과 상한 시간을 제시하게 함으로써 프로그램의 오동작을 막기도 하였다.

 4) 작업 제어 명령어
- 규격카드나 제어 카드를 사용하여 필요한 조작을 기술하는 방법이 등장하였다. 
- 이 기법을 위해 시스템에 제어 명령어를 추가하게되었다.
- 각각의 작업은 해당하는 제어 카드를 가지고 있어서 작업순서가 이미 정의되어 있다. 그 작업이 모두 끝난 후에야 결과를 볼 수가 있다.

5. 다중 프로그래밍

- 다중 프로그래밍의 기본적인 개념은, 운영체제가 여러 개의 작업을 메모리에 적재하고, 적재된 작업중 하나를 선택하여 CPU를 할당하고 실행시키기 시작한다. 그 작업은 키보드 입력을 기다리거나 출력을 기다리거나 하는 상태가 될 수 있다. 그 때 다른 작업에 CPU를 할당하여 실행시키는 것이다.

 1) 스풀링
- 시스템이 작업을 실행하는 동안 별도로 카드 판독기의 작업을 테이프나 디스크에 일괄 저장하고, 시스템이 다음 작업들을 테이프나 디스크에 적재하는 방식을 사용하기 시작하였는데 이를 입력 스풀링이라 한다.

 6. 시분할 시스템
- 시분할 시스템은 사용자와 시스템 간에 온라인 통신을 마련하여 사용자가 운영체제나 프로그램에 직접 명령을 주고 즉시 응답을 받을 수 있도록 한다. 
-  여러 프로그램이 동시에 메모리에 존재할 뿐만 아니라 여러 사용자에게 빠른 응답시간을 제공하기 위해 CPU시간을 나누어서 각 작업에 번갈아 가며 할당하는데, 한번에 할당되는 CPU시간을 타임 슬라이스( time slice )라 한다.

 7. 개인용 컴퓨터
 8. 병렬 시스템
 9. 분산 시스템
 10. 실시간 시스템
 11. 내장형 시스템




'학부 전공 > 운영체제' 카테고리의 다른 글

6. 병행 프로세스  (0) 2011.06.17
2. 컴퓨터 구조  (0) 2011.03.15




눈 쌓인 아침의 산.






에서 정체모를 생명체의 발자국을 발견!(.....)




햇빛이 반사되어 반짝반짝 빛나는 눈길.

이번 산행중에 가장 아름다운 곳이었다.

사진으로 보니 좀 덜한것 같은데......육안으로 볼때는 반짝임이
거의 공기좋은 곳에서 보는 밤하늘의 별처럼 많았다.
차이라면 밤하늘의 별은 배경이 검은색이지만 여긴 배경이 흰색이라는 것 정도?.

너무 아름답게 반짝여서 멍하니 한 20초간 감상하다가 사진을 찍었다.ㅋ





산에서 바라보는 도심은 여전했음

저 멀리 남산도 보이고..





좀 있다 도착할 용마산 정상도 찍어보고..



그리고 숨막힐 정도로 깨끗한 파란색 하늘.


윈도우 그림판을 열고 파란색 물감을 선택한 다음 색채우기로 가득채운
딱 그 느낌이랄까..

구름이고 비행기고 아무것도 없는 새파란 하늘을 보고있자니

마음까지 청량해지는 느낌이었다.







다람쥐 발견 3연사.ㅋ

........아니 청설모였나?;;;

첫번째 사진엔 가운데부분에 꼬리만 찍혔고,

그나마 두번째, 세번째 사진에서 실루엣을 확인 할 수 있다.





눈 쌓인 나무들과
눈 덮인 한강.





그리고 드디어 개장한 아차산 정상.

지난번에 갔을때만해도 공사중이었는데 드디어 끝냈나보다.





이렇게 옆에 계단이 마련되어 있다.




아차산 정상의 모습.




추락을 조심해야 한다(.)






그리고 바로 용마산 정상에서의 사진으로 넘어감.ㅋ




용마산 정상에 서식하는 뫼냥이(?!)들.

얘네들은 겨울인데 뭐먹고 살지...
등산객들이 이것저것 주려나......

아니면 다람쥐?(.............)





용마산 정상에서 바라보는 도심.

암사동 방향이었던 걸로 기억한다.






그리고 내려오면서 본 누군가의 작품.ㅋㅋ







오랜만의 산행이었다.

산 입구부터 아차산 정상까지 46분이 걸렸고,

아차산 정상에서 용마산 정상까지 24분 걸려서

딱 1시간 10분 걸렸다.

예전 타임어택할때 최고기록이 39분이었던 걸로 기억하는데...

아무래도 눈 구경하느라 시간 보내고
눈 쌓인 길에서 미끄러지는거 조심하느라 천천히 걸어서 그런듯.

물론 중간중간 뛰어올라가기도 했지만...
타임어택할 때처럼 계속 뛰어올라가다간 어디에선가는 넘어져 다칠것 같아서(.)

아무래도 눈이 다 녹기 전까지는 타임어택은 자제해야 될 듯.







'사진' 카테고리의 다른 글

연구실에서 본 바깥풍경 변화가 ㄷㄷ해  (0) 2013.09.13
네? 뭘 하라구요?  (0) 2012.07.07
101006 아차산 + 용마산  (0) 2010.10.06
100827 한강  (0) 2010.08.27
100819 아차산 + 용마산  (0) 2010.08.24



2010년 12월동안 프로그래밍 언어가 검색된 순위입니다.


역시 자바는 부동의 1위로군요. 

Objective-C의 상승세는 아이폰이 팔리는 한 계속될것 같고...

데이터베이스 관련 언어인 SQL과 RPG가 쭉쭉 상승하고 있네요.
수많은 데이터를 어떻게 처리하느냐가 중요하게 여겨지는 듯한 느낌.

놀랬던건 Assembly의 상승입니다..
뭔가 이유가 있겠지만..........모르겠네요(..) 


MATLAB이 20위인것도 의외였습니다. 생각보다 많이 찾아지네요.

개인적으로는 관심있었던 언어인 Ruby가 점점 떨어지는게 아쉽네요.

참고로 Ruby의 변동폭은 이렇습니다.


몇번의 반짝임 후 추락중입니다(.)


그리고 여담이지만, 37위에 ActionScript가 있더군요..
저에게는 좌절과 절망의 언어(..........)



물론 위의 결과들은 "검색된 빈도"일 뿐입니다.

그 이상의 의미는 없습니다.


'프로그래밍 > IT' 카테고리의 다른 글

무료 도메인 제공 사이트, http://internetsite.co.kr  (1) 2013.06.26




Life Game의 업그레이드버전입니다.

*추가사항
- 마우스를 누른 상태에서 드래그를 하면 마우스의 궤적을 따라 생명이 채워지거나 없어집니다.
- BUTTERFLY EFFECT 버튼을 누르면 나비효과를 볼 수 있는 상태로 세트됩니다.
- CROSS 버튼을 누르면 십자가 모양으로 세트됩니다.
- RANDOM 버튼을 누르면 임의로 세트됩니다.


'프로그래밍 > 애플릿' 카테고리의 다른 글

Life Game  (0) 2010.12.29
야구 게임  (0) 2010.12.28

Life Game Start


자바 애플릿으로 만든 Life Game(생명 게임).


처음에는 단순한 게임인 줄 알았는데, 컴퓨터 과학에서도 큰 의미를 가지고,
카오스 이론도 연관이 있다는 것에 놀랐다.



게임 자체는 간단하다.

검은색 칸은 생명이 있는 칸이고, 흰색 칸은 생명이 없는 칸이다.
(구현한 애플릿에서는 속도를 위해 격자 없이 출력한다.)

한 세대가 지날때마다 일정한 규칙에 의해 칸들이 변화한다.

1. 생명이 있는 칸의 경우 
 상하좌우대각선 8방향에 다른 생명이 1개 이하 또는 4개 이상 있으면 소멸. 2개 또는 3개 있으면 생존.

2. 생명이 없는 칸의 경우
 상하좌우대각선 8방향에 다른 생명이 3개 있으면 탄생.


이것 뿐이다.

단, 1세대 초기값은 사용자가 입력해야한다. 
구현한 애플릿에서는 중간에 가로줄 하나를 넣었다.
(클릭하면 변경된다.)
  
세대가 지나감에 따라 여러가지 모양으로 변화하는 생명들을 볼 수 있다.

초기값에 따라 최종적으로 수렴하기도 하고, 발산하기도 하고(언젠가는 수렴할지도 모르겠지만.)

일정한 패턴이 반복되기도 한다.






'프로그래밍 > 애플릿' 카테고리의 다른 글

Life Game 기능확장판  (0) 2010.12.30
야구 게임  (0) 2010.12.28





자바 애플릿으로 만든 간단한 야구 게임

  * 규칙
- 시작하면 컴퓨터는 1부터 9로만 이루어진 3자리 숫자를 하나 임의로 생성한다. 
(이 때, 각 자리의 숫자는 모두 다르다.)
- 유저는 1부터 9까지의 숫자를 3개 조합해서 컴퓨터가 가지고 있는 숫자를 맞춘다.

- Strike는 '유저가 입력한 숫자'가 정답에 포함되어 있고, 그 위치까지 같은 숫자의 개수이고,
   Ball은 '유저가 입력한 숫자'가 정답에 포함되어 있지만, 그 위치는 다른 숫자의 개수이다.

- Strike가 3개이면 정답을 맞춘 것이므로 게임이 종료된다.

- 1번만에 맞추면 찬사를, 11번 틀리면 비웃음을 받는다(.)



'프로그래밍 > 애플릿' 카테고리의 다른 글

Life Game 기능확장판  (0) 2010.12.30
Life Game  (0) 2010.12.29


1. 블록킹 자바 IO

- 자바에서 파일 읽기를 시도하면, 먼저 커널에 명령이 전달되고,
 커널은 시스템 콜을 사용해서 디스크 컨트롤러가 읽어온 데이터를 커널의 버퍼에 저장한다.
 그 후 모든 파일 데이터가 커널의 버퍼에 복사되면, JVM의 버퍼로 복사한다.

- 첫번째 문제점은, 커널의 버퍼에 저장된 데이터를 프로세스 영역의 버퍼로 복사하는 것이다.
 만약 커널의 버퍼를 직접 사용할 수 있다면, 복사하는 시간이 필요없다.
 
- 두번째 문제점은, 디스크 컨트롤러에서 커널의 버퍼로 데이터를 복사하는 동안, 프로세스 영역이 블로킹 된다는 것이다.


2. IO 속도 향상을 위한 OS수준의 기술들

1) 버퍼
 - 효율적으로 데이터를 전달하기 위한 객체.
 - 버퍼의 크기가 크면 클수록 성능 향상이 이루어진다.

2) Scatter/Gather
 - 사용하는 버퍼가 여러개 일때, Scatter/Gather를 사용하면 시스템 콜을 한번만 호출하고,
 사용할 버퍼의 주소 목록을 넘겨줌으로서, 운영체제에서 버퍼들에게서 순차적으로 데이터를 읽거나 쓰게 된다.

3) 가상 메모리
 - 프로그램이 사용할 수 있는 주소 공간을 늘이기 위해 운영체제에서 지원하는 기술.
 - 가상 메모리를 사용함으로써 실제 물리적 메모리보다 더 큰 공간을 사용할 수 있고,
   여러 개의 가상 주소가 하나의 물리적 메모리 주소를 참조함으로써 메모리를 효율적으로 사용할 수 있게 해준다.
- 프로그래밍에서 가상 메모리를 사용하게 되면, 프로세스의 버퍼와 커널의 버퍼를 매핑시킴으로써
   커널의 버퍼에서 프로세스의 버퍼로 복사할 필요가 없게 된다.

4) 메모리 맵 파일
 - Memory-mapped IO는 파일시스템의 페이지들과 유저 영역의 버퍼를 가상 메모리로 매핑시킨다.
 - 메모리 맵 파일을 사용하면, 프로세스가 파일 데이터를 메모리로서 바라보기 때문에 시스템 콜을 할 필요가 없다.
   따라서 프로세스가 파일 데이터를 변경하면 별도의 입출력을 할 필요가 없이 물리적 디스크에 자동으로 반영하게 된다.
 - 또한, 매우 큰 파일을 복사하기 위해 많은 양의 메모리를 소비하지 않아도 된다.
   그때그때 필요한 부분만을 실제 메모리에 올려놓고 사용하면 된다.

5) 파일 락
 - 스레드의 동기화와 거의 비슷한 개념이다. 한 프로세스가 어떤 파일에 락을 획득하면, 다른 프로세스가 그 파일에 접근하는 것을
  막거나, 접근 방식에 제한을 두는 것이다.
 - 파일의 일부분만을 잠궈서 사용하기 때문에, 락이 설정되지 않은 부분은 다른 프로세스가 작업할 수 있다.
 - 일반적으로 공유 락은 읽기 작업에 사용되고, 배타 락은 쓰기 작업에 사용된다.
 - 공유 락이 걸려있는 부분은 읽기 작업은 얼마든지 더 할수 있지만, 쓰기 작업을 할 수 없다.
   배타 락이 걸려있는 부분은 어떤 다른 작업도 할 수 없다.


3. 자바의 변화

1) 포인터 버퍼 도입
 - NIO에서는 커널이 관리하는 시스템 메모리를 직접 사용할 수 있는 Buffer 클래스가 도입되었다.
 - 내부적으로는 C로 만들어져 있지만 우리는 추상화되어 제공되는 자바 클래스인 Buffer만을 사용하게 된다.

2) 네이티브 IO서비스를 제공해주는 채널 도입
 - 채널은 단방향 뿐만이 아니라 양방향 통신도 가능하다.
 - 채널을 이용해서 시스템 메모리인 버퍼에 직접 읽거나 쓸 수 있다. 또한 Scatter/Gather를 구현하였다.

3) 셀렉터 도입
 - 기존에는 클라이언트 하나당 스레드 하나를 생성해서 처리해야 했다.
 - 셀렉터를 이용함으로써 단 한개의 스레드만으로 수천, 수만명의 동시 사용자를 처리할 수 있다.



+ Recent posts