본문 바로가기
👨‍💻Computer Science/운영체제[OS]

[운영체제] 3장 Process Concept

by 코푸는 개발자 2021. 6. 29.
728x90

프로세스 일상 : 일을 처리하는 과정/경로, 공장 조립과정, 요리 과정 등등

운영체제 : 컴퓨터에서 프로그램을 실행시키기 위해 연속적인 작업(효율적

관리가 중요), 스케줄링의 대상이 되는 작업

 

Process Concept

프로그램 하드웨어에 있는 파일

프로세스 프로그램 구동 시 만들어지는 인스턴스, 운영체제에서 관리하는 프로그램의 흐름으로 가장 기초가 되는 단위

프로세스의 첫 번째 이 프로세스가 어떤 것을 하는지?

프로세스 명명(ID를 사용 = PID)

 

 

Process Address Space

Process Address space 프로세스가 실행이 되기 위해 메모리공간에 저장이 되어야하는데 이때 저장이 되는 공간

stack(dynamic allocated memory) 함수 호출시 지역변수와 매개변수 저장(실행이 완료되면 메모리 제거)

heap(dynamic allocated memory) 필요에 따라 동적으로 메모리를 할당할 때 사용(동적 메모리할당-프로그램이 실행되는 동안 메모리의 크기를 정함, 효율적, 얼마만큼 메모리공간이 사용될지 모를 때)

data segment(프로그램 고유 설정 값) 정적(static) 데이터저장(한번 저장되면 변화x), 전역변수 -> 프로그램이 완전히 종료가 되어야 없어짐

code segment(맨 아래) 기계어가 들어가 있음

 

Process State

프로세스 상태(5가지)

new 프로세스가 처음 생성되는 상태

running 프로세스 실행되는 상태

waiting 프로세스 실행되다가 멈춰있는 상태(CPUI/O Interrupts작업 시 현재 작업 중인 프로세스를 잠시 멈춰둬야 할 때)

ready 프로세스가 실행이 가능한 상태(프로세스가 이제 막 생성되었을 때 CPU에 올라가 준비가 되었을 때, Interrupts 작업이 끝났을 때)

terminated 프로세스의 실행이 종료되었을 때

dispatch CPU가 실행가능의 상태가 되어 실행준비가 된 프로세스 ready상태에서 프로세스 running상태로 상태를 전이 시키는 것

프로세스 생성(new -> ready) 메인메모리로 넘어가 준비 완료

I/O디바이스의 이벤트 발생 -> waiting 상태로 이동 -> I/O이벤트가 완료되면 ready상태가 됨

running -> ready(Interrupt, Timer interrupt의 영향으로 조절하는 것)

running -> terminated(프로세스 종료/완료)

 

(리눅스 예시)

ps입력 시 현재 프로세스 진행을 보여줌

제일 왼쪽의 숫자들은 PID를 의미함

윈도우에서는 작업관리자 -> 탭 누르면 현재 실행 중인 프로세스이름, 실행자, 얼마만큼 할당이 되어 진행 중인지를 보여줌

 

Process Control Block (PCB)

Process Control Block(PCB) - 프로세스를 자주 반복적으로 사용하기 위해서 프로세스 정보 저장이 필요(이러한 프로세스를 블록단위로 저장함, 현재 사용하지 않는 프로세스를 저장함)

프로세스 스케줄링을 위해서 운영체제가 가지고 있는 데이터베이스

  • Information associated with each process
  • Process state – 프로세스 상태
  • Program counter – 현재 프로세스 다음에 수행할 프로세스의 명령어 주소를 저장
  • CPU registers – CPU상태와 명령어 저장
  • CPU scheduling information – 어떤 명령부터 실행할지에 대한 정보
  • Memory-management information – 해당 프로세스의 주소 공간이나 메모리관리 정보를 저장하고 있음
  • Accounting information
  • I/O status information

 

(PCB구조 그림)

 

PCBs and Hardware State

프로세스 정보 CPU레지스터에 저장됨

PCB

When a process is running:

  • its hardware state is inside the CPU: PC, SP, registers
  • When the OS stops running a process:
  • it saves the registers’ values in the PCB
  • When the OS puts the process in the running state:
  • it loads the hardware registers from the values in that process’ PCB

 

