#3-2. Process

 

???) 동기식 입출력과 비동기식 입출력의 차이점.

- 동기식 : 입출력 진행되는 동안에 프로세스가 아무일도 하지 않고 기다리는 것.

- 비동기식 : 입출력이 진행되는 동안에 그 프로세스가 cpu를 잡아서 instruction을 실행을 하는것.

 


* Thread
 : 프로세스 내부에 cpu 수행 단위

 

 

 

# pc가 code 어느부분을 가리키게 된다.

 

# Thread 라는건 프로세스 하나에서 공유할수 있는건 최대한 공유,
 1. 메모리 주소공간 (data, code)
 2. 프로세스 상태
 3. 프로세스가 사용하는 각종 자원들

 

# 별도로 가지고 있는것. (점선으로 되어있는것)
 1. cpu 관련된것들(PC, register)
 2. 주소공간의 (stack)

 

* Thread 정리 (light weight process)
 : cpu를 수행하는 단위

 

 v. Thread의 구성 (독립적으로 가지고 있는 것)
  - Program Counter
  - register set
  - stack space

 v. Thread가 동료 thread와 공유하는 부분 (=task)
  - code section
  - data section
  - OS resources

 v. 전통적인 개념의 heavy weight process는 하나의 thread를 가지고 있는 task로 볼 수 있다. 
 
* 쓰레드를 사용하면 어떤 장점이 있나?

 

 - 응답시간이 빨라진다.
 : 다중 스레도로 구성된 task 구조에서는 하나의 서버 스레드가 blocked(waiting) 상태인 동아넹도 동일한 task 내의 다른 스레드가 실행 (running)되어 빠른 처리를 할 수 있다.

 

 - 동일한 일을 수행하는 다중 스레드가 협력하여 높은 처리율과 성능 향상을 얻을 수 있다.

 

 - 스레드를 사용하면 병렬성을 높일 수 있다.

 
 ex> 웹 브라우저에서 naver를 본다면, network을 통해서 web page를 읽어오는 작업이 I/O 작업이된다.

     만약 멀티 스레드가 아니라면 이 작업중에 사용자는 아무것도 할 수 없게 되어 답답한게 된다.

'cs > os' 카테고리의 다른 글

#4. Process Management  (0) 2018.01.02
#3-3. Thread  (0) 2017.12.29
#3-1. Process  (0) 2017.12.27
#2-2. System Structure & Program Execution  (0) 2017.12.25
#2-1. System Structure & Program Execution  (0) 2017.12.24

#3-1. Process

cf> process = (한 마디로) 실행중인 프로그램


 

 


