프로세스와 쓰레드

2022. 11. 9. 16:52cs 상식/운영체제

프로그램과 프로세스

 

프로그램? 

프로그램은 하드디트스 등과 같은 저장장치에 저장된 명령문의 집합체이다.

ex)애플리케이션 ,앱 , 윈도우 운영체제(.exe)와 같다 .

 

 

프로세스?

 

실행중인 프로그램 이다.

ex) 저장장치(HDD,SSD) 하드디스크에 저장된 프로그램이 메모리에 올라 갔을때 (RAM)  실행중인  프로그래 프로세스라고 한다.

  • 프로그램: 컴퓨터에서 하드디스크 즉 저장장치만 이용하는 수동적인 존재이다.
  • 프로세스: 메모리도 사용하고 운영체제의 CPU스케줄링 알고리즘에 따라서 CPU도 사용하고 입출력 작업도 하는 능동적인 존재이다.

 

프로세스 구조?

 

 

프로세스 구조: 

  • 코드영역: 자신이 실행하는  코드가 저장되어 있다.
  • DATA: 전역, static 변수 저장 되어 있다.
  • STACK:지역변수 int a=1; 함수 호출시 매개변수와 돌아갈 주소가 저장됨
  • HEAP:프로그래머가 런타임시 할당할수 있는 메모리 공간

 

작성한 코드가 메모리에 올라가서 프로세스가 되는 과정

 

. JAVA 코드 -> 컴파일-> .class 파일 하드디스크에 저장-> JVM에 의해 -> 바이트 코드 , 클래스 로딩이 된다.

 

 

 

 

  1. .exe 파일을 클릭시  파일이 메모리에 올라간다.
  2. 올라간 프로그램은=> 프로세스라고 불린다.
  3. 운영체제에 의해 관리가 된다 .
  4. cpu관점에서 보면 cpu는 기계어만 해석 가능 하다 (어셈블리어)
  5. cpu 내에 제어장치가 숫자 5와7을 메모리에 저장 시킨다.
  6. 이 저장된 값을 edx,eax레지스터로 가져온다.
  7. 제어장치가 레지스터에 저장된 5와 7을 가지고 더하라고 명령을 하면  
  8. 산술 논리 연산장치가 두 숫자를 더하고
  9. 그결과는 eax레지스터에 저장한다. 
  10. 다시 제어장치가 저장된 12값을 가져와서 메모리에 저장 시킨다.

 

 

멀티 프로그래밍과 멀티 프로세싱

 

유니 프로그래밍과 멀티프로세싱?

 

 

 

유니 프로그래밍: 오직 메모리에 하나의 프로세스가 올라온 것

멀티 프로그래밍: 메모리에 여러개의 프로세스가 올라온 것

 

 

 

멀티프로세싱?

 

 

 

 

멀티 프로세싱은  cpu관점에서 여려 개의 프로세스를 처리하는 것을 말한다.

-오늘날의 OS는 멀티 프로그래밍과 멀티 프로세싱이 공존한다.

메모리에는 여러개의 프로세스가 올라온다.

멀티 프로그래밍이 있고 CPU 시분활 처리로 CPU가 각각의 프로세스를 교대로 짧은 시간 동안 실행하는

멀티 프로세싱이 있다.

 

 

 

 

-과거 에는 메모리의 프로그램이 작아서 멀티 프로그래밍이 불과 했지만, 유니 프로그래밍을 하면서 멀티 프로세싱을

이용했다. 메모리는 프로세스를 올려서 CPU가 처리하고 그 프로세스를 다른 저장 장치에 저장한다.저장장치에 있던 것을

다시 메모리에 올려서 CPU로 처리 하는  것을 스와핑(Swapping)이라고 한다.

 

 

 

PCB

 

 

 

운영체제는 여려개의 프로세스를 공평하게 실행시켜줘야 한다.