CPU Switch From Process to Process

CPU Switch

CPU 1개에 프로세스 2개 실행(교차) 과정 그림(CPU Switch = Context Switch)

같은 뜻이 단어가 많은 이유 = 여러 회사들이 독자적으로 만들기 때문

이러한 Context Switch를 실행하지 않는다면 한 프로세스가 쭉 실행이 되고 그다음 프로세스가 연달아 쭉 실행됨.

 

Context Switch

지속적 프로세스 스위치 사용 -> 오버헤드가 발생(오버헤드가 큼)

but 사용이유 : 프로세스를 작은 단위로 사용해야 동시에 사용하는 Time-sharing의 장점이 더 크기에 사용하게 됨.(여러 사람들이 컴퓨터를 동시에 사용할 때 응답시간이 낮아져서 동시에 사용하는 Time-sharing의 장점이 생김)

 

Context Switch 횟수가 얼마나 일어나는지 예시를 보여줌(한 달 동안, 1초 동안 얼마만큼 time switch가 발생하나?)

 

PCBs and Queues

PCBQueue(FIFO)에 저장됨 -> 프로세스가 실행 중일 때는 큐에 저장이 불가능(ready, I/O디바이스 상태에 따라서 대기하는 상태일 때 이전의 프로세스 상태를 저장 Queue)

 

Process Scheduling Queues

PCB저장하는 큐의 종류가 많음

  • Job queue – 모든 프로세스 저장(Job = process)
  • ready queue - 자원할당을 받기 위해 대기하는 큐
  • Device queue – 각 I/O디바이스에서 작업을 처리하는 동안 wait 상태로 대기하는 큐

다양한 큐 사이에서 프로세스들이 상태에 따라 이동을 함

 

Queue 동작 예시

 

 

-ready 큐에서 CPU자원을 할당 받으면 프로세스가 실행이 됨

-I/O요청을 받으면 I/O queue에 들어감

-자식프로세스 수행

-Interrupt 수행 -> 다시 ready queue로 들어감

 

Schedulers

ready상태 저장 ready Queue에 저장인데 이 ready queue에서 다음 수행할 프로세스를 선택하는 것 -> Scheduling 다음에 무엇을 할지를 정해둔 것

Scheduler 운영체제(Scheduling하는 주체)

  • Long-term scheduler – 긴 주기(여러 프로세스 중 어떤 것을 메모리(CPU)에 올려놓을지 선택하는 것, 현재 운영체제에서는 존재x) -> 가상 메모리 관리가 생기면서 필요가 없어짐
  • Short-term scheduler – 짧은 주기(현재 프로세스를 ready상태의 프로세스를 CPU에 올려놓고 running 상태로 만들 프로세스를 선택하는 방법, 지금까지 말해온 스케줄러, CPU-Scheduler)

예전에는 버추얼 메모리라는 개념이 없었음

버추얼 메모리 매니지먼트 순간순간 필요한 프로세스만 메모리에 올려서 실행하는 방법(따라서 물리적 메모리양이 작아도 작동가능)

Medium-term Scheduler도 있음(숏텀과 롱텀 중간, but 요즘엔 없음)

 

Medium-term Scheduling 설명 그림

롱텀에서 CPU의 성능이 좋지 않아 여러 개를 돌리는게 벅찰 때 몇 개 정도 내려서 나머지 것들이 빠르게 돌아가게 함

CPU에서 동적 스케줄링을 통해 어느 하나의 프로세스를 메모리에서 내보내는 방법(일부만 실행시킴) 미드텀과 롱텀은 현재는 잘 사용x

 

각각의 Scheduler 특성 설명
  • Short-term scheduler is invoked very frequently (milliseconds) 자주 ⇒ (must be fast)
  • Long-term scheduler is invoked very infrequently (seconds, minutes) ⇒ (may be slow)
  • The long-term scheduler controls the degree of multiprogramming
  • Processes can be described as either: ->스케줄러의 일종(5장에서 다시 다룸)
  • I/O-bound process
  • spends more time doing I/O than computations, many short CPU bursts
  • CPU-bound process
  • spends more time doing computations; few very long CPU bursts

프로세스 하나의 작업 단위

