※ 질문/내용오류/공유할 내용이 있다면 jinkilee73@gmail.com으로 메일 주세요 :-)


이번 장에서는 프로세스에 관하여 이야기해보자. 프로세스를 논하기 전에 프로그램을 논해보자. 프로그램은 executable file을 의미한다. executable fileOS의 메모리 관리 기법에 의해 메모리에 load된다. 이 때 여러 개의 executable fileload될 수 있다. 이 여러 개의 executable file은 아직 프로세스라고 하지 않는다. 이 여러 파일 중 하나가 OSscheduling에 의해 선택되어 CPU에 의해 실행되면, 그것을 우리가 프로세스라고 한다. 한 마디로 실행 중인 executable file이라고 보면 된다.

프로세스의 정보는 메모리에 두 가지 형태로 존재할 수 있다.

PCB는 프로세스의 정보들을 한 곳에 모아둔 정보이다. 반면 process in memory라고 적어 놓은 저 부분에는 프로세스가 실행되면서 추가되는 변수 값이나 사용되는 값들이 저장되어있는 공간이다. 이러한 프로세스는 OS에 의해 특정한 상태 흐름도에 따라 움직인다.

위 그림은 개인적으로 굉장히 중요하다고 생각한다. 공부를 할 때 가장 중요한 것은 전체적인 흐름이 아닌가 싶다. 그래야 나중에 잊어먹어도 다시 공부하기가 쉽다. 아무튼 위의 개념을 설명해보자.


모든 프로세스는 처음에 created 상태에서 시작한다. 이 상태에서 ready 상태로 넘어가는 단계는 사용자가 프로세스를 실행시키는 단계라고 볼 수 있다. 앞에서 몇 번이고 말했듯이 모든 프로세스는 secondary storage에 저장되어있다. ready 상태로 넘어가는 단계는 secondary storage에 저장되어있는 실행파일(executable file)이 메모리에 load되는 과정이다. 



메모리에는 여러 개의 프로세스가 load되어 있을 수 있다. 그렇다면 그 중에 어떤 프로세스를 실행시킬 것이냐? 즉, 어떤 프로세스가 running 상태로 갈 것이냐? 이것은 CPU의 스케줄링에 의해 결정된다.(실제로는 dispatcher가 한다.) 



그렇게 running 상태에 있는 프로세스는 time-sharing system에서 한 프로세스를 실행시킬 수 있는 최대시간이 지나면 CPU 점유권을 빼앗기게 된다. 이 과정이 있는 OS를 선점형 OS(preemption OS)라고 한다. 



running 상태에서 I/O request가 발생하면 asleep상태에 빠지게 된다. I/O 작업을 하는 동안 메모리에서 자고 있다고 생각하면 된다. 


I/O가 끝나면 다시 ready 상태로 들어가게 된다. running 상태로 가는 것이 아니라는 것을 주의하자.



여기서, 잠시 다른 것을 생각해보자. 오로지 하나의 프로세스만 running 상태에 있을 수 있는 반면, 여러 개의 프로세스가 ready 상태나 asleep 상태에 있을 수 있다. 그러면 다음과 같은 프로세스도 있을 수 있다.

  • ready 상태에서 계속 CPU의 점유권을 못 가져가는 프로세스
  • asleep 상태에서 ready 상태로 못 넘어가는 프로세스
위의 두 개의 프로세스는 결과적으로 실행은 잘 되지도 않으면서 메모리에서 자리만 차지하고 있는 꼴이 된다. 이런 비효율은 없어져 줘야겠다. 즉, 다시 secondary storage로 swap out 해버린다. ready 상태에서 swap out하면 suspended ready 상태가 되고, asleep 상태에서 swap out하면 suspended block 상태가 되어버린다. 물론 이 두 상태에서 나중에 필요에 의해 swap in 하여 다시 메모리에 load될 수도 있다. 


이러한 여러 과정을 거쳐 결국 프로세스가 종료되면 running 상태에서 terminated 상태로 가서 프로세스가 종료된다. (= 할당되어있던 모든 메모리나 CPU 점유권을 내놓는다.)


suspended block 상태에서 I/O가 끝나면 어떻게 될까? 다시 suspended ready 상태로 변해서 asleep 상태가 아닌 ready 상태로 갈 수 있다.


마지막으로, created 상태에서 suspended ready 상태로 갈 수도 있다. 원래는 메모리를 할당 받아서 ready 상태로 가야하나 여러 가지 문제로 인해서 메모리 할당을 못 받으면 suspended ready 상태로 가게 된다.



전체적인 프로세스의 흐름은 이와 같다. 다음 포스팅에서는 스케줄러에 대해서 이야기해보자.


'Operating Systems' 카테고리의 다른 글

[OS] Job Queue, Ready Queue 그리고 Device Queue  (1) 2013.01.01
[OS] 스케쥴러 (scheduler)  (2) 2012.12.31
[OS] Interrupt Service Routine (ISR)  (2) 2012.12.24
[OS] OS의 역할 (more details)  (0) 2012.12.24
[OS] OS의 역할  (0) 2012.12.24
Posted by 빛나유
,

