//구글콘솔 광고 추가가
728x90
반응형
교착 상태란?

일어나지 않을 사건을 기다리며 진행이 멈춰 버리는 현상.

교착 상태를 해결하기 위해서는?
  1. 교착 상태가 발생했을 때의 상황을 정확하게 표현해 보기
  2. 교착 상태가 일어나는 근본적인 이유 이해하기.
1. 교착 상태가 발생했을 때의 상황을 정확하게 표현해 보기 - 그래프를 그려보자

자원 할당 그래프
: 교착 상태가 발생했을 때의 상황을 표현하기 위한 그래프
>>교착 상태 발생 조건 파악 가능
- 어떤 프로세스가 어떤 자원을 할당받아 사용 중인지 확인 가능.
- 어떤 프로세스가 어떤 자원을 기다리고 있는지 확인 가능.

교착상태가 일어난 그래프의 특징은 자원 할당 그래프가 원의 형태를 띄고 있다.
2. 교착 상태가 일어나는 근본적인 이유 이해하기.

교착 상태가 발생할 4가지 조건

1. 상호 배제 : 한 프로세스가 사용하는 자원을 다른 프로세스가 사용할 수 없는 상태
2. 점유와 대기 : 자원을 할당받은 상태에서 다른 자원을 할당받기를 기다리는 상태
3. 비선점 : 어떤 프로세스도 다른 프로세스의 자원을 강제로 빼앗지 못하는 상태
4. 원형 대기 : 프로세스들이 원의 형태로 자원을 대기하는 상태

위 네 가지 조건 중 하나라도 만족하지 않으면 교착 상태가 발생하지 않음.
위 네가지 조건을 모두 만족하면 교착 상태가 발생할 수 있음.
교착 상태 해결 방법 4가지.
예방, 회피, 검출 후 회복.

교착 상태 예방 애초에 교착 상태가 발생하지 않도록 교착 상태 발생 조건(상호배제, 점유와 대기, 비선점, 원형 대기)중 하나를 없애버리기
>> 교착 상태가 발생하지 않음은 보장할 수 있으나 부작용이 따르는 방식.
상호배제 없애기 모든 자원을 공유 가능하게 만들기 >> 이론적으론 가능하지만 현실적으로 ㄴㄴ
점유와 대기 없애기 특정 프로세스에 자원을 모두 할당하거나, 아예 할당하지 않는 방식으로 배분
>> 자원의 활용률을 낮출 수 있는 방식이라 부작용이 있음.
비선점 조건 없애기 선점이 가능한 자원(e.g. CPU)에 한해 효과적
>> 모든 자원이 선점 가능한 것은 아니다.
원형 대기 조건을 없애기 자원에 번호를 붙이고 오름차순으로 할당하면 원형 대기는 발생하지 않음
>> 자원에 번호를 붙이는 것은 어려운 작업, 어떤 자원에 어떤 번호를 붙이느냐에 따라 활용률이 달라짐.
교착 상태 회피 - 교착 상태를 무분별한 자원 할당으로 인해 발생했다고 간주
- 교착 상태가 발생하지 않을 만큼 조심히 할당하기
- 배분할 수 있는 자원의 양을 고려하여 교착 상태가 발생하지 않을 만큼만 자원 배분
안전 순서열 교착 상태 없이 안전하게 프로세스들에 자원을 할당 할 수 있는 순서
안전 상태 교착 상태 없이 모든 프로세스가 자원을 할당 받고 종료될 수 있는 상태
- 안전 순서열이 있는 상태
불안전 상태 교착 상태가 발생할 수도 있는 상태
- 안전 순서열이 없는 상태
- 안전 상태에서 안전 상태로 움직이는 경우에만 자원을 할당하는 방식
- 항시 안전 상태를 유지하도록 자원을 할당하는 방식
- c.f. 은행원 알고리즘 

교착 상태 검출 후 회복 - 교착 상태의 발생을 인정하고 사후에 조치하는 방식
- 프로세스가 자원을 요구하면 일단 할당, 교착 상태가 검출되면 회복
- 선점을 통한 회복, 프로세스 강제 종료를 통한 회복 
선점을 통한 회복 - 교착 상태가 해결될 때까지 한 프로세스씩 자원을 몰아주는 방식
프로세스 강제 종료를 통한 회복 - 교착 상태에 놓인 프로세스 모두 강제종료(>> 작업 내역을 잃을 위험)
- 교착 상태가 해결될 때까지 한 프로세스씩 강제종료(>> 오버헤드)

 

++교착 상태 무시 ( == 타조 알고리즘) : 문제가 발생했을 때 무시해 버리는 방법.