PCB 프로세스 정보를 저장하고 있는 데이터 블록

PCB가 저장하고 있는 것 Pointer(다음 프로세스 블록의 주소가 저장되어 있음, 어디를 가리킴), Process state, Process number, program counter etc.

 

프로세스 생성, 종료, 통신에 대해서는 과정을 알고 있어야 성능이 좋고 오버헤드가 적은 프로그래밍 만들기가 가능하다

-프로세스 생성 프로세스를 만드는 것

 

프로그램 생성

프로세스를 만드는 것 애플리케이션에서는 프로세스를 만들려면 시스템 콜 함수를 호출함

fork 프로세스를 새로 만들어달라는 시스템 콜 함수

exec 프로세스 실행

 

유닉스 프로세스 생성 구조 -> 상하구조를 가짐(트리구조, 부모자식 관계) / 윈도우는 다름->모든 프로세스가 부모자식 관계를 가지고 있지는 않음

fork라는 이름이 왜 붙었을까?

 

fork라는 시스템 콜이 작동하는 과정을 보여줌

fork 프로세스를 하나 더 새로 생성함

보충설명

유닉스 역시 프로세스를 생성, 실행을 시키는 시스템 콜 함수들이 존재

fork 프로세스 생성

exec 생성된 프로세스를 실행

wait 프로세스 상태에서 배운 wait과는 다른 동작을 함.

유닉스에서는 부모프로세스와 자식프로세스가 존재 -> 어떠한 프로세스(CPU) 사용권 을 박탈시킴

프로세스 생성과정 유닉스 fork함수는 부모프로세스에서 자식프로세스를 복사하는 개념임

따라서 fork함수 사용 시 트리형태로 계속해서 프로세스가 커져감.

fork함수를 사용하여 자식프로세스를 생성하면 리턴이 두 번 일어나게 된다.(한번은 자식프로세스에게 0값을 리턴하는 것이고 나머지 한 개는 부모프로세스에게 자신의 아이디 값을 리턴 하는 것->따라서 프로세스에서 자식과 부모를 구분하기 위해서는 자식에서는 PID값이 0으로 리턴 되고 부모에서는 PID값이 더 높게 부여됨)

일반적으로 부모프로세스는 자식프로세스가 수행이 완료될 때까지 대기하는 형태를 가짐

-> 그림을 보면 부모프로세스에서 fork를 통해 자식프로세스를 생성하고 곧바로 자식프로세스는 실행이 된다. 이때 PID값을 0으로 리턴 받는다. 이후 자식이 끝난 뒤 부모프로세스가 수행된다. 부모프로세스는 자식프로세스가 진행될 때 CPU의 사용권을 박탈하고 자식프로세스를 실행해 준다. -> 부모프로세스의 PID리턴 값을 받는 것을 wait시켜 주고 자식프로세스를 exec함수를 통해 실행시켜주고 자식프로세스가 끝난 뒤에 부모프로세스로 복귀를 하는 모습을 보여줌.

 

cpu가 수행하는 순서에 대해서는 둘 중 하나가 먼저 나오게 됨

반드시 child가 먼저 수행이 되고 부모가 수행되는 구조가 아닌 때에 따라 다름

이유 : CPU가 스케줄링 하면서 프로세스를 정하게 되는데 때문에 때에 따라 달라짐

 

ex) 카카오 톡 채팅 여는 방법

서버프로그램에서 많이 사용

fork 웹서버나 서버프로그램에서 많이 사용됨

 

유닉스 쉘도 fork를 통해서 만들어짐

 

fork 정의 및 내용

fork라는 함수가 어떻게 동작하는지 순서에 대해서 보여줌

-fork를 하게 되면 새로운 PCB를 생성해주고 초기화한다.

-프로세스를 메모리에 올리기 위해서 새로운 주소 공간을 할당을 해줌(초기화도 해줌)

-부모의 주소를 새롭게 할당된 메모리공간에 모두 복사해서 넣어줌

-부모프로세스에서 사용한 커널리소스들을 자식프로세스에서 사용할 수 있도록 포인트를 해줌

-PCBready queue에 올려놓음.

-fork함수를 통해서 리턴되는 값(0이냐 아님 다른 값이냐)에 따라서 프로세스가 동작함

 