프로세스를 만들어지면 운영체제는  해당 프로세스의 정보를 가지고 있는 PCB를 만들고 저장한다.

 

이것은 연결리스트라는 자료구조로 저장이 된다.

운영체제는 프로세스가 종료되면 연결리스트에서 해당 프로세스의 PCB를 제거

 

PUB 구조?

 

  • 포인터: 부모와 자식 프로세스에 대한 포인터와 할당된 자원에 대한 포인터등이 있다.   프로세스의 한 상태에서 다른 상태로 전환할때 저장하는 포인터를 가지고 있다.
  • 프로세스 상태: 프로세스의 다섯가지 상태를  생성 , 준비,실행,대기,완료 이렇게 나타낸다.
  • 프로세스 ID:  프로세스를 식별하기 위한 아이디 숫자가 저장이 된다.
  • 프로그램 카운터: 다음에 실행될 명령어의 주소를 포함하는 프로그램 카운터를 저장한다. 오늘날 OS는 시분할 처리로 여러 프로세스를 짧은 시간동안 번갈아 처리한다, 어떤 프로세스가 처리하다가  다른 프로세스에게 CPU를 뺏기고 다시 실행될 때  원래 실행하던 명령어가 다시 실행되어야 하기 때문에  필요하다.
  • 레지스터 정보: 프로그램 카운터와 마찬가지로 CPU를 뻇기고 다시 시작할때 이전에 사용하던 값을 복구하기 위한 용도
  • 메모리 관련 정보: 프로세스가 메모리에 있는 위치 정보 메모리 침범을 막기위한 경계 레지스터 같은 값들이 저장이 된다.
  • CPU스케줄링 정보: CPU스케줄링에 필요한 우선 순위 최종 실행시간,CPU점유 시간 등이 저장됩니다.

 

 

 

 

프로세스 상태

 

사용자가 프로그램을 실행시키면 메모리에 올라가면서 프로세스가 생성이 된다.
오늘날에 운영체제에도 수많은 프로세스가 실행 된다.



작업관리자=>프로세스가 돌아가는 것 확인

시분활 시스템: 운영체제는 여러개의 프로세스를 돌아가면서 실행한다.

 

CPU: CPU는 한순간에는 하나의 프로세스 밖에 처리 하지 못합니다. 근데 그 처리 속도가 너무 빨라 동시에 처리하는 줄 사람들이 알고 있습니다. 프로세스는 시분활 처리를 위한 5가지 상태를 가지고 있다. 

이것은 프로세스 상태 (생성,준비, 대기 ,실행, 완료)상태가 있습니다.

 

 

생성상태

: PCB를 생성하고 메모리에 프로그램 적재를 요청한 상태이다.

준비상태

:메모리에 프로그램 적재를 승인 받으면 준비상태가 된다, CPU를 사용하기 위해 기다리는 상태

실행상태

:CPU스케줄러에 의해 할당 받으면, 실해 상태가 된다 CPU의 갯수에 따라 프로세스 한개이다.

무한정 사용이 아니라 부여 시간 동안에만 사용 , 시간이 되면 다시 빼앗고 그러면 해당 프로세스는 다시 준비 상태로 돌아간다.

대기상태

:프로세스가 입출력 요청을 하면 입출력이 완료될때 까지 기다리는 상태이다.

 

 

대기상태? 왜  있는가

입출력 작업은 CPU비해 느리다 특정프로세스가 입출력 완료 될때 까지 기다리는 것은 시간 소비다 , 

그래서 대기로 두고 인터럽트해서 다른 프로세스에게 넘긴다, 그러다 입출력이 다 되면 대기 상태에 프로세스에게

CPU를준다,.

 

완료상태

:프로세스가 종료된 상태이다.

프로세스가 사용했던 데이터를 메모리에서 제거하고 생성된 PCB도 제거한다.

 

 

컨텍스트 스위칭

 

컨텍스트 스위칭?

