본문 바로가기

SW정글사관학교

[SW 정글] 5/19 운영체제 - 프로세스, 스레드, 스케쥴러

반응형

배운거

 

운영체제란 자원을 효율적으로 관리해주고, 컴퓨터 시스템을 편리하게 사용하게 도와주는 것이다.

 

운영체제의 분류에 따른 종류

 

동시작업 가능 여부에 따른 분류

1) Single Tasking (단일 작업)

- 한번에 하나의 작업만 처리 ex) MS-DOS

2) Multi Tasking (다중 작업)

- 동시에 두개 이상의 작업 처리 ex) MS-Windows, UNIX ...

 

사용자의 수에 따른 분류

1) Single User (단일 사용자)

- 혼자 사용 ex) MS-DOS, MS- Windows

2) Multi USer (다중 사용자)

- 2명 이상 사용 ex) UNIX, NT Server

 

처리방식에 따른 분류

1) Batch Processing (일괄처리)

- 작업 요청의 일정량 모아서 한꺼번에 처리

- 작업이 완전 종료될 때까지 기다려야함

ex ) 초기 Punch card 처리 시스템

 

2) Time sharing (시분할)

- 여러 작업을 수행할 때 컴퓨터 처리 능력을 일정한 시간 단위로 분할하여 사용

- 일괄 처리 시스템에 비해 짧은 응답시간을 가짐

- Interactive한 방식

ex) UNIX, Windows

 

3) Realtime OS (실시간)

- 정해진 시간안에 어떠한 일이 반드시 종료됨이 보장되어야하는 실시간 시스템을 위한 OS

ex) 원자로/공장 제어, 미사일 제어, 반도체 장비, 로보트 제어

 

현재 우리가 사용하는 운영체제는 Multi Tasking, Multi User, Time sharing을 지원한다.

 

Multi Programming 메모리에 여러 프로그램이 올라가는 것

 

✔️ Multi Processor 하나의 컴퓨터에 CPU(processor)가 여러개 붙어 있음을 의미

 

 

운영체제의 대략적인 구조

CPU

↕️

memory

↕️

Disk I/O device

 

cpu, memory, disk간의 속도차이가 크기 때문에 자원을 효율적으로 사용하고 저장해야함.

 

CPU : cpu를 누구한테 주지 ? ➡️ CPU scheduling

memory : 한정된 메모리를 어떻게 쪼개 쓰지 ? ➡️ 메모리관리

Disk : 디스크에 파일을 어떻게 보관하즹 ? ➡️ 파일 관리(움직임을 최소화하면서 자원을 어떻게 효율적으로 관리할까?)

I/O device : 각기 다른 입출력 장치와 컴퓨터 간에 어떻게 정보를 주고 받게 하지 ? ➡️ 입출력 관리 (interrupt 기반)

 

컴퓨터 구조

 

I/O Device에 접근할 수 있는 것은 OS가 유일하다! 이유는 보안상의 이유다!

만약, 어떤 프로그램이 사용자 입력이 필요하다면 modebit을 0으로 바꿔야한다. 그러나 프로그램은 그러한 권한이 없다.

그렇기 때문에 시스템 콜을 통해 interrupt line에 요청하고 interrupt line은 OS에 필요하다고 요청한다. 그리고 OS가 mode bit을 0으로 변경한다. (이게맞나 ? -> 내일 보경이누나 챈스)

 

 

Mode bit

- 사용자가 프로그램의 잘못된 수행으로 다른 프로그램 및 운영체제에 피해가 가지 않도록 하기 위한 보호 장치 필요

 

- Mode bit을 통해 하드웨어적으로 두가지 모드의 operation을 지원한다.

 

1 사용자 모드 : 사용자 프로그램 수행
0 모니터 모드 : OS 코드 수행 (모니터 모드 = 커널모드, 시스템모드)
더보기

1 사용자 모드 : 사용자 프로그램 수행

0 모니터 모드 : OS 코드 수행

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

   - Interrupt나 Exception 발생시 하드웨어가 mode bit을 0으로 바꾼다

   - 사용자 프로그램에게 CPU를 넘기기전에 mode bit을 1로 셋팅

 

