티스토리 뷰

반응형

프로세스의 개요

프로세스의 개념

프로그램

 - 저장장치에 저장되어있는 정적인 상태

 

프로세스

 - 실행을 위해 메모리에 올라온 동적인 상태

 

일괄작업 방식

 - 메모리위에 여러 프로세스를 올리고 순서대로 처리해주고 순서대로 주문 리스트에서 삭제 -> 순서를 정하는데에 큐 사용

 

시분할 방식

 - 메모리 위 여러 프로세스를 올리고 동시에 진행함 -> 모든 작업을 처리하고 주문 리스트 비움

 

프로세스 제어 블록(PCB)

 - 운영체제가 해당 프로세스를 위해 관리하는 자료구조

   - 프로세스 구분자 : 각 프로세스를 구분하는 구분자

   - 메모리 관련 정보 : 프로세스의 메모리 위치 정보

   - 각종 중간값 : 프로세스가 사용했던 중간값(cpu 레지스터에 들어있던 값)

 

프로세스와 프로그램의 관계

 - 프로그램이 프로세스가 된다는 것은 운영체제로부터 프로세스 제어 블록을 얻는다는 뜻

 - 프로세스가 종료된다는것은 해당 프로세스 제어블록이 폐기된다는 뜻

 

프로세스의 네 가지 상태

 - 생성상태 : 프로세스가 메모리에 올라와 실행 준비를 완료한 상태

 - 준비상태 : 생성된 프로세스가 CPU를 얻을 때까지 기다리는 상태

 - 실행상태 : 준비 상태에 있는 프로세스 중 하나가 CPU를 얻어 실제 작업을 수행하는 상태

 - 완료상태 : 실행 상태의 프로세스가 주어진 시간 동안 작업을 마치면 진입하는 상태(프로세스 제어 블록이 사라진 상태)

 

 + 대기상태 : 실행과 완료 사이에 입출력이 완료될 때까지 기다리는 상태

 + 휴식상태 : 프로세스가 일시적으로 쉬고 있는 상태, 종료가 아니라 원할때 다시 시작할 수 있음

 + 보류상태 : 프로세스가 메모리에서 잠시 쫒겨난 상태

                    ex) 메모리가 다 찬 경우, 프로그램 오류발생으로 실행을 미룰 경우, 바이러스같은 프로세스라고 판단 되었을 경우 등

 

 

프로세스 제어 블록

프로세스 제어 블록

 - 프로세스를 실행하는데 필요한 중요한 정보를 보관하는 자료 구조

 - 프로세스는 고유의 프로세스 제어 블록을 가짐

 - 프로세스 생성 시 만들어져서 프로세스가 실핼을 완료하면 폐기

 

프로세스 제어 블록의 구성

 - 포인터 : 준비 상태나 대기 상태의 큐를 구현할 때 사용

 - 프로세스 상태 : 프로세스가 현재 어떤 상태에 있는지를 나타내는 정보

 - 프로세스 구분자 : 운영체제 내에 있는 여러 프로세스를 구현하기 위한 구분자

 - 프로그램 카운터 : 다음에 실행될 명령어의 위치를 가르키는 프로그램 카운터의 값

 - 프로세스 우선순위 : 프로세스의 실행 순서를 결정하는 우선순위

 - 각종 레지스터 정보 : 프로세스가 실행되는 중에 사용하던 레지스터의 값

 - 메모리 관리 정보 : 프로세스의 메모리가 어디에 있는지 나타내는 메모리의 위치정보, 경계레지스터, 한계레지스터 값 등

 - 할당된 자원 정보 : 프로세스를 실행하기 위해 사용하는 입출력 자원이나 오픈 파일 등에 대한 정보

 - 계정정보 : 계정번호 cpu 할당 시간, cpu 사용 정보 등

 - 부모 프로세스 구분자와 자식 프로세스 구분자 : 부모 프로세스를 가르키는 PPID와 자식 프로세스를 가르키는 CPID정보

 

포인터

 - 대기상태에는 같은 입출력을 요구한 프로세스끼리 연결할 때 포인터 사용

 

문맥교환

문맥교환

 - cpu를 차지하던 프로세스가 나가고 새로운 프로세스를 받아들이는 작업

 - 나가는 프로세스 제어블록에는 지금까지의 작업내용을 저장하고 들어오는 프로세스 제어블록의 내용으로 cpu가 다시 세팅

 

문맥 교환 과정

 

프로세스의 구조

프로세스의 구조

 - 코드영역(읽기전용), 데이터 영역(읽기/쓰기, 전역변수), 스택 영역(숨김 영역. 지역변수)

 