프로세스를 실행하는 중에 다른 프로세스를 실행하기 위해 실행중인 프로세스의 상태를 저장하고 다른 프로세스의 

상태 값으로 교체하는 작업

 

 

 

:컨텍스트 스위칭이 일어날때 PCB의 내용이 변경됩니다.

실행중인 프로세스의 작업 내용의 PCB에 저장하고 

실행될 기존 프로세스의 PCB의 내용대로 CPU가 다시 세팅된다.

 

 

컨텍스트 스위칭이 실행 될때 ?

컨텍스트 스위칭이 일어날때 PCB에 변경하는 값들로는 프로세스 상태, 다음 실행할 명령어의 주소를 가지고 있는

프로그램 카운터, 각종 레지스터 정보와 , 메모리 관련 정보 값이 있다.

 

 

 

 

 

 

 

컨텍스트 스위칭이 발생하는 이유?

 

CPU점유시간이 다되거나,입출력 요청이 있거나 다른종류의 인터럽트가 있을때 발생한다.

 

 

 

프로세스 생성과 종료

 

 

프로세스가 생성될때?

 

.exe파일을 실행하면 운영체제는 해당 프로그램을 코드영역과 데이터 영역을  메모리에 로드하고 

빈 스택과 빈 힙을 만들어 공간을 확보한다.  이프로세스를 관리하기 위한 PCB를 만들어서 값을 초기화 해준다.

지금 설명한 프로세스 생성과정은 운영체제가 부팅되고 0번 프로세스가 생성될때 딱 한번 실행된다.

나머지 프로세스는 새로 생성하지 않고0번 프로세스를 복사해서 사용한다. 

 

 

0번 프로세스를 복사한다.

 

->.복사하는 이유?

새로생성하는 것보다 복사하는 것이 더 빠르기에 복사한다.

0번 프로세스를 복사 해서 생긴건 = 자식 프로세스

0번 프로세스는 =부모 프로세스가 된다.

 

 

자식 프로세스: 부모 프로세스의 코드영역, 데이터 영역 ,스택 영역과 PCB내용을 전부 복사한다.

 

0번 프로세스를 복사하니 똑같은것이 여러번 실행이 되는 거와 마찬가지 이다 그래서 자기가 원하는

코드는 어떻게 실행 시킬 수 있는가?

 

exec()함수를 실행시키는 것이다. 부모를 복사한 자식 프로세스의 코드와 데이터 영역을 원하는 값을 덮어쓰게 된다. 자식 프로세스는 이제 부모프로세스와 완전 다르게 동작 할 수 있다.

 

 

if 부모 프로세스가 먼저 실행 된다고 가정해보면

 

  1. 부모 프로세스는 fork()함수의 반환 값으로 1을 받는다. 그럼 10번 라인의 if문이 거짓이 되면서 15번라인이 실행된다
  2. 17라인wait 함수를 호출한다 , 자식 프로세스로 부터 exit()신호가 오기까지 기다리는 시스템 함수이다.
  3. 컨텍스트 스위치을 거쳐 부모 프로세스에게 cpu가 할당 되어도 자식 프로세스의 exitI0신호가 오기 전까지는  다른 코드를 실행시키지 않는다.
  4. 이제cpu스케줄링으로 자식 프로세스가 실행된 상황이다.
  5. 자식 프로세스는 fork()함수의 반환값으로 0을 받았다 그러면 10번라인이 참이 되어 12번라인 exelp()함수를 실행한다.
  6. execlp()함수로 InternetBrowser프로그램을 실행시킨다.
  7.  InternetBrowser에서 코드와 데이터영역을 가져와 자식 프로세스를 덮어쓰게 된다 . 그러면 이제 부터 완전히 부모프로세스와는 다른 코드가 실행이된다..
  8. InternetBrowser사용하다가 종료가 되면 13번 라인의exit()함수가 호출하고 프로세스의 종료를 알린다.
  9. CPU스케줄링으로 다시 부모 프로세스가 실행된 상황이된다.
  10. wati()함수로 자식 프로세스가 끝나길 기다렸는데 종료 된것을 보고  부모 프로세스는 이제 완전히 자식 프로세스를 다고 "인터넷 브라우저닫힘"이라는 텍스트를 출력한다.
  11. 19번 함수에 exti()함수로 부모프로세스도 끝이 난다.
  12. exit()함수는 자식 프로세스가 부모 프로세스에게 작업이 끝남을 알리고 부모프로세스는 자식 프로세스의 Exit Status를 일고 자식 프로세스를 정리한다.