exec - 실행함수

실행함수를 실행하기 전에 현재 수행되고 있는 다른 프로세스가 있는지 없는지를 우선 확인

->있다면 현재 프로세스를 멈추고 받아온 프로그램의 address space를 매개변수로 받고

address space에서 프로그램을 로드를 시켜줌 -> 프로그램이 실행이 될 수 있게 사용하는 하드웨어 같은 것들을 초기화 시켜줌 -> PCBready queue에 업로드를 시켜놓음

따라서 exec함수는 새로운 프로세스를 만드는 것이 아닌 기존의 프로세스를 ready queue에 올려놓는 방식을 말하는 것임

질문 실행을 하려면 CPU에 올려서 하는 것이 아닌가? ready queue에만 올려 놓는가?...

>CPU에 무엇을 올려놓고 수행을 할지는 사실상 CPU 스케줄링에 의해서 결정이 되기 때문에 exec함수는 ready queue에 올려놓는 것까지만이 exec함수의 목표이다.

이후에 CPU자원이 남으면 실행이 되는 방식임 -> exec함수의 리턴 값은 ready queue에 잘 올라가있는지를 리턴해줌.

 

CreateProcess

윈도우에서 프로세스 생성방법

윈도우에서는 fork 말고 CreateProcess를 사용

윈도우의 프로세스방법은 부모프로세스에서 자식프로세스를 만드는 메커니즘은 동일하나 부모프로세스의 주소를 복사하는 과정은 없고 프로세스를 생성을 할 때 주소공간에 대해서 지정을 해주어야 하는 차이가 있음

 

exit - 정상적 종료, 주로 사용

abort - 비정상적 종료

 

Cooperating Processes

Cooperating Processes 프로세스 간의 통신에 대해 설명을 함

사용이유

게임을 예로들 때 각 캐릭터들의 프로세스와 전체 맵에 대한 프로세스가 서로 데이터 공유를 하기 위함

- 정보의 공유

각 작업들을 세부작업들로 나누어서 동시에 수행해서 빨리 끝내기

프로세스의 모듈화(여러 프로세스 협력)

사용자의 멀티테스킹이 좋아짐

독립 프로세스(Independent Process) 다른 프로세스 실행에 영향을 주고받지 못함

IPC(inter-Process Communication) 프로세스 간에 통신과 동작의 매커니즘 제공(메시지 전달 방법, 메모리 공유 방법)

 

메시지 패싱 - 프로세스간 정보 전달이 안되므로 커널(운영체제)을 이용

-장점 : 동기화를 커널이 자동으로 해줌

-단점 : 전달할 데이터양이 크면 오버헤드가 많이 발생

메모리 공유 공유 가능한 메모리에 전달할 정보 넣어 전달

장단점 패싱과 반대 커널의 도움 없이 정보 전달

동기화를 프로그래밍하면서 직접(코딩) 해줘야함(애플리케이션)

 

Producer 데이터 생성 담당

Consumer Producer에서 생성된 데이터를 소비하는 프로세스

위와 같은 두 개의 구조를 합쳐서 버퍼라고 함

인터프로세서 커뮤니케이션 프로듀서와 컨슈머 간의 데이터 통신이 이루어지는 것

바운디드 버퍼(유한버퍼) - Shared memory를 생성해서 옮기게 됨

 

(바운디드 버퍼 구현->메모리 공유 기법) -> 버퍼가 Shared memory가 됨

 

프로듀서 프로세스 구현

큐가 꽉 차지 않으면 지속적으로 데이터를 넣어주고 꽉 차있으면 대기를 함

 

컨슈머 프로세스 구현

어떤 것이 더 효율적인가를 생각하면서 프로그래밍 구현을 해야 함

 

IPC 자세히 설명(send, receive 함수를 통해서 데이터를 주고받음)

 

Direct Communication 수신지(수신할 프로세스) 지정해서 보내기

 

indirect Communication 수신지를 정해두지 않고 특정 메일박스에 넣어두고 찾아가라는 신호를 보내면 다른 프로세스가 받아서 메일박스에서 데이터를 확인하고 가져감

 

Synchronization

Synchronization 데이터를 주고받을 때 데이터를 맞춰서 가져가는 것