Timer

- 정해진 시간이 흐른 뒤 운영체제에게 제어권이 넘어가도록 인터럽트를 발생시킴

   (어떤 프로그램이 독점적으로 CPU를 사용하는 걸 방지)

- 타이머는 매 클럭 틱 때마다 1씩 감소

- 타이머 값이 0이 되면 타이머 인터럽트 발생

- CPU를 특정 프로그램이 독점하는 것으로부터 보호

- 타이머는 time sharing을 구현하기 위해 널리 사용된다.

- 타이머는 현재 시간을 계산하기 위해서도 사용된다.

 

DMA (Direct Memory Access) Controller

- 원래 메모리는 CPU만 접근할 수 있었다. CPU가 인터럽트를 너무 많이 당하면 효율이 떨어지기(오버헤드) 때문에 DMA란걸 개발함

- 빠른 입출력 장치를 메모리에 가까운 속도로 처리하기 위해 사용

- CPU의 중재없이 device controller가 device의 buffer storage의 내용을 메모리에 block 단위로 직접 전송

- 바이트 단위가 아니라 block 단위로 인터럽트를 발생시킴(하나마다 보내는게 아니라 모아서 보냄)

 

Device Controller

I/O device controller

- 해당 I/O 장치유형을 관리하는 일종의 작은 CPU

- 제어 정보를 위해 control register, status registe를 가짐

- local buffer를 가짐 (일종의 data register)

 

I/O는 실제 device와 local buffer 사이에서 일어남

Device controller는 I/O가 끝났을 경우 Interrupt로 CPU에 그 사실을 알린다.

 

✔️ device driver(장치 구동기) : OS 코드 중 각 장치별 처리 루틴 ➡️ software

✔️ device controoler(장치 제어기) : 각 장치를 통제하는 일종의 작은 CPU ➡️ hardware

 

입출력의 수행

- 모든 입출력 명령은 특권 명령

1. system call : 사용자 프로그램은 운영체제에게 I/O 요청(Interrupt line에 Interrupt걸기)

2. trap을 사용하여 인터럽트 벡터의 특정 위치로 이동

3. 제어권이 인터럽트 벡터가 가리키는 인터럽트 서비스 루틴으로 이동

4. 올바른 I/O 요청인지(접근 권환이 있는지? 등) 확인 후 I/O 수행

5. I/O 완료 시 제어권을 시스템 콜 다음 명령으로 옮김

 

Interrupt(인터럽트)

인터럽트 : 인터럽트 당한 시점의 레지스터와 program counter를 save한 후 CPU의 제어를 인터럽트 처리 루틴에 넘긴다.

 

Interrupt(하드웨어 인터럽트) : 하드웨어가 발생시킨 인터럽트

Trap(소프트웨어 인터럽트)

- Exception : 프로그램이 오류를 범한 경우

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

 

📌 I/O 요청때는 프로그램이 Trap요청 -> I/O 끝났을시 I/O controller가 하드웨어 인터럽트 요청

 

인터럽트 벡터란 ? 해당 인터럽트의 처리 루틴 주소를 가지고 있음

인터럽트 처리 루틴(= Interrupt Service Routine, 인터럽트 핸들러)이란 ? 해당 인터럽트를 처리하는 커널 함수

 

동기식 입출력과 비동기식 입출력

Synchronous I/O(동기식 입출력)

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

구현 방법 1

- I/O가 끝날 때까지 CPU를 낭비시킴

- 매시점 하나의 I/O만 일어날 수 있음

구현 방법 2

- I/O가 완료될 때까지 해당 프로그램에게서 CPU를 빼았음

- I/O 처리를 기다리는 줄에 그 프로그램을 줄 세움

- 다른 프로그램에게 CPU를 줌

 

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

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

 

✔️ 두 경우 모두 I/O의 완료는 인터럽트로 알려줌

  

커널 주소 공간의 내용

사용자 프로그램이 사용하는 함수 Function (code에 저장)

사용자 정의 함수 

- 자신의 프로그램에서 정의한 함수

 

