본문 바로가기

cs/운영체제

운영체제 4강 System Structure & Program Execution 2

https://core.ewha.ac.kr/publicview/C0101020140314151238067290?vmode=f 

 

반효경 [운영체제] 4. System Structure & Program Execution 2

설명이 없습니다.

core.ewha.ac.kr

 

CPU의 역할

cpu 는 계속해서 메모리의 instruction 을 처리하는데 (기계어)  0과 1로 조합된 4byte정도되는 것 -> 기계어 set(집합)에 따라서 instruction 단위는 다를수있다.

cpu는 메모리의 어디에있는 명령을 꺼내다 실행하는가?

-> cpu 안에있는 register중 메모리 주소를 가르키는 레지스터인 program counter 레지스터의 저장되있는 위치의 메모리의 명령을 읽는다.

읽고 난후에 program counter는  다음 instruction 의 주소로 바뀐다. -> 별일이 없다면 다음 메모리 주소로 가는것이다. 

조건문이나 이런것들을 만났을때 점프할수있고 점프하면 그 주소가 program counter 에 저장된다.

 

결국 cpu는 눈뜨고있으면 그냥 program counter에 있는 메모리 주소로가서 읽고 명령을 실행하는것만 계속해서 반복함

-하지만 매번 instruction 을 끝내고 다음 instruction 을 실행하기전에 intrrupt 를 체크하는데

intrrupt가 있다면 어떤 상황이였든 운영체제로 무조건 cpu가 넘어간다.

 

운영체제는 intrrupt 마다 상황에 맞게 어떤일을 처리해야하는지 매뉴얼이(인터럽트 벡터->인터럽트 종류별로 몇번 라인의 인터럽트가 들어왔는지 판단하는 엔트리,그에 맞게 처리해야하는 명령들의 주소 들의 쌍을 뜻한다.) 이미 있고 그것을 실행한다.

 

Trap 에는 Exception 도 포함된다. ex) 원래 허용안되는 숫자를 0으로 나누기,운영체제 코드에 접근하기 이딴짓을 내 프로그램이 실행한경우 애초에 instruction 집합에서 그런것들을 막아놓았기 때문에 실행되지 않고  exception 이 난다.-> 운영체제로 cpu 가 넘어간다.

그럼 운영체제가 그 프로그램을 종료시키든지 어쩃든 뭔가 적절한 조치를 취한다. 

 

 

동기식 입출력과 비동기식 입출력

 

동기식 입출력 

요청후 입출력 작업이 완료 된 후에야 제어가 사용자 프로그램으로 넘어감

 

자료의 구현 방법 2 처럼 다른 프로세스에 cpu 를 줘버리는게 비동기가아님 이것또한 동기식 처리임 

비동기는 그냥 진짜 순서가 어떻게 되든 상관없이 그냥 방치하는거임

-> 그래서 디스크에서 읽어오기 키보드에서 받아오기 이런건 동기식으로 처리함(구현방법 2로)

2023.09.11 에 이제야 이해가됨  -> 비동기는 I/O의 문제가아니라 입력을 시켜놓고 그 프로그램 내부의 다른코드를 실행시킨다는 뜻이였음 그 코드내에 동기인지 비동기인지 생각하면됨

 

동기식으로 짜더라도 구현방법 1로 짜면 cpu 가 노는 시간 뿐만아니라 I/O 장치도 하나밖에 작업을 못해서 매우 손해가 큼

-> 2번 방법으로 구현해야함

 

비동기식 입출력

I/O 요청 넣어놓고 그냥 바로 제어가 사용자 프로그램으로 넘어감 

모니터 출력, 소리 출력같이 딱히 값을 받아올 필요가없는것들은 비동기로 짜는거임

무엇을 받아와야하는 상황이면 동기식 입출력, 그냥 소리 출력같은건 비동기식 입출력쓰면됨

 

그림을 보면 이해하는데

 

화살표가 cpu 의 제어권이 넘어가는걸 나타낸다