* process`s context
 : 이 프로세스가 어디까지 와 있는가 => PC가 필요.
   (즉, 현재 상태 규명)

 v. cpu 수행 상태를 나타내는 하드웨어 문맥 (cpu)
   - Program Counter
   - 각종 register
 v. 프로세스의 주소 공간   (memory)
   - code, data, stack
 v. 프로세스 관련 커널 자료 구조  (kernel)
   - PCB(Process control Block)
   - Kernel stack


cf> 프로세스는 생성이 되면 독자적인 주소공간을 생성한다.


* Process State

- 프로세스는 상태가 변경되며 수행된다.
  => 크게 3가지로 구분!! cpu를 잡고 있거나, 기다리거나, 무언가 오래걸리는 작업을 하고 있거나
 
 v. Running : cpu를 잡고 instruction을 수행중인 상태
 v. Ready : cpu를 기다리는 상태(메모리 등 다른 조건은 모두 만족)
 (즉, cpu만 얻으면 instruction을 실행할수 있는 상태)
 v. Blocked(wait, sleep)
  - cpu를 주어도 당장 instruction을 수행할 수 없는 상태
  - Process 자신이 요청한 event(예:I/O)가 즉시 만족되지 않아
    이를 기다리는 상태
  - (예)디스크에서 file을 읽어와야 하는 경우

 

(경우에 따라 2가지 추가)
 v. New : 프로세스가 생성중인 상태
 v. Terminate : 수행(excution)이 끝난 상태

 

# Ready상태에 있는 프로세스들이 번갈아가며 cpu를 잡았다 놓았다 하면서 time sharing을 구현하고 있다.
# Blocked 상태에 있는 프로세스의 예))
  virtual 공간(주소 공간)에 있는 것들중 메모리에 올라가 있지 않고 disk(swap area)에 내려가 있는 것.

 

 

<프로세스 생태도>

  (이 글의 마지막에 상태도는 suspended 상태 때문에 약간 변하게 된다. )

 

# ready 상태는 최소한의 메모리를 가지고 있다.(당장 instruction실행하는데 필요한 부분들이 메모리에 있다.)

# running 에서는 나가는것이 3가지가 있다.
1. 자진해서 cpu를 내놓는 경우.
  (I/O같은 그런 이벤트 처리를 위해)
2. cpu를 계속 쓰고 싶은데 time sharing을 위해 시간이 다되어서 timer interrupt가 들어와서 ready 상태로 돌아가는 경우.

3. 할일 다해서 끈나는 경우.

 이 상태 변화를 컴퓨터 시스템 입장에서 알기 쉽게 그려놓은것.

 

 

# process는 큐에 들어가서 줄을 서서 자기 차례를 기다린다. (실은 기다린 순서대로 가는것이 아니라 우선순위가 있다.)

 

 

 

 

 

 


# kernel이 Data자료구조를 만들어 놓고, 이런것들을 통제한다.

 

 

* PCB 
 : 커널이 프로세스를 관리하기 위해서 PCB를 둔다.

 

 

# 구성요소(4가지)를 잘보자.

 

 

** 문맥교환 (굉장히 중요한 개념!!)
 : cpu를 게속 이용하는것이 아니라 뺏겼다가 다시 사용한다.
 뺏겼다가 다시 사용할때, 뺏긴 시점의 문맥을 기억했다가 다시 사용하는것이 포인트!

 

 


# 문맥 교환시 필요한 작업.
 : 프로세스가 cpu를 빼앗길때
   pc, register정보(왼쪽 노란색), memory map(아래 초록색) 정보를
   저장해둔다.
   why)) 뺏긴 시점의 문맥을 기억하기 위해!!

 

<문맥교환 그림 설명>


# cpu 제어권 넘어가는걸 설명하는 그림.
# A -> kernel -> A :(다시 A로 오는건 문맥교환x)
  A -> kernel -> B :(문맥교환!!)
# timer 인터럽트 or 오래걸리는 작업(ex> I/O) 의 인터럽트에서는 문맥교환이 일어난다!!
# 문맥교환에는 수행정보등 context의 일부를 PCB에 save 해야해서 cach memory flush(오버헤드)가 발생함.

 

 

* 프로세스를 스케줄링하기 위한 큐

 

 

# job queue 에는 ready queue, device queue 에 들어있는 프로세스들도 들어 있다!!
# But!! ready queue <-> device queue 이다.

 


 
** 실제 프로그램에서 큐가 어떻게 관리되는지 그림으로 알아보자.

 

 

# 1번째가 ready 큐 이고,
  밑에 4개가 device 큐 이다.

 

 

*프로세스 스케줄링 큐의 모습

 

 


# 마지막에 인터럽트가 발생했을떼 ready 상태로 넘어가는거 처럼 그려졌는데 정확하게는 ready상태로 넘어가는게 아니다.(틀린 그림)

 

 

* 스케줄러
 : 순서를 정해주는 것

 - Short-term scheduler
  : 굉장히 짧은 시간 단위로 스케줄이 이루어 진다.
  : 다음번에 어떤 프로세스한테 cpu를 줄지를 결정

 

 - Long-term scheduler
  : 메모리를 어떤 프로세스한테 줄지를 결정.
  : 프로세스가 new 상태에서 메모리에 올라가는것이 허락이 되야 ready 상태가 될수 있다. 그 허락을 결정하는것이 이 스케줄러.
  : degree of MultiProgramming을 제어(memeory에 몇개를 올려 놓을지를 결정하는 것.) -> 중요!!
  : 현재에는 안쓰임.(무조건 ready 상태로 들어감)

  ???)그러면 현재에는 degree of MultiProgramming을 어떻게 제어 하는가? => Medium-term Scheduler!!

 

 - Medium-term Scheduler(swapper)
  : 일단 memory에 다 올려 놓고, memory에 너무 많은 프로세스가 올라가 있으면 필요없는것을 골라 통째로 쫒아냄!!

 


 

# 프로세스의 상태 3가지에, 중기 스케줄러 때문에 추가된 상태가 Suspended 상태이다!
 => 메모리를 통재로 빼앗긴 프로세스들의 상태를 나타냄.
# blocked 와 suspended를 구분하자!
 blocked는 자신의 오래걸리는 작업이 끈나면 다시 ready가 될 수 있지만,
 suspended는 외부에서 허락을 받아야 한다

cf> 사람이 ctrl+z 를 눌러서 프로세스를 중지 시켰을때도 suspended 상태가 된다. 사람이 프로세스를 재개시키면 다시 위의 상태로 돌아갈 수 있다.

 

 

 

** 프로세스 상태도 (최종)

 

 

# running을 두가지로 나누었다.


 

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

 

※ 추가 개념

 

# pc 또한 register 이다.

# pc는 code부분을 카리킨다.

 

# (사진 설명)

: (code, data, stack)은 가상 주소 공간 이므로,

  pc는 Memory(물리적 공간)에 있는 code를 가리킨다. 

 

# cpu에 관한 문맥은 2가지가 있는데,

 1) pc : 다음 실행할 주소를 가리킨다.

 2) registers : 이 정보로 인해서 다음에 어디를 실행해야 할지 알 수 있다.

'cs > os' 카테고리의 다른 글

#3-3. Thread  (0) 2017.12.29
#3-2. Process  (0) 2017.12.27
#2-2. System Structure & Program Execution  (0) 2017.12.25
#2-1. System Structure & Program Execution  (0) 2017.12.24
# Thread  (0) 2017.12.17

#2-2. System Structure & Program Execution


복습))

 instruction은 보통 4byte 이다.

 그렇기 때문에 순차적일때 pc(program counter)는 4가 증가한다.

 But, 항상 일정한건 아니다!(if, continue etc)

 

 

* 동기식 입출력(synchronous I/O)

 : I/O요청 후 입출력 작업이 완료된 후에야 제어가 사용자 프로그램으로 넘어감.

  (즉, 완료가 되어야 다음일을 할 수 있다.)


* 비동기식 입출력(asynchronous I/O)

 : I/O가 시작된 후 입출력 작업이 끝나기를 기다리지 않고 제어가 사용자 프로그램에 즉시 넘어감.

  (안끈나도 다음작업이 가능하다.)


cf> I/O는 커널을 통해서만 사용이 가능하다.


 

* DMA (Direct Memory Access)

 : 메모리에 접근하는 장치

 

 v. 작은일들은 바로 cpu에 interrupt 거는게 아니라 DMA를 거친다.

(byte 단위가 아니라 buffer에다 저장해뒀다가 블록 단위로 전송)

즉, CPU가 효율적으로 일할 수 있게 해주는것.



* 저장장치 계층 구조

 

 

 

v. 위로 올라갈 수록 

  - 스피드 빠르고

  - 비싸고(그래서 용량이 적다.)

  - 휘발성이다.

 v. cpu가 직접 접근할수 있는 것이 Primary구간(초록)


cf> cpu가 직접 접근하기 위해선 byte 단위로 접근이 가능해야하는데,

 DRAM 메모리 같은경우 byte단위로 주소를 매겨서 접근할수 있다.

 반대로, 하드디스크 경우는 섹터 단위로 주소를 매긴다.


 - 캐시메모리 : 속도 차이를 완충해주는 역할

그러나 메모리가 main memory보다 작아서 당장 필요한거만 저장해서 쓴다. 이것을 caching 이라고 부른다.(보통 캐싱은 재사용을 목적으로 한다.)

 

 - register : 이곳을 통해 instruction을 읽어들인다.


** 프로그램이 어떻게해서 실행이 되는가?

 


실행파일 형태로 하드디스크에 저장 되있고, 실행시키게 되면 메모리에 올라가서 프로세스가 된다. 그렇게 실행이된다.

정확하게는 물리적인 메모리에 바로 올라가는것이 아니라 virtual memory를 거치게 된다.


모든 프로그램이 독자적인 주소 공간(virtual memory)을 가지고 있다.


이것이 통째로 물리적인 메모리에 올려놓는게 아니라 당장 필요한것은 물리적인 메모리에 올려놓고, 당장필요하지 않은것은 swap area에 내려 놓는다.



* 메모리 주소변환 계층

 논리적인 메모리 주소 -> 물리적인 주소로 변환되는것

 (이부분은 뒤에서 자세히..)

 


 

* 커널 주소 공간의 내용

 

뒤에 자세히 하겠다.. 생김새 정도만 살펴 보자


 

cf> 어떤 프로그램이던 함수형 언어로 짜여 있다.

 

 


 

* 함수

커널함수(시스템 콜) Vs 사용자정의 함수, 라이브러리 함수

-------------------------------------------------------------------

커널안에 있다               사용자 프로세스 코드 영역에 들어있다


=> 즉, 사용자 프로세스가 커널함수를 사용하고 싶다면 스스템콜을 사용하여 interrupt가 발생시켜 cpu제어권을 os에게 넘겨보내어 실행을 하게 된다.

 

[실행 예시]

 



'cs > os' 카테고리의 다른 글

#3-3. Thread  (0) 2017.12.29
#3-2. Process  (0) 2017.12.27
#3-1. Process  (0) 2017.12.27
#2-1. System Structure & Program Execution  (0) 2017.12.24
# Thread  (0) 2017.12.17

#2-1. System Structure & Program Execution

: 운영체제를 설명하기 앞서 하드웨어적인 동작을 설명.


 



컴퓨터란? : cpu + memory


memory = cpu의 작업공간


* cpu는 매 클럭 사이클마다 instruction(기계어)를 하나씩 읽어서 실행을 하게된다.

  => cpu의 운명.


- register : cpu안에는 memory보다 더 빠른 메모리 저장 공간이 있다

- mode bit : 지금 cpu에서 사용되는것이 운영체제인지 or 사용자명령인지 구분해주는 것.


 => 1 : 사용자 프로그램 수행

      0 : 모니터모드. 커널모드 (os가 cpu사용)

 v. 보안을 해칠수 있는 중요 명령어는 모니터 모드에서만 실행가능.

 v. interrupt 발생시, mode bit 0으로 set.

 v. 사용자 프로그램에 cpu넘기기 전에 mode bit 1로 set.

 

    => 보안을 목적으로 instruction set을 나누어 놓았다.



* timer

: 특정프로그램이 cpu를 독점하는것을 막는것 (무한루프 방지)

 v. 매 클럭 틱 때마다 1씩 감소

 v. 셋팅해놓은 시간이 끈나면 ‌interrupt를 넣어준다.

 v. cpu는 intertupt line을 체크한다.

 

=> 즉, cpu의 time sharing 구현을 위한 하드웨어!!



* I/O device


- device controller : I/O device는 각각 작은 cpu역할을 하는 컨트롤러가 있다.


cf> device driver : 각 장치에 맞게 접근할 수 있게 해주는 SW모듈.


- local buffer : device controller들도 작은 메모리 공간이 필요한데, 이곳은 로컬 버퍼라고 부른다.

 v. 실제 I/O는 device와 로컬 버퍼 사이에서 일어남.

 v. I/O가 끈나면 컨트롤러가 interrupt로 cpu에 그 사실을 알림.



* DMA controller :  이러다 보면 cpu가 너무 interrupt를 너무 많이 당하게 된다. 그래서 이것이 필요하다. (직접 메모리 접근 가능)


=> 즉, DMA는 cpu를 효율적으로 사용하기 위해 필요한것.


* memory controller : DMA와 CPU의 교통정리를 해주는 컨트롤러.


* 모든 입출력 명령은 특권 명령이다.

- 시스템콜 : 사용자 프로그램이 os의 커널함수를 호출하는것.

 : 일반 함수 호출과는 조금 다르다. 

 프로그램이 interrupt를 걸면서(mode bit=0) 시스템콜을 하게된다.

 이 인터럽트를 Trap 이라고 한다.

 

   v. Exception   : 프로그램 오류를 범한 경우.

   v. System call : 프로그램이 커널함수를 호출하는 경우.

   v. trap이 걸리면 cpu가 os로 넘어가게 된다.

cf> 일반 함수 호출은 memory 주소를 바꾸는 것으로 가능하다.


???) 

Q. I/O를 요청하는 interrupt : SW 인터럽트(trap)

   I/O가 끈난다면     : HW 인터럽트를 이용해서 끈난것을 알려준다.


 

=> 현대의 os는 interrupt에 의해서 구동된다.

'cs > os' 카테고리의 다른 글

#3-3. Thread  (0) 2017.12.29
#3-2. Process  (0) 2017.12.27
#3-1. Process  (0) 2017.12.27
#2-2. System Structure & Program Execution  (0) 2017.12.25
# Thread  (0) 2017.12.17

● PROCESS : 실행중인 프로그램

       ------------------> 자원 + 공간(*) + 쓰레드(**) 로 이뤄짐.


  * 자원        : 공간(호출스택)의 크기에 따라 호출할 수 있는 쓰레드의 수가 결정된다.

  ** 쓰레드    : 쓰레드의 갯수에 따라 싱글 쓰레드와 멀티 쓰레드로(***) 나뉜다. 


  *** < 멀티 쓰레드의 장점 >

                                  

1. cpu의 활용률 향상                                     

2. 자원을 보다 효율적으로 사용                         

3. 사용자에 대한 응답성 향상                           

4. 작업이 분리 되기 때문에 코드가 간결해진다.

=> 쓰레드와 사용자 요청이 1:1 대응이 되도록 프로그래밍 해야 한다.


< 멀티 쓰레드의 단점 > --> 이 부분에 대해선 뒤에서 자세히 다루자.


1. 동기화 문제

2. 교착상태

=> 여러 쓰레드가 자원을 공유하면서 작업을 하기 때문에 발생.


cf> 프로세스의 성능이 쓰레드의 개수와 비례하진 않는다.



● 쓰레드 구현 방법

 

1. Thread 클래스 상속

   -> But, Thread클래스를 상속받으면 다른 클래스를 상속 받을 수 없다.


2. Runnable 인터페이스 구현.

   -> 이 방법을 주로 

 ex>

1
2
3
class MyThread implements Runable {
    public void run() { /* 작업 내용 */ }
}
cs


● 한번 사용한 쓰레드는 재 사용될 수 없다. (즉, 한번 start() 한 것을 또 start()할 수 없다.)

 


● 예시를 통해 호출스택 내부를 살펴보도록 하자.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class ThreadEx3 {
 
    public static void main(String[] args) throws Exception {
        MyThreadEx3_1 t1 = new MyThreadEx3_1();
        t1.run();
    }
 
}
 
class MyThreadEx3_1 extends Thread {
    public void run() {
        throwException();
    }
    
    public void throwException() {
        try {
            throw new Exception();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
cs


실행결과

java.lang.Exception

at GodBell.MyThreadEx3_1.throwException(ThreadEx3.java:19)

at GodBell.MyThreadEx3_1.run(ThreadEx3.java:14)                        

at GodBell.ThreadEx3.main(ThreadEx3.java:7)

 

 

: 이 예제는 고의적으로 예외를 발생시켜서 호출스택의 내용을 확인할 수 있도록 했다.

 (start() 메서드가 아니라 run()메서드 이기 때문에 main()메서드가 호출스택에 포함되어 있음을 확인할 수 있다.)

 

● start VS run

 

start() : 쓰레드 실행 (새로운 호출 스택 생성)

run()  : 단순히 클래스에 속한 메서드 하나를 호출

 

cf> start()가 호출된 쓰레드는 바로 실행되는것이 아니고, 일단 대기상태에 있다가 스케줄러가 정한 순서에 의해 실행.

     실행중인 쓰레드가 하나도 없을 때 program은 종료된다. 

 

 

 

 

● 싱글 쓰레드 VS 멀티 쓰레드

 

 - cpu 만을 사용하는 계산 작업이라면 오히려 싱글 쓰레드가 더 빠르다.

   why)) 스위칭 때문!! (다음에 실행하는 위치(PC)등의 정보를 저장하고 읽어오는 시간이 소요된다.)

 

 - 프린트기 사용이나 다른 입력장치와 함께 사용할때에는 멀티쓰레드가 더 좋다. 

 

 

● 쓰레드는 우선순위 속성을 가지고 있다.

 

 - 우선순위 (1 ~ 10) : 클수록 우선순위가 높다.

 - 절대적이 아니라 상대적인 개념.

ex> 1, 2    ==    9, 10    

     (두 경우 모두 우선순위가 1차이 만큼 우선순위 속성을 가지고 있다.)

 - main의 쓰레드의 우선순위는 '5'이므로 main 내의 생성한 쓰레드는 우선순위 '5'를 갖게된다.

 

 

● 쓰레드 그룹

 

 - 그룹 : 폴더개념이라고 생각하자.

 - 보안상의 이유로 만들어졌다. (자신이 속한 그룹이거나, 하위그룹 쓰레드는 변경 가능 하지만 다른 그룹의 쓰레드는 내용 변경 불가!)

 - 모든 쓰레드는 그룹에 포함되어야 한다.

 

 - ThreadGroup(String name)을 사용해서 그룹 생성 가능.

 - 쓰레드 그룹에 포함시키려면 "생성자"를 이용해야 한다.

   if> 생성자를 안썻다면?

: 자신을 생성한 쓰레드와 같은 그룹에 속하게 된다.

 

=> 즉, 우리가 생성한 모든 쓰레드는 모두 main 쓰레드 그룹에 속하게 된다.

 

 

~641 PAGE 부터 이어집니다.... (데몬 쓰레드 부터 시작) 



'cs > os' 카테고리의 다른 글

#3-3. Thread  (0) 2017.12.29
#3-2. Process  (0) 2017.12.27
#3-1. Process  (0) 2017.12.27
#2-2. System Structure & Program Execution  (0) 2017.12.25
#2-1. System Structure & Program Execution  (0) 2017.12.24

+ Recent posts