라이브러리 함수

- 자신의 프로그램에 정의하지 않고 가져다 쓴 함수

- 자신의 프로그램의 실행 파일에 포함되어 있다

 

커널 함수

- 운영체제 프로그램의 함수

- 커널 함수의 호출 = 시스템 콜

 

프로세스

개념

"Process is a program in execution"

프로세스의 문맥(context)

- CPU 수행 상태(어디까지 수행했는가? 어떤 데이터를 저장하고 있는가 ? 등)를 나타내는 하드웨어 문맥

    - Program Counter

    - 각종 Register

- 프로세스의 주소 공간

    - code, data, stack

- 프로세스 관련 커널 자료 구조

    - PCB(Process Control Block)

    - Kernel Stack

 

상태(State)

프로세스는 상태가 변경되며 수행된다

1. Running

    - CPU를 잡고 Instruction을 수행중인 상태

2. Ready

    - CPU를 기다리는 상태(메모리 등 다른 조건을 모두 만족하고)

3. Blocked(wait, sleep)

    - CPU를 주어도 당장 Instruction을 수행할 수 없는 상태

    - Process 자신이 요청한 event(ex: I/O)가 즉시 만족되지 않아 이를 기다리는 상태

4. Suspended(stoped)

    - 외부적인 이유(Medium scheduler등)로 프로세스의 수행이 정지된 상태

    - 프로세스는 통째로 디스크에 swap out 된다.

    - ex) 사용자가 프로그램을 일시 정지시킨 경우 (break key)

       시스템이 여러 이유로 프로세스를 잠시 중단시킴 (메모리에 너무 많은 프로세스가 올라와있을때)

 

New ? 프로세스가 생성중인 상태

Terminated : 수행(execution)이 끝난 상태

Blocked: 자신이 요청한 event가 만족되면 Ready

Suspended : 외부에서 resume해주어야 active

 

의문 1 (아래에 나옴)

 

PCB (Process Control Block)

- 운영체제가 각 프로세스를 관리하기 위해 프로세스당 유지하는 정보

- 다음의 구성요소를 가진다(구조체로 유지)

1) OS가 관리상 사용하는 정보

    - Process State, Process ID

    - scheduling Information, Priority

2) CPU 수행 관련 하드웨어 값

    - Program counter, register

    - 쓰레드일 경우 이부분빼고 공유

3) 메모리 관련

    - Code, data, stack의 위치 정보

4) 파일 관련

    - Open file descriptors ... 

 

PCB

문맥 교환(Context Switch)

- CPU를 한 프로세스에서 다른 프로세스로 넘겨주는 과정

- CPU가 다른 프로세스에게 넘어갈 때 운영체제는 다음을 수행

    1. CPU를 내어주는 프로세스의 상태를 그 프로세스의 PCB에 저장

    2. CPU를 새롭게 얻는 프로세스의 상태를 PCB에서 읽어옴

 

system call이나 interrupt 발생시 반드시 context switch가 일어나는 것은 아니다.

if) process A가 system call을 호출하고 kernel mode로 갔다가 다시 process A로 간다면 context switch가 아니다

 

위 경우에도 CPU 수행 정보 등 context의 일부를 PCB에 save해야 하지만 문맥교환을 하는 경우가 부담이 훨씬 크다(오버헤드가 크다)

 

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

Job queue

- 현재 시스템 내에 있는 모든 프로세스의 집합

Ready queue

- 현재 메모리 내에 있으면서 CPU를 잡아서 실행되기를 기다리는 프로세스의 집합

Device queue

- I/O device의 처리를 기다리는 프로세스의 집합

 

프로세스들은 각 큐들을 오가며 수행한다.

 

스케쥴러

Long-term Scheduler(장기 스케쥴러 or job scheduler)

- 시작 프로세스 중 어떤 것들을 메모리를 줄지(ready queue로 보낼지) 결정

- 프로세스에 memory(및 각종 자원)을 주는 문제

- degree of Multiprogramming을 제어

- time sharing system에는 보통 장기 스케쥴러가 없음(무조건 ready)

 

