instruction:
- 실행해야하는 기계어, 보통 4비트로 구성
- 순차적으로 기계어를 실행하다 반복문이나 함수를 만나면 점프뜀
- 매 기계어를 실행하고 interrupt 라인을 체크, interrupt가 있으면 실행해야 할 기계어를 잠시 멈추고 CPU를 OS에게 줌
- OS는 CPU를 받고 interrupt 상황에 따라 인터럽트 백터를 참고하여 해당 인터럽트를 처리하는 커널 함수(인터럽트 처리 루틴)을 실행함
- OS가 CPU를 가지고 있을때는 mode bit이 0, 모든 기계어 실행 가능(다른 사용자의 메모리나 I/O 디바이스 접근 가능)
- 사용자 프로그램이 CPU를 가지고 있을땐 mode bit이 1, 제한된 기계어만 사용 가능
- 사용자 프로그램이 I/O 할일이 있을때 OS에게 요청해야 하는데, mode bit이 1이라 바로 OS로 가는건 막혀있음, 그래서 스스로 인터럽트를 걸어서 CPU를 OS가 가지게 하면(시스템 콜) mode bit이 0으로 바뀌고 OS가 사용자 프로그램이 요청한 대로 I/O 디바이스에 접근해서 처리해줌
Interrupt: 입출력 장치들(하드웨어들)이 CPU와 정보 교신이 필요할때
- 하드웨어가 발생시킨 인터럽트
Trap: 사용자 프로그램이 돌아가다가 자신이 처리 못하는 걸 OS에게 부탁할때
- 소프트웨어가 발생시킨 인터럽트
- Exception: 프로그램이 오류를 범한 경우
- System call: 프로그램이 커널 함수를 호출하는 경우
- 이 외에도 timer가 거는 인터럽트가 있음
동기식 입출력과 비동기식 입출력:
1) 동기식 입출력(synchronous I/O)
- I/O 요청 후 입출력 작업이 완료된 후에야 제어가 사용자 프로그램에 넘어감
- 구현방법1:
I/O가 끝날 때까지 CPU를 낭비시킴
매 시점 하나의 I/O만 일어날 수 있음
- 구현방법2:
I/O가 완료될 떄까지 해당 프로그램에게서 CPU를 빼앗음
I/O 처리를 기다리는 줄에 그 프로그램을 줄 세움
2) 비동기식 입출력(asynchronous I/O)
- I/O가 시작된 후 입출력 작업이 끝나기를 기다리지 않고 제어가 사용자 프로그램에 즉시 넘어감
- 두 경우 모두 I/O의 완료는 인터럽트로 알려줌
- Read 하는 경우는 read한 결과를 가지고 프로그램을 실행해야 하기에 대게 동기식 입출력을 사용
- write 하는 경우는 굳이 write한 결과를 기다릴 필요는 없기 때문에 대게 비동기식 입출력을 사용
저장장치 계층구조
- 초록색: 빠르고, 비싸고, 휘발성
- 빨간색: 느리고, 싸고, 비휘발성
- 밑으로 내려갈수록 점점 속도가 느려짐, 빠른 CPU가 기다리는 시간을 최소화 하기 위해 중간에 미리 데이터를 가져다 놓는 Cache memory 라는걸 놔둠
- Caching: 처음에는 데이터를 밑에서부터 꺼내오지만 일단 꺼내온 후에는 잠시 저장해놨다가 재사용
프로그램의 실행
- 실행 파일은 원래 File system에 있다가 실행이 시작되면 그때 메모리에 올라감
- 바로 메모리에 올라가지 않고 중간에 Virtual memory라는 각 실행 파일의 독자적인 주소 공간이 생김
code: 프로그램의 기계어 코드
data: 변수
stack: 함수를 호출할때 데이터를 쌓았다가 꺼내가는데 사용
- 모든 실행파일을 메모리에 올리면 낭비가 되기에 virtual memory에 데이터를 담아두고 사용되는 함수 부분에 관련된 데이터만 메모리에 올렸다가 삭제하고 하는 식으로 진행됨
- 메모리에 올라갔던 파일 중 바로 삭제하면 안되고 잠시 보관해야 하는 데이터들은 Swap area에 잠시 보관해둠
- Address translation: virtual memory에도 주소지가 있고 실제 메모리에도 주소지가 있음, 이 가상 주소지와 실제 주소지를 서로 매칭해주는 역할을 담당함
- 커널 영역도 똑같이 code, data, stack으로 구성됨
- code 부분에는 각 인터럽트마다 어떤일을 해야하는지 등이 들어있음
- data 부분에는 운영체제가 사용하는 여러 자료구조들이 담겨있음
실제 CPU, memory, disk등을 관리하기 위한 각각의 자료구조등을 담아놓음
실행중인 프로세스에 대한 자료구조등도 담겨있음(PCB)
- 각각의 프로세스는 커널 함수를 호출할 수 있음, 각각의 프로세스의 커널 스택을 stack 공간에 따로따로 집어넣음
- 사용자 정의 함수, 라이브러리 함수는 프로세스의 code 영역에 담겨있음, 그래서 함수가 호출되도 해당 프로세스 안에서 점프를 통해 호출됨
- 커널 함수는 운영체제의 code 영역에 담겨있음, 그래서 시스템 콜을 통해 호출을함, 인터럽트를 걸어서 실행
'[개발일지] > 필기' 카테고리의 다른 글
Process Management (0) | 2021.08.12 |
---|---|
Process2 - 스레드 (0) | 2021.08.10 |
Process1 (0) | 2021.08.03 |
System Structure & Program Execution 1 (0) | 2021.07.25 |
Introduction to Operating Systems (0) | 2021.07.21 |