728x90
반응형
728x90
반응형
동시 다발적으로 실행되는 프로세스들은 서로 협력하며 영향을 주고받는다.
이 과정에서 자원의 일관성을 보장해야 한다.  >> 즉, 프로세스들의 동기화를 고려해야 한다.

공동의 목적을 위해 동시에 수행되는 프로세스들은 아무렇게나 마구 실행해도 괜찮을까?

>> ㄴㄴ 올바른 수행을 위해 프로세스들은 동기화되어야 함.

프로세스의 동기화란?
프로세스들의 수행 시기를 맞추는 것
크게 두 가지를 의미
- 실행 순서 제어 : 프로세스를 올바른 순서대로 실행하기
- 상호 배제 : 동시에 접근해서는 안 되는 자원에 하나의 프로세스만 접근하게 하기 
* 실행의 문맥을 갖는 모든 대상은 동기화 대상이기에 스레드도 동기화 대상. 
실행 순서 제어를 위한 동기화 : reader writer problem 상호배제를 위한 동기화 :
Bank account problem , Producer & Consumer problem
(레이스 컨디션(race condition)의 사례)
Writer: Book.txt 파일에 값을 저장하는 프로세스
Reader: Book.txt파일에 저장된 값을 읽어들이는 프로세스
----------------------------------------------------------------------------
Reader와 Writer프로세스는 무작정 아무렇게나 실행되어선 안된다. 실행의 순서가 있기 때문
Reader 프로세스는 "Book.txt"안에 값이 존재한다"는 특정 조건이 만족되어야만 실행 가능
공유가 불가능한 자원의 동시 사용을 피하기 위한 동기화
== 한번에 하나의 프로세스만 접근해야 하는 자원에 동시 접근을 피하기 위한 동기화
---------------------------------------------------------------------------------------
현재 계좌에 잔액 : 10만원
프로세스 A는 현재 잔액에 2만원을 추가하는 프로세스
프로세스 B는 현재 잔액에 5만원을 추가하는 프로세스 
프로세스의 실행이 끝나고 다음 프로세스가 실행되어야 잔액의 오류가 없음.
--------------------------------------------------------------------------------------
물건을 계속해서 1씩 생산하는 생산자(producer, 프로세스 혹은 스레드)
물건을 계속해서 1씩 소비하는 소비자(consumer, 프로세스 혹은 스레드)
"총합" 변수 공유, 이 상태에서 생산자를 100,000번, 소비자를 100,000번 실행했을때 총합은? 예상과 다르게 결과 값 나옴.
>> 동기화가 되지 않았기 때문에 발생하는 문제.
동시에 접근해서는 안되는 자원(총합)에 동시에 접근해서 발생한 문제.

 

공유 자원과 임계구역

공유자원 :  여러 프로세스 혹은 스레드가 공유하는 자원 (전역변수, 파일, 입출력장치, 보조기억장치 ...)

임계 구역 : 공유 자원에 접근하는 코드 중 동시에 실행하면 문제가 발생하는 코드 영역

임계 구역에 진입하고자 하면 진입한 프로세스 이외에는 대기해야 한다.

임계 구역에 동시에 접근하면 자원의 일관성이 깨질 수 있다. 이를 레이스 컨디션(race condition)이라 한다.

 

운영체제가 임계구역 문제를 해결하는 세 가지 원칙 (상호배제를 위한 동기화를 위한 세가지 원칙)
1. 상호 배제(mutual exclusion) :
 한 프로세스가 임계 구역에 진입했다면 다른 프로세스는 들어올 수 없다.

2. 진행(progress) :
임계 구역에 어떤 프로세스도 진입하지 않았다면 진입하고자 하는 프로세스는 들어갈 수 있어야 한다.

3. 유한 대기(bounded waiting) :
 한 프로세스가 임계 구역에 진입하고 싶다면 언젠가는 임계 구역에 들어올 수 있어야 한다.(임계 구역에 들어오기 위해 무한정 대기해서는 안된다.)

 

동기화 기법
뮤텍스 락  세마포 모니터
- 상포 배제를 위한 동기화 도구(탈의실에 있는 자물쇠 역할(사람이 들어있는지 안들어있는지 확인 가능한 역할) - 탈의실 : 임계구역, 손님 : 프로세스) 
- 공유자원이 only 하나일 때 적용 가능
- 좀 더 일반화된 방식의 동기화 도구
- 공유 자원이 여러개 있는 경우에도 적용 가능.
- 임계 구역 앞에서 멈춤 신호를 받으면 잠시 기다리기. 임계 구역앞에서 가도 좋다는 신호를 받으면 임계구역 진입.
- 사용자(개발자)가 다루기에 편한 동기화 도구