※ 질문/내용오류/공유할 내용이 있다면 jinkilee73@gmail.com으로 메일 주세요 :-)


이 전의 포스팅에서 Interrupt를 다음과 같이 정의했다.


Interrupt : In systems programming, an interrupt is a signal to the processor or an instruction in software usually indicating an event that needs immediate attention. An interrupt signals the processor of a high-priority condition requiring the interruption of the current code the processor is executing, the current thread.

출저 : 위키피디아


이번 포스팅에서는 Interrupt가 어떻게 동작하는지 알아보도록 하자.

Interrupt가 발생하면 OS는 유저모드에서 커널모드로 전환된다. 이 때 커널모드로 동작하고 있는 OS에서는 어떤 일이 벌어지고 있을까?


위와 같은 일이 벌어진다.

처음에 Interrupt가 발생하면 메모리 상의 특정 고정된 위치로 간다. 그 위치에 가면 어떤 주소 값이 저장되어있다. 그 주소 값으로 다시 가서 그 곳에 있는 코드를 수행하게 된다.

쉽게 설명하면, 예를 들어, 키보드 하나를 눌렀을 때 키보드 입출력 처리 루틴을 수행하는 과정을 설명해보자. 키보드 하나를 누르면, Interrupt가 발생하게 되고 키보드 처리 루틴?인 0x00000AB로 이동한다. 그 값에 저장되어있는 포인터 값이 0x177B82C6이기 때문에 그 메모리 주소로 이동하여 그 곳에 저장되어있는 코드(키보드 입출력 루틴 관련 코드)를 수행하게 된다. 

'Operating Systems' 카테고리의 다른 글

[OS] 스케쥴러 (scheduler)  (2) 2012.12.31
[OS] 프로세스 상태(Process State)  (2) 2012.12.31
[OS] OS의 역할 (more details)  (0) 2012.12.24
[OS] OS의 역할  (0) 2012.12.24
[OS] 운영체제 공부를 시작하기에 앞서...  (3) 2012.12.24
Posted by 빛나유
,

※ 질문/내용오류/공유할 내용이 있다면 jinkilee73@gmail.com으로 메일 주세요 :-)


이전 포스팅에서 설명했듯이 OS는 프로세스 관리, 메로리 관리, storage 관리 등등을 수행한다. 조금 중복되는 내용일지는 모르겠으나 OS의 기능을 조금 더 자세하게 구분해보자.

OS의 역할을 사용자를 돕는 부분과 시스템을 돕는 부분으로 나눠 보자.

사용자 역할 돕는 부분

user interface : GUI, Batch, CLI

program execution : 메모리에 load하는 것

I/O operations : file & I/O devices

File systems : creating and deletion file or directory

communication : 프로세스끼리의 정보 공유 (done by memory-share and message passing)

error detection : error 처리

 

시스템 역할 돕는 부분

resource allocation : 메모리 할당

accounting : 누가 어떤 종류의 resource를 사용하고 있는지

protection and security : 할당된 메모리 침범

 

이와 같이 OSOS의 역할을 하기 위해서 무엇이 필요할까?

 

이것을 설명하기 전에 우선 OSDual mode를 설명하자.

OS는 두 가지 모드로 동작 가능하다. 유저 모드와 커널 모드이다.(유저 모드와 커널 모드는 동시에 동작하지 않는다.) 유저 모드는 OS가 어플리케이션 프로그램을 수행하고 있을 때의 모드를 뜻하고 커널 모드는 OS가 시스템 프로그램을 수행하고 있을 때를 말한다. 컴퓨터가 동작하는 동안 OS는 이 두 모드를 왔다 갔다 한다.

그러면 언제 유저 모드 커널모드 이고 언제 커널 모드 유저 모드인가? 이 두 모드는 Trap이나 Interrupt에 의해 변한다.

 

Trap : In computing and operating systems, a trap, also known as an exception or a fault, is typically a type of synchronous interrupt typically caused by an exceptional condition (e.g., breakpoint, division by zero, invalid memory access)

Interrupt : In systems programming, an interrupt is a signal to the processor or an instruction in software usually indicating an event that needs immediate attention. An interrupt signals the processor of a high-priority condition requiring the interruption of the current code the processor is executing, the current thread.

위키피디아에 따르면,

Trap은 예외 처리된 상태에 의해 야기된 interrupt 또는 system call이다. 그 예로 breakpointdivided-by-zero 등등이 있다. , OS에 의해 이미 예측된 내용들이다. 반면, InterruptOS가 예측하지 못 한 프로세서의 signal이나 OS가 즉각적으로 처리해주어야 하는 Instruction들을 의미한다. 키보드에서 사람이 타자를 치는 것도 모두 Interrupt이고, starcraft를 실행하거나 마린을 움직이는 것 역시 모두 Interrupt이다.


Interrupt는 OS에서 상당히 중요한 부분이기 때문에 Interrupt가 Interrupt Service Routine(ISR)에 의해 어떻게 동작하는지 알 필요가 있다. 

[링크] http://operatingsystems.tistory.com/entry/4-Interrupt-Service-Routine-ISR