코드영역

 - 프로그램의 본문이 기재된 곳

 - 프로그래머가 작성한 코드가 탑재되며 탑재된 코드는 읽기 전용으로 처리되

 

데이터 영역

 - 코드가 실행되면서 사용하는 변수나 파일 등의 각종 데이터를 모아놓은곳

 - 데이터는 변하는 값이기 때문에 이곳의 내용은 기본적으로 읽기와 쓰기가 가능

 

스택 영역

 - 운영체제가 프로세스를 실행하기 위해 부수적으로 필요한 데이터를 모아놓는 곳

 - 프로세스 내에서 함수를 호출하면 함수를 수행하고 원래 프로그래으로 되돌아올 위치를 이 영역에 저장

 - 운영체제가 사용자의 프로세스를 작동하기 위해 유지하는 영역이므로 사용자에게는 보이지 않음

 

fork() 시스템 호출의 개념

 - 실행중인 프로세스로부터 새로운 프로세스를 복사(리눅스에서)

 - 실행중이던 프로세스가 부모 프로세스(PPID), 새로생긴 프로세스가 자식 프로세스(CPID)

 

fork() 시스테 호출의 장점

 - 프로세스의 생성속도가 빠름

 - 추가 작업 없이 자원을 상속할 수 있음

 - 시스템 관리를 효율적으로 할 수 있음

 

exec() 시스템 호출의 개념

 - 기존의 프로세스를 새로운 프로세스로 전환(재사용)하는 함수

  - fork() : 새로운 프로세스를 복사하는 시스템 호출

  - exec() : 프로세스는 그대로 둔 채 내용만 바꾸는 시스템 호출

 

유닉스 프로세스 계층 구조

 - 유닉스의 모든 프로세스는 init 프로세스의 자식이 되어 트리 구조를 이룸

 

프로세스 계층 구조의 장점

 - 여러 작업을 동시에 처리 할 수 있다.

 - 프로세스의 재사용이 용이하다.

 - 자원 회수가 쉽다.

   - 프로세스를 계층 구조로 만들려면 프로세스 간의 책임 관계가 분명해져서 시스템을 관리하기가 수월함

 

고아 프로세스

 - 프로세스가 종료된 후에도 비정사적으로 남아 있는 프로세스 중 부모 프로세스가 자식보다 먼저 죽는 경우

 - c언어의 exit()이나 return()문은 자식 프로세스가 작업이 끝남을을 부모 프로세스에 알리는 것으로 고아 프로세스 발생을 방지함

 

스레드의 개념

스레드의 정의

 - cpu 스케쥴러가 cpu에 전달하는 일 하나

 - cpu가 처리하는 작업의 단위는 프로세스로부터 전달받은 스레드

   - 운영체제 입장에서의 작업 단위는 프로세스

   - cpu입장에서의 작업 단위는 스레드

 

프로세스와 스레드의 차이

 - 프로세스끼리는 약하게 연결되어있는 반면 스레드 끼리는 강하게 연결되어있음

 

멀티태스크와 멀티스레드의 차이

 - 멀티 태스크 : 여러 개의 프로세스로 구성된 것

 - 멀티 스레드 : 하나의 프로세스에 여러개의 스레드로 구성된 것

 

멀티 스레드

 - 프로세스 내 작업을 여러 개의 스레드로 분할 함으로써 작업의 부담을 줄이는 프로세스 운영기법

 

멀티 태스킹

 - 운영체제가 cpu에 작업을 줄 때 시간을 잘게 나누어 배분하는 기법(시분할)

 

멀티프로세싱

 - cpu를 여러개 사용하여 여러개의 스레드를 동시에 처리하는 작업 환경

 

CPU 멀티 스레드

 - 한번에 하나씩 처리해야 하는 스레드를 파이프라인 기법을 이용하여 동시에 여러 스레드를 처리하도록 만든 병렬처리 기법

   - 멀티 스레드 : 운영체제가 소프웨어적으로 프로세스를 작은 단위의 스레드로 분할하여 운영

   - cpu 멀티 스레드 : 하드웨어적인 방법으로 하나의 cpu에서 여러 스레드를 동시에 처리하는 병렬 처리 기법

 

멀티 태스킹의 낭비 요소

 - fork() 시스템 호출로 프로세스를 복사하면 데이터 영역의 일부가 중복되어 존재, 서로 독립적이라 낭비 요소를 제거할 수 없음

 

멀티 태스킹과 멀티 스레드의 차이

 - fork() 시스템 호출로 여러 개의 프로세스를 만들면 필요 없는 정적 영역이 여러 개가 됨

 - 멀티스레드는 코드, 파일 등의 자원을 공유함으로써 자원의 낭비를 막고 효율성 향상

 

