### Process Management 1
프로세스 생성 (Process Creation)
부모 프로세스가 자식 프로세스를 생성
=> 사용자 프로세스가 직접 다른 프로세스 생성 X, 운영체제를 통해서만 생성이 가능함.
시스템콜(fork, exec)을 통해서 운영체제에게 대신 부탁한다
부모 프로세스: 프로세스를 생성한 프로세스
자식 프로세스: 부모 프로세스에 의해 생성된 프로세스
프로세스의 트리(계층 구조) 형성
자식 프로세스는 부모 프로세스의 주소 공간(code, data, stack)과 운영체제에 있는 데이터(PCB, resource)를 복사한다. (복제생성 -> 문맥을 복제함)
자식은 복제를 한 다음에 그 공간에 새로운 프로그램을 덮어씌운다
fork() 시스템콜 : 부모 프로세스를 복제하여 새로운 프로세스를 생성
exec() 시스템콜 : 복제한 것에 새로운 프로그램으로 덮어 씌우는 것, 새로운 프로그램을 메모리에 올림
프로세스가 마지막 명령을 수행한 후 운영체제에게 이를 알려줌 (exit)
프로세스가 종료될 때는 운영체제에게 exit이라는 시스템콜을 날리면 프로세스가 종료된다
자식프로세스가 죽을 때는 부모 프로세스에게 wait 시스템 콜을 통해서 output data를 보낸다
부모 프로세스가 자식의 수행을 종료시킴 (abort) 강제종료
- 자식이 할당 자원의 한계치를 넘어섬
- 자식에게 할당된 태스크가 더 이상 필요하지 않음
- 부모가 종료하는 경우
- 운영체제는 부모 프로세스가 종료하는 경우 자식이 더 이상 수행되도록 두지 않음
- 단계적인 종료
### Process Management 2
copy-on-write (COW) 기법 :Write가 발생했을 때 그 때 Copy를 하겠다. Write가 발생하기 전까지는(=내용이 바뀌기 전까지는) 기존꺼를 공유해서 쓴다
fork() 시스템 콜
fork()를 호출하면 자식 프로세스가 생성 (부모 프로세스와 문맥(context)를 똑같이 복제)
자식 프로세스는 fork()를 호출한 그 이후시점부터 실행이 됨
부모 프로세스의 문맥을 복제할 때 다음 명령어의 실행 주소를 저장하는 레지스터인 프로그램 카운터도 복제가 되기 때문!!
fork()의 return value가 다르다.
부모 프로세스는 fork()의 결과값이 양숫값(자식 프로세스의 pid)이다
자식 프로세스는 fork()의 결과값으로 0을 리턴받는다.
exec() 시스템 콜
프로그램을 새로운 프로그램으로 덮어씌움
exec을 하게 되면 새로운 프로그램의 처음부터(main함수부터) 시작
exec를 2번하진 않고 한번만 할 수 있다(?) 이전으로 되돌아 올 순 없다
fork를 한 이후에만 exec를 할 수 있는 것은 아니다. fork를 하지 않고 exec를 할 수도 있다
=> c언어에서는 execlp 함수를 사용하여 exec 시스템콜 가능
wait() 시스템 콜
프로세스를 block 상태로 만든다
자식 프로세스가 종료되길 기다리는 시스템 콜
보통은 자식 프로세스를 만든 다음에 wait() 시스템 콜을 하게 되는데 -> 자식 프로세스가 종료되길 기다리면서 block 상태가 된다.
자식 프로세스가 종료(terminate)되면 부모 프로세스는 block 상태에서 ready 상태로(=cpu를 얻을 수 있게 메모리로 올라간 상태) 바뀌게 된다.
예시: 리눅스의 foreground => 프로그램이 띄워지면 쉘 프로그램 입장에서 자식 프로세스를 생성한 것이고, 쉘 프로그램은 wait 시스템콜을 호출해서 자식프로세스인 프로그램이 종료될 때까지 기다린다
vi 명령어만 생각해도... vim으로 파일 읽고있을 때는 쉘에 command를 칠 수 없다
exit() 시스템 콜
프로세스 종료할 때 호출하는 시스템 콜
자발적 종료
프로그램이 프로그램 스스로 종료할 때
끝까지 실행했거나 exit 를 만나서 종료
비자발적 종료
프로그램이 코드를 실행하고 있는데 외부에서 죽이는 것
- 부모 프로세스가 자식 프로세스를 강제 종료시킴
- 자식 프로세스가 한계치를 넘어서는 자원 요청
- 자식에게 할당된 태스크가 더 이상 필요하지 않음
- 키보드로 강제종료(kill, break, 리눅스 ctrl+C 등)를 했을 때
- 부모가 종료하는 경우
- 부모 프로세스가 종료하기 전에 자식들을 먼저 죽임
프로세스 간 협력
독립적 프로세스
협력 프로세스
프로세스 간 협력 메커니즘 - IPC
원칙적으로 프로세스들은 독립적 프로세스이고, 독자적인 주소 공간을 갖고 있기 때문에 code, data, stack을 각자 갖고 있어서 자신의 주소공간만 볼 수 있는데
협력하는 것이 IPC
message passing은 커널을 통해 메시지를 전달하는 방식 /
shared memory는 서로 다른 프로세스 간에 일부 주소 공간을 공유하는 것!!
프로세스 간 통신(IPC): 프로세스 간의 자원을 공유하고 데이터를 주고 받는 것
네트워크를 통해 데이터를 주고 받는 방식뿐만 아니라 같은 컴퓨터 내의 서로 다른 프로세스나 스레들끼리 데이터를 주고받는 것도 통신으로 간주..
⭐IPC: Inter-Process Communication
message passing : 커널을 통해 메시지 전달
프로세스 A가 프로세스 B에게 메시지를 전달 -> 프로세스 B가 처리
(Direct Communication, Indirect Communication)..
shared memory : 서로 다른 프로세스 간에 일부 주소 공간을 공유
shared memory는 처음에 영역을 shared memory로 설정하는 것을 커널의 도움을 받지만, 그 이후에는 사용자 프로세스끼리 shared memory를 쓰며 작업하게 된다..
그러므로 사용자 프로세스끼리는 신뢰가 있어야 함,, 잘 짜야함
+
파일을 통한 프로세스 간 통신: A는 'hello.txt' 파일에 새로운 값을 쓰는 프로세스, 프로세스 B는 'hello.txt'파일을 읽는 프로세스 => 두 프로세스는 'hello.txt' 파일 속 데이터를 주고받으므로 통신
강민철, 『혼자 공부하는 컴퓨터 구조+운영체제』, 한빛미디어(2022), 312.
------------------
thread: thread는 하나의 프로세스이므로 프로세스 간 협력으로 보기는 어렵지만 동일한 process를 구성하는 thread들 간에는 주소 공간을 공유하므로 thread들끼리는 협력이 가능하다
CPU 스케줄링
CPU burst: CPU를 실행하는 단계
I/O burst: I/O를 실행하는 단계 / 입출력을 기다리는 단계
CPU-burst Time의 분포 선그래프 - 52분 50초
I/O bound job (입출력 집중 프로세스)
- CPU를 짧게 쓰고 I/O가 중간중간 끼어듬
- CPU를 잡고 계산하는 시간보다 I/O에 많은 시간이 필요한 job
- (many short CPU bursts 빈번하고 짧은 시간의 CPU bursts)
/ 사용자와 interaction하는 job이다..
사람과 상호작용하기 때문에 CPU를 우선적으로 주는 게 필요
interactive한 job이 너무 오래 기다리게 하지 않도록 효율적으로 하기 위해 CPU 스케줄링이 필요
CPU bound job (CPU 집중 프로세스)
- CPU를 오랫동안 길게 씀
- 계산 위주의 job
- (few very long CPU bursts 빈번하지는 않고 긴 시간의 CPU bursts)
=> 여러 종류의 job(=process)이 섞여 있어서 CPU 스케줄링이 필요
CPU Scheduler & Dispatcher
운영체제 커널 코드에서 특정 기능을 하는 부분을 CPU Scheduler, Dispatcher라고 부르는 것
CPU Scheduler : 누구에게 CPU를 줄지 결정
운영체제 안에서 CPU 스케줄링을 하는 코드가 있다. 그 부분을 CPU 스케줄러라고 부르는 것이다
Dispatcher : CPU의 제어권을 CPU Scheduler에 의해 선택된 프로세스에게 넘김 / 이 과정을 context switch(문맥 교환)이라고 함 / 프로세스 상태가 ready 상태인 것을 running 상태로!(이 과정을 dispatch 라고 함)
CPU 스케줄링이 필요한 경우
Running -> Blocked (예: I/O 요청하는 시스템 콜)
Running -> Ready (예: 할당시간만료로 timer interrupt)
Blocked -> Ready (예: I/O 완료 후 인터럽트)
Terminate (종료)
nonpreemptive 프로세스가 이용중인 자원(=CPU)을 강제로 빼앗지 않고 자진 반납때까지 기다림 (비선점 스케줄링)
preemptive 프로세스가 이용중인 자원을 강제로 빼앗음 (선점 스케줄링)
선점형 스케줄링에는 타이머 인터럽트가 발생하여 다음 프로세스에게 CPU를 할당해주는 것도 포함된다
------------------------------
다음시간에 다룰 것: 스케줄링의 성능 측정 방법, CPU 스케줄링 알고리즘
'운영체제' 카테고리의 다른 글
[OS 7주 스터디🍀] 6. Process Synchronization (0) | 2024.08.04 |
---|---|
[OS 7주 스터디🍀] 5. CPU Scheduling (1) | 2024.07.28 |
[OS 7주 스터디🍀] 3. Process (0) | 2024.07.16 |
[OS 7주 스터디🍀] 2. System Structure & Program Execution (0) | 2024.07.13 |
[OS 7주 스터디🍀] 1. Introduction to Operating Systems (0) | 2024.07.13 |