운영체제 CS

TIL / / 2021. 10. 1. 16:53

운영체제란

컴퓨터의 각종 하드웨어적인 자원과 소프트웨어적인 자원을 효율적으로 운영 관리하는 시스템 소프트웨어

 

  • 프로세스 vs 스레드
    프로세스는 메모리상에서 실행중인 프로그램을 말하고, 스레드는 프로세스안에서 독립적으로 명령어를 실행할 수 있는 실행단위(제어흐름)을 말한다.
    한 프로세스안에 스레드들은 스택공간을 제외한 프로세스의 나머지공간과 시스템 자원을 공유합니다. (code 영역을 공유해서 스레드들은 프로세스가 가지고 있는 함수 호출가능, heap,data영역 공유해서 스레드간 통신이 가능합니다)
    스레드마다 독립적으로 스택공간이 있는 이유는 스택에 함수호출시 매개변수, 되돌아갈 주소값, 함수내 지역변수 등이 저장되기 때문에 독립적인 함수호출이 가능해야하는 스레드는 스택공간을 독립적으로 부여받아야 합니다.

    멀티프로세스: 하나의 프로그램을 여러 프로세스로 구성하여 처리하는 것
    장점 : 한 프로세스에 문제가 생겨도 다른 프로세스에 영향이 가지 않는다.
    단점: Context Switching 에서의 오버헤드 발생, 그리고 프로세스 간 통신 기법인 IPC가 복잡해진다.

    멀티쓰레드 : 하나의 프로그램을 여러 스레드로 구성하여 처리하는 것
    장점: 스레드들은 stack을 제외한 모든 메모리를 서로 공유하기 때문에 자원의 효율적 관리가 가능하고 통신의 부담이 적어진다. 
    단점 : 하나의 스레드의 문제가 생겼을 때, 모든 스레드에 영향이 갑니다. ( 메모리를 공유하기 때문 )
    그럼에도 멀티프로세스 대신 멀티 쓰레드로 처리하는 이유는 프로세스당 자원을 할당하는 시스템 콜을 줄일 수 있고 프로세스 간의 통신보다 스레드 간 통신 비용이 적기 때문이다. 대신 멀티 쓰레드를 사용하려면 공유 자원으로 인한 문제를 해결하기 위해 동기화에 신경써서 프로그래밍 해야한다.

 

 

  • 교착 상태(Dead Lock)
    교착상태는 프로세스가 자원을 얻지 못해 무한정 대기하고 있는 상태이다.
    시스템에서 한정된 자원을 여러 곳에서 사용하여 발생하는 문제이다.
    교착 상태의 4가지 조건은 아래와 같다.

    비상원점
    1. 비선점 : 이미 할당된 자원을 강제로 뻇을 수 없다.
    2. 상호배제 : 사용중인 자원을 다른 프로세스가 사용할 수 없다.
    3. 원형대기(순환대기) : 대기 프로세스의 집합이 순환 형태를 이룬다.(=각 프로세스들이 다음프로세스가 요구하는 자원을 갖고있음)
    4. 점유대기 : 자원을 보유한 채로 다른 프로세스에 할당된 자원을 점유하기 위해 대기한다.

    교착상태 해결방법;
    1. 예방 : 4가지 조건들중 하나를 부정하는식으로 프로그래밍함 (임계구역떄문에 상호배제는 부정못함)
    ---> 시스템의 처리량이나 효율성이 떨어질 수 있음.
    2.  회피 : 프로세스들이 요청하는 자원들을 특정한 순서대로 모두에게 할당해주는 안정상태를 계속해서 유지하는 방식 ( 여기서의 특정 순서를 안전순서 라고 부른다. 대표적 회피 알고리즘 : 은행원 알고리즘 )
    ---> 미리 최대 자원 요구량을 알아야하고 할당할 수 있는 자원 수가 일정해야 하는 등 사용하는데 제약조건이 많음.
     3. 탐지 및 회복 : 자원 할당 그래프등을 통해 데드락이 발생했는지를 탐색하고 발견하면  교착상태에 빠진 모든 프로세스를 중단 시키거나, 프로세스를 하나씩 중단시켜보면서 탐지하는 등에 방법을 통해 회복하는 방법 
    ---> 교착상태에 모든 프로세스를 중단시켜버리면 결과에 부분적인 문제발생 가능성있음, 
    하나씩 중단시켜보는 방법은 하나씩 중단시키고 매번 탐지해야하기때문에 시스템에 부담이 될 수 있음.

  • 메모리계층구조
    CPU가 메모리에 접근을 빨리 하기 위해 레지스터와 캐시는 CPU 내부에 위치한다. 메모리는 CPU밖에 위치하고 디스크는 CPU가 직접 접근을 할 수 없다.
    메모리를 계층화 해서 나눠놓은 이유 : 자주 쓰는 데이터는 계속해서 자주 쓰이기 떄문에 빈도별로 구조화 시켜놓으면 해당 메모리에 접근할 때, 그 안의 모든 데이터를 고르게 접근할 필요가 없어지기 때문이다.
    메모리 할당 알고리즘 : FirstFit(메모리 처음부터 검사후 크기 맞는 첫번째 메모리에 할당), NextFit(마지막으로 참조한 메모리 공간에서부터 탐색을 시작해 공간을 찾아 할당), BestFit(모든 메모리 공간을 검사후 내부 단편화를 최소화하는 공간에 할당)
    * 내부 단편화: 메모리를 할당할 때 프로세스가 필요한 양보다 더 큰 메모리가 할당되어서 프로세스에서 사용하는 메모리 공간이 낭비 되는 현상.
    * 외부 단편화 : 메모리가 할당 및 해제 작업의 반복으로 메모리 공간 중간중간에 여유공간이 생겨 낭비되는 현상



  • 가상 메모리 : 메모리에 로드된(실행중) 프로세스가 메모리가 아닌 가상의 공간을 참조하는 기법을 말한다.
    구현 방식 : 프로세스의 모든 부분이 메모리에 올라가야만 동작하는 것은 아니기 때문에, 프로세스를 실행할 때, 전체 메모리는 논리적(가상적) 메모리를 참조하게하고 실행에 필요한 부분만 물리적 메모리에 올려놓는 방식
    1. 페이지 단위로 프로세스를 자른다. (외부단편화 문제를 해결하기 위해 페이징이 효율적)
    2. 현재 사용하고 있지 않은 데이터는 가상메모리에 저장하고 실행하는데 필요한 페이지만 실제 메모리에 적재한다.
    그러다 프로세스가 적재되지 않은 페이지(페이지 부재)를 요구할 경우 요구 페이징 작업이 일어남

    *요구 페이징 :
    1. 디스크에서 해당 페이지를 찾음
    2. 메모리상의 빈 프레임을 찾고 해당 페이지를 할당한다.
    3. 로딩 완료 인터럽트를 발생시켜 CPU가 다시 할당되어지면 멈춰진 부분부터 재개된다.

    새로운 페이지를 적재하기 위한 Free Frame이 부족한 경우 스왑 아웃 방식과 페이지 교체 방식이 있습니다.

    스왑아웃은 다른 프로세스를 일시정지해 스왑 아웃했다가 여유가 생길때 다시 스왑 인하게 하여 공간을 만드는 방식입니다. 동시에 적재할 수 있는 프로세스의 수가 많은 다중 프로그래밍 정도가 매우 높을 때 최적의 방식이 될 것입니다.

    페이지 교체방식이 가장 일반적인 방법으로 정해진 규칙에 의해 페이지를 교체하는 방식입니다.
    페이지 교체 알고리즘 : FIFO (메모리 할당된 순서대로 교체), LRU (최근에 가장 오랫동안 사용하지 않은 페이지교체) ,LFU(사용빈도가 가장 적은 페이지 교체) ...

    스레싱 : 페이지 부재율이 너무 높아서 실행시간보다 페이지 교체시간이 더 걸려 성능이 저하되는 현상
    https://aerocode.net/390

  • 뮤텍스 vs 세마포
    두가지 모두 동시성 프로그래밍에서 공유 자원을 안전하게 관리하기 위해 상호 배제를 달성하는 기법이다.

    뮤텍스: Key에 해당하는 오브젝트를 소유한 쓰레드/프로세스만이 공유 자원에 접근하게 하는 기법
    세마포 : 현재 공유자원에 접근할 수 있는 쓰레드, 프로세스의 수를 지속 관리하여 상호배제를 달성하는 기법
    https://worthpreading.tistory.com/90
 

