멀티프로세스란?
-> 프로세스/쓰레드 관리를 위한 운영체제 설계의 중심!!
1) 멀티프로그래밍 : 다수의 프로세스가 메모리 상에 올라와서 CPU를 번갈아가며 사용 및 실행한다.
2) 멀티프로세싱 : 여러 개의 CPU 실행
3) 분산프로세싱 : 서로 다른 머신에서 연산을 수행
Serial processing
-> 하나의 프로세스가 싲가되면, 독점적으로 모든 컴퓨터의 자원(CPU, 메모리, I/O장치)을 사용하는 것. 사용이 다 끝나야만 다음 프로세스 실행이 가능하다.
Concurrent processing(병행처리)
-> 여러개의 프로세스를 동시에 실행한다. *인터리빙 방식과 오버래핑 방식으로 나뉜다.
1) Interleaving(인터리빙) 방식
-> CPU가 1개일 때, 여러 작업이 CPU를 번갈아가면서 사용한다.
2) OverLapping(오버래핑) 방식 / Parallel processing 병렬처리
-> CPU가 여러개일때, 여러 작업이 다 다른 CPU를 사용한다.
cpu1-------------------------
cpu2 -------------------------
cpu3 -------------------------
경쟁상태(Race condition)
다중 프로세스/쓰레드가 데이터를 사용하거나 갱신할 때 발생 -> 데이터 일관성이 진다.
*인터리빙 방식과 오버래핑 방식 모두 겅쟁 상태가 발생할 수 있다.
임계영역(Critical section) / 공유자원 있는 부분
공유자원을 접근하는 코드
병행처리를 하면 발생하는 문제점
1) 전역 자원(공유 자원)을 공유하기가 어렵다. -> 자원 공유시에 문제 발생
2) 운영체제가 자원을 최적으로 할당하기 어렵다.
3) 프로그래밍 오류를 찾아내기 어렵다. 이곳저곳에서 막 사용하므로 복잡해짐.
=> 프로세스들이 경쟁하면 다음의 3가지 제어 문제가 발생한다.
1) 상호 배제(mutual exclusion)
2) 교착 상태(deadlock)
3) 기아(starvation)
1) 상호 배제(mutual exclusion) :
- 하나의 프로세스 만이 임계영역에 진입할 수 있다.
- 임계 영역에 접근하고자 하는 프로세스의 수행은 무한이 미뤄져서는 안된다. -> 교착 상태 및 기아 발생XXX
- 임계 영역이 비어있을 때, 임계 영역에 진입하려고 하는 프로세스가 지연되어서는 안된다.
- 프로세스는 유한 시간 동안만 임계 영역에 존재할 수 있다.
상호배제 해결방법 / 문제 : 어느 한 순간에는 오직 하나의 프로세스만이 임계영역에 진입한다.
entercritical(), exitcritical() 사용
1) entercritical() 을 사용하여 임계영역에 접근한다.
2) /* 임계영역 */ 부분에서 데이터에 접근한다.
3) 빠져나온 후에는 exitcritical()을 사용한다.
소프트웨어적 접근 방법이다. 수행 부하가 높고, 논리적 오류의 위험성이 크기 때문에 사용을 잘 안한다.
하드웨어 적으로 봤을 때, 인터럽트 금지이다.
임계영역에 진입할 때 disable interrupt하여 임계영역에서 공유자원을 작업하는 동안 인터럽트를 막는다.
작업이 끝난 후에는 enable interrupt를 사용하여 인터럽트를 가능하게 한다.
*CPU가 1개일 때는 상관이 없지만 CPU가 여러개인 mutiprocessor에서는 의미가 없다. 왜냐하면 하나를 막아도 다른 CPU에서 진입을 하기 때문에.
특별한 기계 명령어를 사용할 수 있다.
compare_and_swap을 사용하면 코드안에 명령어들의 수행이 끝날때까지 방해받지 않는다.
=>원자적 연산(atomic operation) : 한 번 실행하면 다른 애한테 영향을 받지 않고 끝까지 수행(CPU를 안뺏긴다.)
예시를 통해 자세히 알아보겠다.
parbegin() : n 개의 프로세스를 동시에 실행하라는 의미 / P함수 n개가 동시에 실행된다.
bolt 값이 0일때만 진입이 가능하다.(flag 역할을 한다)
동기화(Synchronization) 종류
- lock과 unlock
- 세마포어(semaphore)
세마포어
상호배제를 지원하는 메커니즘이다.
세마포어는 정수 값을 갖는 변수로 다음 3가지 인터페이스를 통해 접근할 수 있다.
- 초기화 연산(initialize operation) : 세마포어 값을 음이 아닌 값으로 초기화한다.
- 대기 연산(wait operation) : 세마포어 값을 감소시킨다. 값이 음수이면 호출한 프로세스는 블록된다. 음수가 아니면, 프로세스는 계속 수행될 수 있다.(임계 영역 실행 가능)
- 시그널 연산(signal operation) : 세마포어 값을 증가시킨다. 값이 양수가 아니면 블록된 프로세스를 깨운다.
1) 일반 세마포어(카운팅 세마포어)
semWait(), semSignal()은 임계영역을 들어가고 나올때 사용된다.
semWait()를 사용한 뒤 -> 임계 영역에 접근할 수 있다. 접근 후 -> semSignal()를 사용하여 나올 수 있다.
초기값이 1이 아닌 세마포어(보통 2보다 크다)
초기값이 만약 3이라면 3개까지 동시에 진입할 수 있다라는 뜻
-코드설명
1) semWait()를 사용하여 임계영역에 접근한다.
2) count의 값을 감소시킨 후, 0보다 작게 되면 큐에 연결을 시키고 블락 상태로 전환한다.
3) semSignal()이라는 것은 count값을 증가시키고, 만약에 count가 0보다 작거나 같으면 지금 기다리고 있는게 있다는 뜻이다. / 그렇다면 큐에 연결되어 있는 프로세스를 제거 후, 레디 큐에 연결한다.
2) 이진 세마포어(mutex)
enum은 0과1 만을 값으로 갖는다.
semWait는 Lock을 의미, semSignal은 UnLock을 의미한다.
초기값이 1이라면 이진 세마포터(mutex)이다. 임계영역은 serial하게 진행된다.
코드설명
1) semWait()는 value값이 1이면, 0으로 만든다. / 1이 아니면 이미 0이므로 큐에 연결 후 블록상태로 만든다.
2) semSignal()은 큐가 비어있으면, 기다리는 값이 없으므로 value값을 1로 만든다. / 아니라면 기다리는게 있다는 뜻.
임계영역이 아닌 곳에서는 프로세스들이 병렬처리 되지만,
임계영역안에서는 직렬화, serial하게 진행된다.
생산자/소비자(producer/consumer)
5장 병행성 : 상호배제(Mutual Excl.. : 네이버블로그 (naver.com)
*Serial Processing
프로세스 하나가 시작되면, 자발적으로 프로세스를 놓기 전까지 모든 리소스와 CPU 등 모든 디바이스를 독점하여 실행된다. 다 끝나야먄 다음 프로세스가 실행될 수 있다.
*Councurrent Processing
CPU가 1개일때 번갈아가면서 사용 -> Interleaving 방식
CPU가 2개 이상 일때 : OverLapping 방식(Parallel processing) 병렬처리
cpu1-------------------------
cpu2 -------------------------
cpu3 ------------------------- *동시에 처리 / 문제가 발생할 수 있다. 언제? 자원을 공유할 때. 정확히는 공유한 자원에 '동시에 접근할 때' 문제가 발생한다. 산티아고 순례길 화장실은 공유자원이다. 들어가서 똥사고 나오는데 나올때까지 아무도 없으면 문제가 없다. 그런데 A라는 사람이 들어가 있는데 B라는 사람이 들어가버리면 문제가 발생한다.
=> 해결방법은? 문. 문이 닫혀있으면 이용중, 문이 없으면 이용중이 아님을 나타낸다. / 임계영역을 실행할 때에는 '순차적'으로 실행하게 한다!!! Lock을 사용하여 순차적으로 행하게 한다.
'컴퓨터과학 > 운영체제' 카테고리의 다른 글
메모리 관리 (1) | 2024.05.31 |
---|---|
병행성 : 교착상태와 기아 (0) | 2024.05.31 |
프로세스를 생성하는 fork()함수를 알아보자 (1) | 2024.05.06 |
What is 쓰레드? (0) | 2024.05.06 |
운영체제가 뭔데? 이름부터 어려운게 거부감 드는데? (0) | 2024.05.03 |