본문 바로가기
백엔드/Computer Science(CS)

[스터디]운영체제 #2

by 수박통통 2023. 1. 13.

 

프로세스란?

실행중인 프로그램

운영체제 입장에서는 작업의단위

 

프로세스는 완료하기 위해 이러한 자원들이 필요

- cpu
- 메모리
- 파일들
- i/o 디바이스들

 

프로세스의 여러 개의 섹션

text영역 - 명령어들
data영역 - 전역변수들
힙영역 - 메모리 로케이션, new같은것(동적 데이터 영역)
스택영역 - 함수호출, 지역변수

text, data, 스택 영역은 컴파일 할 때 영역의 크기를 계산해 메모리 영역을 결정.

힙영역은 프로그램 동작 시(런타임)에 크기가 결정.




프로세스상태(life cycle)

1. New - 프로세스의 탄생
2. Running - cpu 를 점유한 상태
3. Wating -  프로세스가 cpu를 실행중일때 다른 프로세스는 기다림의 상태
4. Ready  - cpu를 할당하면 바로 일을 할 수 있는 상태
5. Terminated - 프로세스 종료

위 사진에서 디스패치란?

ex) 스케줄러가 cpu를 디스패치해준다(이러면 ready-> running) 


PCB(Process Controle Block) or TCB(Task Control Block)

- 구조체같은것
- 많은 정보들을 포함

       - 프로세스 상태(new, ready 등)
       - program counter(IR, 명령어 레지스터가 메모리에 있는 것들을 가져와야하는데,여기서의 메모리의 위치를 알려줌),
       - CPU registers(IR, DR 등)
       - 위 두개를 context 라 함
       - cpu-scheduling information
       - Memory-management information
       - Accounting information
       - i/o status information 등

아무튼 그런 정보를 갖고 있는 PCB들을 운영체제가 관리해줘야함!!!

 

프로세스는 한 줄로 실행되는 프로그램(------------- 이런식으로 진행된다는 이야기)
-> 동시에 하나의 task만 가능
-> 그래서 멀티스레드 등장(우리가 흔히 아는 그 스레드를 이야기하는 것이 아님)

-> 동시에 여러개의 task가 가능하고, 프로세스 내에서도 여러개의 스레드가 필요해졌다

 


스레드의 등장 (위 스레드와 다른것)

스레드란?

경량된 프로세스

 

여러개의 프로세스 < 여러개의  스레드

-> 멀티프로세싱 보다 멀티스레드가 대세

-> Why?

-> 멀티스레드 :

  • 멀티 프로세스보다 적은 메모리 공간을 차지하고 Context Switching이 빠른 장점이 있지만, 오류로 인해 하나의 스레드가 종료되면 전체 스레드가 종료될 수 있다는 점과 동기화 문제를 가지고 있다.

-> 멀티프로세스 :

  • 하나의 프로세스가 죽더라도 다른 프로세스에 영향을 끼지지 않는다는 장점이 있지만, 멀티 스레드보다 많은 메모리 공간을 차지하는 단점이 있다.




멀티프로그래밍(멀티프로세싱)

  • 동시에 여러개의 프로세스를 실행
  • cpu사용효율을 최대화-> 타임쉐어링

타임쉐어링

  • 프로세스간의 스위치를 해서, 사용자는 각 프로그램이 동시에 도는 것처럼 보이게 하자
  • 그래서 cpu스케쥴링이 필요

 

cpu스케쥴링

  • fifo(first in, first out)
  • ready queue(대기열)은 linked list로 구현 가능
  • running 에서 ready로 다시가거나 or wating으로 간다(ex. i/o를 기다리고 있는)
  • waiting 다음엔 무조건 ready큐로 가게 된다

 

큐잉다이어그램(프로세스 스케쥴링의 공통적인 부분)





컨텍스트란?

PCB에 저장되어 있는, 프로세스가 사용되고 있는 상태

 

인터럽트가 일어났을 때, 

->running중인 프로세스의 현재 컨텍스트를 저장(pc에)
->다시 cpu를 할당받을 때, 저장해놨던 컨텍스트를 복원

 

컨텍스트 스위치

-어떤 task가 cpu코어를 다른 프로세스에게 넘겨주는 것
-현재프로세스의 상태를 저장하고 다른 프로세스의 상태를 복원하는 것




프로세스의 생성

fork를 통해 프로세스 만들수있음

 

자식프로세스 옵션

- 동시에 실행
- 기다리는

 

자식 프로세스 주소공간 옵션

- 주소공간을 복제
- 새로운 공간을 로딩

 

 

프로세스 종료