뮤텍스(Mutex)와 세마포어(Semaphore)의 차이

이 글은 Medium에 개시된 글입니다. Medium에서 보시면 좀 더 유쾌한 환경에서 글을 보실 수 있습니다. 뮤텍스(Mutex)와 세마포어(Semaphore)의 차이 Toilet problem 동시성 프로그래밍의 가장 큰 숙제는 ‘공

worthpreading.tistory.com

 

  • 문맥교환 (Context Switching) 
    하나의 프로세스가 CPU를 사용중인 상태에서 다른 프로세스가 CPU를 사용하도록 하기 위해 이전의 프로세스 상태를 보관하고 새로운 프로세스의 문맥을 적재하는 작업 (이전 프로세스의 문맥은 OS의 PCB에 기록된다)

    *PCB (Process Control Block) : OS가 시스템 내의 프로세스들을 관리하기 위해 프로세스마다 정보(프로세스 상태, pc값, 자원사용 정보 등등)들을 담는 커널 내 자료구조

예를 들어, 실행 상태에 있던 프로세스(A)가 입출력을 요청해야하는 경우, 입출력을 하기 위해서 프로세스는 I/O를 요청하는 시스템 콜을 발생시키고, 프로세스는 device queue에 줄을 서게 되고 준비 상태로 상태가 변경된다.( I/O 연산은 CPU가 처리하지않고 I/O 컨트롤러가 담당함) 
그리고 준비 큐에 있던 다른 프로세스(B)가 CPU를 할당받아 명령을 수행하게 될 것이다. 이렇게 CPU제어권이 A에서 -->OS --> B로 넘어가는 과정을 문맥교환이라고 한다.

'TIL' 카테고리의 다른 글

마크다운(MarkDown) 사용법  (0) 2021.10.04
Servlet , JSP, MVC Pattern , Spring  (0) 2021.10.03
Git 브랜치 전략  (0) 2021.09.28
[TIL] JWT TOKEN, Cookie & Session  (0) 2021.09.26
[TIL] 자바 개념정리  (0) 2021.09.25
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기