-> kernel 은 운영체제를 말하고  -> 비동기에서는 I/O 요청해놓고 바로 일단 사용자 프로그램으로 넘어온다.

 

동기 처리보면 저시간 만큼 기다리는 waiting 이있다.

 

동기든 비동기든 I/O 작업의 완료는 인터럽트를 통해서 알려준다.

 

비동기 같은경우 I/O 에서 받아온 값이 필요없는 작업들을 동기였다면 waiting 으로 걸리는시간에 처리해준다.

 

DMA

dma 는 메모리에 접근할수 있는 장치이다.

원래는 메모리에 접근할수 있는 장치는 cpu 뿐이다.

-> I/O 장치들 너무 많기 때문에 intrrupt 가 너무많이 걸려 성능 저하남

I/O 장치 전용 메모리 담당 일찐 이다.

 

키보드로 예시를 들면 한두글자 처도 I/O 받은걸로 쳐서 계속 인터럽트 거니까

문제생김

-> DMA 이용

일정 입력양 특정 크기 단위(block,page) 이정도 단위가 로컬버퍼에 쌓이면 그걸 DMA 가 메모리로 카피를 하고 

작업이 끝났다고 cpu에게 intrrupt를 건다.

cpu 효율 올라감

 

I/O 를 할수 있는 방법 2가지

일반적인 I/O 방식

기계어에 메모리만 접근하는 instruction 이있고

I/O 장치에 접근하는 instruction 은 따로 각 I/O 디바이스별로 각각 접근하는 instruction 이 정의되어있는경우

각각 instruction 이 구분되어있는것임

 

 

Memory Mapped I/O

따로 I/O 장치에 접근하는 instruction 이 정의되어있는것이 아닌 그냥 죄다 메모리 접근 instruction으로 처리한다

-> I/O 장치 제어하는 명령 메모리에 그냥 메모리주소에 접근하는것임

 

저장장치 계층구조

primary storage-> 휘발성 메모리(전원나가면 없어짐)-> cpu에서 직접 접근할수 있는것(바이트 단위로 접근할수있음)

사실 그림의 레지스터위에 cpu가 있는거임

cpu 안에 register 있음

캐시 메모리는 운영체제에서는 약간만 언급되는데 캐시 메모리도 cpu 안에있음

메인 메모리는 d ram

 

secondary storage-> 비휘발성 메모리 -> 바이트 단위로 접근불가(하드디스크의 경우 섹터단위로 접근가능)

하드디스크,플래시 메모리

옛날의 경우 뭐 마그네틱 테이프 이런거 있었음

 

-> 위로갈수록 빠르고 비싸서 용량이 적음

 

 

모든걸 빠른메모리에 올릴수 없음 -> 최대한 필요한것들 빠른메모리에 담음 cpu랑 d ram도 속도차이나서 캐시 메모리에 올려놓음 메모리들

-> 이렇게 필요한거 빠른데다가 올리는걸 캐싱이라고함(재사용을 목적으로 하는게 캐싱)

 

 

프로그램이 어떻게 컴퓨터에서 실행되는가?

프로그램 실행파일 형태로 하드디스크에 저장되어있음

-> 실행시키면 메모리로 올라가서 프로세스가 됨

근데 물리적인 메모리에 바로 올라가는것이 아닌 virtual memory(가상메모리)에 먼저 올라감

프로그램을 실행시키면

그 프로세스의 주소공간(Address space)이 형성되는데 메모리 주소공간 0번지부터 시작되는 그 프로그램의 독자적인 메모리 공가닝 생김

각 프로그램이  0번지로 시작되는 주소공간이 생김(code,data,stack 로 구성됨) -> 이걸 물리적인 메모리에 올려서 사용함

 

커널같은경우 컴퓨터가 켜지는 순간부터 메모리에 올라가지만

사용자 프로그램의 경우 실행하는 경우 이런 가상 메모리들이 생겼다가 프로그램을 종료하는경우 없어짐

 

