나의 2번째 공부 기록공간 - 기본 Part : 운영체제 (2)

BE_{Potato.}·2023년 1월 28일
0

< CPU 스케쥴링 개요 >

컴퓨터의 자원은 CPU,메모리와 같은 필수장치와 하드디스크,키보드,마우스 같은 주변장치로 나뉜다.

  • CPU
    : 운영체제는 모든 프로세스에게 CPU를 할당하는데
    고려해야 할 사항 2가지
  1. 어떤 프로세스에게 CPU 리소스를 주어야 하는가?
  2. CPU를 할당받은 프로세스가 얼마동안 CPU를 사용해야 하는가?

위의 두가지 고려사항이 컴퓨터 성능에 큰 영향을 미침.
요즘은 '시분할 방식' 이 쓰인다.

  • CPU를 할당받아 실행하는 작업: CPU burst
    입출력 작업: I/O burst 라 한다.

< 다중 큐 >

  • 프로세스 상태에서 준비상태와 대기상태는 '큐'라는 자료구조로 관리됨.
    '큐(Queue)' => 먼저 온 것이 먼저 작업.
    '스택'=> 먼저 들어온 것이 제일 나중에 처리됨.

-프로세스가 실행상태에서 준비상태가 될 때 운영체제는 해당 프로세스의 우선순위를 보고, 그에 적합합 '준비 큐'에 넣는다.
그 다음 '다중 큐' 프로세스들 중 적당한 프로세스를 선택해 실행상태로 바꾼다.
I/O 작업은 HDD 큐/LAN 큐/키보드 큐처럼 각 대기 큐에 들어가서 완료되면 나온다.
=> 큐에 프로세스 정보를 가진 PCB가 들어간다.

(정리)
프로세스 정보를 가진 PCB는 준비 상태 다중 큐에 들어가 실행을 기다림.
-> CPU 스케쥴러에 의해 실행상태로 전환됨.
-> CPU 스케쥴러 준비상태 다중큐를 참조해서 어떤 프로세스를 실행시킬지 결정함(I/O 작업도 비슷함)

< 스케쥴링 목표 >
1.리소스 사용률: CPU 사용률 높이기. I/O device 사용률 높이기 등이 목표가 될 수 있음.
2.오버헤드 최소화
3.공평성: 모든 프로세스에게 공평하게 CPU가 할당되어야 함 => 시스템에 따라(각 프로세스 중요도에 따라) 공평의 의미가 달라질 수 있음.
4.처리량: 같은 시간 내에 더 많은 처리를 할 수 있는 방법을 목표로 함.
5.대기시간: 작업 요청하고 실제 작업 이루어지기 전까지 대기시간 짧은 것을 목표함.
6.응답시간: 응답시간이 짧은 것을 목표함.
=> 목표에 따라 응답시간, 처리량 조율해서 스케쥴링한다.

< FIFO 알고리즘 >
: 먼저 들어오면 먼저 나간다 -> 장점은 단순하고 직관적이다. 단점은 한 프로레스가 완전히 끝나야 다음 프로세스가 실행. 실행시간이 긴 프로그램이 앞에 있다면 실행시간 짧은 프로그램이 오래 대기해야 하고, I/O 작업이 있을 때에 CPU는 I/O 작업이 끝날 때까지 쉬어서 CPU사용률이 떨어진다.

  • 스케쥴링의 성능은 '평균대기 시간'으로 평가함.
    (각 프로세스가 실행되기 전 대기시간들의 평균)
    :FIFO는 프로세스 burst time에 따라 성능차이가 심해 현대 운영체제에서 안 쓰임.

< SJF 알고리즘 >
burst time이 짧은 프로세스를 먼저 실행하는 알고리즘.짧은 작업 먼저!
하지만 구현하려 할 때 2가지 문제점 발견
1.어떤 프로세스가 얼마나 실행될 지 예측이 힘듬.
2.burst time이 긴 프로세스는 아주 오랫동안 실행이 안될 수 있다는 점.
burst time이 짧은 프로세스가 중간에 계속 들어오면 실행순위가 뒤로 밀려남.
-> 이런 문제 때문에 SJF 알고리즘 사용 안됨.

