내가 공부하기 위한 공간 - [운영체제] 3- 프로세스
[프로세스]
큐 방식
프로그램 + PCB(Process Control Block)
구조 : 코드(읽기) + 데이터(읽기,쓰기) + 힙(숨김) + 스택(숨김)
동적할당영역
스택 : 함수 호출 영역
힙 : 변수 할당 영역(포인터, malloc, calloc)
상태
생성(PCB+)>준비<(timeout)(Dispatch)>실행>완료(PCB-)
+대기(blocking)상태 : 실행 중 입출력 요청에 따라 대기상태로 변환, 완료되면 준비상태로 변환
+보류(Suspend)상태 : 대기상태에서 메모리에서 잠시 쫓겨난 상태, 스왑영역에 보관(보류대기상태 > 보류준비상태 <> 준비상태) - 재시작으로 대기상태/준비상태로 변환
- 메모리 포과, 오류, 바이러스 등 여러 이유가 있음
+휴식(Pause)상태 : 프로세스가 일시적으로 중단(프로세스가 메모리에 있음)
[PCB]
구성 : 포인터, 상태, PID, PC, 우선순위, 메모리정보, 할당자원정보, 레지스터정보, 계정정보, PPID, CPID(없으면 -1) 등
[문맥교환]
PCB가 교환됨, 디스패치되는 프로세스는 CPU에 올라오고 타임아웃되는 프로세스는 PCB에 저장하고 나옴
교환에도 시간이 걸림(전환시간)
타임아웃 없이 완료상태로 가면 문맥교환을 하지 않은것(일괄처리) or 너무 많은 문맥교환 > 시분할 효율 안좋음
[프로세스 생성, 복사]
fork() : 기존 프로세스에 대해 복사
- 기존 프로세스와 복사된 프로세스는 각각 부모-자식관계
- 부모의 CPID는 자식의 PID를 갖고, 자식의 PPID는 부모의 PID를 가짐
부모가 먼저 없어져서 자식 프로세스만 남음 : 고아(Orphan) 프로세스
자식 프로세스가 없어진 후 뒤처리를 제대로 하지 않음 : 좀비(Zombie) 프로세스
> exit(), return(), wait(), 운영체제의 주기적 회수로 해결
exit() : 반환값으로 어떤 상태로 종료되었는지 가능 / 알려주기만 할 뿐임
wait() : 자식이 끝나길 기다렸다 끝나면 다음문장 실행>부모가 먼저 끝나는 경우가 없음
exec() : 기존 프로세스에 대해 구조를 재활용
- PID, PPID, CPID를 제외한 내용들을 새로(코드, 데이터, 스택, 힙도 마찬가지)
프로세스 계층구조 : 동시 작업과 종료시 자원 회수에 용이
init : 일반 유저 프로세스의 맨 위
ex) login과 shell, login후 shell을 사용할 때 login종료 shell생성 보다는 login을 재사용하여 shell로 바꾸면 효율적
[스레드]
프로세스 코드에 따라 CPU에 요청할 실행 단위
멀티 스레드 : 프로세스 내 여러 스레드로 분할
멀티 태스킹(프로그래밍) : 한개의 처리기에 시분할을 이용하여 동시에 처리하는 것처럼 보임
멀티 프로세싱 : 여러 처리기에 동시에 처리
멀티태스킹(fork)은 정적영역이 여러개(HWP가 여러게) > 메모리 낭비 > 멀티스레드로 향상(LWP)
- 장점 : 응답성, 자원, 효율
- 단점 : 한 스레드에 문제=전체에 영향
모델 : 유저(커널1 to N), 커널(1 to 1), 멀티(N to M)
유저(User) 스레드
장점:
• 커널의 개입 없이 빠르게 생성 및 전환 (오버헤드 적음)
• 사용자 레벨에서 관리 가능하여 구현이 간단함
단점:
• 하나의 스레드가 블록되면 프로세스 전체가 멈출 수 있음
• 커널이 직접 스케줄링하지 않아 다중 CPU 활용이 어려움
커널(Kernel) 스레드
장점:
• 커널에서 직접 스케줄링하므로 멀티코어 활용 가능
• 하나의 스레드가 블록되더라도 다른 스레드 실행 가능
단점:
• 생성 및 전환 시 커널 개입 필요 → 오버헤드 증가
• 유저 스레드보다 구현이 복잡
멀티 스레드(Multi-threading) 전반적인 장단점
장점:
• 병렬 처리 가능 → 성능 향상
• 리소스 공유 가능 → 메모리 절약
단점:
• 동기화 문제 발생 가능 (데드락, 경쟁 상태 등)
• 디버깅이 어려움