CS/운영체제
[운영체제] 프로세스
삶_
2022. 6. 27. 16:33
프로세스
- 운영체제로부터 자원을 할당받는 작업의 단위
- 독립된 메모리 영역을 할당받음(code, data, stack, heap 의 구조)
- 프로세스의 상태
- CPU에서 기계어 실행 (큐를 만들어 그안에 해야할 일들을 줄 세워줌)
- -> 오래걸리는 할 일은 디스크/키보드 등의 입출력 큐로 넘어감
- Process와 Program 차이점
- 프로그램 : 어떤 작업을 위해 실행할 수 있는 파일
- 프로세스 : cpu를 차지하면서 수행하는 수행 주체. 프로그램의 한개의 인스턴스
프로그램의 실행
- Virtual memory : 실제로 존재하지 않는 메모리.
- Physical memory : 실제적인 메모리. 운영체제가 들어있음.
프로세스의 문맥
- 필요성
- CPU가 시분할 시스템 환경이라 돌아가면서 CPU를 나눠주게 되는데,
- 다시 명령 수행 시, 이전에 어디까지 수행했는지 정확히 알고가야하기 때문에 필요하다
- 하드웨어 문맥 : CPU의 수행상태. 각종 PC/레지스터 값.
- 프로세스의 주소공간 : stack/data/code 공간을 의미
- 커널상의 문맥 : PCB와 커널스택
문맥 교환
- CPU를 한 프로세스에서 다른 프로세스로 CPU제어권을 넘겨주는 과정
- CPU가 다른 프로세스에게 넘어갈때
- CPU를 내어주는 프로세스의 상태(문맥)를 그 프로세스의 PCB에 저장
- CPU를 새롭게 얻는 프로세스의 문맥를 PCB에서 읽어옴
- 아래의 (2)만 문맥교환에 해당된다
프로세스의 상태
- running
- CPU를 잡고 명령을 수행중인 상태
- 커널모드/사용자모드 둘다 프로세스는 running 상태이다
- ready : CPU를 쓰려고 기다리는 상태. CPU만 보유하면 당장 명령을 수행함.
- blocked : CPU를 받아도 못쓰는 상태. I/O 등의 이벤트가 아직 완료되지 않아서.
- Suspended (stopped)
- 프로세스가 중기스케줄러에 의해 메모리에서 쫒겨난 상태
- 외부적인 이유로 프로세스의 수행이 정지된 상태
PCB
- 운영체제가 각 프로세스를 제어하기 위해
- 프로세스별로 중요한 정보를 저장해 놓는 곳
- 각 구성요소를 가짐
- OS가 관리상 사용하는 정보 (우선순위, 프로세스아이디,)
- CPU 수행 관련 하드웨어 값 (레지스터 등(프로세스가 인터럽트 이후 올바르게 작업하기 위해 참조한 값))
- 메모리 관련 (code/data/stack의 위치정보)
- 파일 관련 (오픈해서 쓰고있는 파일이 어떤건지)
스케줄러
어떤 프로세스에게 자원을 할당할지 결정하는 운영체제의 커널코드
- 장기 스케줄러/메모리 스케줄러
- 프로세스에 메모리를 주는 문제
- 보통 time sharing system에는 장기스케줄러가 없음
- 단기 스케줄러/CPU 스케줄러
- 어떤 프로세스에게 CPU를 할당하는 역할
- 중기 스케줄러
- 장기스케줄러가 없으니 메모리가 너무 부족할때, 여유공간을 위해
- 프로세스를 통째로 메모리 -> 디스크로 쫓아냄
프로세스 생성
- 부모 프로세스가 자식프로세스를 생성
- 둘은 별개의 프로세스라 각자 수행됨
- 주소공간
- 자식은 부모의 공간을 복사함
- 자식은 그 공간에 새로운 프로그램을 올림
- fork() 시스템 콜 : 새로운 프로세스 생성(복제)
- 부모를 그대로 복사, 주소 공간 할당
- fork 다음에 이어지는 exec() 시스템콜을 통해 새로운 프로그램을 메모리에 올림
프로세스 종료
- exit : 프로세스가 마지막 명령을 수행한 후 운영체제에게 이를 알려줌
- 자식이 부모에게 종료사실을 알림
- abort : 부모 프로세스가 자식의 수행을 종료시킴 (강제)
- 자식이 할당 자원의 한계치를 넘을 때
- 자식에게 할당된 일이 더이상 필요하지 않을 때
- 부모가 종료하는 경우
- 운영체제는 부모 프로세스가 종료하는경우 자식 종료 -> 부모종료 시킨다
- (단계적 종료)
fork() 시스템 콜
- 부모를 복제한 자식프로세스를 생성
- 복제품 구분하는법
- 부모 프로세스 : fork()의 pid값을 0보다 큰값으로 받음
- 자식프로세스 : fork()의 pid값을 0으로 받음
exec() 시스템 콜
- 새로운 프로세스의 이미지로 덮어씌운다
- fork()로 복제한다음 exec() 로 덮어씌울수 있음
wait() 시스템 콜
- 프로세스 A가 wait()을 호출하면 blocked 상태가 됨
- 커널은 자식이 종료할 때까지 프로세스A를 sleep 시킴
- 자식 프로세스가 종료되면 커널은 프로세스 A를 ready 로 만듬
exit() 시스템 콜
- 프로세스의 종료
- 자발적 종료 : 마지막 프로세스 이후 exit() 시스템콜을 통해 종료됨
- 비자발적 종료
- 부모 프로세스가 자식 프로세스를 강제 종료시킴
- 키보드로 kill, break 등을 친 경우
- 부모 프로세스가 종료되기 전에 자식들이 먼저 종료됨
프로세스 간 협력
- 독립적 프로세스 : 프로세스는 각자의 공간을 갖고 독립적으로 수행한다
- 협력 프로세스 : 하나의 프로세스가 다른 프로세스의 수행에 영향을 미침
- 프로세스 간 협력 메커니즘
- Message Passing : 메세지를 전달. ex. 운영체제가 매개가 되어 프로세스 A에게 프로세스 B의 메세지를 전달 (간접/비간접)
- Shared Memory : 운영체제가 매개가 되어 메모리를 공유함
- thread : 하나의 프로세스. 동일한 프로세스를 구성하는 스레드들간에는 주소공간을 공유하므로 협력은 가능하다
프로세스의 특성 분류
- I/O-bound process : CPU를 잡고 계산하는 시간보다 I/O에 많은 시간이 필요한 일
- CPU-bound process : CPU가 오랫동안 잡고있는 일
- CPU 스케줄링이 필요하다!
- CPU 스케줄러 : Ready 상태의 프로세스 중에 CPU를 줄 프로세스를 고름
- Dispatcher : CPU 제어권을 CPU 스케줄러에 의해 선택된 프로세스에게 넘김 (=문맥교환)
- Running -> Blocked (I/O 요청하는 시스템 콜)
- Running -> Ready (타임인터럽트) (강제)
- Blocked -> Ready (I/O 완료 후 타임인터럽트) (강제)
- Terminate (프로세스가 종료됬을 때)
- 스케줄링 기준
- 이용률, 처리량, 소요시간, 대기시간, 응답시간 (CPU가 얼마나 안 놀고 일하는지에 대한..)
쓰레드
- 프로세스 내부에서 CPU를 수행할 단위
- 구성 : 프로그램카운터/레지스터/함수호출과 관련된 stack
- 같은 프로세스 내 스레드들과 공유 (= task)
- 그 외의것. code, 메모리
- 스레드의 장점 : 응답성이 빠름
- 다중 스레드의 구조에선 하나의 서버 스레드가 blocked상태인 동안에도
- 그 내에 다른 스레드가 실행되어 빠른 처리가 가능
- 자원을 공유하는 효과 (동일 프로세스 안의 스레드들끼리 공유)
- 경제적 : 용량 프로세스 하나만드는게 오래걸리니 차라리 스레드를 만드는게 나음
- 병렬성
- 멀티 프로세스 구조에선 스레드들이 각자 병렬적으로 실행되서
- CPU가 여러개일때 병렬적으로 잘 사용될 수 있다
- 커널 스레드
- 스레드의 존재를 이미 운영체제가 알때. 미리 어떻게 넘길지 아는거.
- 사용자 스레드
- 운영체제가 스레드의 존재를 모름. 사용자 프로그램 실행.