< RR 알고리즘 >
FIFO 알고리즘의 단점을 해결한 방식. 한 프로세스에서 일정시간만큼만 CPU를 할당하고 시간이 지나면 다른프로세스에서 권한을 넘겨주는 식.
CPU를 뺏긴 프로세스는 큐의 맨 끝으로 이동하게 됨.

  • 타임 슬라이스: 프로세스에게 할당하는 일정 시간을 의미
    RR 알고리즘은 컨텍스트 스위칭도 있기 때문에 이를 고려해야 함
    타임 슬라이스의 크기와 컨텍스트 스위칭의 오버헤드를 고려한 알고리즘을 써야한다.(윈도우는 타임슬라이스 20ms, Unix는 100ms)

< MLFQ 알고리즘 >
RR 알고리즘의 업그레이드 버전.CPU bound process와 I/O bound process를 나누어 타임슬라이스를 다르게 지급하는 방식.
CPU bound process는 CPU작업을 주로하고 CPU 사용률과 처리량을 중요하게 생각함.
I/O bound process는 응답속도를 중요하게 생각함.

작은 타임슬라이스 크기를 기본으로 하며,CPU bound process에게는 타임슬라이스 크게 I/O bound process에게는 작게 줌.
운영체제는 CPU사용률을 보고 CPU bound와 I/O bound를 구분.
우선순위를 가진 큐를 여러개 준비해서 처음에는 타임슬라이스를 짧게 주고, 처리를 못하면 점차 타임슬라이스를 길게 줘서 마지막에는 연속적으로 작업을 할 수 있게 만듬.
오늘날 쓰이는 CPU 스케쥴링 알고리즘은 MLFQ가 주류이다.

  • 운영체제에서 CPU 스케쥴링이 가장 중요하다!

< 프로세스 동기화 >

  • 프로세스 간 통신: 프로세스는 독립적으로 실행되기도 하지만 다른 프로세스와 데이터를 주고 받으며 통신하기도 함. 통신은 한 컴퓨터 내의 다른 프로세스와 할 수도 있고, 네트워크로 연결된 다른 컴퓨터에 있는 프로세스와 통신할 수도 있음.
    (프로세스 간 통신의 종류)
  1. 한 컴퓨터 내 프로세스 간의 통신: 파일과 파이프를 이용함. 파일은 하나의 파일을 읽고 쓰는 형태. 파이프는 운영체제가 만든 파이프를 통해 통신하는 방법.
  2. 쓰레드 이용방법: 한 프로세스 내에서 쓰레드 간 통신. 프로세스 내의 데이터나 힙영역을 사용하면 쓰레드간 통신이 가능.
  3. 네트워크 이용방법: 운영체제가 제공하는 소켓통신이나 RPC를 이용해 통신함.

< 공유자원과 임계구역 >

  • 프로세스 간 통신을 할 때 공동으로 사용하는 변수나 파일들이 있는데 이를 '공유자원'이라고 함. 공유자원은 여러 프로세스들이 사용하기 때문에 프로세스의 공유자원 접근순서에 따라 자원의 값이 달라질 수 있음.또한 컨텍스트 스위칭 때문에 프로세스 간의 실행순서를 명확히 모름.
    => 이런 이유들로 연산 결과를 예측하기 힘들고 이를 '동기화 문제'라고 함.
    이 동기화 문제 때문에 여러 프로세스가 동시에 사용하면 안되는 구역을 정하고 이를 '임계구역'이라 함.
    공유자원을 서로 사용하기 위해 경쟁하는 것을 '경쟁조건'이라 함.
    임계구역의 문제를 해결하기 위해서는 상호배제의 매커니즘이 필요함.
  • 상호배제의 요구사항
  1. 임계영역에는 동시에 하나의 프로세스만 접근한다.
  2. 여러 요청에도 하나의 프로세스만 접근 허용한다.
  3. 임계구역에 들어간 프로세스는 빠르게 나와야한다.

< 세마포어 >
동기화에서 가장 중요한 개념으로 운영체제가 공유자원을 사용하려는 프로세스들에게 세마포어라는 권한을 줘서 공유자원을 순서대로 사용할 수 있게 만드는 것.
프로세스가 대기하는 곳을 대기큐라고 함.세마포어는 '정수형 변수'.
세마포어를 이용하면 공유자원에 여러 프로세스가 동시에 접근하지 못하기 때문에 동기화 문제가 발생하지 않음. 세마포어의 갯수는 공유자원의 갯수를 따른다.
세마포어의 단점은 세마포어 호출 함수의 순서를 이상하게 해서 세마포어를 잘못 사용할 수 있다는 점이 있다.

