목차
📂content
0. Intro
- cpu
- program counter가 가리키고 있는 메모리 위치에서 매 순간기계어를 읽어서 실행함.
- program counter
- cpu 안에 있는 register 중 하나.
- 기계어 하나를 실행하고 나면 그 다음 위치를 가리켜서 다음 기계어를 읽어와서 실행한다.
- 단! 프로그램은 시작과 끝까지 항상 동일한 순차적인 로직을 가지고 실행되지 않는다. 조건 만족 여부에 따라서 다른 기계어가 실행될 수도 있다. 그래서 c언어를 사용할 때 if문, 반복문을 돌면 항상 바로 다음으로 넘어가지 않고, 그 다음으로 넘어가거나 함수를 이용해서 위치가 점프된다.
- 인터럽트가 들어오면 프로그램 카운터가 어디를 가리켰는지 모르지만, 무조건 프로그램 카운터는 운영체제의 위치를 가리키도록 정해져있다.
- 인터럽트가 들어와서 프로그램 카운터가 운영체제로 이동하고 코드가 실행될 때(운영체제가 cpu를 가지고 있을 때), 자동적으로 modebit이 0으로 바뀌어서 모든 기계어를 다 실행하고, 운영체제가 cpu를 다른 친구에게 넘겨주면 modebit을 1로 바꾸어서 제한된 기계어만 실행할 수 있도록 한다.
- 메모리
- cpu의 작업 공간.
- 메모리에 접근할 수 있는 장치는 cpu밖에 없다. 디스크 컨트롤러가 파일 읽는 작업이 끝났다고해서 읽은 파일 내용을 직접 메모리에 옮기지 못한다. 그래서 자신의 local buffer을 가지고 있고, 여기에 내용이 들어가고, 일 끝나면 cpu에게 인터럽트를 걸어 알려주고, cpu가 직접 local buffer에 있는 내용을 자신의 메모리에 카피해서 가져간다. 그런데 이런 인터럽트가 너무 빈번하면 cpu가 상당히 비효율적으로 되기 때문에 DMA라는 메모리에 접근할 수 있는 장치를 하나 더 둔것임.
- 실제 io 작업은 cpu가 직접하는 것이 아니라 디바이스 컨트롤러에게 부탁을 함. 그리고 작업이 끝나면 디바이스 컨트롤러가 인터럽트를 걸어 cpu에게 알림.
- cpu와 device controller는 하드웨어 / 운영체제는 소프트웨어
1. 인터럽트
- 프로그램 a에게 cpu가 넘어가서, cpu를 가지고 실행하다가 cpu에게 어딘가로부터 인터럽트가 안 들어오면 a는 계속 기계어를 실행한다.
- 그런데 timer가 인터럽트를 걸었다. 그러면 a는 계속 cpu를 쓰고 싶지만 그렇지 못한다. (timer : cpu의 독점권을 막기위해서 운영체제와 하드웨어가 협력해서 cpu의 독점권을 막음).
- 운영체제가 사용자프로그램에게 cpu를 넘겨줄때 timer에 시간을 세팅해서 넘겨준다.
- timer에서 인터럽트가 들어온다면 다음 기계어를 실행하기 이전에 인터럽트를 확인하고 cpu의 제어권이 운영체제에게로 넘어간다.
- 운영체제는 cpu 큐에 줄서 있는 다른 프로그램에게 cpu를 넘겨준다.
“현대의 운영체제는 인터럽트에 의해 구동됨”
⇒ 운영체제는 인터럽트가 들어올 때만 일을 한다.
- interrupt : cpu에 붙어있는 interrupt line이 셋팅되어서 다음 기계어를 실행하기 전에 cpu제어권을 자동으로 운영체제에게 넘어가게 함
- 일반적인 interrupt는 하드웨어 인터럽트
- 개별 프로그램이 운영체제에게 cpu를 넘기기 위해서 소프트웨어가 발생시키는 인터럽트 ⇒ 넓은 의미에서 인터럽트라고 부르지만 소프트웨어가 하는 인터럽트는 트랩이라고 부른다.
인터럽트 벡터
- 인터럽트 종류별로 운영체제 어디에 있는 코드를 실행해야하는지 위치를 담고 있는 것
- 일종의 주소에 대한 포인터라고 생각해라
2. 시스템콜
- 사용자프로그램이 cpu로 기계어를 계속 실행하다가 파일을 읽어와서 기계어를 실행하자고 함!
- but! 파일은 디스크에 있음!!!
- 디스크는 매우 느린 i/o 장치! cpu는 직접 접근을 못함.
- 사용자프로그램이 직접 cpu를 가지고 있으면서 이 기계어(디스크 전담하는 controller에게 파일을 읽어달라)를 실행할 수 없음.
- but! 이 부탁(기계어)는 특권명령!!
- (모든 권한을 가진)운영체제에게 파일 읽어달라고 요청해야함. ⇒ system call
- 즉, system call : 사용자 프로그래밍 뭘 하고싶은데 내 권한으로는 못함. 그래서 운영체제에게 부탁을 함.
- 사용자 프로그램의 기계어가 실행되다가 운영체제의 위치의 기계어가 실행되는 점프가 필요하다. 이 점프는 개별 프로그램에서 일어나는 점프와는 다르게 프로그램의 가상메모리를 가로질러 점프하는 것이다. 사용자 프로그램이 운영체제의 코드를 실행하고 싶다고 해서 할 수 있는 것이 아니다 ⇒ 사용자 프로그램이 기계어를 실행하다가 cpu를 운영체제에게 넘기고 싶은 것
- cpu가 운영체제에게 넘어가는 방법? ⇒ 인터럽트
- 기존 인터럽트(하드웨어 인터럽트) : 하드웨어들이 정보를 전달하기 위해 cpu에게 인터럽트
- system call(소프트웨어 인터럽트)
- 내가 i/o를 하고 싶은데 운영체제만이 이를 해결할 수 있는 상황이면? 사용자 프로그램이 스스로 인터럽트를 건다.
⇒ 소프트웨어가 본인이 직접 할 수 없는 일을 운영체제에게 부탁하기 위해 자신의 코드를 통해서 인터럽트를 건다. - 사용자 프로그램이 cpu를 운영체제에게 넘기기 위해서 자신의 기계어를 통해서 interrupt line을 셋팅. cpu가 다음 기계어를 실행하기 전에 인터럽트가 들어왔으니까 운영체제에게 cpu 제어권을 넘긴다.
- 기존 인터럽트(하드웨어 인터럽트) : 하드웨어들이 정보를 전달하기 위해 cpu에게 인터럽트
3. Device Controller
device driver
- device controller가 실행하는 코드 아님.
- 운영체제 안에 있는 코드 중에서 cpu가 io장치에게 부탁을 하는 코드. 부탁을 하는 방법에 대해 적혀짐.
- controller가 수행하는 코드가 아니라 cpu가 수행하는 코드
- device controller에서 수행되는 코드는 펌웨어라고 한다.
4. 동기식 입출력과 비동기식 입출력
동기화 :
- 여럿이 시간에 맞게 조율해서 하는 것
- 예) 립싱크, 싱크로나이즈 수영을 예시로 생각하자
동기식
cpu가 디바이스 컨트롤러에게 디스크 데이터 읽어오라고 시킴. 그 동안에 입출력 요청한 애는 기다림. 디스크 데이터 다 읽어서 인터럽트 걸어서 cpu에게 전달할때까지 기다렸다가 작업을 함.
⇒ 하지만 기다리는 시간이 길기 때문에 동기식으로 i/o를 요청한 후 기다리는 시간동안 cpu를 다른 사용자 프로그램에게 넘겨줘서 일을 시킨다.
비동기식
사용자 프로그램이 i/o요청을 함. i/o 작업은 오래 걸림. 결과는 늦게 나오지만 i/o를 요청한 친구에게 바로 cpu를 준다.
⇒ 상식적으로 파일을 요청한 것은 파일을 보고 다음 일을 진행하는 것인데 비동기식이 맞냐는 얘기가 있음. 일반적으로 동기식 입출력이 맞긴하다. 그런데 경우에 따라서는 i/o 요청한 것에 대한 결과값을 얻기 전에 할 수 있는 작업도 있다. i/o가 파일을 읽어와라면 이것을 읽고 다음일을 해야 하지만 파일을 쓰라는 요청이면 그냥 다음 일을 할 수 있다. 하지만 나는 써졌는지 꼭 확인을 하고 싶다고 하면 동기식을 사용한다.
5. DMA(Direct Memory Access)
- interrupt가 너무 자주 걸려도 비효율적. i/o장치가 느리긴 하지만 고속 i/o장치도 존재함.
- 이 장치를 왜 두었냐? 인터럽트가 너무 자주 걸리는 것을 막기 위해서. 아주 작은 크기의 데이터가 local buffer에 들어와있다고 해서 그때마다 controller가 cpu에게 직접 인터럽트를 거는 것이 아니고 분량이 찼을 때 dma가 직접 메모리에 카피하는 작업까지 해준다. 이 작업이 끝나면 인터럽트를 걸어 알려준다. 그러면 인터럽트가 덜 빈번하게 발생하게 되고 cpu가 더 효율적으로 동작한다.
- 왼쪽 그림의 의미는 일반적으로 cpu밑에 메모리가 있지만, 의미적인 측면에서 볼때, 메모리에 접근할 수 있는 것이 cpu밖에 없다는 의미.
6. 서로 다른 입출력 기계어
- cpu에서 사용하는 기계어 : instruction
- i/o를 수행하는 기계어는 2가지
- 아예 i/o를 전담하는 기계어를 둔다. ⇒ 좌측 이미지
- 메모리가 따로 있고, i/o장치가 따로 있고, 그래서 메모리 접근하는 기계어 따로 있고, i/o수행하는 기계어 따로 있음.
- 메모리 주소를 실제 메모리에만 있는 것이 아니라 i/o장치에도 main memory의 주소를 연장해서 매겨놓고,
실제 i/o를 고유 기계어를 쓰는 것이 아니라 메모리 접근하는 기계어를 통해서 i/o를 접근하도록 하는 방식
⇒ 우측 이미지- 즉, 메모리 접근하는 기계어로 i/o도 수행하는 것. 다만 메모리 주소가 i/o장치까지 이어지도록 연장
- 아예 i/o를 전담하는 기계어를 둔다. ⇒ 좌측 이미지
7. 저장장치 계층 구조
- 저번 시간에 보여준 ppt
- 맨위에 cpu부터 맨 아래 i/o장치까지 저장 장치가 계층적으로 구성
- 위 : 용량 작고, 비싸고, 빠름, 휘발성
아래: 용량이 크고, 싸고, 느림, 비휘발성 - 위에서 필요하다고 해서 맨 아래까지 내려와서 가져가려고 하면 느리다. 그래서 내려가기 전에 내가 이미 가지고 있다고 하면 그대로 위로 올리는 방식 ⇒ 캐싱의 원리
- 하지만 올라갈 수록 크기가 작기 때문에 요청하는 내용이 위로 갈 수록 다 없을 수도 있다.
- 캐싱은 재사용성에 효과적.
- secondary는 i/o를 해야함. 접근할 때는 cpu가 직접 접근을 못한다. i/o controller에게 요청해야함.
📑 출처
http://www.kocw.net/home/cview.do?cid=4b9cd4c7178db077
감사합니다😊
'🎥Etc > [kocw]운영체제' 카테고리의 다른 글
[Ch3]프로세스 관리2 (0) | 2023.06.25 |
---|---|
[Ch3]프로세스 관리1 (0) | 2023.06.25 |
[Ch2]컴퓨터시스템의 구조3 (0) | 2023.06.23 |
[Ch2]컴퓨터 시스템의 구조1,2 (0) | 2023.06.23 |
[Ch1]운영체제의 개요2 (0) | 2023.06.23 |