Short-term Scheduler(단기 스케쥴러 or CPU scheduler)

- 어떤 프로세스를 다음번에 running시킬지 결정

- 프로세스에 CPU를 주는 문제

- 충분히 빨라야함 (ms 단위)

 

Medium-term Scheduler(중기 스케쥴러 or Swapper)

- 여유 공간 마련을 위해 프로세스를 통째로 메모리에서 디스크로 쫓아냄

- 프로세스에게서 memory를 뺏는 문제

- degree of Multiprogramming을 제어 (메모리에 몇개의 메모리를 올려놓을지 제어)

 

 

Thread(or lightweight process)

CPU를 실행하는 단위

Thread의 구성

- program counter

- register set

- stack space

 

Thread가 동료 thread와 공유하는 부분(= task)

- code section

- data section

- OS resources

 

전통적인 개념의 heavyweight process는 하나의 thread를 가지고 있는 task로 볼 수 있다.

 

다중 스레드로 구성된 태스크 구조에서는 하나의 서버 스레드가 blocked(waiting)상태인 동안에도 동일한 태스크 내의 다른 스레드가 실행(running)되어 빠른 처리를 할 수 있다.

 

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

 

스레드를 사용하면 병렬성을 높일 수 있다.(멀티 코어(cpu)에 해당)

 

Benefits of Threads

- Responsiveness

ex ) 멀티 스레드 웹

그림이 늦게 나오더라도 텍스트가 먼저나오면 덜 답답하다.

- Resource Sharing (자원 공유)

code, data, resource를 공유하면 효율적이다

- Economy

프로세스를 만드는 것보다 스레드만드는 게 오버헤드가 작다.

프로세스끼리 스위치보다 스레드끼리의 스위치가 훨씬 더 오버헤드가 작다.

creating & CPU switching thread (rather then a process)

- Utilization of MP Architectures

멀티프러세서환경에서 병렬적으로 실행하면 매우 빠르다(매우 큰 행렬 연산)

 

커널의 지원을 받고 커널이 스레드가 여러개인 것을 알면 kernel threads 아니면 user threads

 

Process Creation(프로세스 생성)

부모 프로세스가 자식 프로세스 생성

Copy-on-write(COW) : write가 발생했을 때 copy하겠다.

프로세스의 트리(계층 구조) 형성

프로세스는 자원을 필요로 함

    - 운영체제로부터 받는다.

    - 부모와 공유한다.

자원의 공유

    - 부모와 자식이 모든 자원을 공유하는 모델

    - 일부를 공유하는 모델

    - 전혀 공유하지 않는 모델(일반적임)

Execution(수행)

    - 부모와 자식은 공존하며 수행되는 모델

    - 자식이 종료(terminate)될 때까지 부모가 기다리는 모델 (wait system call을 이용)

주소 공간 (Address space)

    - 자식은 부모의 공간을 복사함(binary and OS data)

    - 자식은 그 공간에 새로운 프로그램을 올림

유닉스의 예

    - fork() system call이 새로운 프로세스를 생성 

        - 부모를 그대로 복사(OS data except PID + binary)

        - 주소 공간 할당

    - for 다음에 이어지는 exec() system call을 통해 새로운 프로그램을 메모리에 올림

 

Process Terminate(프로세스 종료)

프로세스가 마지막 명령을 수행한 후 운영체제에게 이를 알려줌 (exit) : 자발적 종료

    - 자식이 부모에게 output data를 보냄 (via wait)

    - 프로세스의 각종 자원들이 운영체제에게 반납됨

부모 프로세스가 자식의 수행을 종료됨 (abort) : 비자발적 종료

    - 자식이 할당 자원의 한계치를 넘어섬

    - 자식에게 할당된 태스크가 더 이상 필요하지 않음

    - 부모가 종료하는 경우

        - 운영체제는 부모 프로세스가 종료하는 경우 자식이 더 이상 수행되도록 두지 않는다.

        - 단계적인 종료

 

자발적 종료

    - 마지막 statement 수행 후 exit() 시스템 콜을 통해

    - 프로그램에 명시적으로 적어주지 않아도 main 함수가 리턴되는 위치에 컴파일러가 넣어줌

 