< 모니터 >
세마포어의 단점을 해결한 상호배제 매커니즘.모니터는 운영체제가 처리하는 것이 아니라 프로그래밍 언어 차원에서 지원하는 방법. 예시로 자바에서 지원.
모니터 구현이 완벽하다면 세마포어로 임계영역을 감싸지 않아도 되어서 모니터 덕분에 쉽게 코딩이 가능함.

< 교착상태(데드락) >

  • 여러 프로세스가 서로 다른 프로세스의 작업이 끝나기를 기다리다가 아무것도 못하는 상태 ->'교착상태'라고 함.
    교착상태가 발생하는 이유는 '공유자원' 때문!

( 교착상태의 필요조건 )
1.상호배제: 어떤 프로세스가 한 리소스를 점유했다면 다른 프로세스에서 공유되면 안됨.
2.비선점: 한 프로세스가 점유한 리소스를 다른 프로세스가 뺏을 수 없음.
3.점유와 대기: 한 프로세스가 리소스A를 가지면서 리소스B를 원해야 하는 상태.
4. 원형 대기: 점유와 대기를 하는 프로세스들이 원형 대기하고 있어야 함.
4가지 중 한가지라도 해당 안되면 교착상태 안됨.

< 교착상태 해결 >

  • 교착상태 회피: 프로세스들에게 자원할당을 할 때 어느정도 자원을 할당해야 교착상태가 발생하는지 파악해서 이것이 발생하지 않게 자원 할당.
    전체자원의 수와 할당자원의 수로 안정상태/불안정상태를 정함. 운영체제는 최대한 안정상태를 유지하려고 하고, 불안정상태에 있다면 교착상태에 빠질 확률이 높다는 것.
    교착상태의 예방에는 비용이 너무 많이 듬. 그래서 교착상태의 해결에 조첨을 맞춤.
    2가지 방법이 있는데
  1. 프로세스가 일정시간동안 작업을 안한다면 교착상태 발생했다고 파악=> '가벼운 교착상태 검출'-> 교착 상태 해결은 일정 시점마다 체크포인트를 만들어 작업을 저장하고 교착상태가 발생했다면 이전 체크포인트로 롤백시킴.
  2. '무거운 교착상태 검출' -> 운영체제가 프로세스 상태를 계속 지켜보고 파악. 순환구조를 보고 교착상태가 발생했다고 판단되면 교착상태 일으킨 프로세스를 강제종료시킴. 다시 실행시킬 때는 체크포인트로 롤백시킴. 이 과정에서 오버헤드가 발생함.

< 컴파일과 프로세스 >

  • 프로그래밍언어는 '컴파일언어'와 '인터프리터 언어'로 나뉨.
    컴파일언어는 컴파일 과정을 거쳐 기계어로 변환되기 때문에 속도가 빠름. C언어가 이에 해당됨. 인터프리터 언어는 실행 시 코드를 한줄한줄씩 해석해 실행하는 언어. 미리 검사하지 않아 도중에 오류가 날 수 있고, 속도도 컴파일언어에 비해 상대적으로 느림.

< 컴파일 후 프로세스 변환과정 >
.c파일 => 전처리기 => .i파일 => 컴파일러(기계어에 가까운 어셈블리어로 변환시킴 ) => .s파일 => 어셈블러 => .o파일(이 오브젝트 파일안에는 코드영역과 데이터영역이 나뉘어져 있음) => 링커(링커에서 여러 오브젝트파일을 하나의 코드와 데이터영역으로 묶는다. 그리고 실제 실행될 주소를 매핑해줌) => 프로그램
-> 이 프로그램을 실행시키면 운영체제는 프로세스를 만들고 프로그램의 코드영역과 데이터영역을 가져와 프로세스에 넣어주고 빈 스택과 힙영역을 만든다. PCB를 만들고 프로그램 카운터 주소를 설정해준다.

profile
항상 '기본'을 중요시하는 예비 백엔드개발자입니다!

0개의 댓글