OS가 부팅을 할 때에는 커널 모드로 부팅이 된다. 이 상태에서 새로운 Interrupt , 사용자에 의해 새로운 프로세스가 실행되거나 할 때 유저모드로 변하게 된다. 그럼 왜 굳이 모드가 변하는가? 안 변하고 그냥 계속 커널 모드로 혹은 유저 모드로 작동하면 안 되나? 안 된다. 왜냐하면 보안을 위해서이다. 시스템을 수행하는데 있어 굉장히 중요한 몇몇 함수들은 커널모드에서 밖에 작동하지 않는다. 모드를 구분하지 않으면 그러한 함수들에 접근하는 것을 막을 수 없다.

 

모드 전환을 이해하려면 System Call Interface를 이해하면 좋다.


위의 그림에서 볼 수 있듯이, OS는 커널 함수들과 System Call함수들로 이루어져있다. System Call들은 커널 함수에 비하면 굉장히 적다. 대부분의 커널 함수는 System Call함수을 통해 사용자가 불러올 수 있다. , system call은 사용자가 kernel 함수를 사용할 수 있도록 해주는 중간 매개체이다.(그래서 system call interface이다.)

 

이제 다시 본래의 질문으로 돌아가자.

OSOS의 역할을 하기 위해서 무엇이 필요할까? 바로 system call이다. system call이 있어야 application programkernel 함수 등을 사용할 수 있다. 위에서도 말했듯이 kernel 함수는 OS의 주된 역할을 담당하는 함수들이다. 그렇다면 system call 역시 OS처럼 역할이 구분될 수 있을 것이다.

ex) a라는 system call interfacememory management를 담당하는 kernel 함수를 호출하고, b라는 system call interfaceprocess management를 담당하는 kernel 함수를 호출한다.

 

주요 system call 함수는 아래와 같다.

Process control

- end, abort

- load, execute

- create process, terminate process

- get process attributes, set process attributes

- wait for time

- wiat event, signal event

- allocate and free memory

File management

- create file, delete file

- open, close

- read, write, reposition

- get file attributes, set file attributes

Device management

- request device, release device

- read, write, reposition

- get device attributes, set file attrubutes

- logically attach or detach devices

Information maintenance

- get time or date, set time or date

- get system data, set system data

- get process, file, or device attributes

- set process, file, or device attributes

Communications

- create, delete communication connection

- send, receive messages

- transfer astatus information

- attach or detach remote devices


위에서 볼 수 있듯이 각각의 system call은 역할을 가지고 있는데, 그 역할이 꼭 OS의 역할과(OS에서의 Kernel 함수) 같다.

 

이제 system call이 어떻게 호출되는지를 알아보자. system call이 호출되려면 위에서 설명한 trap이나 interrupt가 있어야 한다. system call이 발생하는 과정을 간략하게 설명하면 다음과 같다.




Operating System Structures

OS의 구조를 살펴보자. 애초의 MS-DOS는 다음과 같은 simple한 구조를 취했다고 한다.


application이 직접 I/O를 다룰 수 있게 되어있다. 취약하다!!

 

그래서 다음과 같은 layered approach를 고안하게 된다.

Kernel과 "shells and commands ..." 이 두 부분이 OS를 이루는 구조이고 그 위에는 사용자, 그 밑에는 하드웨어. 이렇게 구조를 띈다. 이러한 구조는 몇 가지 장점이 있다.

1. OS 개발할 때 디버깅과 구조화 등을 쉽게 한다.

2. low-level routine이 변경되지 않도록 보장한다.(그럼 위에서 봤던 MS-DOS는 그게 가능한가? 사실 조금 추상적이다;; 이해가 제대로 안 됐음;;)

단점도 있으나 굳이 말하지 않겠다.

 

이외에도 microkernel를 이용한 방법과 Modules를 이용한 방법이 있다.

Microkernel : 마이크로커널은 커널을 필수적으로 필요한 함수들의 집합으로 압축시켜놓은 커널이다. 몇 가지 필요 없는? 기능들을 커널로부터 제거하고 진짜 필요한 것들로만 이뤄놓은 것이다. 그러다보니 크기가 작아져서 마이크로커널이라고 부른다.

Modules : 필수적으로 필요한 kernel함수의 집합인 core kernel을 가지고 있다는 점에서 microkernel과 비슷하지만, 다른 추가적인 서비스(device driver, file system, scheduling classes 등등)들이 동적으로 execution-timelink된다는 점에서 Microkernel의 접근 방법과 다르다.

Modules를 사용하는 방법이 Microkernel보다 효율적이라네? message passing을 사용하지 않기 때문이라는데... 그렇다면 microkernelmessage passing을 사용한다는 말인가? 그리고 그렇다면 modules는 어떤 방법으로 communication을 구현할까?

'Operating Systems' 카테고리의 다른 글

[OS] 프로세스 상태(Process State)  (2) 2012.12.31
[OS] Interrupt Service Routine (ISR)  (2) 2012.12.24
[OS] OS의 역할  (0) 2012.12.24
[OS] 운영체제 공부를 시작하기에 앞서...  (3) 2012.12.24
시작하며...  (0) 2012.12.15
Posted by 빛나유
,