비자발적 종료

    - 부모 프로세스가 자식 프로세스를 강제 종료시킴

        - 자식 프로세스가 한계치를 넘어서는 자원요청

        - 자식에게 할당된 태스크가 더이상 필요하지 않음

    - 키보드로 kill, break 등을 친 경우

    - 부모가 종료하는 경우

        - 부모 프로세스가 종료하기 전에 자식들이 먼저 종료됨

 

 

프로세스간 협력

독립적 프로세스 (Independent process)

- 프로세스는 각자의 주소 공간을 가지고 수행되므로 원칙적으로 하나의 프로세스는 다른 프로세스의 수행에 영향을 미치지 못함

 

협력 프로세스 (Cooperating procoess)

- 프로세스 협력 메커니즘을 통해 하나의 프로세스가 다른 프로세스의 수행에 영향을 미칠 수 있음

 

프로세스 간 협력 메커니즘 (IPC : Interprocess Communication)

메시지를 전달하는 방법

- message passing : 커널을 통해 메시지 전달

주소 공간을 공유하는 방법

- shared memory : 서로 다른 프로세스간에도 일부 주소 공간을 공유하게 하는 shared memory 메커니즘이 있음

 

❗️thread : thread는 사실상 하나의 프로세스이므로 프로세스 간 협력으로 보기는 어렵지만  동일한 process를 구성하는 thread들 간에는 주소 공간을 공유하므로 협력이 가능

 

Message Passing 

Message system

- 프로세스 사이에 공유 변수(shared variable)를 일체 사용하지 않고 통신하는 시스템

 

Direct Communication

- 통신하려는 프로세스의 이름을 명시적으로 표시

ex ) Send(Q, message) ➡️ Receive(P, message)

 

Indirect Communication

- mailbox(or port)를 통해 메시지를 간접 전달

ex ) Send(M, message) ➡️ Receive(M, message)

 

프로세스는 그 특성에 따라 두가지로 나눈다

I/O bound process

- CPU를 잡고 계산하는 시간보다 I/O에 많은 시간이 필요한 job

- many short CPU bursts

 

CPU bound process

- 계산 위주의 job

- few very long CPU bursts

 

CPU Scheduler & Dispatcher

CPU Scheduler

- Ready 상태의 프로세스 중에서 이번에 CPU를 줄 프로세스를 고른다.

 

Dispatcher

- CPU의 제어권을 CPU scheduler에 의해 선택된 프로세스에게 넘긴다.

- 이 과정을 context switch라 한다

 

CPU 스케쥴이 필요한 경우는 프로세스에게 다음과 같은 상태 변화가 있는 경우

1. Running ➡️ Blocked

2. Running ➡️ Ready

3. Blocked ➡️ Ready

4. Terminate

 

1, 4번은 nonpreemptive (=강제로 빼았지 않고 자진 반납) 나머지는 preemptive(=강제로 빼았김)

 

 

 

 

 

 

 

 

 

 

 

 

 

참고 

http://www.kocw.net/home/search/kemView.do?kemId=1046323

 

 


 

느낀거

어렵다. 근데 js랑 연결되는 개념이 많은 것 같아서 연결해서 공부하려고 노력중이다.

js랑 연결해서 생각하니 흥미도 생기고 재미도 있는 것 같다.

 

 

의문점

의문 1 : ready queue, blocked queue이다. js에서의 event loop의 heap-> ready queue, 대기실->blocked queue인가?

2 : 로드밸런싱 개념

3 : https 통신을하면 TLS가 자동으로 설정되는 것인가? 아니면 TLS를 설정해야 https통신을 할 수 있는가 ?

 

운영진분들이 지난 거에 미련을 가지지말고 현재 주차에 최선을 다하라고 했지만, 학우들과 얘기를 하다보면 전 주차 내용들이 스물 스물 올라와서 궁금증이 많이 생긴다.

 

화이팅이다 ~!

 

열코~!!🔥🔥🔥🔥

 

 

반응형