멀티스레드의 장점

 - 응답성 향상

 - 자원 공유

 - 효율성 향상

 - 다중 CPU 지원 //동시에 사용하는 것 처럼 사용 가능

 

멀티스레드의 단점

 - 모든 스레드가 자원을 공유하기 때문에 한 스레드에 문제가 생기면 전체 프로세스에 영향을 미침

 - 인터넷 익스플로러에서 여러 개의 화면을 동시에 띄웠는데 그중 하나에 문제가 생기면 인터넷 익스플로러 전체가 종료

 

커널 스레드와 사용자 스레드

 - 커널스레드 : 커널이 직접 생성하고 관리하는 스레드

 - 사용자 스레드 : 라이브러리에 의해 구현된 일반적인 스레드

 

사용자 스레드

 - 사용자 프로세스 내에 여러 스레드가 커널 스레드 하나와 연결(1 to N)

 - 라이브러리가 직접 스케쥴링 하고 작업에 필요한 정보를 처리하기 때문에 문맥 교환이 필요 없음

 - 커널 스레드가 입출력 작업을 위해 대기 상태에 들어가면 모든사용자 스레드가 같이 대기하게 됨

 - 한 프로세스의 타임 슬라이스를 여러 스레드가 공유하기 때문에 여러 개의 cpu를 동시에 사용할 수 없음

 

커널스레드

 - 하나의 사용자 스레드가 하나의 커널 스레드와 연결 (1 to 1)

 - 독립적으로 스케쥴링이 되므로 특정 스레드가 대기 상태에 들어가도 다른 스레드는 작업을 계속할 수 있음

 - 커널 레벨에서 모든 작업을 지원하기 때문에 멀티 CPU를 사용할 수 있음

 - 하나의 스레드가 대기 상태에 있어도 다른 스레드는 작업을 계속 할 수 있음

 

멀티 레벨 스레드

 - 사용자 레벨 스레드와 커널 레벨 스레드를 혼합한 방식 (M to N)

 - 커널 스레드가 대기 상태에 들어가면 다른 커널 스레드가 대신 작업을 하여 사용자 레벨 스레드보다 유연하게 작업을 처리할 수 있음

 - 커널 레벨 스레드를 같이 사용하기 때문에 여전히 문맥 교환 시 오버헤드가 있어 사용자 레벨 스레드만큼 빠르지 않음

 - 빠르게 움직여야 하는 스레드는 사용자 레벨 스레드로 작동하고, 안정적으로 움직여야 하는 스레드는 커널 레벨 스레드로 작동

 

프로세스의 동적 할당 영역

프로세스의 구조

 - 코드영역 : 프로그램의 본체가 있는곳

 - 데이터영역 : 프로그램이 사용하려고 정의한 변수와 데이터가 있는곳

 - 스택 영역과 힙 영역 : 프로세스가 실행되는 동안 만들어지는 영역으로, 그 크기가 늘어났다 줄어들기도 하는 동적 할당 영역

 

스택 영역

 - 스레드가 작동하는 동안 추가되거나 삭제되는 동적 할당 영역

 - 스레드가 진행됨에 따라 커지기도 하고 작아지기도 함

 

힙 영역

 - 프로그램이 실행되는 동안 할당되는 변수 영역

 - 포인터, malloc()함수, calloc() 함수 등은 메모리를 효율적으로 사용하기 위해 만들어진 것으로 어쩌다 한 번 쓰는 큰 배열을 처음부터 선언하고 끝까지 놔두는 일이 없어야함

 

exit() 시스템 호출

 - 작업의 종료를 알려주는 시스템 호출

 - exit() 함수를 선언함으로써 부모 프로세스는 자식 프로세스가 사용하던 자원을 빨리 거둬 갈 수 있음

 - exit() 함수는 전달하는 인자를 확인하여 자식 프로세스가 어떤 상태로 종료되었는지를 알려주는데, 인자가 0이면 정상 종료이고, -1 이면 비정상 종료임.

wait() 시스템 호출

 - 자식 프로세스가 끝나기를 기다렸다가 자식 프로세스가 종료되면 다음 문장을 실행하는 시스템 호출

 - 부모 프로세스와 자식 프로세스 간 동기화에도 사용

 

wait() 함수의 응용

 - 전면 프로세스에서는 셸이 wait() 함수를 사용하기 때문에 자식 프로세스가 끝날 때까지 다음 명령어를 입력받을 수 없음

 - 후면 프로세스에서는 셸이 wait() 함수를 사용하지 않기 때문에 다음 명령어를 받아 들일 수 있음.

 

*전면 프로세스: 사용자의 표준 입력을 받을 수 있는 프로세스

*후면 프로세스: 실행중이지만 사용자의 표준입력을 받을 수 없음.

 

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함