ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • CS 스터디 - 운영체제
    CS 2023. 7. 21. 03:00

    프로세스

    • 메모리에 올라와 실행되고 있는 프로그램
      • 프로그램과 달리 메모리에 주소공간을 가진다.
      • 메모리 영역을 (code,data, heap, stack) 다른 프로세스와 공유하지 않는다.
    • CPU에 의해 실행/처리되며 스케줄링의 대상( = task)
    • 프로세스 내부에는 최소 하나의 Thread(메인스레드) 가지고 있으며, Thread 단위로 스케줄링을 수행한다. 
    • Context : 프로세스가 현재 어떤 상태에서 수행 중인지 규명하기 위한 정보
      • Hardware Context : CPU 수행 상태를 나타낸다.
        • Program Counter : 다음에 실행될 명령어의 주소를 가지고 있다. 다음에 실행할 기계어코드의 위치 지정함
        • Program Counter,  Register 등이 저장하는 값
      • Process Address Space : 프로세스 주소 공간
        • Code : 프로그램의 코드 / 명령어들이 기계어로 저장된 영역
        • Data : 코드에서 선언된 전역 / 정적 변수가 저장되는 영역 -> 실행 시 할당되고 종료 시 소멸
        • Stack : 컴파일 타임에 크기 결정, 지역변수, 매개변수, 리턴 값 등 저장 
        • Heap : 런타임에 크기가 결정, 사용자에 의해 메모리 공간이 동적으로 할당되고 해제되는 영역, 참조형 등 저장
      • Kernel Context 
        • PCB(Process Control Block) : 운영체제가 시스템 내의 프로세스들을 관리하기 위해 프로세스마다 유지하는 정보들을 담는 커널 내의 자료구조
          • 프로세스 식별자(Process ID, PID) : 프로세스 식별번호
          • 프로세스 상태 : new, ready, running, waiting, terminated 등의 상태를 저장
          • 프로그램 카운터 : 프로세스가 다음에 실행할 명령어의 주소
          • CPU 레지스터
          • CPU 스케쥴링 정보 : 프로세스의 우선순위, 스케줄 큐에 대한 포인터 등
          • 메모리 관리 정보 : 페이지 테이블 또는 세그먼트 테이블 등과 같은 정보를 포함
          • 입출력 상태 정보 : 프로세스에 할당된 입출력 장치들과 열린 파일 목록
          • 어카운팅 정보 : 사용된 CPU 시간, 시간제한, 계정번호 등
        • Kernel Stack : 커널 내의 주소 
        • PCB 구조 그림 

    https://zangzangs.tistory.com/108

    Kernel이란? 

    OS도 프로그램이기 때문에 메모리에 올라가 있어야 사용이 가능하다.

    하지만 메모리는 한정적이므로, 항상 필요한 부분만 메모리에 올려두고 나머지는 필요할 때마다 올려서 사용한다.

    이 '항상 필요한 부분'이 커널이다. 메모리에 상주하는 부분이자, OS의 핵심적인 부분을 뜻한다.

     

    • Context Switching : CPU에서 여러 프로세스 돌아가면서 작업을 처리하는 과정. 돌아가면서 프로세스를 처리하므로 이전 context를 보관 / 복구하는 과정
      • 프로세스가 동작 -> 대기를 하면서 해당 프로세스의 Context를 보관
      • 대기하고 있던 다음 프로세스가 동작 ~ 이전에 보관했던 프로세스의 상태를 복구
    • Process Status
      • Running : CPU 받아 명령수행중인 상태 
      • Ready : CPU 제외한 메모리 등 모든 조건이 준비된 상태(메인 메모리로 로드된) - CPU만 받으면 당장 수행 가능
      • Blocked : CPU 받더라도 당장 실행 불가 -> I/O event 기다리거나 디스크에서 file 읽어와야 하는 등 저장매체에 액세스해서 이벤트 발생 대기중인 상태  
      • 추가적인 상태
        • new : 프로세스를 위한 자료구조들은 생성, 아직 메모리 획득 승인은 못 받은 상태
        • terminated : 프로세스는 종료되었는데 프로세스와 관련된 자료구조 정리 완전히 못한 상태 
        • Suspended : 사용자가 정지시키거나 메모리에 너무 많은 프로세스가 올라가있어 디스크로 swap out된 상태 (아래에 나옵니다)

     

    스레드

    • 프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위, 스레드 간 메모리 공유하며 작동
    • 독립적으로 가지는 부분 : program counter, register set, stack
    • 다른 스레드와 공유하는 부분(멀티 스레드에서) : code, data(코드나 데이터는 컴파일되고 나면 변경X라서 공유하는 것이 더 효율적), OS resources

     

    https://gmlwjd9405.github.io/2018/09/14/process-vs-thread.html

    스택을 스레드마다 독립적으로 할당하는 이유?

    스택 메모리 공간이 독립적 == 독립적인 함수 호출이 가능하다(함수 호출 시 전달되는 인자, 되돌아갈 주소값 등을 저장하므로) == 함수에 따른 독립적인 실행 흐름을 스레드가 갖출 수 있다. 따라서 독립적인 실행 흐름을 추가하기 위한 최소 조건으로 독립된 스택을 할당

     

    ProgramCouter / Register 를 스레드마다 독립적으로 할당하는 이유?

    ProgramCounter == 스레드가 명령어의 어디까지 수행되었는가?

    스레드는 CPU 를 할당받았다가 스케줄러에 의해 선점당한다. ->  명령어가 연속적으로 수행되지 못하므로 각 스레드가 어디까지 수행했는지 기억해야 하므로. 

     

    멀티 프로세스 & 멀티 스레드

    멀티 프로세스 멀티스레드
    2개 이상 다수 프로세서(CPU)가 협력적으로 하나 이상의 작업을 동시에 처리 - 각 프로세스 간 메모리 구분하거나 독립된 주소 공간 필요할 때 사용 하나의 프로세스 여러 스레드로 자원을 공유하며 작업을 나누어 수행
    하나의 프로세스가 죽어도 다른 프로세스에 영향을 주지 않으므로 안정성이 높음 -> 프로세스 간 독립된 공간이므로  메모리 공간을 적게 사용하고 context switching 빠름 - 스레드 간 데이터 주고 받는 것 간단
    더 많은 메모리 공간, CPU 시간 차지, Context Switching 자주 일어날 경우 성능저하 우려 하나의 스레드 장애가 전체 시스템 장애로 이어질 위험이 존재 주의 깊은 설계가 필요

     

    * 멀티 스레드를 만든 이유가 뭘까? 멀티 프로세스로 할 수 있지 않은가? 

    프로세스를 생성하여 자원을 할당하는 시스템 콜이 감소 -> 자원의 효율적 관리 

    프로세스 간의 통신(IPC)보다 스레드 간의 통신 비용이 적다 -> 작업들 간 부담이 감소함

     

    * IPC (Inter Process Communication) 

    프로세스끼리 데이터를 주고 받고 공유 데이터를 관리하는 메커니즘 

     

    멀티 스레드를 사용할 때는 공유 자원으로 인한 문제 해결을 위해 동기화에 주의해야 한다. 

    동기화 문제? 

    • 어느 스레드가 어떤 순서로 실행될 지 순서 알 수 없음. 
    • 스레드가 함께 전역변수를 사용한다면 다른 프로세스가 접근을 못하거나, 바뀐 자원에 접근해 버리는 등 충돌이 발생할 위험
    • 프로그래머가 적절하게 직접 프로그래밍.. (운영체제가 자동으로 해주지 않음)

     

    Process Scheduler 

    • 어떤 프로세스에게 자원을 할당할지 결정하는 커널의 모듈
    • 장기 스케줄러
      • 어떤 프로세스를 Ready Queue에?
        • Ready Queue : CPU 할당을 기다리는 프로세스
        • 디스크에서 어떤 프로그램을 가져와 등록할 것인가를 결정
        • 상대적으로 속도가 느려도 괜찮음
        • 메모리에 올라가 있는 프로세스의 수를 조절하는 역할도 수행(너무 많은 프로세스가 올라가면 프로세스 당 메모리 보유량이 적어지므로)
          • 현대의 운영체제는 프로세스 시작되면 바로 메모리 할당하고 ReadyQueue에 넣는다. 현대에는 일반적으로 장기 스케줄러 X 
    • 단기 스케줄러
      • 어떤 프로세스에게 CPU를 할당?
        • CPU스케줄러라고도 하며 준비 상태의 프로세스 중 어떤 애 실행할 것인가
        • 인터럽트 발생 시 단기 스케줄러가 호출
        • 정해진 스케줄링 알고리즘에 따라 할당할 프로세스 결정함
        • 빈번한 호출, 속도 빨라야 함
    • 중기 스케줄러 
      • 메모리에 적재된 프로세스 수를 동적으로 조절 (시스템 성능이 저하되는 경우 일부 프로세스로부터 메모리 통째로 뺴앗아 디스크 스왑 영역에 저장 -> swap out)
      • Blocked 상태의 프로세스 먼저 swap out(당장 CPU 할당받을 확률이 없으므로), 이러고도 해결이 안되면 Ready Queue로 이동하는 프로세스들도 아웃시켜버린다. 
      • 메모리 여유가 생길 때 다시 적재 
        • Suspended Ready : Ready 였던 프로세스가 swap out 
        • Suspended Block : Blocked 상태의 프로세스 swap out. blocked 된 조건이 충족되면 Suspended Ready로 바뀐다. 

     


     

    동기(Synchronous)와 비동기(Asynchronous)

    • 동기 : 요청과 결과가 동시에 일어난다. 
      • 요청을 하면 시간이 얼마가 걸리던 요청한 자리에서 결과가 주어져야 한다.
      • 순서에 맞춰 진행되나, 여러 요청을 동시에 처리할 수는 없다. 
      • 설계가 간단하고 직관적이지만, 결과가 주어질 때까지 아무것도 못하고 대기
    • 비동기 : 요청과 결과가 동시에 일어지 않음
      • 요청에 따른 응답을 즉시 처리하지 않아도, 대기 시간동안 또 다른 요청에 대해 처리 가능 
      • 동기보다 복잡하지만, 결과가 주어지는데 시간이 걸리더라도 다른 작업 가능
      • 자원을 효율적으로 사용할 수 있음 

     


    Cache ? 

    • 데이터를 미리 복사해놓는 임시 저장소이자, 속도가 느린 장치 & 빠른 장치 간 병목현상 줄이기 위한 메모리
    • 데이터에 접근하는데 시간이 오래 걸리는 경우 / 다시 계산하는 시간 등을 절약 가능
    • Cache 설정하는 조건? 
      • 자주 사용하는 데이터를 기반으로 설정한다.(적중율을 극대화시키기 위해)
      • 지역성 :  기억 장치 내의 데이터에 균일하게 Access 하는 것이 아닌 어느 순간에 특정 부분을 집중적으로 참조하는 특성
        • 시간 지역성
          • 최근에 사용한 데이터에 다시 접근하려는 특성 
        • 공간 지역성
          • 최근에 접근한 데이터를 이루고 있거나 근접한 공간에 접근하려는 특성
    • Cache Mapping
      • cache hit (cache에서 참조) 되기 위해 매핑하는 방법
      • 메모리에 비해 레지스터는 굉장히 작기 때문에 매핑을 잘해주어야 캐시 계층으로서의 역할을 잘 수행할 수 있음
        • 직접 매핑 : 메모리 주소와 캐시 순서를 일치시킨다.
          • 1~100이 메모리라 하면 10씩 쪼개서 1~10까지는 캐시1에.. 이런식
          • 구현이 간단하지만, 메모리의 30~40만 계속 불러다 쓴다고 생각해보자. 메모리의 30~40에 속한 데이터는 캐시 한 칸에만 존재한다. 교체가 잦다. 
        • 연관 매핑 : 관련 있는 캐시와 메모리를 매핑 하여 저장
          • 순서를 일치시키지 않고, 필요한 메모리값을 캐시 어디든 저장 가능.
          • 대신 검색을 해야하므로 속도가 느릴 수는 있으나 적중율은 높음 
        • 직접 연관 매핑 : 위의 2개를 혼합한 방식
          • 순서를 일치시키지만 집합을 둬서 저장하고, 블록화되어 있기 때문에 검색은 효율적. 
          • 1~100까지의 메모리, 1~10의 캐시 공간이 있다면 1~5의 캐시에는 1~50까지의 메모리 중 무작위로 저장
          • 어디까지의 메모리를 저장할지 순서대로 구분은 해두었으므로 검색 속도가 향상, 그룹화시켜 저장했으므로 적중율도 직접 매핑보다는 높다.

     

    'CS' 카테고리의 다른 글

    CS 스터디 - 운영체제 Q&A(1)  (0) 2023.08.10
    CS 스터디 - 네트워크 Q&A (1)  (0) 2023.08.03
    CS 스터디 - 네트워크 이론  (0) 2023.07.05
    CS 스터디 - Spring  (0) 2023.06.20
    CS 스터디 - 데이터베이스  (0) 2023.06.14
Designed by Tistory.