그리고 이런 가상 메모리를 물리메모리로 다 올리는것이 아닌 당장 필요한 부분만 메모리에 올려놓음

-> 메모리 낭비를 막기위해 

 

하드디스크도 swap area 는 램의 연장선상이라 보면됨 즉 저장하려는 데이터가 아님 휘발은 안되지만 날려야하는데이터

 

그리고 필요없는것들 ( 버츄얼인데 당장 메모리에 안올라가는것들)은

디스크에 swap area에 있다 즉 버츄얼 메모리는 하드디스크에 있는것이다.

 

그리고 물리적으로 올라간것들도 다쓰고 필요없으면 메모리에서 방출함

 

code: 기계어 코드

data: 변수,전역변수 -> 프로그램이 사용하는 자료 구조

stack: 프로그램 함수 구조로 되어있기 때문에 -> 함수를 호출하거나 리턴할떄 데이터를 쌓았다가 꺼내는 용도로씀

 

각 버츄얼 메모리들 0번지부터 시작하는데

실제 물리메모리도 0번지부터 시작해서 쭉있을것이다

 버츄얼 메모리에서 0번지인데 물리메모리에 1000번지에 올라가야하는상황이면 주소 변환해서 올린다.

메모리 주소변환하는 계층이있는데 이건 운영체제에서 하는게 아니라 하드웨어적으로 주소변화해주는 하드웨어 장치가 있다. 

 

커널 주소공간의 내용

각 프로그램이 가지고 있듯 code,data,stack 가 있다.

운영체제 커널에 있는 주소공간의 내용이다.

 

code 영역

운영체제가 하는 코드들이 있다

사용자 인터페이스 제공 코드

자원관리 관련코드

시스템콜, 인터럽트 처리코드

 

data 영역

운영체제 cpu ,메모리, 디스크 같은 하드웨어 직접 관리함

하드웨어 관리하기위해서 하드웨어 종류마다 자료구조 하나씩 만들어서 관리하고 있을것임 그거 그림으로 나타낸거(두루뭉술하게 설명함)

 

프로스세 관리 자료구조도 있을것임

-> 그게 pcb 라고 부름 프로세스 컨트롤 블록 -> 프로그램이 돌아갈떄 프로그램을 관리하는기 위한 자료구조인데 운영체제 커널 데이터 영역에 하나씩 만들어짐

 

stack 영역

운영체제도 함수 형태로 되어있으므로 호출하는 영역인 stack 가 필요 각 함수들 호출함

운영체제는 여러 사용자 프로그램들이 요청에의해 사용할수있음(시스템콜) -> 그래서 스택 부분에서 각 프로세스마다 커널스택을 따로 두고있음 (프로세스 마다 구분됨)

 

모든 프로그램은 함수 구조로 짜여져있다 

c언어로 짜든 파이썬으로 짜든 뭐든간에 함수형태이다.

컴파일해서 기계어로 바꿔도 기계어 구조에서 함수에 해당하는 범위가 어디서 부터 어디까지인지 정보가있음

-> 기계어 레벨에서도 함수는 의미가있음

 

함수에는 3가지 종류가 있다.

사용자 정의함수: 내가 작성한 함수

라이브러리함수: 누가 써놓은함수 가져다만 쓰는것

 

라이브로리함수든 사용자 정의함수든 컴파일해서 실행파일을 만들면 내 실행파일 안에 포함되어있다.

프로세스에 들어있는거임

 

커널함수: 운영체제 안에서 정의된 함수

프로그램 안에서 시스템 콜을 통해서 가져다 쓸수있음

-> 내 프로그램에 있는 함수가 아님 호출만하는거 커널 코드 안에 있는 함수임

 

사용자 정의함수나 라이브러리 함수같은경우 호출되어도

프로그램내에서 메모리 점프하면서 실행되지만

커널함수 같은경우 점프가 불가능하고 시스템 콜을해야한다.

 

프로그램 실행 단계를 보면 이런형식이다.

사용자 프로그램이 cpu를 가지고있으면 user mode라고 한다.