먼저 프로그램과 프로세스의 차이부터 설명해보자면,
프로그램은 저장장치에 저장되어 있는 정적인 상태이고, 프로세스는 실행을 위해 메모리에 올라온 동적인 상태입니다.
우선 운영체제는 프로그램을 메모리의 적당한 위치로 가져오고, 동시에 작업 지시서를 만드는데 이를 PCB(프로세스 제어블록)이라고 합니다. 이 프로세스 제어블록에는 프로세스를 처리할때 필요한 다양한 정보가 들어있습니다. 이 프로세스 제어블록이 없다면 프로그램이 프로세스로 전환되지 못합니다.
즉 프로그램이 프로세스가 된다는 것은 운영체제로부터 프로세스 제어블록을 얻는다는 뜻이고, 프로세스가 종료된다는 것은 해당 프로세스 제어 블록이 폐기된다는 뜻입니다.
프로세스 = 프로그램 + 프로세스 제어 블록
프로그램 = 프로세스 - 프로세스 제어블록
* 프로세스 제어블록은 프로세스를 실행하는데 필요한 중요한 정보를 보관하는 자료 구조로 TCB라고 합니다. 이 PCB에는 포인터, 프로세스 상태, 프로세스 구분자, 프로그램 카운터, 프로그램 우선순위, 각종 레지스터 정보, 메모리 관리 정보, 할당된 자원 정보, 계정 정보등이 들어있습니다.
프로세스의 상태
상태 | 설명 |
생성 상태 | 프로그램을 메모리에 가져와 실행 준비가 완료된 상태입니다. 이때 프로세스 제어 블록이 생성됩니다. |
준비 상태 | 실행을 기다리는 모든 프로세스가 자기 차례를 기다리는 상태입니다. 실행될 프로세스를 CPU 스케쥴러가 선택합니다. |
실행 상태 | 선택된 프로세스가 타임 슬라이스를 얻어 CPU를 사용하는 상태입니다. |
대기 상태 | 실행 상태에 있는 프로세스가 입출력을 요청하면 완료될때까지 기다리는 상태입니다. 입출력이 완료되면 준비상태로 갑니다. |
완료 상태 | 프로세스가 종료된 상태입니다. 메모리에서 삭제되고 프로세스 제어블록도 삭제 됩니다. |
*Context Switching(문맥교환)
문맥교환은 CPU를 차지하던 프로세스가 나가고 새로운 프로세스를 받아들이는 작업을 말합니다. 이때 두 프로세스 제어 블록의 내용이 변경됩니다. 실행 상태에서 나가는 프로세스 제어블록에는 지금까지의 작업 내용을 저장하고 반대로 실행 상태로 들어오는 프로세스 제어블록의 내용으로 CPU가 다시 셋팅됩니다. 이처럼 두 프로세스의 프로세스 제어 블록을 교환하는 작업을 문맥교환이라고 부릅니다.
프로세스의 복사와 전환
fork() 시스템 호출 | 실행중인 프로세스로부터 새로운 프로세스를 복사하는 함수입니다. ex) 크롬 브라우저에서 새로운 크롬 더 생성하기 -> 크롬 프로세스를 복사한 것으로 복사할 때 기존의 프로세스는 부모 프로세스가 되고 새로 생긴 프로세스는 자식 프로세스가 됩니다. PID, PPID(부모 ID),CPID, 메모리 관련 정보가 바뀝니다. |
exec() 시스템 호출 | 기존의 프로세스를 새로운 프로세스로 전환하는 함수입니다. 프로세스는 그대로 둔체 내용만 바꾸는 시스템 호출입니다. 목적은 프로세스의 구조체를 재활용하기 위합입니다. 새 프로세스를 만드려면 pcb를 만들고 메모리의 자리를 확보해야하고, 사용한 메모리를 청소하기 위해 상위 프로세스와 부모-자식 관계를 만들어야 합니다. 이때 exec()시스템 호출을 사용하면 이미 만들어진 프로세스 제어블록, 메모리 영역, 부모-자식 관계를 그대로 사용할 수 있습니다. 새로운 코드 영역만 가져오면 되기 때문에 운영체제의 작업이 수월해집니다. pcb의 pid, ppid, cpid등 프로세스 구분자는 그대로이고 내용만이 바뀝니다. (새로운 코드, 새로운 데이터, 스택영역 리셋) |
프로세스의 구조
프로세스는 코드영역, 데이터영역, 스택 영역으로 나뉩니다.
코드 영역은 프로그램의 본문이 기술된 곳으로, 텍스트 영역이라고 합니다. 프로그래머가 작성한 프로그램은 코드 영역에 올려집니다. ex) 워드프로그램
데이터 영역은 코드가 실행되면서 사용하는 변수나 파일등의 각종 데이터를 모아놓은 곳입니다 .
ex) 워드 프로그램에서 편집중인 문서
스택 영역은 운영체제가 프로세스를 실행하기 위해 부수적으로 필요한 데이터를 모아놓은 곳입니다.
ex) 워드 프로그램을 작동시키기 위해 필요한 부가 데이터
스레드
스레드란 프로세스의 코드에 정의된 절차에 따라 CPU에 작업 요청을 하는 실행단위입니다. (CPU 스케쥴러가 CPU에 전달하는 일 하나를 스레드라고 하며, 하나의 프로세스에는 여러개의 스레드가 존재합니다)
* 멀티태스크
워드 프로세스와 프린터는 서로 독립적으로 작동하다가 필요할 때 출력할 데이터를 주고받습니다. 서로 독립적이라는 것은 워드 프로세스가 비정상적으로 종료되어도 프린터는 멀쩡히 작동하는 것을 의미하죠. 즉 프로세스간 간섭이 일어나지 않습니다.
*멀티 스레드
멀티 스레드는 프로세스 내 작업을 여러개의 스레드로 분할함으로써 작업의 부담을 줄이는 프로세스 운영기법입니다.
예를 들어 워드 프로세서의 프로세스 내에서는 문서 편집, 문서 입출력, 그림판 같은 스레드들이 동시에 작업됩니다. 이 스레드들은 강하게 연결되어 있어 워드가 종료되면 프로세스 내의 스레드도 강제로 종료됩니다. 이처럼 멀티 스레드는 변수나 파일들을 공유하고 전역변수나 함수 호출등의 방법으로 스레드 간의 통신을 합니다.
* 멀티태스킹
멀티 태스킹은 운영체제가 CPU에 작업을 줄 때 시간을 잘게 나누어 배분하는 기법으로, 이렇게 여러 스레드에 시간을 잘게 나누어 주는 시스템을 시분할 시스템이라고 합니다. 시분할 시스템에서 운영체제가 CPU에 전달하는 작업은 프로세스가 아니라 스레드입니다.
* 멀티 프로세싱
멀티 프로세싱은 cpu를 여러개 사용하여 여러개의 스레드를 동시에 처리하는 작업환경입니다.
멀티 스레드
워드 프로세서와 같은 문서 편집기나 인터넷 익스플로러 같은 웹 브라우저의 경우 여러개의 작업을 동시에 진행하곤 합니다. 이렇게 동시에 작업을 하는경우 fork()시스템 호출로 프로세스를 여러개 만든다면 워드프로세서의 코드 일부, 프로세스 제어 블록, 공유 변수가 메모리의 여러 곳에 중복되어 메모리가 낭비됩니다. 스레드는 이러한 멀티태스킹의 낭비 요소를 제거하기 위해 사용되며 2개 이상의 프로세스를 만드는 것보다 코드,데이터등을 공유하면서 여러개의 일을 하나의 프로세스 내에서 하는 것이지요,
즉 멀티스레드는 스택 영역을 제외한 모든 영역을 공유하기 때문에 통신의 부담이 적어 응답시간이 빨라지고, 문맥교환을 할 때 공유하고 있는 메모리 만큼의 메모리 자원을 아낄 수 있습니다.
다만 스레드끼리 끈끈하게 연결되어있으므로 프로세스 내 자원을 망쳐버리면 모든 프로세스가 종료될 수도 있습니다. ex) 인터넷 익스플로러 여러개 띄워놓았는데, 하나에서 문제 생기면 인터넷 익스플로러가 모두 종료되는 상황 / 반면 크롬은 각 화면이 독립적인 프로세스여서 그 중 하나에 문제가 생겨도 다른 화면에 미치는 영향이 작다고 합니다...
또한 자원을 공유하기 때문에 동기화 문제가 발생할 수 있습니다.
참고하면 좋은 글:)
'CS > Operating Systems' 카테고리의 다른 글
동시성과 병렬성 (0) | 2023.09.01 |
---|---|
교착 상태 (0) | 2021.09.26 |
프로세스 주소공간 (0) | 2021.08.18 |
운영체제 (0) | 2021.08.01 |
다양한 페이지 교체 알고리즘 (0) | 2021.02.05 |