It is What it is
로그인
It is What it is
로그인
[운영체제] 프로세스
.
·
2021년 7월 9일
팔로우
0
0
운영체제
목록 보기
3/6
프로세스 개념
프로세스 : 실행중인 프로그램
프로세스의 현재 상태는 프로그램 카운터값과 프로세서 레지스터의 내용으로 나타냄
프로세스는 스택, 힙, 데이터,프로그램 카운터를 포함한다
프로세스
텍스트 섹션 : 실행 코드
데이터 섹션 : 전역 변수
힙 섹션 : 프로그램 실행 중에 동적으로 할당되는 메모리
스택 섹션 : 함수를 호출할 대 임시 데이터 저장소 (함수 매개변수, 복귀 주소 및 지역 변수)
프로그램카운터 : 다음 실행할 명령어를 지정
실행파일(프로그램)이 메모리에 적재되면 프로세스가 됨
프로세스 상태
프로세스는 실행되면서 그 상태가 변함
생성(new) : 프로세스가 생성중
실행(run) : 명령어들이 실행중
대기(waiting) : 어떤 이벤트가 일어나기를 기다림
준비(ready) : 프로세스가 처리기에 할당되기를 기다림
종료(terminated) : 프로세스의 실행이 종료
대기중이거나 준비중인 프로세스는 많이 존재할 수 있지만 실행중인 프로세스는 딱 하나만 존재
프로세스 제어 블록
PCB : Process Control Blokc
각 프로세스는 운영체제에서 프로세스 제어 블록에 의해 표현됨
프로세스 상태 : new, ready, running, waiting, halted
프로그램 카운터 : 이 프로세스가 다음에 실행할 명령어 주소
CPU 레지스터들 : 누산기, 인덱스 레지스터, 스택 레지스터, 범용 레지스터, 상태 코드 정보가 포함. 나중에 프로세스가 다시 스케줄 될 때 올바른 실행을 위해 인터러브 발생 시 따로 저장되야 함
CPU 스케줄링 정보 : 프로세스 우선순위, 스케줄 큐에 대한 포인터, 매개변수 포함
-메모리 관련 정보 : 기준 레지스터, 한계 레지스터, 페이지 테이블, 세그먼트 테이블
회계 정보 : CPU 사용 시간, 경과된 실시간, 시간 제한, 잡, 프로세스 번호
입출력 상태 정보 : 프로세스에 할당된 입출력 장치들과 열린 파일 목록
프로세스 제어 블록은 약간의 회계 데이터와 함께 프로세스를 시작시키거나 다시 시작시키는 데 필요한 모든 데이터를 위한 저장소 역할을 함
프로세스 스케줄링
다중 프로그래밍의 목적 : CPU 이용을 최대화하기 위해 항상 어떤 프로세스가 실행되도록 함
시분할의 목적 : 각 프로그램이 실행되는 동안 사용자가 상호 작용할 수 있도록 함
이를 위해 프로세스 스케줄러는 코어에서 실행 가능한 여러 프로세스 중에서 하나의 프로세스를 선택
대부분의 프로세스는 I/O 바운드 CPU 바운드로 구분
I/O 바운드 프로세스는 I/O에 더 많은 시간을 소비
CPU 바운드 프로세스는 계산에 더 많은 시간을 소비
스케줄링 큐
프로세스가 시스템에 들어가면 준비 큐에 들어가 준비 상태가 되어 실행되기를 기다림
준비 큐는 연결리스트로 구성
헤더에는 첫번 째 PCB에 대한 포인터가 저장되고 각 PCB는 다음 PCB를 가리키는 포인터 필드를 포함
I/O 완료와 같은 특정 이벤트가 발생하기를 기다리는 프로세스는 대기 큐에 삽입
새 프로세스는 처음에 준비 큐에 놓임
프로세스는 실행을 위해 선택되거나 디스패치 될 때까지 기다림
프로세스에 CPU 코어가 할당되고 실행 상태가 되면 여러가지 이벤트 발생
프로세스가 I/O 요청을 보내고 I/O 대기 큐에 놓임
새 자식 프로세스를 만든 다음 다음 자식의 종료를 기다리는 동안 대키 큐에 놓임
인터럽트, 타임 슬라이스가 만료되어 준비 큐로 돌아감
프로세스는 종료될 때 까지 이 주기를 반복하다가 종료 되면 모든 큐에서 제거되고 PCB 및 자원을 반환
CPU 스케줄링
CPU 스케줄러 : 준비 큐에 있는 프로세스 중에서 선택된 하나의 프로세스에 CPU 코어를 할당
장기 스케줄러 : 디스크에서 준비 큐로 넣을 프로세스 선택
단기 스케줄러 : 준비 큐에 있는 프로세스 중 CPU 코어를 할당 할 프로세스 선택
단기 스케줄러가 장기 스케줄러보다 더 많이 발생
장기 스케줄러는 다중 프로그래밍의 정도를 제어 함 (메모리에 있는 프로세스 숫자)
장기 스케줄러가 I/O 바운드 프로세스와 CPU 바운드 프로세스를 적절하게 조합해야 함
시분할 시스템에서는 장기 스케줄러를 사용하지 않음
스와핑으로 알려진 중간 형태의 스케줄링 이용
메모리에서 프로세스를 제거하여 다중 프로그래밍 정도를 감소 시킴
문맥교환
인터럽트가 발생하면 시스템은 인터럽트 처리가 끝난 후 문맥을 복구 할 수 있도록 현재 실행중인 프로세스의 문맥을 저장 해야 함
CPU 코어를 다른 프로세스로 교환 할 때 이전의 프로세스 상태를 보관하고 새로운 프로세스의 보관된 상태를 복구 해야 함
프로세스에 대한 연산
대부분 프로세스들은 병행 실행될 수 있으며 동적으로 생성되고 제거됨
운영체제는 프로세스 생성 및 종료를 위한 기법을 제공
프로세스 생성
프로세스는 실행되는 동안 여러 개의 새로운 프로세스를 생성할 수 있음
부모 프로세스, 자식 프로세스로 나뉨
프로세스들은 계속해서 프로세스를 생성하며 트리 구조를 형성
프로세스들은 프로세스 식별자(pid)를 통해 구분
리눅스에서는 시스템이 부팅되면 pid가 1인 systemd 프로세스가 생성 됨
자원 분배
자식 프로세스가 자원을 얻는 3가지 방법이 존재
부모, 자식 프로세스가 모든 자원을 공유
부모 프로세스의 일부분만을 공유
부모 프로세스와 자원을 공유하지 않고 OS로부터 직접 얻음
실행
프로세스가 새로운 프로세스를 생성할 때 두가지 방법을 사용
부모는 자식과 병행하게 실행을 계속 실행
부모는 일부 또는 모든 자식이 실행을 종료할 때까지 기다림
주소
새로운 프로세스들은 주소 공간 측면에서 두가지 가능성이 있음
자식 프로세스는 부모 프로세스의 복사본 -> 똑같은 프로그램과 데이터를 지님
자식 프로세스가 자신에게 적재될 새로운 프로그램을 지님
UNIX 예제
fork 시스템 콜 : 새로운 프로세스 생성
exec 시스템 콜 : 프로세스의 주소 공간을 새로운 프로그램으로 바꿈
fork를 통해 새로운 프로세스 생성
새로운 프로세스는 부모 프로세스의 주소의 복사본을 지님
두개의 프로세스가 동시에 실행 됨
자식 프로세스에는 0이 반환되며 부모 프로세스에는 자식 프로세스의 PID 반환
exec는 2진 파일을 메모리에 적재하고 실행시킴
프로세스 종료
프로세스가 마지막 문장의 실행을 끝내고 exit 시스템 콜을 사용하여 운영체제에 자신의 삭제를 요청하면 종료함
이 시점에서 프로세스는 자신을 기다리는 부모 프로세스에 상태 값을 반환
프로세스의 모든 자원이 할당 해제되고 운영체제로 반납
부모 프로세스는 다음과 같은 이유로 자식 프로세스를 종료 시킬 수 있음
자식이 자신에게 할당된 자원을 초과하여 사용
자식에게 할당된 태스크가 더 이상 필요 없음
부모 프로세스가 exit를 할 때, 부모가 exit 한 후 자식이 실행하는 것을 허용하지 않는 경우
부모 자식을 종료할 때 자식 프로세스를 전부 종료 하는것을 연쇄식 종료라 부름
프로세스 간 통신
병행 프로세스들은 독립적이거나 협력적인 프로세스
독립적 프로세스 : 다른 프로세스들과 데이터를 공유하지 않음
협력적 프로세스 : 시스템에서 실행중인 다른 프로세스들과 영향을 주고 받음
프로세스 협력 허용 이유 : 정보 공유, 계산 가속화, 모듈성
IPC
IPC : InterProccess Communication
공유메모리, 메시지 전달 두가지 기법 존재
공유메모리 모델에서는 공유된 메모리에 데이터를 읽고 씀
메시지 전달 모델에서는 협력 프로세스들 사이에 교환되는 메시지를 통함
메시지 전달
충돌을 회피할 필요가 없어 적은 양의 데이터를 교환하기 유용
공유 메모리보다 구현하기 쉬움
시스템 콜을 사용해 커널 간섭 등의 부가적인 시간이 더 필요
공유 메모리
빠른 속도와 소통이 편리
메시지 전달 모델보다 속도가 더 빠름
공유 메모리 영역을 구축할 때만 시스템 콜 사용
공유 메모리 시스템에서의 프로세스 간 통신
통신하는 프로세스들이 공유 메모리 영역을 구축
공유 메모리 영역은 공유 메모리 세그먼트를 생성하는 프로세스의 주소 공간에 위치
다른 프로세스들은 이 세그먼트를 자신의 주소 공간에 추가
일반적으로 OS는 한 프로세스가 다른 프로세스의 메모리에 접근하는 것을 금지
공유 메모리는 둘 이상의 프로세스가 이 제약조건을 제거하는 것에 동의
그 후 프로세스들은 공유 영역에 읽고 씀으로써 정보를 교환
생산자-소비자 문제
생산자 프로세스는 정보를 생산하고 소비자 프로세스는 정보를 소비함
컴파일러는 어셈블리 언어를 생산하고 어셈블러는 이를 소비
생산자와 프로세는 동시에 실행되며 공유 메모리(버퍼)를 통해 소통
생산자와 소비자가 반드시 동기화되어야 생산되지 않은 항목들을 소비자가 소비하려고 시도하지 않음
무한 버퍼(unbounded buffer), 유한 버퍼(bounded buffer) 존재
무한 버퍼는 버퍼의 크기에 한계 X
유한 버퍼는 버퍼의 크기가 고정되어 있어 버퍼가 비어 있으면 소비자는 대기하고 버퍼가 채워져 있으면 생산자가 대기
공유 버퍼는 두개의 논리 포인터 in과 out을 지닌 원형 배열로 구성
메시지 전달 시스템에서의 프로세스 간 통신
메시지 전달 방식은 동일한 주소 공간을 공유하지 않고 프로세스들이 통신을 하고 동작을 동기화할 수 있도록 허용하는 기법 제공
프로세스들이 네트워크에 의해 연결된 다른 컴퓨터에 존재할 수 있는 분산환경에서 유용
send, receive 명령을 이용
프로세스들이 통신을 원하면 이들 사이에 통신 연결이 설정되어야 함
send, receive 연산을 논리적으로 구현하는 방법은 다음과 같음
직접 vs 간접
동기식 vs 비동기식
자동 vs 명시적 버퍼링
직접 연결
통신을 원하는 각 프로세스는 통신의 수신자, 송신자 이름을 명시
프로세스들은 상대의 신원을 알면 자동으로 연결이 구축 됨
연결은 두 프로세스 사이에만 연관
통신하는 프로세스들의 각 쌍 사이에는 정확이 하나의 연결이 존재
대칭성 : 송신자와 수신자 프로세스가 모두 통신을 위해 상대방의 이름을 제시
비대칭성 : 송신자만 수신자의 이름을 지명
모듈성을 제한한다는 단점이 존재
프로세스의 이름을 바꾸면 모든 다른 프로세스의 지정 부분을 검사해야 함
간접 연결은 메일 박스를 통해 이루어짐
동기화
봉쇄형(blocking)
봉쇄형은 동기식이라고도 불림
송신 프로세스는 메시지가 수신 프로세스 또는 메일박스에 수신될 때까지 봉쇄 됨
수신 프로세스는 메시지가 이용 가능할 때까지 봉쇄
봉쇄형 메시지 전달을 사용하면 생산자-소비자 문제가 간단히 해결 됨
비봉쇄형(non-blocking)
비봉쇄형은 비동기식이라고도 불림
송신 프로세스가 메시지를 보내고 작업을 재시작
수신 프로세스가 유효한 메시지 또는 null을 받음
버퍼링
통신하는 프로세스들에 의해 교환되는 메시지들은 임시 큐에 들어가 있음
무용량 큐 : 송신자는 수신자가 메시지를 수신할 때까지 기다림
유한 용량 큐 : 큐는 n의 길이를 지니며 최대 n개의 메시지를 받을 수 있음
링크가 만원이면 송신자는 큐 안에 공간이 이용 가능할 때까지 봉쇄 됨
무한 용량 큐 : 송신자는 봉쇄되지 않음
무용량은 버퍼가 없는 메시지 시스템이라 불리고 다른 두가지는 자동 버퍼링이라 불림
클라이언트 서버 환경에서의 통신
소켓을 활용한 통신
아이피 주소, 포트 번호를 접합해 구별
두가지 이상의 소켓을 통해 통신함
TCP, UDP 통신이 존재
JAVA에서는 TCP 소켓은 Socket 클래스로 구현
UDP 소켓은 DatagramSocket 클래스로 구현
원격 프로시저 호출
RPC : Remote Procedure Calls
IPC와 유사하며 IPC 기반 위에 만들어짐
전달되는 메시지들은 구조화 되어 있음
스텁 : 클라이언트에 제공되며 필요한 자세한 사항을 숨겨줌
클라이언트가 원격 프로시저를 호출하면 RPC는 그에 대응하는 스텁을 호출하고 필요로 하는 매개변수를 건내 줌
스텁이 원격 서버의 포트를 찾고 매개 변수를 정돈 해 메시지를 전달
서버 측 스텁은 메시지를 수신한 후 적절한 서버의 프로시저를 호출한 후 반환 값을 도려줌
.
지금부터 공부하고 개발한것들을 꾸준하게 기록하자.
팔로우
이전 포스트
[운영체제] 운영체제 구조
다음 포스트
[운영체제] 스레드와 병행성
0개의 댓글
댓글 작성
관련 채용 정보