*fork의 리턴으로 부모는 자식의 pid 값이 넘어오고, 자식은 0이 넘어오기 때문에 서로 다른 일을 할 수 있다
exec()
하나의 프로세스를 완전히 새로운 프로세스로 덮어씌운다
execlp()
프로그램을 완전히 새로운 프로그램으로 덮어씌우는 역할을 한다
누군가가 만든 독립적인 프로그램
- 끝나고 원래 프로그램으로 되돌아오지 않는다
- 뒤에 어떤 코드를 넣어놓아도 실행하지 않는다
- 부모 프로세스
- 자식 프로세스
- eseclp로 data라는 프로그램을 덮어씌우고 실행
wait () 시스템 콜
*프로세스는 자기 주소 공간이 있다 (코드 / 데이터 / 스택)
fork로 똑같은 자식 프로세스가 만들어 짐>
fork 결과값이 0이 아닌 경우에(부모 프로세스에) wait 이라는 시스템 콜 >
자식이 끝날 때까지 부모 프로세스를 블록 상태로 슬립을 시킨다
wait 콜 호출하지 않으면 부모와 자식은 CPU를 두고 경쟁관계
프로세스가 블럭 상태에 들어간 경우
- 오래 기다려야 하는 작업이 있을 때 블럭 상태 (공유 데이터 기다리는 경우 등)
- waiting 시스템 콜을 해서 자식 프로세스의 종료를 기다리면서 블럭 된 경우도 있을 수 있다
- 부모 프로세스가 자식 종료될 때까지 블럭 상태가 되어서 CPU를 얻지 못한다
- 자식이 종료되면 다시 부모가 CPU 얻을 수 있다
exit()
프로세스를 종료시키는 시스템 콜
프로세스 간 협력
- 원래 프로세스는 협력하지 않는다(=경쟁)
- 독립적으로 동작한다
- A프로세스가 B의 메모리 공간을 볼 수 없다
- 프로세스는 항상 자기 자신의 주소 공간만을 볼 수 있다
프로세스가 협력하는 경우
IPC를 통해서 정보 주고받고 협력
-
shared memory
- 프로세스 A와 B 겹쳐지는 메모리를 공유
운영체제한테 시스템 콜 요청 >
공유할 메모리 공간 정해지면 메모리를 공유(서로 데이터를 읽을 수 있다)
신뢰할 수 있는 경우 공유해도 문제 없지만아니면 문제가 생길 수도 있다
-
메시지 패싱
-
스레드
- 별도의 프로세스 X
- 하나의 프로세스 안에 CPU 수행단위인 스레드가 여러 개 존재
- 프로세스 내 스레드 간에는 메모리 공간이 하나 뿐. 따라서 스레드들 끼리는 협력이 훨씬 쉽다
- 스레드 만들어지는 것 자체가 메모리 공간이 공유되는 것
P가 Q한테 메시지를 전달
메시지 패싱
운영체제(커널)가 매개가 되어서 운영체제한테 시스템 콜하면 운영체제가 메시지 패싱
패싱 방법 2가지
-
다이렉트
-
인다이렉트
- 메일박스나 포트에 집어넣는 것
- P가 누구한테 전달할지 모른다
- 정해지지 않은 누군가가 메시지를 받을 수 있음
프로세스의 일생
아래 두 가지 작업이 반복
- CPU 버스트
- CPU에서 기계어를 실행하는 단계
- 초당 많은 기계어를 실행
- I/O 버스트
- I/O 작업을 하는 단계(오래걸림))
- CPU를 빼앗기고 블럭 상태
CPU 버스트 타임 분포
- X축 (버스트 시간)
- 버스트 시간이 긴 프로그램들과 짧게 쓰는 프로그램들이 존재
- 길게 쓰는 프로그램: CPU 바운드 잡 (프로세스)
- 짧게 쓰는 프로그램: I/O 바운드 잡 (사람하고 인터랙션 하는 프로그램)
CPU를 누구에게 먼저 줘야 하는가?
서로 다른 작업들이 섞여있는 시스템 안의 자원이 효율적으로 사용되기 위해서 CPU 스케줄링이 중요하다
- CPU 스케줄러
- ready 상태의 프로세스 중에서 누구한테 CPU 줄지 결정
- 디스패처 => 소프트웨어(운영체제 안에 있는 특정 역할을 하는 코드 일부)
- 결정된 프로세스한테 CPU 넘기는 역할
빼앗기는 문맥을 세이브, 얻는 프로세스의 문맥 로드
스케줄링 일어났을 때의 상태변화
- CPU 얻으면 ready에서 running
- 빼앗길 때는 running에서 ready
(CPU 쓰고싶은데 타이머 인터럽트로 강제로 빼앗는 것)
- running에서 blocked
(쓰다가 I/O 같이 오래걸리는 작업 하게 되면 다른 사람한테 CPU를 주는 것)
- I/O가 끝나면 blocked에서 ready (CPU 얻는 권한 생김) (우선순위가 높으면 I/O 끝나자마자 CPU 얻을 수 있음)
- 종료되었을 때 터미네이티드
preemptive : 강제로 빼앗을 수 있는 것
nonpreemptive : 빼앗을 수 없는 것
1번(더이상 CPU 필요없음)과 4번(끝남)은 nonpreemptive 자진해서 CPU 내어놓는 것
2, 3번은 나머지는 계속 쓰고싶은데 정책상 빼앗는 것
타이머 줘서 계속 빼앗는다 => preemptive
아이오 하러갈 때까지 안 빼앗는다 => nonpreemptive
성능 척도 (3가지)