만약 부모프로세스가 자식 프로세스보다 먼저 종료되거나 비정상 종료되어 exit()외 되지 않을때 좀비 프로세스가 된다.

이경우 컴퓨터가 느려지는데 컴퓨터를 껐다가 키면 메모리가 리셋 된다.

 

 

 

쓰레드 

 

프로세스 : 운영체제가 작업을 처리하는 단위

ex)사용자가 운영체제에게 작업을 요구하면 그만큼 프로세스의 수가 늘어난다.

  • 프로세스가 생성되면 PCB가 생성되고 
  • 메모리에 코드, 데이터, 스택, 힙영역을 만들어 줘야 한다.
  • 프로세스의 수가 많아지면  PCB ,코드,데이터,스택,힙영역도 만들어 줘야 하기 에 너무 무거워진다.

EX)웹브라우저 실행시키면  2개프로세스가 존재일시 탭20개를 추가 하면 프로세스의 복사가 20번 일어나고 

이모든것이 20개 생성이 된다 웹브라우저가 메모리를 너무 많이 사용된다., 웹브라우저 탭 은 서로 통신할려면 IPC를 사용해야 하는데 비용이 많이 든다.

 

 

문제점 해결!!

 

 

쓰레드를 만들었는데  쓰레드는 프로세스에 한개 이상 있을수 있다. 

한프로세스내에  쓰레드는 그 프로세스의 PCB,코드,데이터,힙영역을 공유한다. 스택은 공유하지 않고 쓰레드마다 하나씩 가지고 있다.

 

프로세스내에 쓰레드: 아이디 혹은 ,쓰레드를 관리하기 위한  Thread Control Block(TCB)가 생겼다.

 

운영체제 관점에서 쓰레드 구분도된다 . 운영체제가 작업을 처리하는 단위는 프로세스내에 쓰레드가 된다.



EX) 웹브라우저를 실행하면 프로세스 1개 쓰레드1개인데 탭을 추가하면 쓰레드를 하나더 생성을 하게 된다 

프로세스1개에 쓰레드가 여러개가된다 .

 

Fifrfox는 100개 탭을 열면 4개 프로세스와 100개 쓰레드가 생성이 된다 . 

메모리 절약에 좋다.

 

프로세스 방식 vs 스레드 방식

장단점

 

안정성 :

프로세스는 서로 독립적이기에 다른 프로세스가 문제생겨도 영향을 받지 않지만 

반면 프로세스가 문제 생기면 모든 스레드에 문제가 생긴다 안정성방식에서는 프로세스 방식이 스레드 방식보다 

더 우수하다 .

 

속도와 자원: 

서로 고유한 자원을 가지고 있다. 코드 데이터 힙 스택을 따로 가지고 있고 프로세스간 통신은 ipc이용해야 되서 오버해드가 크다, 속도가 느리다 

반면 스레드는 스택영역 제외하고 공유하기에 오버해드가 적다 데이터가 공유하기 쉽다 하지만 문제가 발생하기 쉽다.

'cs 상식 > 운영체제' 카테고리의 다른 글

데드락  (0) 2022.11.16
프로세스 동기화  (0) 2022.11.15
CPU스케줄링 (2)  (0) 2022.11.14
CPU스케줄링  (0) 2022.11.14
운영체제 들어가기  (0) 2022.11.09