= Blocking - 데이터가 오는 것을 보고 막는 것(기본설정)

 

Buffering

Buffer 임시 저장 공간

Buffering 해결방법

-Zero capacity(더 이상 버퍼에 저장x)

-Bounded capacity(특정 저장할 범위를 정하는 것) => 운영체제

-Unbounded capacity

 

클라이언트 서버 커뮤니케이션(Client-Server Communication)

소켓(Socket) 데이터를 주고받는 어떤 네트워크 인터페이스

원격 프로시저 호출(Remote Procedure Call) 어떤 기기에서 수행되는 프로그램에 대해서 다른 기기에 있는 프로그램을 통신하는 것(받는 쪽에서 원격 호출로 받아감)

Remote Method Invocation - 두 프로그램 사이에 직접 자료 교환가능(프로시져 -> 함수), 자바가 지원 -> 분산 객체들 간의 메서드 호출(자바 버추얼 머신을 이용)

 

Sockets

소켓 -> 연결할 때 IP주소, Host주소 간에 교환(Port 번호 사용)

 

web serverhost간의 포트번호로 교환

 

원격통신이 이루어지는가?

 

이러한 클라이언트, 리모트 오브젝트 사이에서 파라미터를 잘 넣고 보내고 리턴을 받아야 한다를 보여줌.

 

3장 복습

프로세스라는 것은 프로그램의 실행단위로 스케줄링에 기본이 된다.

프로세스의 상태로는 새로 생성됨(new), 실행중일 때(running), I/O디바이스에 interrupts나 이벤트가 발생했을 때 프로세스를 대기시킴(waiting), ready queue에 올라가져있는 상태(ready), 모든 작업을 완료 후 종료시킴(terminated)

PCB 프로세스의 정보를 저장하고 있는 저장 공간

Context switch CPU에서 지속적으로 프로세스를 바꿔가면서 수행을 함

 

Process scheduling

>Long-term 실행할 프로세스를 많을 경우에 어떠한 것을 메인메모리에 올려야하는지를 결정

>Short-term 메인메모리에 올라와져 있는 프로세스 가운데 어떠한 프로세스를 CPU에 올려서 실행할 지를 결정(=CPU scheduling)

>Midium-term 프로세스 수가 너무 많은 경우 메인메모리에 공간이 없게 되는 문제가 발생하는데 일부 프로세스의 이미지를 스왑디바이스(HD)공간으로 보내놨다가 프로세스 수가 줄어들게 되면 다시 메모리로 불러드리는 스왑핑 기술을 사용하여 프로세스를 스케줄링하는 기법

 

프로세스의 생성, 실행, 종료

프로세스 사이에서 데이터를 직접적으로 주고받을 수 없기 때문에 프로세스 끼리 데이터를 주고 받기위해서는 Inter-Process Communication(IPC) 기술을 활용을 해야함

IPC - 기본적으로 프로세스가 다수일 때 데이터를 통신하는 방법(Producer-데이터를 제공, Consumer-데이터 소비)

IPC활용의 2가지 방식

>Message passing-운영체제에 전달할 데이터를 넘겨주고 운영체제가 주도적으로 데이터를 동기화시켜주어서 프로세스 간에 메시지로 데이터를 교환하는 방식->운영체제가 주도적으로 데이터를 통신해주기 때문에 데이터간의 충돌이 불가능하고 구현난이도가 낮다. but 메시지 전달마다 시스템 콜이 계속해서 발생하기 때문에 오베헤드가 발생하기 때문에 속도가 많이 느려짐

>Shared memory-메모리에서 프로세스 간 데이터를 주고받을 수 있도록 공유메모리를 만들어서 프로세스가 직접 데이터를 공유메모리에 넣고 가져가는 방식->프로그래머가 데이터의 동기화를 직접해야하기 때문에 데이터의 충돌 발생가능성이 높지만 공유메모리 구축 시에만 시스템 콜을 사용하기 때문에 오버헤드가 낮고 통신 속도가 빠름

Direct communication 수신할 프로세스를 직접 지정을 해서 데이터를 보내는 것

Indirect communication 수신할 프로세스를 지정하지 않고 수신할 메일박스를 지정해서 보내는 것

 

728x90

댓글