[1] 프로세스의 이해
(1) 프로세스
1. 프로세스 정의
- 컴파일 된 프로그램이 기억장치에 적재 후에 실행 중인 명령어의 집합
- 메모리에 올려져서 컴퓨터에 실행중인 프로그램
- 프로세스 제어 블록 PCB를 가진 프로그램
※프로그램 성능 향상 하는 도구 : Redis, Scala
2. 프로세스 특징
- 프로세스는 각각 독립적인 자원으로 구분된다
- 자신만의 주소영역을 가지고 있다
- 서로 다른 프로세스는 공유가 안되므로 자원공유 기법으로 IPC 기법으로 통신한다
- 여러개의 프로세스는 서로 데이터 접근이 불가능하다
※ 바이너리
응용프로그램이 파일로 저장이 되었을때
컴퓨터 저장과 처리 목적을 위해 이진수 형식으로 인코딩 된 데이터 파일을 의미하는 것으로 코드의 컴파일 또는 압축된 결과물
3. 프로세스 구조
- 프로세스의 구조는 프로세스 스케쥴러 , 컨텍스트스위칭, IPC 기법이 통합된것이다
- Stack 공간 : 함수호출, 로컬 변수 같은 데이터 저장 영역 , 전역 변수를 위한 공간
- Heap 공간 : 동적으로 만들어지는 데이터 저장 영역 ; 객체 , 동적으로 할당된 메모리를 위한 공간
- Data 공간 : 변수 저장 영역 , 함수 실행을 위한 지역 변수를 위한 공간
- Text( code )공간 : 프로그램 코드 저장되는 공간
※ 추가정보
임베디드 시스템에서 동작하는 프로그램 중 디버깅시 PC와 SP 위치 주소에 따라 어디가 오류가 났는지 추적한다
파이썬에서 재귀함수 호출이 일정횟수 이상이면 에러가 난다 : 스택 공간이 고정되어 있기 떄문에
4. 프로세서의 상태 전이도
- 멀티 프로그래밍에 적용된다
Submit 제출 단계 | 작업이 제출되어 스풀 공간에 담겼다 |
hold 보류 단계 | 작업 스케쥴러에 의해 처리 스케쥴러가 들어가기 전 대기 상태 |
ready 준비 단계 | CPU가 할당 할수 있도록 준비된 상태 |
run 실행 단계 | CPU가 프로세스를 실행하고 있는 상태 |
block 블럭 단계 | 입출력 장치에서 케이스가 발생하여 CPU한테 양도하고 입출력 장치가 완료될때까지 대기 큐에서 대기하고 있음 |
exit 완료 단계 | CPU에서 할당받아 수행이 종료된 상태 |
5. 프로세스의 상태 전환
dispatch 할당 | 준비상태→ 실행상태 | 준비상태인 여러개의 프로세스 중에서 우선순위가 높은 프로세스를 선정하여 CPU에서 실행할수 있도록 할당한다 |
time out 할당시간초과 | 실행상태→ 준비상태 | CPU에서 할당시간이 종료된 프로세스를 다시 준비상태의 프로세스 단계로 이동함 |
block 블럭 | 실행상태→ 대기상태 | 프로세스가 입출력 장치의 명령이 오면 입출력 전용 프로세서에게 CPU를 양도하고 프로세스는 대기상태로 전환 |
wake up | 대기상태→ 준비상태 | 입출력 장치의 완료를 기다리다가 완료 신호가 오면 블럭 상태의 프로세스는 준비상태로 전환됨 |
6. 프로세스 제어 블록 PCB
- 정의
- 다음 프로세스 정보인 프로세스 ID, 레지스터(PC,SP)를 저장하는 하드웨어
- 운영체제가 프로세스의 주용한 정보를 저장해놓은 자료구조
- 작업 제어 블럭
- 프로세스를 관리하기 위해 유지되는 데이터 블럭 , 레코드의 데이터 구조
- 프로세스 생성시 만들어지고 주기억 장치에 유지된다
- PCB에 저장되는 데이터 정보
- 프로세스 이름 , 우선순위 ,현재상태
- 주기억 영역 ,프로그램 카운터 PC , 레지스터 영역
- 할당된 자원 정보 , 계정 정보
※리눅스에는 프로세스를 제어하는 명령은 RID를 기반으로 사용한다
7. 멀티 프로세스
-특징
- 프로세스는 다른 프로세스의 공간을 접근할수 없다
- 멀티 프로세스로 작성한다면 프로세스 간 통신인 IPC 기법이 필요하다
- 멀티 프로세스를 사용하는이유는 성능을 높이기 위해 여러 프로세스를 동시에 실행한다
- 프로세스간 상태확인 및 데이터 송수신이 필요하다
- 프로세스는 커널 공간을 공유할수 있다
- 프로세스는 기본적으로 다른 프로세스의 사용자 영역 공간을 직접 접근할수는 없다
- IPC 프로세스 통신 기법
커널공간을 공유하는 것을 사용해서 특별한 메모리 공간을 만들고 이를 사용해서 프로세스간 데이터를 공유할수 있다
IPC 기법의 종류 | |
파일 | 파일을 교체하여 공유 |
메세지 큐 Message Queue | FIFO 정책으로 데이터 전송 , 양방향 통신 지원 |
공유 메모리 shared memory | 커널공간에 고유가능한 메모리 공간을 만들고 변수처럼 사용한다 , key를 사용하여 여러프로세스가 접근할수 있다 |
파이프 Pipe | 단방향 통신 지원, fork() 시스템콜로 자식 프로세스를 만들었을때 부모 자신간에는 통신가능 |
시그널 함수 Siginal | 다른 프로세스에 어떤 이벤트가 발생되었는지 알려준다 |
세마포어 Semaphore | |
소켓 socket | 웹브라우저 사용자와 웹서버 제공자와의 네트워크 통신 기술 |
※ 멀티 프로세서
메모리와 I/O 장치를 공유하는 2개 이상의 CPU를 갖는 시스템이다
단일 공통 버스 시스템으로 연결된 멀티 프로세서는 주어진 시간에 하나의 프로세서만 데이터를 전송할수 있다
하이퍼큐브 상호연결은 멀티프로세서를 연결하는 방법 중 하나이다
Master-slave 모드에서 slave 프로세서는 인터럽트를 통해 OS 기능을 요청한다
모든 프로세서가 각자 운영체제를 가지고 운영되는 방식을 분리 운영체제라고 한다
운영체제의 기능을 여러 프로세스에 분산 시키는 방식을 분산 운영체제 라고 한다
※C언어는
파이프, 메세지 큐, shared 메모리 , IPC 함수, 메모리 직접 제어 기능을 이해하고 사용해야 하기 떄문에 개념만 알고 있는 것보다 직접 구현 해볼수 있게 배우는 것이 좋다
(2) 스레드 Thread
1. 스레드의 정의
- 프로세스 실행의 기본 단위
- 프로세스 내에서 실행되는 흐름의 단위
2. 스레드의 특징
- 기본적으로 하나의 프로세스 에서는 여러 개의 쓰레드를 생성할수 있다
- 하나의 프로세스 내에 있으므로 스레드 간에는 동일 프로세스의 데이터를 접근하여 자원 공유가 가능하다
- 스레드는 각각 스택 공간을 가진다
- 여러개의 스레드는 동시 실행이 가능하다
-주소영역을 공유한다
-별도로 통신기법이 필요없다
※최근 CPU가 멀티코어를 가지는건 스레드를 여러개 만들어서 성능을 높인다
3. 스레드의 목표
- 프로세스의 생성이나 컨텍스트스위칭(문맥교환)의 오버헤드 부담을 줄여 성능 향상
- 프로세스의 실행환경을 공유하여 기억장치의 낭비를 줄임
- 프로세스에서 다중 스레드를 생성하여 병행성 증진
- 사용자에 대한 응답성 향상, 성능 향상
카톡창에 고객센터 자동질문 글 같은 예시
스레드가 여러개이기 때문에 사용자 여러명이서 같은 질문글을 클릭하더라도 오류없이 실행된다
사용자에 대한 응답성을 향상시킬수 있다
-자원공유 효율
프로세스 안에 있으므로 프로세스 데이터 모두 접근이 가능하다
쓰레드간 커뮤니케이션시 IPC와 같은 자원공유 기법을 사용할 필요가 없다
4. 스레드 단점
-스레드 중 한개만 문제가 있어도 전체 프로세스에 문제가 생긴다
-스레드가 많으면 모든 스레드에 스케쥴링을 해야하므로 컨텍스트스위칭이 일어날 가능성이 높고 발생하면 성능이 저하된다
-컨텍스트 스위칭이 발생하면 비정상적으로 동작하여 동기화 이슈 문제가 발생하므로 동기화 코드를 적절히 추가하여 설계해야한다
-동일 자원을 여러 스레드가 동시에 수정하여 결과에 영향을 주는 동기화 이슈가 발생한다
- 동일 자원을 여러 스레드가 동시에 읽기만 하는것은 문제가 없다
- 스레드 사용건수가 늘어날수록 스레드의 동기화 이슈가 발생하며 결과값이 달라지는 비정상적인 동작이 일어난다
5. 단일 스레드와 다중 스레드 모델
- 단일 스레드 프로세스 모델
- 다중 스레드 프로세스 모델
※운영체제를 처음부터 프로세스 몇개 , 스레드 몇개로 설계할지 처음부터 준비한다
6. 멀티 스레드
-소프트 웨어 병행 작업처리를 위해 사용한다
※ 멀티 스레드 사용추세 증가
: 멀티 프로세스는 처음 구조를 잡을때 만들어야하지만 스레드는 프로그램잀부 동작에서만 사용하도록 일부코드 수정이 가능하여 더 많이 사용하는 추세이다
(3) 병행 프로세스
1. 병행 프로세스의 개요
- 정의 : 여러개의 프로세스가 동시에 수행중인 상태
- 병행 전제 조건
- 공유 자원의 배타적 사용
- 교착 상태 해결
- 프로세스 동기화
- 상호 배제 보장
2. 상호 배제 와 임계영역
- 상호배제 정의 mutualexclusion
여러개의 프로세스가 자원에 접근할때 문제가 발생하지 않도록 동시에 접근하지 못하도록 1개의 프로세스만 접근하도록 제어하는 것
- 크리티컬 임계 영역 critical section
2개이상의 프로세스들이 공유할수 없는 임계 자원(크리티컬 리소스)의 영역
한 스레드가 임계영역에 들어가면 다른 스레드는 못 들어가도록 락을 건다
ex) 티켓 예매
3. 프로세스 동기화
- 세마포어 semaphore
- p연산과 v연산을 이용하여 열쇠와 자물쇠 역할로 접근 프로세스를 제어한다
- 접근이 가능한 자원의 갯수를 P연산으로 설정 , v연산으로 대기중인 프로세스 실행하는 신호를 만든다
- 크리티컬섹션에 여러 스레드가 들어갈수 있게 카운터를 두어서 동시에 리소스에 접근 할수 있는 허용 가능한 스레드 수를 제어한다
- lock = threading Semaphore(2)
- lock.acquirel()
- lock.release()
- 뮤텍스 mutual exclusion = binary semaphore
- 락킹기법을 사용한다
- 임계구역에 하나의 스레드만 들어갈수 있다
- 프로세스가 임계영역에 들어가있는 동안 대기중인 프로세스를 busy waiting을 반복해서 호출하여 대기시켜야한다
- busy waiting을 하기 위해 acquire함수를 반복해서 호출해야하기때문에 CPU 사이클이 낭비된다
- threading.Lock()
- lock.acquire()
- lock.release()
- 모니터
- 한순간에 1개의 프로세스만 모니터 안에서 활동하도록 보장한다
- 모니터 내부에서 상호배제가 보장되는 연산자 집합을 포함하는 ADT이다
- 모니터 내에 정의된 함수만이 오직 모니터 내에 지역적으로 선언된 변수와 매개변수만 접근할수 있다
※ 상호배제 해결 알고리즘
- 2개 이상 프로세스가 있을때 : decker 알고리즘 , peterson 알고리즘
- 3개 이상 프로세스가 있을때 : dijkstra 알고리즘 , bakery 알고리즘
※ 각 언어, 프레임 워크 마다 스레드, 락킹 같은 기법을 알고 있어야 현업에 적용
비정상적인 문제가 발생했을때 동기화 문제인것을 파악하고 해결할수 있다
※파이썬의경우
스레드가 1개씩만 접근할수 있게 만들어져있다
파이썬은 자체 스레드 함수가 없어서 스레드 라이브러리로 사용할수 있다
4. 컨텍스트 스위칭 (문맥교환)
- 정의 : 운영체제의 커널이 관할하며 , CPU에 실행중이던 프로세스 또는 스레드가 실행할 다른 프로세스 또는 스레드로 교체되는 것
- 목적 : 1개의 CPU나 코어에서 여러 프로세스 또는 스레드를 동시에 실행시키기 위해서 사용한다
- 특징 : PC와 SP만 바꿔주면 프로세스 저장상태를 기반으로 실행가능
- 발생 상황
- 멀티태스킹 시스템에서 프로세스 또는 스레드가 주어진 time slice를 다 사용했을때 발생한다
- IO 작업을 필요로 하여 더이상 CPU를 점유할 필요가 없을때
- 다른 프로세스 또는 스레드가 사용하고 있는 리소스를 기다려야할때
- 인터럽트가 발생할때
- 동작 단계
- 전제 : 스케쥴러가 A 프로세스의 실행을 중단하고 B 프로세스를 실행할것을 요청함
- 1단계 : A프로세스의 현재 CPU의 PC와 SP 레지스터 값을 업데이트해서 메인 메모리 PCB에 저장한다
- 2단계 : A프로세스는 ready 또는 block 상태로 바뀌고
- 3단계 : B프로세스의 CPU의 PC와 SP 레지스터 값을 CPU의 레지스터에 넣는다
- 4단계 : B 프로세스의 상태는 ready에서 running으로 바뀌고(디스패치) CPU에서 B프로세스를 실행한다
- 5단계 : B프로세스 실행 중단하고 A프로세스를 재진행한다면 저장된 PCB에서 프로세스 A의 SP와 PC의 주소를 바꿔주면 메인 메모리에서 이전 실행한 프로세스 위치에서 시작할수 있다
※JAVA GC : 자바 가비지 컬렉션 (프로세스 칩 하드웨어 부품 )
불필요한 객체가 차지하는 힙공간을 삭제하여 힙공간 확보가 필요하기 때문
힙공간 부족하면 객체 생성이 불가하고 객체지향 프로그램은 동작하지 않는다
객체를 여러번 생성하면 어디다 저장할것인가 , 저장 후 공간을 가득차면 객체를 삭제해야하는 동작
[2] 프로세스 스케쥴링
(1) 스케쥴링의 이해
1. 정의
- 프로세스 관리를 위해 우선순위를 결정하는 것
- 프로세스가 생성되어 실행될때 시스템의 자원을 해당 프로세스에게 할당한다
-프로세스 실행을 관리를 하는 알고리즘
2. 목적
- 운영체제 성능 향상 목적
- 우선순위가 높은 작업을 먼저 수행하고 , 우선 순위가 낮은 작업은 기아 현상을 방지하여
- CPU의 낭비시간을 줄이기 위한 시스템 처리량 향상과 응답 시간 단축이 목적이다
-지금의 운영체제는 각종 스케쥴러 알고리즘이 혼합되어 만들어진 결과물이다
- 시분할시스템의 경우 : 프로세스 응답시간을 짧게 설계한다
- 멀티 프로그래밍의 경우 : CPU 활용도를 최대한 높혀서 프로세스를 빨리 실행하도록 설계한다.
※ 추가정보
마우스/ 키보드 반응이 느려지거나 잠깐식 멈추는 경우 : 스케쥴러의 문제
리눅스 스케쥴러 : O(1)
최근 추세 : 성능 우선 , 대용량 서비스( 사용자가 많은 네트워크)
프로그램이 IO - bound (IO 관련 기능) , CPU -bound (CPU 메모리 기능) 이냐에 따라 구분하여 성능이 상승한다
3. 스케쥴링 성능 기준
- 공정성
-처리율 증가
-CPU 이용률 증가
-우선순위 제도
-오버헤드 최소화
-응답시간 최소화
-반환시간 최소화
-대기시간 최소화
-균형 있는 자원의 사용
-무한 연기 회피
(2) 스케쥴링 분류 및 특징
1. 기간에 따른 분류
- 장기 스케쥴링
- 중기 스케쥴링
- 단기 스케쥴링
2. 방법에 따른 분류
- 비선점형 스케쥴링 : 프로세스가 프로세서 CPU 에게 할당받으면 프로세스가 완료될때까지 프로세서를 사용한다
- 선점형 스케쥴링 : 우선순위가 높은 다른 프로세스가 이미 할당된 프로세서 CPU 를 강제로 빼앗아 프로세서를 사용한다
(3) 비선점형 스케쥴링 기법의 종류
1. FCFS 기법
- 대기 리스트에 먼저 도착한 순서대로 프로세스가 CPU를 할당받는 기법
- 순서대로 처리되기 때문에 공평성은 유지된다
- 짧은 작업 프로세스와 긴 작업 프로세스의 융통성이 없어 중요한 작업이여도 대기하게 된다
- 큐의 자료구조를 사용한다
2. SJF 기법
- FCFS기법을 개선함
- 최단 작업 우선 스케쥴러
- 대기 리스트에 짧은 작업 프로세스가 우선으로 CPU에 할당받는 기법
- 긴 작업 프로세스는 우선순위가 밀려서 대기시간이 길다
- 큐/ 힙 자료구조 O(nlogN) 사용한다
3.HRN 기법
- SJF 기법을 개선함
- 대기시간이 길어지면 우선순위를 높여 우선순위가 밀려 무한 대기상태인 프로세스가 없도록 하는 aging 기법
- 우선순위 계산 방법 = (대기시간 +서비스 받을시간) / 서비스 받을 시간
4. 기한부 기법
- 실행시간을 정해 두고 그 안에 프로세스를 완료하는 기법
- 실시간 운영체제에서 사용한다
- 프로세스에게 할당할 시간을 추정하여 실행시간을 정해 그 프로세스가 완료될수 있도록 해야한다
5. FIFO 스케쥴러
- 프로세스가 저장매체를 읽는다. 프린팅을 한다던지 , CPU를 처음부터 끝까지 사용할때
- 배치처리 시스템에 사용된다
6. 우선순위 기반 스케쥴러 Priority Based
- 우선 순위가 높은 프로세스를 먼저 실행한다
- 정적 우선순위 : 프로세스마다 우선순위 미리 지정한다
- 동적 우선순위 : 스케쥴러 상황에 따라 우선순위를 동적으로 변경한다
- 프로세스의 우선순위가 바뀔수 있다
(4) 선점형 스케쥴링 기법의 종류
1. RR 라운드 로빈 스케쥴링
- FCFS를 변형함
- 시분할 시스템에 적용된다
- A, B, C 라는 프로세스가 순서대로 실행이 요청되면 실행 순서는 A, B, C, A, B, C 와 같은 형태로 동일한 실행순서를 가지는 것이 일반적이다
- 대기 큐를 사용하면서 각 프로세스에 타임 슬라이스를 할당한다. 할당된 시간이 초과되면 대기 큐의 끝으로 이동하여 다시 반복 동작한다
2. SRT 스케쥴링
- SJT를 변형함
- 프로세스 실행중 짧은 작업 프로세스가 생기면 우선순위가 변경됨
- 실시간으로 우선순위를 선정할수 있는 추가시간이 필요하다. 이 추가시간이 많아진다면 변형 전 SJT 기법이 나을수 있다
3. MQ 다단계 큐 스케쥴링
- 여러 종류의 큐를 준비하여 작업 유형별로 프로세스를 분류하여 라운드 로빈 스케쥴링 방식으로 운영한다
- 우선순위에 따라 시스템, 대화형, 대화형 편집 , 일괄처리, 사용자 프로세스 작업 유형별로 분류하여 큐를 단계별로 배치한다
- 각각의 큐에 이동할수 없다
4. MFQ 다단계 피드백 큐 스케쥴링
- 우선순위를 가질수 있는 여러 종류의 큐를 준비하여 긴 작업 프로세스를 낮은 우선순위를 가지도록 수정하여 낮은 우선순위큐에 배치시킨다
- MQ 다단계 큐 스케쥴링이랑 다른점은 각각의 큐사이를 이동할수 있다
[3] 교착상태 = 데드락
(1) 교착상태 = 데드락 이해
프로세스1이 A자원을 점유중 , 프로세스 2가 B 자원을 점유중인데
프로세스1이 B 자원을 점유하고 싶어 대기중 , 프로세스 2가 A자원을 점유하고 싶어 대기중
각각 다른 자원으로 이동하려면 한쪽의 프로세스에서 점유를 풀어야하는데 풀지 못하고 무한 대기중인상태
두개 이상의 작업이 서로 상대방의 작업이 끝나기만을 기다리고 있는 무한 대기상태로 , 다음 단계로 진행이 되지 않는다
여러 프로세스가 동일 자원의 점유를 요청할때 발생
(2) 교착상태 발생되는 조건 (모두 충족해야함)
1. 상호배제
- 한번에 하나의 프로세스만 자원을 사용할수 있음
2. 점유와 대기
- 하나의 프로세스를 점유한 상태에서 다른 프로세를 점유하기위해 대기
3. 비선점
- 하나의 프로세스를 점유한 상태에서 종료될때까지 소유권을 놓치 않음
4. 환형 대기
- 여러 프로세스가 공유 자원을 사용하기 위해 원형으로 대기상태에 빠짐
(3) 교착 상태 해결 방법
1. 교착 상태의 예방
- 조건의 4가지 중 1가지라도 충족되지 않도록 배제한다
-락킹코드를 잘 작성하여 발생하지 않게 하는것
-락킹 코드 위치를 바꿔주거나 크리티컬 리소스를 분리하거나 , 코드를 재작성 해서 해결한다
2. 교착 상태의 회피
- 조건을 배제하지는 않지만 교착 상태 발생시 해결할수 있는 회피 방법을 심어놓는다
- 은행원 알고리즘 : 실시간으로 자원 할당
3. 교착 상태의 발견
- 교착 상태에 있는 프로세스와 자원이 있는지 탐지한다
- 교착상태 발견 알고리즘 , 자원할당 그래프 알고리즘 사용
4. 교착 상태의 회복
- 교착 상태 중인 프로세스를 제거하거나 할당된 자원을 우선순위로 선점하여 해결한다
(4) 기아상태 = 스타베이션
1. 정의
특정 프로세의 우선 순위가 낮아서 원하는 자원을 계속 할당받지 못한 상태이다
여러 프로세스가 부족한 자원을 점유하기 위해 경쟁할때 발생한다
특정 프로세스는 영원히 자원할당이 안되는 경우 발생한다
2. 해결방법
우선순위를 수시로 변경해서 높은 우선 순위를 가질 기회를 준다
오래 기다린 프로세스 순서로 우선순위 바꾸기
우선 순위 아닌 요청 순서대로 처리하는 FIFO 기반 요청으로 큐를 사용한다
참조 : https://blog.naver.com/ding-dong/222619603211
'🌈 CS 컴퓨터공학 > 운영체제' 카테고리의 다른 글
CS_운영체제_리눅스와 파일 시스템 (0) | 2023.04.19 |
---|---|
CS_운영체제_가상머신 (0) | 2023.04.19 |
CS_운영체제_파일 시스템 (2) | 2023.03.19 |
CS_운영체제_기억 장치 관리 (0) | 2023.03.19 |
OS_운영체제_운영체제의 개요 (0) | 2023.03.19 |