뮤텍스 락의 단순한 형태
 : 전역변수 하나, 함수 두개
-----------------------------------------------------
- 자물쇠 역할 :
프로세스들이 공유하는 전역변수 lock
- 임계 구역을 잠그는 역할 :
acquire 함수
- 임계 구역의 잠금을 해제하는 역할 :
release함수
세마포의 단순한 형태
 : 전역변수 하나, 함수 두개
-----------------------------------------------------
- 임계 구역에 진입할 수도 있는 프로세스의 개수(사용 가눙한 공유 자원의 개수)를 나타내는 전역 변수 s
- 임계구역에 들어가도 좋을지, 기다려야 할지를 알려주는 wait함수
- 임계구역 앞에서 기다리는 프로세스에 "이제 가도 좋다"고 신호를 주는 signal함수
- 모니터 안에는 하나의 프로세스만이 있을 수 있다.
> wait()를 호출했던 프로세스는 signal()을 호출한 프로세스가 모니터를 떠난 뒤에 수행을 재개.
> signal()을 호출한 프로세스의 실행을 일시 중단하고 자신이 실행된 뒤 다시 signal()을 호출한 프로세스의 수행을 재개.
ex>
acquire(); //자물쇠 잠겨있는지 확인, 잠겨있지 않다면 잠그고 들어가기
//임계 구역 //임계구역에서의 작업 진행
//여기서 위의 예시 중 총합 변수 접근
release(); //자물쇠 반환
-----------------------------------------------------
acquire 함수 : 프로세스가 임계 구역에 진입하기 전에 호출. 임계 구역이 잠겨있다면 임계구역이 열릴때까지(lock == false) 임계구역을 반복적으로 확인. 임계구역이 열려있다면 임계구역을 잠그기(lock = true)
release함수 : 임계구역에서의 작업이 끝나고 호출. 현재 잠긴 임계구역을 열기(lock을 false로 바꾸기) 
-----------------------------------------------------
* 예시 코드
acquire() {
      while(lock == true) //만약 임계구역이 잠겨잇다면
               ; //임계구역이 잠겨있는지를 반복적으로 확인.
       lock = true ; //만약임계구역이 잠겨있지 않다면 임계구역 잠금
}
release() {
       lock = false; //임계구역 작업이 끝났으니 잠금 해제 
}
-----------------------------------------------------
ex>
wait();
//임계구역
signal();
임계구역 앞뒤로 함수 호출.
-----------------------------------------------------
wait() {
     while( S <=0)  // 만일 임계구역에 진입할 수 있는 프로세스 개수가 0이하라면
        ; // 사용할 수 있는 자원이 있는지 반복적으로 확인하고
     S--; // 임계 구역에 진입할 수 있는 프로세스 개수가 하나 이상이면 S를 1감소 시키고 임계구역에 진입. 
signal() {
       S++; // 임계 구역에서의 작업을 마친 뒤 S를 1 증가시킴.
-----------------------------------------------------
세마포를 활용한 실행 순서 동기화
- 세마포의 변수 S를 0으로 두고, 먼저 실행할 프로세스 뒤에 signal함수. 다음에 실행할 프로세스 앞에 wait함수를 붙이면됨.
- 상호배제를 위한 동기화 : 
>인터페이스를 위한 큐. 
>공유자원에 접근하고자 하는 프로세스를(인터페이스를 위한) 큐에 삽입.
>큐에 삽입된 순서대로(한번에 하나의 프로세스만) 공유 자원 이용 가능.
- 실행 순서 제어를 위한 동기화 : 
> 조건 변수 이용(프로세스나 스레드의 실행 순서를 제어하기 위해 사용하는 특별한 변수)
조건 변수. wait() : 대기 상태로 변경, 조건 변수에 대한 큐에 삽입
조건 변수. signal() : wailt()으로 대기 상태로 접어든 조건 변수를 실행 상태로 변경 
1. 특정 프로세스가 아직 실행될 조건이 되지 않았을 때에는 wait를 통해 실행을 중단한다.
2. 특정 프로세스가 실행될 조건이 충족되었을 때에는 signal을 통해 실행을 재개한다.
- 코드
  while() //만약 임계구역이 잠겨잇다면
               ; //임계구역이 잠겨있는지를 반복적으로 확인.
부분을 바쁜 대기(busy waiting)라 부름 
>>임계 구역에 진입할 수 있는지를 반복적으로 확인하는 것은 CPU사이클 낭비!
---------------------------------------------------------------------------------------------------------------
해결 방법
- 사용할 수 있는 자원이 없을 경우 대기 상태로 만듦
(해당 프로세스의 PCB를 대기 큐에 삽입)
- 사용할 수 있는 자원이 생겼을 경우 대기 큐의 프로세스를 준비 상태로 만듦.
(해당 프로세스의 PCB를 대기 큐에서 꺼내 준비 큐에 삽입)
 

 

728x90
반응형
728x90
반응형
스레드란?
프로세스를 구성하는 실행 흐름의 단위. 하나의 프로세스는 하나 이상의 스레드를 가질 수 있다.
(한 프로세스를 여러 개의 스레드로 동시 실행 가능)
웹브라우저 프로세스 - 화면 출력 스레드, 입력 스레드, 검색 스레드 등등

프로세스와 스레드
- 실행 흐름이 하나인 프로세스(단일 스레드 프로세스)
- 실행 흐름이 여러 개인 프로세스(멀티 스레드 프로세스)
 >> 프로세스를 이루는 여러 명령어 동시 실행 가능.

스레드의 구성요소
: 스레드 ID, 프로그램 카운터를 비롯한 레지스터 값, 스택 등. 실행에 필요한 최소한의 정보를 가지고 있음.
모든 스레드들은 프로세스의 자원을 공유한다. 
멀티 프로세스와 멀티 스레드
동일한 작업을 수행하는 단일 스레드 프로세스 여러 개 실행(멀티프로세스)vs 하나의 프로세스를 여러 스레드로 실행(멀티 스레드) >> 차이는?
멀티프로세스 : 남남처럼(자원 공유 X) 실행
- 프로세스를 fork 하면 코드/ 데이터/ 힙 영역등 모든 자원이 복제되어 저장됨.
- 저장된 메모리 주소를 제외하면 모든 것이 동일한 프로세스 두 개가 통째로 메모리에 적재
- fork를 세번, 네 번 하면 메모리에는 같은 프로세스가 통째로 세 개, 네 개 적재
참고) fork 직후 같은 프로세스를 통째로 메모리에 중복 저장하지 않으면서동시에 프로세스끼리 자원을 공유하지 않는 방법도 있다. 이를 쓰기 시 복사(copy on write) 기법이라 한다.
- PCB값 멀티 프로세스의 스레드들은 다 다름, 멀티 스레드의 PCB값은 하나 
- 스레드들은 각기 다른 스레드 ID, (별도의 실행을 위해 꼭 필요한) 프로그램 카운터 값을 포함한 레지스터 값, 스택을 가질 뿐 프로세스가 가지는 자원을 공유 

>>프로세스끼리는 자원을 공유하지 않는다. --> 남남처럼 독립적으로 실행된다.
프로세스 간에도 자원을 주고 받을 수 있다 : 프로세스 간 통신(IPC)
파일을 통한 프로세스 간 통신, 공유 메모리를 통한 프로세스 간 통신.(프로세스끼리 공유하는 메모리를 따로 둠)
>> 스레드는 프로세스의 자원을 공유한다. --> 협력과 통신에 유리하다. 때로는 자원을 공유하고 있다는 게 문제가 될 수도 있음.

 

728x90
반응형
728x90
반응형
프로세스 상태
생성 상태 - 이제 막 메모리에 적재되어 PCB를 할당 받은 상태
- 준비가 완료되었다면 준비상태로 됨
준비 상태 - 당장이라도 CPU를 할당 받아 실행할  수 있지만 자신이 차례가 아니기에 기다리는 상태.
- 자신의 차례가 된다면 실행상태로 됨(== 디스패치)
실행 상태 - CPU를 할당 받아 실행 중인 상태.
- 할당된 시간 모두 사용 시(타이머 인터럽트 발생시) 준비상태로, 실행 도중 입출력 장치를 사용하면 입출력 작업이 끝날 때까지 대기 상태로 됨.
대기 상태 - 프로세스가 실행 도중 입출력 장치를 사용하는 경우
- 입출력 작업은 CPU에 비해 느리기에 이 경우 대기 상태로 접어듬. 입출력 작업이 끝나면(입출력 완료 인터럽트를 받으면) 준비상태로 접어듬.
종료 상태 - 프로세스가 종료된 상태
- PCB, 프로세스의 메모리 영역 정리 

 

프로세스 상태 다이어그램

프로세스 상태 다이어그램

프로세스 계층구조
  • 프로세스 실행 도중(시스템 호출을 통해) 다른 프로세스 생성 가능
  • 새 프로세스를 생성한 프로세스 : 부모 프로세스
  • 부모 프로세스에 의해 생성된 프로세스 : 자식 프로세스
- 부모 프로세스와 자식 프로세스는 별개의 프로세스이므로 각기 다른 PID를 가짐.
- 일부 운영체제에서는 자식 프로세스 PCB에 부모 프로세스 PID(PPID)를 명시하기도 함. 
- 자식 프로세스는 또 다른 자식 프로세스를 낳을 수 있고, 그 자식프로세스는 또 다른 자식 프로세스르 낳을 수 있음. >> 프로세스의 계층적인 구조 형성. 

 

프로세스 생성 기법

부모 프로세스는 자식 프로세스를 어떻게 만들어내고, 자식 프로세스는 어떻게 자신만의 코드를 실행할까?

>> 복제와 옷 갈아입기

Fork-exec

  • 부모 프로세스는 fork 시스템 호출을 통해 자신의 복사본을 자식 프로세스로 생성
  • 자식 프로세스는 exec 시스템 호출을 통해 자신의 메모리 공간을 다른 프로그램으로 교체 
fork 시스템 호출 fork는 자기 자신 프로세스의 복사본을 자식 프로세스로 생성하는 시스템 호출이다.
- 복사본(= 자식 프로세스) 생성
- 부모 프로세스의 자원 상속
exec 시스템 호출 exec는 자신의 메모리 공간을 새로운 프로그램으로 덮어쓰는 시스템 호출이다.
- 메모리 공간을 새로운 프로그램으로 덮어쓰기
- 코드/ 데이터 영역은 실행할 프로그램 내용으로 바뀌고 나머지 영역은 초기화

 

728x90
반응형
728x90
반응형
실행 중인 프로 그램, "프로세스"

 

프로세스
: 포그라운드 프로세스와 백그라운드 프로세스로 나뉜다.
포그라운드 프로세스 사용자가 볼 수 있는 공간에서 실행되는 프로세스 메모장, 웹브라우저
백그라운드 프로세스 사용자가 볼 수 없는 공간에서 실행되는 프로세스
사용자와 상호작용하지 않고 그저 정해진 일만 수행하는 프로세스
데몬, 서비스로도 불림.

 

프로세스 제어 블록
: 프로세스 관련 정보를 저장하는 자료구조
모든 프로세스는 실행을 위해 CPU가 필요하지만 CPU자원은 한정되어 있다.
프로세스들은 돌아가며 한정된 시간만큼만 CPU이용한다. - 자신의 차례에 정해진 시간만큼 CPU이용, 타이머 인터럽트가 발생하면 차례 양보.

빠르게 번갈아 수행되는 프로세스들을 관리해야 하며 이를 위해 사용하는 자료구조가 프로세스 제어 블록(이하 PCB)이다.
프로세스 관련 정보를 저장하는 자료구조. 프로세스 생성 시 커널 영역에 생성, 종료 시 폐기.
프로세스 제어 블록에 담기는 대표적인 정보
프로세스 ID( = PID)
: 특정 프로세스를 식별하기 위해 부여하는 고유한 번호(학교의 학번같은 거)
레지스터 값
: 프로세스는 자신의 실행 차례가 오면 이전까지 사용한 레지스터 중간 값을 모두 복원. >> 실행재게

프로세스 상태
: 입출력 장치를 사용하기 위해 기다리는 상태. CPU를 사용하기 위해 기다리는 상태, CPU이용중인 상태
CPU 스케줄링 정보
: 프로세스가 언제, 어떤 순서로 CPU를 할당 받을 지에 대한 정보
메모리 정보
: 프로세스가 어느 주소에 저장 되어 있는 지에 대한 정보. 페이저 테이블 정보(== "메모리 현재주소를 알 수 있는 정보가 담기는 군") 
사용한 파일과 입출력 장치 정보
: 할당된 입출력 장치. 사용중인(열린) 파일 정보

운영체제는 커널 영역에 적재된 프로세스 제어 블록 (PCB)를 보고 프로세스를 관리.

 

문맥 교환(context switch)
한 프로세스에서 다른 프로세스로 실행 순서가 넘어가면?
- 기존에 실행되던 프로세스는 지금까지의 중간 정보를 백업(프로그램 카운터 등 각종 레지스터 값, 메모리 정보, 열었던 파일, 사용한 입출력 장치 등)
          - 이러한 중간 정보 == 문맥
          - 다음차례가 왔을 때 실행을 재개하기 위한 정보
          - 실행 문맥을 백업해두면 언제든 해당 프로세스의 실행을 재개할 수 있다!
- 뒤이어 실행할 프로세스의 문맥을 복구
          - 자연스럽게 실행 중인 프로세스가 바뀜 
  • 이처럼 기존의 실행 중인 프로세스 문맥을 백업하고 새로운 프로세스 실행을 위해 문맥을 복구하는 과정을 문맥 교환 이라 한다.(여러 프로세스가 끊임없이 빠르게 번갈아 가며 실행되는 원리)

프로세스의 메모리 영역

: 크게 코드 영역(=텍스트영역), 데이터 영역, 힙 영역, 스택 영역

프로세스의 메모리 영역  
코드 영역(= 텍스트 영역) - 실행할 수 있는 코드, 기계어로 이루어진 명령어 저장
- 데이터가 아닌 CPU가 실행할 명령어가 담기기에 쓰기가 금지된 영역(read- only)
크기가 고정되어 있는 영역
(== 정적 할당 영역)
데이터 영역 - 잠깐 썼다가 없앨 데이터가 아닌 프로그램이 실행되는 동안 유지할 데이터 저장
- e.g. 전역변수 
힙 영역 - 프로그램을 만드는 사용자, 즉 프로그래머가 직접 할당할 수 있는 저장공간
- 메모리 공간을 할당했을 때 언젠가는 이 공간을 반환해야 함. 이걸 대신 해주는게 c#에는 가비지 콜렉션이란 기능이 있음, 하지만 c언어같은 경우는 직접해줘야 함 이걸 안해주면 메모리 누수가 일어날 수 있음.
크기가 가변적으로 변할수 있는 영역
(== 동적 할당 영역)

- 일반적으로 힙 영역은
낮은 주소 >> 높은 주소로 할당
- 일반적으로 스택영역은
높은 주소 >> 낮은 주소로 할당
- 주소가 겹치지 않게 하기 위해 힙과 스택은 할당되는 방향이 반대되는 방향으로 차오름.
스택 영역 - 데이터가 일시적으로 저장되는 공간
- (데이터 영역에 담기는 값과는 달리) 잠깐 쓰다가 말 값들이 저장되는 공간.
- e.g. 매개변수, 지역변수 

 

728x90
반응형
728x90
반응형
운영체제는 현존하는 프로그램 중 규모가 가장 큰 프로그램 중 하나!
운영체제의 심장 "커널"
커널이란?
: 운영체제의 핵심 서비스를 담당하는 부분.
- 운영체제에는 속하는 데 커널에는 속하지 않는 기능 - 유저 인터페이스(UI; User Interface)
>> 사용자와 컴퓨터 간의 통로일 뿐 운영체제의 핵심 기능(커널)은 아님.

- 운영체제는 응용프로그램들이 자원에 접근하려 할 때 오직 자신을 통해서만 접근하도록 하여 자원을 보호.
응용프로그램이 자원에 접근하려면 운영체제에 도움을 요청(== 운영체제의 코드를 실행)해야 함.

 

이중모드와 시스템 호출
  •  이중모드 : CPU가 명령어를 실행하는 모드를 크게 사용자 모드커널 모드로 구분하는 방식.
사용자 모드 - 운영체제 서비스를 제공받을 수 없는 실행 모드
- 커널 영역의 코드를 실행할 수 없는 실행 모드
- 자원 접근 불가
커널 모드 - 운영체제의 서비스를 제공받을 수 있는 실행 모드
- 자원 접근을 비롯한 모든 명령어 실행 가능
  • 시스템 호출: 운영체제 서비스를 제공받기 위해 커널 모드로 전환하는 방법. 커널 모드로 전환하여 실행하기 위해 호출, 일종의 소프트웨어 인터럽트. >> 시스템 호출이 처리되는 방식은 하드웨어 인터럽트 처리 방식과 유사. 

커널모드와 사용자 모드를 왔다 갔다 하면서 실행

운영체제의 핵심 서비스
 프로세스 관리 프로세스 == 실행중인 프로그램. 수많은 프로세스들이 동시에 실행되고 있는데 이걸 관리해줌.
동시다발적으로 생성/ 실행/ 삭제되는 다양한 프로세스를 일목요연하게 관리해줌(프로세스와 스레드, 프로세스 동기화, 교착상태 해결 등등)
운영체제의 자원 접근 및 할당 - CPU (CPU스케줄링: 어떤 프로세스를 먼저, 얼마나 오래 실행할지)
- 메모리 (페이징, 스와핑 등등)
- 입출력장치 (인처럽트 서비스 루틴)
파일 시스템 관리 - 관련된 정보를 파일이라는 단위로 저장 장치에 보관.
- 파일들을 묶에 폴더(디렉토리) 단위로 저장장치에 보관.

 

728x90
반응형
728x90
반응형
모든 프로그램은 실행을 위해 자원을 필요로 한다.
운영체제란?
  • 실행할 프로그램에 필요한 자원을 할당하고 프로그램이 올바르게 실행되도록 돕는 특별한 프로그램.
  • 운영체제는 커널 영역에 적재되는 프로그램.
메모리는 커널 영역과 사용자 영역으로 나뉜다.
- 커널 영역 : 운영체제
- 사용자 영역 : 응용프로그램(사용자가 특정 목적을 위해 사용하는 일반적인 프로그램 >> 메모장, 웹브라우져 등)

 

운영체제 - 메모리 관리, CPU 관리(누가 먼저 실행될지, 얼마나 오래 쓸지), 입출력장치 관리

>> 응용프로그램과 하드웨어 사이에 위치해서 연결해주는 프로그램.

 

운영체제 덕분에 개발자는 하드 웨어를 조작하는 코드를 직접 작성할 필요가 없다.
운영체제를 알아야 하는 이유

- 사용자를 위한 프로그램이 아님. 프로그램을 위한 프로그램! 그렇기에 프로그램을 만드는 개발자는 운영체제를 알아야 한다!! 오류메세지에 대한 깊은 이해로 문제 해결 능력이 높아질 수 있음.

728x90
반응형
728x90
반응형
주기억장치의 종류에는 크게 RAM과 ROM 두가지가 있으며,
메모리라는 용어는 그중 RAM을 지칭하는 경우가 많음.
RAM의 특징

: 전원이 꺼지면 저장된 내용이 날아감.

- RAM은 휘발성 저장 장치, 보조기억장치는 비휘발성 저장 장치.

 

RAM의 종류
DRAM(Dynamic RAM) 저장된 데이터가 동적으로 사라지는 램. 데이터 소멸을 막기 위해 주기적으로 재활성화 해야 함. 
상대적으로 소비전력이 낮고 저렴하고, 집적도가 높아 대용량으로 설계하기 용이하기 때문에 실제로 메모리로 사용되는 램.
SRAM(Static RAM) 전원이 연결되어 있다면, 저장된 데이터가 정적인(사라지지 않는) RAM.
DRAM보다 일반적으로 입출력 속도가 빠름.
상대적으로 소비 전력이 높고 가격도 높고, 집적도가 낮아 대용량으로 설계할 필요는 없으나 빨라야 하는 장치에서 사용. 캐시메모리에서 사용되는 RAM.
SDRAM
(Synchronous DRAM)
DRAM의 발전된 램 >> 특별한(발전된 형태의) DRAM. 클럭 신호와 동기화된 DRAM.
DDR SDRAM
(Double Data Rate SDRAM)
특별한(발전된 형태의) SDRAM, 최근 가장 대중적으로 사용하는 RAM. 
대역폭을 넓혀 속도를 빠르게 만든 SDRAM. 대역폭은 데이터를 주고받을수 있는 길의 너비

 

  DRAM SRAM
재충전 필요함 필요없음
속도 느림 빠름
가격 저렴함 비쌈
집적도(오밀조밀 꽉꽉) 높음 낮음
소비 전력 적음 높음
사용 용도 주기억장치(RAM) 캐시메모리

 


메모리의 주소 공간

(물리 주소 & 논리 주소)

CPU와 실행중인 프로그램은 현재 메모리 몇 번지에 무엇이 저장되어 있는지 알고 있을까?
NO.
메모리에 저장된 값들은 시시각각 변하기 때문.
- 새롭게 실행되는 프로그램은 새롭게 메모리에 적재
- 실행이 끝난 프로그램은 메모리에서 삭제
- 같은 프로그램을 실행하더라도 실행할 때마다 적재되는 주소는 달라짐.

이러한 점을 극복하기 위해 주소 체계를 물리주소와 논리 주소로 나눈다. 
물리 주소 논리 주소
메모리 입장에서 바라본 주소
말 그대로 정보가 실제로 저장된 하드웨어상의 주소
CPU와 실행 중인 프로그램 입장에서 바라본 주소.
실행중인 프로그램 각각에게 부여된 0번지부터 시작하는 주소
물리 주소와 논리 주소의 변환
CPU와 메모리 사이에 있는 MMU(메모리 관리 장치)라는 하드웨어에 의해  논리주소는 물리 주소로 변환.
CPU가 이해하고 실행하는 주소는 전부 논리주소.
MMU는 논리주소와 베이스 레지스터(프로그램의 기 주소, 시작 주소)값을 더하여 논리 주소를 물리 주소로 변환함. 

*베이스 레지스터 : 프로그램의 가장 작은 물리 주소(프로그램의 첫 물리 주소)를 저장하는 셈.
*논리 주소 : 프로그램의 시작점으로 부터 떨어진 거리 인 셈.
CPU가 접근하려는 논리 주소는 한계 레지스터가 저장한 값보다 커서는 안됨.

 

메모리 보호 기법

1. 한계 레지스터 :

- 프로그램의 영역을 침범할 수 있는 명령어의 실행을 막음.

- 베이스 레지스터가 실행중인 프로그램의 가장 작은 물리 주소를 저장한다면, 한계 레지스터는 논리 주소의 최대 크기를 저장.

2. 주소범위 제한:

- 프로그램의 물리 주소 범위는 베이스 레지스터 값 이상에서부터 베이스 레지스터 값에 한계 레지스터 값을 더한 값 미만까지로 제한된다.

- 베이스 레지스터 값 <= 프로그램의 물리 주소 범위 < 베이스 레지스터 + 한계 레지스터 값 

>> CPU는 메모리에 접근하기 전, 접근하고자 하는 논리 주소가 한계 레지스터보다 작은지를 항상 검사한다.
만약 검사를 했는데 논리 주소가 한계레지스터가 크면 인터럽트(트랩)를 발생시킨다.
이런 메모리 보호 기법을 통해 실행중인 프로그램의 독립적인 실행 공간을 확보하고, 하나의 프로그램이 다른 프로그램을 침범하지 못하게 보호한다.

 


 

 

CPU가 메모리에 접근하는 시간은 CPU 연산 속도보다 느리다.  

 

저장 장치 계층 구조(memory hierarchy)
: CPU에 얼마나 가까운가를 기준으로 계층적으로 나타낼수 있음

1. CPU와 가까운 저장 장치는 빠르고, 멀리 있는 저장 장치는 느리다.

2. 속도가 빠른 저장 장치는 저장 용량이 작고, 가격이 비싸다. 

메모리 저장 장치 계층 구조

캐시 메모리

- CPU와 메모리 사이에 위치한, 레지스터보다 용량이 크고 메모리보다 빠른 SRAM기반의 저장장치

- CPU의 연산 속도와 메모리 접근 속도의 차이를 조금이나마 줄이기 위해 탄생.

- CPU가 매번 메모리에 왔다 갔다 하는 건 시간이 오래 걸리니, 메모리에서 CPU가 사용할 일부 데이터를 미리 캐시 메모리로 가지고 와서 쓰자.가 캐시메모리의 취지.

메모리에 접근  ==  물건을 사러가는 것이라 생각하면,
메모리 == 물건은 많지만 집(CPU)과는 멀리떨어져 있어 왕복이 오래 걸리는 대형 마트
캐시메모리 == 물건이 많지는 않아도 집(CPU)과 가까이 있는 편의점 이라 생각해보면 된다. 

 

캐시메모리는 하나가 아님. 계층적으로 구성할수 있음. CPU내부에 있을수도 외부에 있을 수도 있음.

계층적 캐시 메모리(L1 - L2 - L3 캐시) - 일반적으로 L1캐시와 L2캐시는 코어 내부에, L3캐시는 코어 외부에 있다.

L3캐시의 용량은 메모리보다 작지만, L1과 L2캐시보단 크다. 

계층적 캐시 메모리까지 반영한 저장 장치 계층 구조

참조 지역성의 원리
: CPU가 미래에 원하는 데이터를 예측하여 속도가 빠른 장치인 캐시 메모리에 담아 놓는데 이때의 예측률을 높이기 위하여 사용하는 원리 >> CPU가 사용할 법한 데이터를 예측하는 방법.

- 캐시 메모리는 메모리보다 용량이 작다. 당연하게도 메모리의 모든 내용을 저장할 수 없다.

따라서, CPU가 자주 사용할 법한 내용을 예측하여 저장함.

캐시 히트 예측이 들어맞을 경우(자주 사용할 것으로 예측한 데이터가 실제로 들어맞아 CPU가 캐시메모리에 저장된 값을 활용할 경우)
>> 이 경우엔 메모리에 접근하는 것보다 성능이 높아짐
캐시 미스 예측이 틀렸을 경우(자주 사용할 것으로 예측하여 메모리에 저장했지만 예측이 틀려 CPU가 메모리에 접근해야 하는 경우) 
>> 성능 하락!
캐시 적중률 캐시 히트 횟수 / (캐시히트횟수 + 캐시미스 횟수)
>> 적중률이 높으면 높을 수록 성능 높아짐.
참조 지역성의 원리란, CPU가 메모리에 접근할 때의 주된 경향을 바탕으로 만들어진 원리.

CPU의 주된 경향 2가지
- CPU는 최근에 접근 했던 메모리 공간에 다시 접근하려는 경향(시간 지역성)이 있다.
- CPU는 접근한 메모리 공간 근처를 접근하려는 경향(공간 지역성)이 있다. 
728x90
반응형

+ Recent posts