Process is a program in execution
프로세스의 문맥(context)?
프로세스가 현재 어떤 상태에 있는지를 일컫는 개념 (프로세스의 출생에서 사망까지)
현재 이 프로세스는 CPU를 얼마나 썼는가? 과거에 메모리를 얼마나 사용했는가? 얼마나 진행 되었는가? 등 현재 상태를 나타내는 것이 프로세스의 문맥
CPU의 하드웨어 문맥
프로세스의 주소 공간
프로세스 관련 커널 자료구조
PCB
Kernel stack : 그 프로세스의 커널 스택에 어떤 내용이 들어있는지?
Running : CPU를 사용하고 있는 상태
Blocked(wait, sleep) : CPU를 할당해도 무의미한 상태(I/O 등이 만족되지 않음, ex_디스크에서 file을 읽어와야 하는 경우, 키보드 입력이 들어와야하는 경우)
Ready : 모든 준비가 끝났고, CPU의 사용을 기다리는 상태
New(프로세스 생성중인 상태), Terminated(프로세스가 종료중인 상태) 등도 존재
❗ Blocked 상태가 해소되어도 바로 운영체제에 CPU를 할당하는 것(시스템콜)이 아니라, I/O 장치의 컨트롤러들이 인터럽트를 걸고, 프로세스는 Ready상태가 되어 주소를 복사한 후 Ready queue에 주소를 입력하게 된다.
Timer interrupt가 걸리게 되면, 다시 프로세스가 Ready queue에 들어가서 줄을 서야한다. 이런 경우에는 Running 상태에서 Ready상태가 될 수 있다.
운영체제가 각 프로세스를 관리하기 위해 프로세스당 유지하는 정보
OS가 관리상 사용하는 정보 : 프로세스 상태, 프로세스 ID, 스케줄링 정보, 우선도
CPU 수행 관련 하드웨어 값
CPU가 한 프로세스에서 다른 프로세스로 넘어가는 과정
이 과정에서 일어나는 문맥의 저장과 로드는 PCB를 통해서 하게 됨.
❗ 내어주는 프로세스의 입장 : CPU가 한 프로세스에서 다른 프로세스로 이동할 때, CPU를 내어주는 프로세스는 PCB에 현재 프로세스의 문맥을 PCB에 저장한다.
❗ 받는 프로세스의 입장 : 이전까지의 문맥을 PCB에서 읽어온다.
사용자 프로세스 A가 실행되다가 운영체제에게 서비스를 받고(시스템 콜) 다시 프로세스 A 실행 -> 문맥교환 X
사용자 프로세스 A가 실행되다가 인터럽트가 들어온 프로세스를 Ready queue에 넣는 과정(이 때 CPU는 커널에게 내어주게됨) -> Ready queue에 넣고 다시 CPU가 A에 할당 되기 때문에 문맥교환 X
사용자 프로세스 A에 CPU가 할당 되어있던 중 timer interrupt 발생, 사용자 프로세스 B에게 CPU할당 -> 문맥교환 O
사용자 프로세스 A가 I/O 요청으로 인한 system call 발생 -> I/O를 처리해야하기 때문에 다른 프로세스로 CPU 할당 -> 문맥교환 O
운영체제의 일부, 스케줄링을 하는 코드를 일컫는 말
장기 스케줄러(메모리 스케줄러) : 프로세스에 메모리를 할당하는 결정(ready 상태)
흔히 알고있는 운영체제에는 장기스케줄러가 없음 -> 곧바로 메모리를 할당 받게됨(바로 ready상태)
예전의 시스템에서는 존재했던 개념
단기 스케줄러(CPU 스케줄러) : CPU를 어떤 프로세스에 할당할지 결정(running 상태에 둘 프로세스 결정)
중기 스케줄러(Swapper) : 프로세스에게서 메모리를 빼앗는 결정
메모리가 부족할때 특정 프로세스를 메모리에서 통째로 도려냄
장기 스케줄러가 없기 때문에 필요해지는 스케줄러
degree of Multiprogramming을 제어
degree of Multiprogramming : 현재 메인 메모리에 존재하는 활성화된 일의 수
active -> inactive : swap out
inactive -> active : swap in
❗ Suspended(stopped) : 외부적인 이유로 프로세스의 수행이 정지된 상태, 프로세스가 통째로 디스크에 swap out 된다.(메모리를 통째로 빼앗긴 상태) ex) 사용자가 프로그램을 일시 정지시킨 경우.
프로세스 내에서 실행되고 있는 흐름의 단위
각 스레드 별로 레지스터 값 및 stack에는 다른 위치와 다른 값이 존재함. 동일한 프로세스 내에서 여러 스레드를 실행할 수 있고, 이는 효율성을 챙길 수 있는 경우가 된다.
A thread(or lightweight process) is a basic unit of CPU utilization
Thread의 구성
Thread가 동료 thread와 공유하는 부분(=task)
* code section
다중 스레드 : 한 스레드가 blocked 상태인 경우에도 동일한 테스크 내의 다른 스레드가 실행(running)되어 빠른 처리를 할 수 있게 된다.
응답성(Responsiveness) : 다중 스레드의 경우 다른 스레드가 blocked여도 running될 수 있음
자원 공유(Resource Sharing) : 동일 프로세스 내 스레드 끼리는 여러 자원을 공유하기 때문에 효율적이다.
효율적 : 프로세스 한 개 생성 vs 스레드 한 개 생성을 비교했을 때, 스레드 한 개를 만드는 것이 전자에 비해 매우 효율적이다. 따라서 여러 프로세스를 만드는 것보다 한 프로세스 내에 스레드를 여러개 생성하는 것이 좋음
병렬성 : 가령, 1000X1000의 2차원 행렬을 코어가 하나인 CPU로 계산한다고 했을 때, 일일이 계산을 해줘야 함, 하지만 코어가 여러개인 CPU가 스레드 여러개로 병렬적인 계산을 할 경우 훨씬 더 효율적인 계산이 가능함
스레드를 운영체제가 알고 있는 경우, 운영체제 커널이 직접 스레드에게 지원
서로 다른 스레드가 운영체제에게 서로 다른 프로세스로 간주됨
커널이 스레드를 인지하고 있을 경우 A라는 스레드에서 B라는 스레드에게 CPU를 넘기는 방식
운영체제는 프로세스에게 CPU를 할당
사용자 프로그램 단위에서 지원하는 스레드이기 때문에 프로세스가 스레드에 CPU를 할당
부모 프로세스가 자식 프로세스 생성(복제 생성)
프로세스의 트리(계층 구조) 형성 : 프로세스의 족보
프로세스의 자원 : 운영체제로부터 받거나 부모와 공유(이례적인 경우)
수행 (Execution) : 부모와 자식은 공존하며 수행되는 모델, 자식이 terminate 할때까지 부모가 기다리는 모델도 존재
주소 공간(Address space) : 자식의 주소공간 = 부모의 공간 복사, 자식이 실행될 경우 부모가 있던 그 위치에서 실행이 됨
fork()
시스템콜 이후에 exec()
시스템 콜을 하면서 새로운 프로그램을 자식 프로세스에 덮어 씌움 (부모와 동일한 프로세스 실행이 되는걸 막기 위함)
✔ 과정
case 1 : 프로세스가 마지막 명령 수행 -> 자식이 부모 프로세스에게 이를 알림 -> 프로세스의 각종 자원들이 운영체제에게 반납됨
case 2 : 부모 프로세스가 자식의 수행을 종료시킴(abort)
자식이 할당 자원의 한계치를 넘어서는 경우
자식에게 할당된 테스크가 더 이상 필요하지 않은 경우
부모가 종료(exit)하는 경우 : 프로세스끼리는 계층구조를 갖기 때문에 부모를 종료시키기 위해서 자식을 종료시킨다.
자식 프로세스를 하나 생성하기 위한 커널 호출 함수
코드 내에서 fork()
가 실행됐을 경우, fork()
이후의 코드부터 자식 프로세스 실행
❓ 자식과 부모의 구분은 어떻게? : pid 값을 부모에게는 양수, 자식에게는 0 할당하여 구분, pid 값에 따라서 다른 구문 실행, 만약 pid 값이 없을 경우에는 동일한 작업 수행(보통 이런 경우는 없음)
int main()
printf('\n Hello');
execlp('bindata', 'bindata',(char *)0);
printf('\n Hello');
)
execlp()
이후로 완전히 새로운 프로그램으로 바뀌게 됨. pid값이 있을 경우 자식과 부모를 구분하여 자식에게는 execlp()를 적용하는 식으로 다른 작업을 수행할 수 있게 함
프로세스 A가 wait()
시스템 콜을 호출 -> 커널은 child가 종료될 때까지 프로세스 A를 sleep 시킨다(blocked상태) -> childprocess 종료 -> 커널이 프로세스 A를 깨운다(ready 상태)
독립적 프로세스 : 다른 프로세스의 수행에 영향을 미치지 못함
협력적 프로세스 : 프로세스 협력 메커니즘을 통해 하나의 프로세스가 다른 프로세스의 수행에 영향을 미칠 수 있음
프로세스 간 협력 메커니즘 (IPC:Interprocess Communication)
자료 출처 : 이화여자대학교 반효경 교수님 운영체제 강의