- return or exit()
- os입장에서 메모리해제, i/o 버퍼 종료

부모가 없어진 자식프로세스 - 고아프로세스(웨잇 호출안하고 종료)
부모가 신경안쓰는 것 - 좀비 프로세스(웨잇 호출안하고 자기일 하는중)

fork()

parent를 주소공간을 그대로 복제하고 자기일을 그대로 진행
자식을 기다릴수도 있음(이때 wait-> ready에 들어감)


 

 

멀티프로세싱

여러개의 프로세스를 메모리에 로드에서 cpu에 패치(cpu가 타임쉐어링해서 컨테스트 스위칭해서 컨커런트하게!)

 

 

스레드란?

  • lightweight process(LWP)
  • cpu를 점율하는 단위
  • pc나 register set, stack은 thread에 따라 달라짐

 

 

멀티스레드 프로그래밍의 장점

  • responsiveness(민감도) 반응성이 좋다 : 계속 실행이 가능
  • resouce sharing 자원공유에 유리하다: code, data영역을 공유하기 때문에 리소스 효율 높음
  • economy 경제성이 좋다: 프로세스 생성하는 것보다 경제적임(값이 쌈) pcb 스위칭보다 스레드 스위칭이 더 간단
  • scalability(확장성) 확장성이 좋다: 멀티프로세스 아키텍쳐(코어가 여러개)에서 각각에 스레드를 붙여서 병렬처리까지 가능하게 함. 

 




자바에서의 스레드

 

  • 스레드가 기본적으로 고려되어있음
  • 스레드의 관리 생성에 대한 것들을 많이 지원함

1. 스레드클래스를 상속받음(Thread class)
2. Runnable 인터페이스 상속
3. Runnable의 람다 expression (익명스레드라고도 함)

 

프로세스는 wait이고 쓰레드는 join
프로세스는 stop이고 쓰레드는 interrupt

멀티코어 시스템에서의 멀티스레딩
4개의 스레드를 고려해보자
싱글코어 - 인터리빙(사이사이에 끼어넣는다) 즉, 시분할
멀티코어 - 타입쉐어링하면서 동시에 parallel해야함

  • 복잡해서 문제가 많이 생김(프로그래밍 문제들)
    • task확인
    • balance
    • data splitting
    • data dependency
    • testing and debugging

병렬처리 유형

1. data를 각각의 코어에 쪼개주는것
2. data를 하나로 두고 task를 쪼개는것
but, 분산시스템의 발달!!!

 

 

암달의 법칙

코어는 무조건 많을 수록 좋은가? 그건 놉

 

스레드의 두개 타입

유저스레드(사용자모드에서의 스레드)
커널스레드(os에서 직접 관리할 수 있는 스레드)

세개의 관계(유저: 커널)
N:1
1:1
N:N

자바스레드는 jvm이므로 window면 윈도우 스레드, 리눅스면 pthreads를 이용(즉, os에 따라 달라짐)







 

생각해봤던 질문

더보기

프로세스와 스레드의 차이
-> 프로세스는 실행중인 프로그램을 뜻하며 스레드는 프로세스 안에서 실행되는 여러 흐름의 단위입니다.
+) 프로세스는 각각 독립적인 영역을 가지므로 동기화 작업이 필요하지 않고 컨텍스트 스위칭 비용이 큽니다. 하지만 스레드는 stack만 고유한 영역을 갖고 나머지는 자원을 공유하므로 동기화 작업이 필요하고 스위칭 비용이 적습니다.

프로세스의 주소공간
-> text(code) : 코드 자체, 명령어
data : 전역변수, 정적변수, 배열 등(초기화 된 데이터는 data영역에 저장, 초기화 되지 않은 데이터는 bss영역에 저장)
heap : 동적 데이터 영역
stack : 함수호출, 지역변수
스레드는 Stack만 따로 할당 받고 나머지 영역은 서로 공유
하나의 프로세스가 생성될 때, 기본적으로 하나의 스레드 같이 생성
프로세스는 자신만의 고유 공간과 자원을 할당받아 사용하는데 반해, 스레드는 다른 스레드와 공간, 자원을 공유하면서 사용하는 차이가 존재함
text, data, 스택 영역은 컴파일 할 때 영역의 크기를 계산해 메모리 영역을 결정.
힙영역은 프로그램 동작 시(런타임)에 크기가 결정.



프로세스의 생성과정에 대해 설명하시오
=> PCB가 생성되며 OS가 실행한 프로그램의 코드를 읽어들여 프로세스에 할당된 메모리의 Text 영역에 저장한다. 초기화된 전역변수는 data영역에 할당. 힙과 스택은 초기 메모리 주소 초기화. PCB에 여러 정보를 기록되면 레디큐에서 cpu를 할당받기까지 기다린다.

