3.프로세스와 스레드
프로그램이 메모리에 올라와서 실행시킬 수 있는 상태(동적인 상태): 프로세스
하드 디스크에 올라와있을때(정적인 상태)
▶프로그램이 프로세스 된다는 것! = 운영체제로부터 프로세스 제어 블록을 얻는다.
프로세스가 종료된다는 것! = 해당 프로세스 제어 블록이 폐기 된다.
일괄처리 시분할 메모리
_______ | _______ _______ _______ . . |
일괄처리방식은 '큐'로 처리된다 . <큐:먼저 들어온 데이터가 먼저 빠져나가는 구조.>
시분할 방식은 메모리에 프로세스가 여러개 올라와 있다.
시분할 방식에서 예상치 못한 상황처리 : 프로세서 제어 블록(PCB)
운영체제가 해당 프로세스를 위해 관히하는 자료구조.
대기 상태= 블록 상태
<프로세스 이미지>
PCB에는 프로세스 처리 필요한 정보들이 들어있다.
- 프로세스 구분자: 프로세스 구분하는 PID
- 메모리 관련 정보: 프로세스 메모리의 위치 정보(메모리 보호를 위한 경계,한계 레지스터 포함됨.)
- 각종 중간값: 프로세스가 사용했던 중간값(CPU레지스터에 있던 값들:실행중인 상태)
PCB |
코드 |
데이터 |
스택 |
↘생성상태에서는 준비 큐에서 순서를 기다리고 준비 상태로 옮겨진다.
CPU스케줄러에 의해 관리되어 실행 상태 여부 결정되면 dispatch(PID)명령으로 처리된다.
이렇게 실행 상태로 옮겨져 실행되면(CPU를 할당받아) 타임 슬라이스 동안만 작업이 가능하다.
그 시간을 다 사용하면 timeout(PID)가 실행되어 시행 상태에서 준비 상태로 옮겨진다.
작업이 완료되면 exit(PID)가 실행되어 프로세스가 정상 종료된다.
실행 상태에 있는 프로세스가 입출력을 요청하면 CPU는 입출력 관리자에게 입출력을 요청하고 block(PID)를 싱행.
이는 입출력이 완료될 때까지 작업 진행할 수 없어 해당 프로세서를 대기 상태로 옮기고 CPU스케줄러는 새로운 프로세스를 싱행 상태로 가져오게 됩니다.
-보류상태
프로세스가 메로리에서 잠시 쫓겨난 상태 (메모리에서 swap영역으로 내려옴)
PCB 구성
- 포인터: 준비상태,대기상태의 큐를 구현할때 사용.
- 프로세스 상태: 프로세스가 현재 어떤 상태에 있는지 나타내는 정보.
- 프로세스 구분자: 운영체제 내에 있는 여러 프로세스 구현 위함.
- 프로그램 카운터: 다음에 실행될 명령어의 위치를 가리키는 프로그램 카운터의 값.
- 프로세스 우선순위: 프로세스의 실행 순서를 결정하는 우선순위.
- 각종 레지스터 정보: 프로세스가 실행되는 중에 사용하던 레지스터의 값.
- 메모리 관리 정보: 메모리 보호, 위치 정보
- 할당된 자원 정보: 프로세스 실행위해 입출력 자원이나 오픈 파일 등 정보
- 계정정보: 계정 번호,CPU할당시간, CPU사용시간
- 부모 프로세스 구분자와 자식 프로세스 구분자: 부로 프로세스를 가리키는 PPID와 자식프로세스를 가리키는CPID정보
-문맥교환
CPU를 차지하던 프로세스가 나가고, 새로운 프로세스를 받아들이는 작업이다.
실행상태에서 나가는 PCB은 지금까지의 작업내용,상태(레지스터)를 저장(PCB)하고,반대로 실행 상태로 들어오는 프로세스 제어 블록의 내용으로 CPU가 다시 세팅된다.(만약 프로그램 카운터가 100번이였다면 100부터 다시 실행)
-fork() 시스템 호출은 실행 중인 프로세스를 복사하는 함수이다. 실행 하던 프로세스는 PPID,새로 생신 프로세스는 PID로서 부모-자식 관계가 된다. 그대로 프로세스 복사를 하는 것이기 때문에 자원 상속,프로세스 생성 속도가 빠르다.
물론 부분 복사도 가능하다.
-exec() 시스템호출은 이미 만들어진 프로세스의 구조체를 재활용하는 것.
스레드
CPU 스케줄러가 CPU에 전달하는 일 하나
프로세스 내부 실행 흐름 단위이다.
프로세스끼리는 약한 연결,스레드 끼리는 강한 연결(메모리,자원 파일 공유)
멀티 프로세싱:CPU가 여러개사용해 여러개 스레드 동시 처리 / CPU멀티스레드: 한개 CPU가 여러 스레드(파이프라인)
멀티태스크(프로세스) = 멀티 프로그래밍
멀티 스레드: 여러개의 스레드
멀티 태스킹:CPU 시간 잘게나누어(시분할,멀티프로그래밍) 배분하는 기법 (fork()로 인한 낭비 요소있다.)
멀티스레드는 자원을 공유하며 스레드가 여러개라 처리속도가 빠르다.
시분할 처리와 같아 Interleaving:동시에 처리되는 것 처럼 보임! (<->Overlapping: 정말 동시에 처리)
-사용자 스레드: 라이브러리에 의해 구현된 일반적 스레드. 사용자 프로세스 내에 여러 스레드가 커널 스레드 하나와 연결되어 라이브러리가 직접 스케줄링하고 정보 처리하므로 문맥교환이 필요없다(훨씬 가볍). 커널 스레드가 입출력 작업 위해 대기 상태에 들어가면 모든 사용자 스레드가 같이 대기. 한 프로세싀 타임 슬라이스를 여러 스레드가 공유하므로 여러개의 CPU동시 불가능.
-커널스레드: 커널이 직접 생성하고 관리하는 스레드. 사용자,커널 스레드 1:1매칭. 사용자 스레드와 정반대.
스택영역:스레드 작동하는 동안 추가,삭제되는 동적영역
힙영역: 프로그램실행 동안 할당되는 변수 영역
(포인터,malloc(),calloc()등 메모리 효율적 사용)