2022. 11. 24. 15:10ㆍCS/운영체제
//공부 기록용 포스팅입니다. 틀린 부분이 있을 경우 댓글로 알려주시면 감사합니다! 😎
컴퓨터 시스템 구조, 인터럽트(Interrupt), 동기식 입출력과 비동기식 입출력, 서로 다른 입출력 명령어, 저장장치 계층 구조, 프로그램의 실행(메모리 load), 커널 주소 공간의 내용, 사용자 프로그램이 사용하는 함수, 프로그램의 실행
1. 동기식 입출력과 비동기식 입출력
- 동기식, 비동기식 입출력 모두 I/O의 완료는 인터럽트로 알려줌
- I/O에서 일어나는 작업과 CPU에서 일어나는 작업이 sync 되어야 하면 동기식 I/O 라고 하고, sync가 될 필요가 없다면 비동기식 I/O
1-1. 동기식 입출력(synchronous I/O)
- I/O 요청 후 입출력 작업이 완료된 후에야 제어가 사용자 프로그램에게 넘어감
- 입출력이 진행되는 동안 CPU는 그 프로그램의 다음 명령을 수행하지 않고 기다린다.
→ 입출력이 완료되어 인터럽트를 통해 그 사실이 전달된 후
→ CPU의 제어권이 그 프로그램에게 넘어가서 다음 명령을 수행 - 구현 방법 1
- CPU의 명령 수행 속도 >>>>>> 입출력 장치에서 데이터를 읽어오는 등의 입출력 연산
- I/O가 끝날 때까지 인터럽트를 기다리며 CPU를 낭비시킴 ~ 매시점 하나의 I/O만 일어날 수 있음
- 구현 방법 2(일반적으로 I/O가 완료될 때까지 그 프로그램을 봉쇄시키는 2번을 주로 사용)
- 동기식 입출력의 조건은 만족한다. 해당 프로그램은 끝날 때 까지 기다려서 결과를 보고 처리하기 때문에
- 다만 그 동안에 CPU가 놀지 않고 다른 프로그램에게 넘어간다.
- 훨씬 효율적, I/O가 끝날 때 까지 CPU를 가만히 들고만 있으면 대단히 비효율적이기 때문
- 시스템 안에서 I/O는 매순간 한 개만 진행됨, CPU를 넘기지 않으면 다른 I/O를 진행하지 못하기 때문에 I/O도 낭비
- I/O가 완료될 때까지 해당 프로그램(A)에게서 CPU를 빼앗아 다른 프로그램(B)에게 이양
- CPU가 놀지 않고 일을 하고, I/O 장치도 동시에 여러 개가 일을 할 수 있다.
- 프로그램(A)의 입출력이 완료될 때까지 그 프로그램에 CPU를 할당하지 않는다.
- A의 입출력이 완료될 때까지 A에게 CPU를 할당하더라도 명령을 수행하지 못하기 때문
⇒ 입출력 중인 프로그램(A)를 봉쇄 상태(blocked state)로 전환
- 봉쇄 상태의 프로그램에게는 CPU를 할당하지 않고
- CPU 할당 시 곧바로 명령을 수행할 수 있는 프로그램에만 CPU를 할당
- A의 입출력이 완료될 때까지 A에게 CPU를 할당하더라도 명령을 수행하지 못하기 때문
- I/O 처리를 기다리는 줄에 그 프로그램(A)을 줄 세우고 → 다른 프로그램(B)에게 CPU를 줌
- 입출력 요청의 동기화를 위해 장치별로 큐(queue)를 두어 요청한 순서대로 처리할 수 있도록 한다.
- 입출력을 요청한 프로그램(A)에게서 CPU를 빼앗아 프로그램(B)에게 CPU를 할당했을 때
- 프로그램(B)도 입출력을 요청하면
- 프로그램(A)의 요청이 먼저이기 때문에 A를 먼저 큐에 넣고 그 후에 발생한 B의 요청을 A의 요청 뒤에 삽입
- 프로그램(B)도 입출력을 요청하면
- I/O가 끝나면 연산 완료의 통보는 인터럽트를 통해 수행
- 운영체제 커널은 인터럽트 처리 루틴으로 가서 입출력 연산을 끝낸 프로그램이 CPU를 할당받을 수 있도록
그 프로그램의 상태를 봉쇄 상태로부터 해제
- 운영체제 커널은 인터럽트 처리 루틴으로 가서 입출력 연산을 끝낸 프로그램이 CPU를 할당받을 수 있도록
- 원래 수행하던 프로그램(B)의 지점으로 돌아가 하던 업무를 계속 수행
- 프로그램 A는 CPU를 기다리는 줄에서 기다리다가 자신의 차례가 되면 CPU를 할당받고 I/O 연산 이후의 작업 수행
⇒ 사용자 I/O 요청 → 운영체제 커널로 CPU의 제어권이 넘어와 입출력 처리와 관련된 커널 코드 수행
→ I/O를 호출한 프로세스의 상태를 봉쇄 상태로 바꾸어 I/O가 완료될 때 까지 CPU를 할당받지 못하도록 한다
→ I/O가 완료되면 I/O 컨트롤러가 CPU에게 인터럽트를 발생시켜 입출력이 완료되었음을 알림
→ 프로세스의 봉쇄 상태를 해제시켜 CPU를 할당받을 수 있는 권한이 다시 생김
1-2. 비동기식 입출력(synchronous I/O)
- I/O가 시작된 후 입출력 작업이 끝나기를 기다리지 않고 CPU의 제어권을 입출력 연산을 호출한 그 프로그램(A)에게 곧바로 다시 부여하는 방식
- I/O의 요청의 결과와 관련 없이 수행할 수 있는 작업을 먼저 수행하고, 결과가 반드시 있어야 수행할 수 있는 일들은 입출력이 완료된 후에 수행하게 된다.
- I/O 요청이 디스크에서 읽어오는 요청이 아니라 디스크에 쓰는 요청이라면 쓰기 작업이 완료되기도 전에 다음 명령을 수행할 수 있다(asynchronous write)
⇒ 사용자 I/O 요청 → CPU의 제어권이 입출력을 요청한 프로세서에게 곧바로 다시 주어짐
→ 입출력 연산이 완료되는 것과 무관하게 처리 가능한 작업부터 처리
→ I/O이 완료되면 동기식과 마찬가지로 인터럽트를 통해 이를 CPU에게 알려준다.
→ 그 시점부터 읽어온 데이터를 필요로 하는 명령 수행
1-3. read, write
- read
- synchronous read: read는 I/O에서 데이터를 들고 와야지만 결과를 보고 그다음 작업을 할 수 있다
- asynchronous read: 읽어온 데이터와 상관 없이 그냥 할 수 있는 작업을 하고 ~ I/O가 끝났다고 알려주면 user 영역에서 할 수 있는 작업을 한다.
- write
- 보통은 출력이 됐는지 확인을 꼭 해야 다음 작업을 수행할 수 있는 것이 아니기 때문에 asynchronous write가 자연스러움
- synchronous write: I/O요청을 하고 I/O가 끝났다는 인터럽트가 들어올 때까지 기다렸다 다음 작업을 한다.
2. 서로 다른 입출력 명령어/기계어
- 일반적인 I/O 방식(I/O를 수행하는 special instruction): Memory Addresses + Device Addresses
- 메모리만 접근하는 인스트럭션(Memory Addresses), 예) load, store
- I/O 장치를 접근하는 인스트럭션(Device Addresses)
- (메모리에 접근하는 기계어, I/O하는 기계어) 두 개가 따로 있다
- Memory Mapped I/O에 의해: Memory Address
- I/O device에 메인 메모리 주소를 연장해서 매겨 메모리에 접근하는 인스트럭션을 통해서도 I/O에 접근할 수 있다.
- 실제 I/O를 고유의 기계어를 사용하지 않고, 메모리에 접근하는 기계를 통해서 I/O를 접근하도록 하는 방식
- 메모리에 접근하는 기계어로 I/O도 한다. 메모리에 데이터를 읽고나 쓰는 기계어를 실행하면, 실제로는 I/O를 접근하는 방식
3. 저장장치 계층 구조
- 컴퓨터 시스템을 구성하는 저장장치는 빠른 저장창치부터 느린 저장장치까지 단계적인 계층 구조로 이루어짐
- 빠른 저장 장치는 단위 공간당 가격이 높기 때문에 적은 공간을 사용
- 느린 저장 장치는 가격이 저렴해 대용량을 사용하는 반면 접근 속도가 느리다.
→ 당장 필요한 정보는 빠른 저장 장치에 넣어두어 수행 속도를 높이고, 그렇지 않은 정보는 상대적으로 느린 저장장치에 보관
- CPU 내부에 존재하는 레지스터, 캐시 메모리, 메인 메모리는 휘발성 저장 장치 - 전원 꺼지면 내용이 사라짐
- 메모리에서 실행되고 있는 프로그램 즉, 프로세스는 컴퓨터 전원이 켜져 있을 때만 살아있는 내용
- 메인 메모리보다 아래에 있는 저장 장치 계층은 비휘발성 저장 장치 - 전원이 꺼져도 내용이 사라지지 않음
- 적은 용량의 상위 저장장치만으로 빠른 수행 속도의 성능을 얻어낼 수 있는가?
→ 당장 필요한 정보만을 선별적으로 저장하면 하위에 있는 큰 용량의 저장장치를 가지고 있는 것과 비슷한 성능 효과를 낼 수 있다.
⇒ 캐싱(caching)- 상대적으로 용량이 적은 빠른 저장장치를 이용해 느린 저장장치의 성능을 향상시키는 총체적 기법
- 캐시 메모리는 메인 메모리보다 용량이 적어 모든 내용을 다 담아 놓을 수 없어서
- 상대적으로 느린 저장장치에 있는 내용 중 당장 사용되거나 빈번히 사용될 정보를 빠른 저장장치에 선별적으로 저장해서
→ 두 저장 장치 사이의 속도를 완충, 재사용성↑ ~ 성능↑
- 상대적으로 느린 저장장치에 있는 내용 중 당장 사용되거나 빈번히 사용될 정보를 빠른 저장장치에 선별적으로 저장해서
- 여러 가지 캐싱 기법을 사용해 적은 용량의 캐시 메모리를 사용해서도 메인 메모리와 같이 큰 용량을 가진 것처럼 효율적으로 동작하도록 관리할 수 있다.
3. 프로그램의 실행 (메모리 load)
- 프로그램은 실행 파일 형태로 파일 시스템에 저장
- 실행을 시키면 virtual memory 주소 공간이 형성
- 그 프로그램의 메모리 주소 공간이 형성되어 그 프로그램만의 독자적인 주소 공간이 생기게 된다
- 독자적 주소 공간이란(0부터 시작하는 주소)
- code: 실행 파일에 있던 코드가 올라오는 부분, CPU에서 수행할 기계어들이 위치
- data: 데이터가 보관되는 영역, 전역 변수나, 프로그램이 시작해서 종료할 때까지 남아있는 데이터들이 위치
- stack: 함수 안에 들어있는 지역변수, 함수 호출과 리턴에 관련된 부분
- physical memory 주소로 변환
- physical memory 또한 0으로 시작하는 주소이다. 하지만 하나의 주소로 쭈욱 올라간다.
- virtual memory 주소와 physical memory 주소는 다르다.
- 하드웨어의 지원을 받아 logical memory 주소 → physical memory 주소로 변환
- 프로세스가 되어 메모리에서 실행
- 실행파일이 메모리에 적재될 때 실행파일 전체가 메모리에 한꺼번에(메모리 낭비!) 올라가기보다는
일부분만 메모리에 올라가고 나머지는 디스크의 특정 영역에 내려가 있는 것이 일반적이다. - 메모리에는 - 당장 CPU의 수행에 필요한 부분을 올려놓고
- 당장 필요하지 않은 부분은 디스크 중 메모리의 연장 공간으로 사용되는 스왑 영역에 내려놓는다.
- 스왑 영역(swap area)
- OS는 프로그램 수행에 당장 필요한 부분만 메모리에 올려놓고
- 그렇지 않은 부분은 디스크의 스왑 영역에 내려놓는다: 스왑 아웃(swap out)
- 스왑 아웃된 부분이 필요할 때에는 다시 메모리 영역으로 올림
- 스왑 영역으로는 하드디스크가 가장 널리 사용
- 스왑 영역은 프로그램이 실행될 때 내용을 저장했다, 프로그램이 종료될 때 삭제하는 메모리의 연장 공간으로서의 역할을 담당 → 파일 시스템처럼 비휘발성 용도로 사용되는 것과 역할 구분
- 스왑 영역(swap area)
- 일부는 파일 시스템에 파일 형태로 존재
- 실행파일이 메모리에 적재될 때 실행파일 전체가 메모리에 한꺼번에(메모리 낭비!) 올라가기보다는
- 프로그램 만의 독자적인 주소 공간(virtual memory)은 실제로 연속적으로 메모리에 할당되는 것이 아니라 메모리와 스왑 영역에 쪼개져서 할당된다.
4. OS 커널 주소 공간의 내용
- OS도 하나의 프로그램이므로 OS 커널 역시 코드, 데이터, 스택의 주소 공간을 가지고 있다.
- 코드 영역
- 자원 관리를 위한 코드
- 사용자에게 편리한 인터페이스를 제공하기 위한 코드
- 시스템 콜, 인터럽트 처리 코드
- 데이터 영역
- 각종 자원을 관리하기 위해 OS가 사용하는 자료구조가 정의, 유지, 저장
- 하드웨어 종류마다 자료구조를 만들어 관리
- 현재 수행 중인 프로그램을 프로세스(process)라 부르고, 프로세스를 관리하기 위한 자료구조가 운영체제 커널에 하나씩 만들어짐
- PCB(Process Control Block): 각 프로세스의 상태, CPU 사용 정보, 메모리 사용 정보 등을 유지하기 위한 자료구조
- 스택 영역
- 커널 역시 함수 구조로 이루어져 있으므로, 커널의 코드가 수행되는 도중에 이루어지는 함수 호출은 커널 스택을 사용하게 되는 것
- 함수 호출 시의 복귀 주소를 저장하기 위한 용도로 각 프로세스마다 별도의 스택을 두어 따로 관리한다.
5. 사용자 프로그램이 사용하는 함수
- 어떠한 언어로 프로그램을 짜더라도 다 함수 형태로 만들어져 있고, 코드가 컴파일되어 기계어가 만들어지더라도 기계어 구조에는 함수가 어디서 시작하고 끝나는지에 대한 정보를 유지한다 → 인스트럭션 레벨에서도 ‘함수’ 용어 사용
- 사용자 정의 함수(User defined function call): 자신이 프로그램에서 정의한 함수
- 라이브러리 함수(Library function call): 자신의 프로그램에서 정의하지 않고 갖다 쓴 함수
⇒ 사용자 정의 함수와 라이브러리 함수는 프로그램의 실행 파일에 포함되어 있다.
→ 프로그램이 실행될 때 해당 프로세스의 주소 공간에 포함되며, 함수 호출 시에도 자신의 주소 공간에 있는 스택을 사용한다.
~ 메모리 jump 가능
- 커널 함수: OS 커널의 코드에 정의된 함수, 커널 함수의 호출 = 시스템 콜
- 시스템 콜 함수와 각종 하드웨어 및 소프트웨어가 CPU의 서비스를 요청하기 위해 발생하는 인터럽트 처리 함수
- 사용자 프로그램의 주소 공간에 그 코드가 존재하는 것이 아니라 운영체제 커널의 주소 공간에 코드가 정의
- 운영체제 내에 있는 함수를 사용자 프로그램이 호출해서 사용하는 것 ~ 메모리 jump 불가능
- 논리적으로 영역이 달라서 점프할 수 없고, 물리적으로도 접근 자체가 허가되지 않음
- 삼각함수 sum()은 라이브러리 함수, printf()는 함수 그 자체로는 라이브러리 함수이지만 궁극적으로 특권 명령인 입출력을 수반하므로 printf() 내에서 커널 함수를 호출하는 시스템 콜을 동반
6. 프로그램의 실행
- 하나의 프로세스가 시작되어 수행을 완료하기까지는 프로세스 자신의 주소 공간에 있는 코드만 실행되는 것이 아니라 커널의 주소 공간에 있는 코드도 실행된다.
- 프로그램 A의 시작부터 종료까지 - user mode와 kernel mode를 반복 ~ 중괄호를 닫는 지점에서 종료
- 프로그램 시작
- → A의 주소 공간에서는 사용자 모드(user mode): 프로그램이 CPU를 잡고 있다.
- User defined function call
- Library function call
- → 시스템 콜: kernel의 주소 공간에서 커널 모드(kernel mode)로 진입해 커널 주소에 정의된 함수를 실행
- 시스템 콜이 끝나면 다시 사용자 모드로 복귀해서 시스템 콜 이후의 명령들을 계속 실행
- user mode와 kernel mode를 반복 ~ 중괄호를 닫는 지점에서 종료
- 프로그램의 실행이 끝날 때에는 커널 모드로 진입해 프로그램 종료
- → A의 주소 공간에서는 사용자 모드(user mode): 프로그램이 CPU를 잡고 있다.
[복습]
- 동기식 입출력: I/O이 진행되는 동안 CPU는 그 프로그램의 다음 명령을 수행하지 않고 기다린다.
- 구현 방법 1: I/O가 끝날 때 까지 인터럽트를 기다리며 CPU를 낭비시킴
- 구현 방법 2: I/O가 완료될 때까지 프로그램을 봉쇄상태로 전환하고 CPU를 빼앗아 다른 프로그램에게 이양
- 비동기식 입출력: I/O가 끝나기를 기다리지 않고 CPU의 제어권을 I/O를 요청한 프로그램에게 곧바로 다시 부여한다.
- 서로 다른 입출력 명령어
- 일반적인 I/O 방식: 메모리 접근(Memory Address) + I/O 장치 접근(Device Address)
- Memory Mapped I/O: 메모리 주소를 매겨 메모리에 접근하는 인스트럭션을 통해 I/O에 접근
- 저장장치 계층 구조
- 캐싱: 상대적으로 느린 저장장치에 있는 내용 중 당장 사용되거나 빈번히 사용될 정보를 빠른 저장장치에 선별적으로 저장해서 두 저장 장치의 속도를 완충하고 재사용성을 높여 성능을 높이는 방법
- 프로그램의 실행: 프로그램만의 독자적인 주소공간은 실제로 연속적인 메모리에 할당되는 것이 아니라 메모리와 스왑 영역에 쪼개져서 할당된다.
- 메모리에는 당장 CPU의 수행에 필요한 부분을 올려놓고
- 디스크에는 당장 필요하지 않은 부분을 내려놓는다.
- 스왑영역: 프로그램이 종료될 때 삭제되는 메모리의 연장 공간으로서의 역할 담당
- OS 커널 주소 공간의 내용: 코드 + 데이터 + 스택
- 사용자 프로그램이 사용하는 함수
- 사용자 정의 함수 - 프로그램의 실행 파일에 포함
- 라이브러리 함수 - 프로그램의 실행 파일에 포함
- 커널 함수 - 운영체제 커널의 주소 공간에 코드 정의
- 프로그램의 실행: 프로세스 자신의 주소 공간에 있는 코드만 실행되는 것이 아니라 커널의 주소 공간에 있는 코드도 실행된다.
- user mode(사용자 정의 함수, 라이브러리 함수)와 kernel mode(시스템콜)를 반복
이화여자대학교 반효경 교수님의 [2014년 1학기 운영체제], [2017년 1학기 운영체제] 강의 정리입니다.
반효경 교수님의 [운영체제와 정보기술의 원리] 교재를 참고하였습니다. 감사합니다.
https://core.ewha.ac.kr/publicview/C0101020140314151238067290?vmode=f
'CS > 운영체제' 카테고리의 다른 글
[운영체제] Chapter 3. Process(2) (0) | 2022.12.14 |
---|---|
[운영체제] Chapter 3. Process(1) (2) | 2022.12.11 |
[운영체제] Chapter 2. System Structure & Program Execution (1) (0) | 2022.11.23 |
[운영체제] Chapter 1. Introduction to Operating Systems (0) | 2022.11.20 |
[운영체제] Chapter 1. 강의소개 (0) | 2022.11.19 |