크롭탭은 프로세스인가요 쓰레드인가요
-> 크롬은 탭마다 PID를 가지고 있으니 Process이며 각 Tab마다 랜더링 정보나 기타 데이터를 따로 관리한다고 한다.
그로인해 메모리를 많이 잡아먹기도 하지만 하나의 Tab에 오류가 생겼다고 모든 Tab에 영향을 끼치진 않는다.

멀티스레드와 멀티프로세스를 비교해 말해보시오
-> 멀티프로세스는 동시에 여러 개의 프로세스를 실행하는 것으로 하나의 프로세스가 죽더라도 다른 프로세스에 영향을 끼치지 못하지만, 멀티 스레드보다 많은 메모리 공간을 차지한다. 작업량 많을 수록 오버헤드 발생.
멀티 스레드는 하나의 프로세스에서 여러개의 스레드를 구성하여 자원을 공유하며 작업을 수행한다. 그렇기에 컨텍스트 스위칭이 빠르지만, 하나의 스레드가 다른 스레드에 영향을 끼칠 수 있다. (동기화 문제나 오류로 인해 하나의 스레드가 종료될 경우 전체 스레드가 종료될 수도 있다는 점 등)

멀티프로세스보다 멀티스레드를 많이 쓰는 이유
-> 계속적으로 실행이 가능하며, stack영역을 제외, 다른 영역들을 공유하기 때문에 리소스 효율이 높으며 스위칭이 더 간단하다.(PCB보다 스레드가 간단) 또한 확장성이 좋다. 
-> 프로그램을 여러 개 키는 것보다 하나의 프로그램 안에서 여러 작업을 해결하는 것이 더욱 효율적이기 때문. 

그렇다면 멀티스레드의 안정성을 증가시키는 방법은?
-> critical Section기법 : 둘 이상의 스레드가 접근하지 못하도록 하는 것. 하나의 스레드가 임계구역에 이미 들어가 있다면 다른 스레드는 대기해야한다. 
즉, 중요한 공유자원에 대해 하나의 스레드만 접근하도록 함.

그렇다면 프로세스의 주소 공간을 따로 나눈이유?
-> 최대한 데이터를 공유하여 메모리 사용량을 줄여야 한다. code는 같은 프로그램 자체에서는 모두 같은 내용이라 따로 관리하여 공유한다. stack과 데이터는 스택 구조의 특성과 전역 변수의 활용성을 위한 것
+)그렇다면 Stack 영역과 Data 영역을 구분한 이유는 무엇일까? 가장 큰 이유는 역할의 분배이다.

그렇다면 스레드마다 스택을 독립적으로 할당하는 이유는?
-> 스택 메모리 공간이 독립적이라는 것은 독립적인 함수 호출이 가능함을 의미하고 이는 독립적인 실행 흐름이 추가된다는 것을 의미한다.
즉, 독립적인 실행 흐름을 만들기 위해서 스레드마다 스택을 할당한다.

컨텍스트 스위칭이란?
-> 어떤 Task가 CPU코어를 다른 프로세스에게 넘겨주는 것으로 현재 프로세스의 상태를 저장하고 다른 프로세스의 상태를 복원하는 것.
+) 이러한 상태들은 PCB에 기록됨

스레드마다 PC 레지스터를 독립적으로 할당하는 이유
-> PC값은 스레드가 명령어를 어디까지 수행했는지를 나타낸다. 스레드는 CPU를 할당받았다가 스케줄러에 의해서 다시 선점당한다. 따라서 명령어가 연속적으로 수행되지 못하기 때문에 이를 기억할 필요가 있어 독립적으로 할당한다.

프로세스의 종류는?
->자식프로세스, 데몬프로세스, 고아프로세스, 좀비프로세스 


 

 

 

 

 

 

참고

https://www.inflearn.com/course/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%EA%B3%B5%EB%A3%A1%EC%B1%85-%EC%A0%84%EA%B3%B5%EA%B0%95%EC%9D%98

 

 

 

 

 

 

 

 

 

 

'백엔드 > Computer Science(CS)' 카테고리의 다른 글

[스터디] 운영체제 #6  (0) 2023.02.12
[스터디] 운영체제 #5  (0) 2023.02.03
[스터디] 운영체제 #4  (0) 2023.01.27
[스터디]운영체제 #3  (0) 2023.01.20
[스터디]운영체제 #1  (0) 2023.01.06