1. 프로세스 VS 쓰레드
# 프로그램
- 어떤 작업을 위해 실행할 수 있는 파일
# 프로세스
- 메모리에 올라와 실행되고 있는 프로그램의 인스턴스
- 운영체제로부터 자원을 할당받는 작업의 단위
=> 실행된 프로그램 의미
- 프로그램과 프로세스 제어 블록(PCB)로 구성
- 준비/대기/실행/종료/생성
- fork로 생성, exec로 실행
( 부모 프로세스 fork() 호출 -> 자식 프로세스 생성 -> 부모 프로세스 자식 프로세스가 종료될때 까지 wait -> 자식 프로세스 exec호출 -> 자식 프로세스 프로그램 실행 -> 자식 프로세스 종료 -> 부모 프로세스 wake up -> 프롬프트를 생성 후 또 다른 명령어 입력 기다림)
[프로그램이 할당받는 시스템 자원의 예]
- CPU 시간
- 운영되기 위해 필요한 주소 공간
- Code, Data, Stack, Heap의 구조로 되어 있는 독립된 메모리 영역
[프로세스 특징]
1. 프로세스는 각각 독립된 메모리 영역을 할당 받음.
2. 프로세스당 최소 1개의 스레드(메인)를 갖고 있음
3. 각 프로세스는 별도의 주소 공간에서 실행, 한 프로세스는 다른 프로세스의 변수나 자료구조에 접근 불가
4. 한 프로세스가 다른 프로세스의 자원에 접근하려면 프로세스 간의 통신 필요(Socket 등)
# 쓰레드
- 프로세스 내에서 실행되는 여러 흐름의 단위
- 프로세스가 할당받은 자원을 이용하는 실행의 단위
- 운영체제에서 더 효율적으로 시스템 자원을 관리하기 위해 사용됨
- 쓰레드 간에 자원 공유는 전역변수를 통해 이루어지기에 동기화 문제 신경써야함
[쓰레드 특징]
1. 프로세스 내에서 각각 Stack만 따로 할당받고 나머지 영역은 공유
2. 같은 프로세스 내의 여러 쓰레드들은 같은 힙 공간 공유 -> 접근 가능
# Multi Process 대신 Multi Thread 사용 이유
1. 자원의 효율성 증대
- 시스템 콜이 감소(프로세스를 생성하여 자원을 할당하는)
2. 처리 비용 감소 및 응답 시간의 감축
- Stack 영역 제외 모든 메모리 공유
- 프로세스간 전환속도 > 스레드간 전환속도: Context Switching시에 쓰레드는 Stack만 처리
2. 메모리 영역
- 프로그램이 실행되기 위해서는 프로그램이 메모리 영역에 로드 되어야 한다.
- (low to high)
(1) 코드 영역
- 실행할 프로그램의 코드가 저장되는 텍스트 영역
- CPU는 코드영역에 저장된 명령어를 하나씩 가져가 처리
(2) 데이터 영역
- 전역변수, 정적변수
- 프로그램의 시작과 함께 할당되면 프로그램 종료 시 소멸
(3) 힙영역
- 사용자가 직접 관리할 수 있는 메모리 영역
- 사용자에 의해 메모리 공간이 동적으로 할당되고 해제
- 런타임시에 할당
(4) 스택영역
- 함수의 호출과 관계되는 지역변수와 매개변수가 저장되는 영역
- 함수의 호출과 함께 할당되며 함수의 호출이 종료될 때 해제
- 컴파일 타임에 할당
3. 교착상태(Dead Lock)
- 모든 스레드가 락이 풀리기를 기다리고 있음 -> 무한 대기 상태
- 프로세스들의 집합이 더 이상 영구적으로 진행을 못하고 영구적으로 블록됨
-> 두 개 이상의 프로세스들이 서로 충돌되는 자원 요구를 할 때 발생
임계자원 - 두 개 이상의 프로세스가 동시에 사용할 수 없는 자원
임계영역 - 그 자원을 접근하는 프로그램 코드의 일부분
기아 - 특정 프로세스가 오랜 기간 동안 자우넝르 사용하지 못하는 상태
교착상태 - 자우넝르 제공받기를 기다릴 뿐 갖고 있는 자원을 반납하지 않음, 대기만 되며 수행되지 않음
세마포어 - 프로세스 간에 시근러을 주고받기 위해 사용되는 정수값
다익스트라
-> 두 개 이상의 프로세스들은 간단한 형태의 시그널을 이용해 협동할 수 있다.
= 한 프로세스가 특정 시그널을 수신할 때 까지 정해진 위치에서 중지하고록 강제
[교착상태 조건]
(1) 상호 배제(mutual exclusion)
- 한 번에 한 프로세스 만 공유 자원을 사용할 수 있음
- 공유 자원에 대한 접근 권한 제한
- 자원의 양이 제한되어 있더라도 교착상태는 발생할 수 있음
- 한 시점에 단 하나의 프로세스만이 임계영역에 들어감
(2) 점유대기(hold and wait)
- 공유 자원에 대한 접근 권한을 갖고 있는 프로세스가, 그 접근 권한을 양보하지 않은 상태에서 다른 자원에 대한 접근권한을 요구할 수 있음
(3) 비선점(preemption)
- 한 프로세스가 다른 프로세스의 자원 접근 권한을 강제로 취소할 수 없다.
(4) 순환대기(circular wait)
- 두 개 이상의 프로세스가 자원 접근을 기다리는데 그 관계에 사이클이 존재
안전한 상태 == 교착상태가 발생하지 않도록 프로세스에게 자원을 할당할 수 있는 경로가 존재하는 상태
[교착상태 방지]
- 위 4가지 조건 가운데 하나를 제거
- 1번 조건은 제거하기 어려움: 공유 자원 중 많은 경우가 한 번에 한 프로세스만 사용
- 대부분은 4번 조건 제거
교착상태 회피 - 예방에 비해 자원 할당이 더 자유로움, 교착상태 발견에 비해 자원을 선점하고 프로세스 수행의 롤백이 불필요
-> 최대 자원 요구량 알아야 하고 자원 개수 고정, 선점한 채로 종료되어서는 안된다.
# 운영체제
- 처리기(CPU) - 메모리와 데이터를 교환
- 주기억장치 - 휘발성
- 입출력 모듈
- 시스템 버스 - 어드레스 버스(메모리 주소 전달), 데이터 버스(데이터 전달), 제어 버스(제어 정보 전달)
* 메모리 모듈 = 일련번호로 주소가 부여된 장소들의 집합
* 입출력 모듈 - 외부장치로부터 처리기와 메모리로 데이터를 전송하거나, 그 역방향으로 데이터 전송
프로그램은 처리기에 의해 수행, 메모리에 저장된 명령어들의 집합으로 구성
프로그램 카운터는 다음에 가져올 명령어의 주소를 갖고 있으며 순서대로 명령에 반입
반입된 명령어는 처리기 내의 명령어 레지스터로 적재
인터럽트: 처리기의 처리율을 향상시키기 위해 제공됨
cpu내의 레지스터 > 캐시 > 주기억장치 > 자기디스크> 자기테이프
-> 저속의 메모리에 대한 접근 횟수 줄이는 것 필요
- 주기억장치
: 현재 실행중인 프로그램과 프로그램에 필요한 데이터를 일시적으로 저장
: BYTE 또는 WORD 단위로 분할해 어드레스를 할당
: 주요 기능은 데이터를 저장하는 "쓰기"와 데이터를 읽어오느 "읽기"
: 데이터 입력선 - 데이터의 크기가 1 바이트이므로 1비트 정보가 전송되는 입력선 8개 필요
: 어드레스선 - 0번지부터 1023번지의 1024개의 어드레스를 가지므로 어드레스를 나타내기 위해 10개의 어드레스 선 필요
- 캐시 메모리
: SRAM으로 구성되어, DRAM으로 구현된 주기억장치에 비해 속도가 5~10배 정도 빠름
참조 지역성 - 프로그램이 수행되는 동안 명령어와 데이터 둘 다에 대한 처리기의 메모리 참조는 인근 지역으로 몰림
캐시의 원리 - 가장 빠른 메모리 속도에 근접한 메모리를 제공 + 비용이 저렴한 대용량의 메모리를 제공
운영체제 - 응용 프로그램의 수행을 제어하고 응용 프로그램과 컴퓨터 하드웨어 사이의 인터페이스 역할
준비(Ready) 상태 - 프로세스가 주기억장치에 있고 수행될 수 있음
블록(Blocked) 상태 - 프로세스가 주기억장치에 있고 사건을 기다리고 있음
블록/보류 상태 - 프로세스가 보조기억장치에 있고 사건을 기다리고 있음
준비/보류 - 프로세스가 보조기억장치에 있지만, 주기억장치에 적재되면 즉시 수행 가능
메모리테이블 - 주기억장치과 보조기억장치 모두의 자취를 유지하기 위해 사용
입출력테이블 - 입출력 장치와 컴퓨터 시스템의 채널들을 관리하기 위해 os에서 사용
파일테이블
프로세스 테이블
프로세스 이미지 - 프로그램, 데이터, 스택, 속성들의 집합
멀티프로그래밍 - 단일 처리기(프로세서) 시스템 상에서 다수의 프로세스 관리
멀티 프로세싱 - 멀티 프로세서 시스템 상에서 다수의 프로세스 관리
분산처리 - 다수의 분산된 컴퓨터 시스템들 상에서 수행되는 다수의 프로세스 관리
# 멀티 프로세서
- 여러 개의 프로그램을 동시에 실행하거나 하나의 프로그램을 분할해서 동시에 실행하는 것을 병렬 처리라고 하며, 병렬처리를 가능케 하는 것이 멀티프로세서
- 장점: 성능향상, 신뢰성 향상
- (1) 집중 메모리 구조
: CPU마다 메모리를 따로 두지 않고, 버스를 기준으로 CPU 반대쪽에 있음, 버스를 통해 CPU접근
: (단) 통신은 모두 cpu들이 메모리를 공유하기 때문에 일반적으로 공유 변수 사용 -> 메모리 접근 충돌 가능성이 큼
: (보완책) 자주 사용하는 프로그램과 데이터를 캐시 메모리에 저장해두고, 동작하며 메모리에 대한 접근을 줄일 수 있음
- (2) 분산 메모리 구조
: cpu마다 메모리를 따로 두어 메모리 접근에 대한 충돌이 생기지 않음, 캐시 사용 가능
: (통신방법) cpu의 메모리도 접근이 가능하도록 하여 공유 변수를 이용해 통신
# 클러스터링
- 서버 여러 대를 하나의 멀티 프로세서처럼 동작하도록 구현
경쟁상태 - 다수의 프로세스나 쓰레드가 공유 자원을 동시에 읽거나 쓰려고 하는 상태
서로 인식X 프로세스 = 경쟁
서로 간접적으로 인식 = 협력(공유)
서로 직접적으로 인식 = 협력(통신)
프로세스의 모든 메모리 참조는 논리주소, 수행시간에 동적으로 물리주소로 변환
주소공간은 여러 블록(페이지 혹은 세그먼트)으로 분할, 주기억장치에 연속영역일 필요 없음
적재집합 = 데이터 중 임의 시점에 주기억장치에 적재되어 있는 부분
주기억장치에 적재되지 않은 논리주소가 참조될 경우 메모리 폴트 발생
반입정책
- 선 페이징: 페이지 폴트에 의해 요구된 페이지들 이외의 페이지들도 반입
- 요구 페이징
배치 정책
- 어디에 위치할 것 인지
- 성능에 큰 차이는 없음
교체정책
- 최적: 미래에 참조될까지의 시간이 가장 긴 페이지
- LRU: 가장 오랫동안 참조되지 않은 주기억장치 상의 페이지 교체
- FIFO: 메모리 상에 가장 오래 머물렀던 페이지를 교체
- 클록
페이지버퍼링 - 선정된 페이지를 교체하지 않고 그 페이지가 변경되지 않은 페이지인 경우 가용페이지리스트에, 변경된 페이지인 경우 변경페이지리스트에 연결시켜 관리
# CPU의 구성
- 제어장치: 프로그램 명령어를 해석, 의미에 따라 연산장치, 메모리 등에게 동작 지시
- 연산장치: 덧셈, 뺄셈 등의 연산을 하는 장치로 제어 장치의 지시에 따라 연산 수행
- 레지스터: 메인 메모리로부터 ㅇ릭어온 명령어나 데이터를 저장하거나 연산된 결과를 저장한느 공간
(1) 어드레스 레지스터 - 메모리로부터 데이터를 읽거나 메모리의 데이터를 쓸 메모리 주소를 저장
(2) 프로그램 카운터 - 다음에 실행될 명령어가 저장된 메모리 주소를 저장
(3) 데이터 레지스터 - 메모리에서 읽어온 데이터를 저장
(4) 명령어 레지스터 - 메모리에서 읽어온 명령어를 저장
(5) 어큐뮬레이터 - 연산에 사용되는 데이터를 저장
- CPU 연산 명령어
(1) LOAD - 메모리 주소와 데이터를 로두하여 어큐뮬레이터에 저장
(2) ADD - 메모리 주소의 데이터를 가져와 어큐뮬레이터에 저장된 데이터와 더해서 저장
(3) STORE - 메모리 주소에 해당 데이터를 저장