- Today
- Total
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- python
- Firebase
- til
- 컴퓨터공학과
- 구글 로그인
- 비주얼 베이직
- 안드로이드
- oauth
- 자바
- 프로그래머스
- 코딩테스트
- C언어
- firebase google
- 안드로이드 스튜디오
- android studio
- 배열
- sql
- 연결리스트
- 동적할당
- 자료구조
- 정렬
- 알고리즘
- Java
- 로그인
- 공유대학
- 프로그래밍 입문
- 백준
- C++
- 파이썬
코딩하는 해달이
[운영체제] 3주차 본문
컴퓨터 시스템과 운영체제
컴퓨터 시스템의 범위
컴퓨터 시스템의 계층
- 응용프로그램 층
- 운영체제 층
- 컴퓨터 하드웨어 층
컴퓨터 시스템의 계층
- 사용자는 응용프로그램과 GUI/도구프로그램을 통해 컴퓨터 활용
- 하드웨어는 모두 운영체제의 배타적 독점적 지배 받음
- 사용자나 응용프로그램의 하드웨어에 대ㅐ한 직접접근 불허
컴퓨터 시스템의 계층
- 사용자가 하드웨어에 대해 몰라도 컴퓨터를 사용할 수 있도록 함
- 응용프로그램과 하드웨어 사이의 중계
- 위로는 응용프로그램과 아래로는 하드웨어와의 인터페이스
컴퓨터 하드웨어 구성
컴퓨터 하드웨어 설명
CPU
- 프로그램 코드를 해석하여 실행하는 중앙처리장치
- 컴퓨터의 가장 핵심
- 전원이 공급될 때 작동, 메모리에 적재된 프로그램 실행
메모리
- CPU에 의해 실행되는 프로그램 코드와 데이터가 적재되는 공간
- 반도체 메모리 RAM(현재는 전부 반도체)
- 프로그램은 실행되기 위해 반드시 메모리에 적재되어야 함
캐시 메모리
- 병목 현상을 해소하기위해 등장
- ex)고속도로 톨게이트
- 프로그램은 실행되기 위해 반드시 메모리에 적재되어야 함
장치들
- 키보드, 프린터, 스캐너 등
버스
- 하드웨어들이 데이터를 주고받기 위해 0과 1의 디지털 신호가 지나가는 여러 가닥의 선을 다발로 묶어 부르는 용어
- 버스의 종류
- 주소 버스 - 주소신호가 지나다니는 버스
- 데이터 버스 - 데이터 신호가 지나다니는 버스
- 제어 버스 - 제어 신호가 지나다니는 버스
주소
- 메모리, 입출력장치나 저장장치 내에 있는 저장소들에 대한 번지
- 0번지에서 시작하는 양수
- 주소버스는 주소 값이 전달되는 여러 선의 다발
- CPU는 메모리나 입출력 장치에 값을 쓰거나 읽을 때 반드시 주소를 발생시킴
목적에 따라 버스 구분
- 시스템 버스
- 빠른 하드웨어들 사이에 데이터 전송
- like 고속도로
- 입출력 버스
- 상대적으로 느린 입출력 장치들로부터 입출력 데이터 전송
- like 일반도로
I/O controllers & control circuit
- 입출력 장치를 제어하기 위한 여러 하드웨어
- 입출력 장치에게 명령 하달
- 메모리 - 입출력장치, CPU - 입출력 장치 사이 데이터 전달 중계
현대 PC의 구조
CPU와 메모리의 관계
CPU
- 능동적 소자. 메모리 액세스 시 주소 발생
32비트 CPU, 32비트 운영체제, 32비트 컴퓨터란?
- CPU에 32개의 주소선이 있음
- CPU의 액세스 범위 : 2^32개의 서로 다른 주소
- CPU가 최대 액세스 할 수 있는 메모리 크기 : 4GB
- 한 번지의 공간이 1bite → 2^32bite = 4GB
- CPU에 입출력되는 32개의 데이터 선이 있음
- 한번에 32비트 읽고 쓰기 가능
CPU 기계 명령(instruction)
CPU 명령
- CPU가 해석하고 실행할 수 있는 기계 명령
- C 언어나 자바 프로그램 소스 코드와 다름
- CPU를 설계하는 기업이 명령어들, 개수, 형태 등을 결정
- CPU의 명령 개수는 수십개~수백개
- CPU마다 명령 이름, 기계어 코드, 크기, 개수 등이 다름
- CPU 사이에 명령들의 호환성 없음
- CPU 명령 사례
CPU의 일생(Life Cycle) - 명령 처리 과정
CPU 레지스터들
- PC(Program Counter) - 다음에 실행할 명령의 메모리 주소 저장
- IR(Instruction Registers) - 현재 실행하기 위해 메모리로부터 읽어 온 명령 저장
- SP(Stack Pointer) - 스택의 톱 메모리 주소 저장
- 데이터 레지스터들 - 연산에 사용되거나 사용 될 데이터들을 저장
- 상태 레지스터 - cpu의 상태 정보나 인터럽트 금지 등의 제어 정보 저장
- 기타 여러 레지스터 - 페이지 테이블이 저장된 메모리 주소를 가리키는 레지스터 등
CPU 명령 사이클 - CPU의 일생
- CPU가 하나의 명령을 실행하는 과정. CPU는 전원이 켜진 후 단순하게 명령 사이클 반복
스택(Stack)은 어디에 있는가?
프로그램이 실행되기 위해 운영체제에 의해 할당되는 4공간
- 코드(code) 공간 – 프로그램 코드 적재
- 데이터(data) 공간 - 전역 변수들이 적재되는 공간
- 힙(heap) 공간 – 프로그램에서 동적 할당받는 공간
- 스택(stack) 공간 – 함수가 호출될 때 매개변수, 지역변수 등 저장
스택
- 메모리의 일부를 스택으로 사용하도록 할당된 공간
- 스택이라는 별도의 하드웨어 메모리가 있는 것 아님
- 운영체제는 각 프로그램에게 스택 공간 할당
- CPU의 SP 레지스터는 현재 CPU가 실행중인 프로그램의 스택 꼭대기 주소 를 가리킴
- 스택에 저장되는 내용
- 함수의 지역 변수들
- 함수가 호출될 때 전달받은 매개변수 값들
- 함수가 실행된 후 돌아갈 주소
- 함수가 의도적으로 저장해 두기 위한 값
스택과 메모리
컨텍스트(Context)
컨텍스트(문맥이라고도 표현)
- 한 프로그램이 실행 중인 일체의 상황 혹은 상황 정보
- 메모리
- CPU 레지스터들의 값
- 축소 정의
- 현재 CPU에 들어 있는 레지스터의 값들
컨텍스트 스위칭
- 발생
- CPU가 현재 프로그램의 실행을 중지하고 다른 프로그램을 실행할 때
- 여러개의 프로세스가 실행되고 있을 때 기존에 실행되던 프로세스를 중단하고 다른 프로세스를 실행하는 것
- 과정
- 현재 실행중인 프로그램의 컨텍스트를 메모리에 저장
- 새로 실행시킬 프로그램의 저장된 컨텍스트를 CPU에 복귀
프로그램 A에서 프로그램 B로 컨텍스트 스위칭(시간날때 보세요)
멀티 코어 CPU(Multi-core CPU)
2001년 IBM에 의해 PowerPC라는 멀티코어 CPU 개발
- CPU 내부에 2개의 프로세서(processor) 포함
- 2개의 프로그램을 동시에 실행
- 코어는 완벽한 처리기(과거 개념의 CPU)
컴퓨터 시스템의 계층 구조와 운영체제 인터페이스
컴퓨터 시스템 계층 구조
컴퓨터 시스템 계층
- 사용자
- 응용프로그램
- 운영체제
- 커널 코드
- 디바이스 드라이버
- 하드웨어
컴퓨터 시스템이 계층 구조로 설계된 이유
계층간 독립성 확보(칸막이가 있다고 생각)를 위해
- 사용자
- 운영체제나 하드웨어에 대해 몰라도 응용프로그램으로 컴퓨터 활용
- 응용프로그램
- 컴퓨터 하드웨어의 타입이나 구조, 제어방법을 몰라도 개발 가능
- 운영체제에 요청하여 해결
- 컴퓨터 하드웨어가 바뀌어도 응용프로그램을 다시 작성할 필요 없음(다시 작성해야하나, 운영체제가 자동으로 처리)
- 운영체제
- 운영체제는 장치 관련된 모든 작업을 디바이스 드라이버에게 요청
- 응용프로그램과 하드웨어 사이의 인터페이스
왜 운영체제가 필요한가?
운영체제가 없다면
- 응용프로그램이나 사용자가 직접 하드웨어를 제어해야 함
- 하드웨어에 대한 지식이 필요하며, 충돌, 관리, 보안의 문제 발생
실례
- 프로세스 관리
- 메모리 관리
- 장치 관리
- 파일시스템 관리
- 입출력 관리
운영체제의 필요성
- 자원에 대한 충돌 해결, 성능 최적화, 사용자 시스템 사용 효율화
직원이 없는 은행과 직원 있는 은행 비교
운영체제와 응용프로그램 사이의 관계
응용프로그램
- 워드, 웹브라우저 등, 사용자가 컴퓨터를 활용하도록 작성된 다양한 프로그램들
응용프로그램에 대한 운영체제의 역할
- 응용프로그램이 직접 하드웨어를 다루지 못하도록 차단
- 운영체제가 하드웨어를 완벽히 독점 장악
- 이유 : 응용프로그램들 사이의 하드웨어 사용 충돌을 막기 위함
- 응용 프로그램이 하드웨어를 사용하고자 할 때
- 반드시 운영체제에게 요청 → 운영체제가 대신하여 하드웨어 조작
- 유일한 요청 방법 - 시스템 호출(system call)
- 응용프로그램과 하드웨어 사이의 인터페이스
- 응용프로그램들의 실행 순서 제어
- 응용프로그램들 사이의 통신 중계
운영체제와 사용자의 관계
사용자는 응용프로그램을 통해 컴퓨터 활용
- 탐색기, 메모장 등
사용자에 대한 운영체제의 역할
- 사용자가 하드웨어에 관한 지식이 없어도 컴퓨터 다루기 용이
- 사용자가 하드웨어를 설치하거나 변경하는 것에 도움
- 사용자에게 컴퓨터 시스템을 사용할 편리한 인터페이스 제공
- 컴퓨터의 사용을 돕는 여러 도구 응용프로그램 제공
- 사용자 계정 관리
- 사용자의 컴퓨터 사용 시간 계산, 과금 처리 등
운영체제와 하드웨어의 관계
하드웨어를 제어하는 것은 전적으로 운영체제의 몫
- 응용프로그램에서 printf(“hello”)
- 응용프로그램에서 scanf()
운영체제
- 사용자/응용프로그램과 하드웨어 사이의 중계자
- 하드웨어 제어는 전적으로 운영체제의 기능
- 하드디스크에서 파일을 읽거나 쓰기
- 마우스의 클릭
- 키보드 입력 받기
- 네트워크를 통한 데이터 전송 혹은 수신
- 디스플레이에 텍스트나 이미지, 그래픽 등 출력
운영체제의 전체 기능
프로세스와 스레드 관리
파일 관리 혹은 파일 시스템 관리
장치 관리
사용자 인터페이스
네트워킹
보호 및 보안
운영체제의 구성 요소와 커널
운영체제 구성
운영체제 = 커널 + 툴 + 디바이스 드라이버
- 커널(kernel)
- 운영체제의 핵심 부분, 좁은 의미의 운영체제
- 부팅 후 메모리에 상주하는 코드와 데이터
- 운영체제의 핵심 기능 모두 구현
- CPU, Memory, MMU 등 컴퓨터 자원을 직접 제어하고 관리하는 코드와 자료 구조들
- 커널 코드는 함수들의 집합
- 커널 기능을 이용하려면 응용프로그램은 반드시 시스템 호출 사용
- 도구(tool) 소프트웨어와 GUI
- 사용자가 컴퓨터를 편리하게 사용할 수 있도록 제공하는 툴 소프트웨어 혹은 툴 응용프 로그램
- Windows 경우, 바탕화면 GUI, 탐색기, 명령창, 작업 관리자, 제어판 등
- 리눅스 경우, 쉘, 로그인 프로그램
- 디바이스 드라이버(device driver)
- 장치를 직접 제어하고 입출력하는 소프트웨어
- 장치마다 전담 디바이스 드라이버 있음
- 일반적으로 장치 제작자에 의해 작성되어 배포됨
운영체제 커널 인터페이스 : 시스템 호출과 인터럽트
커널이 제공하는 2개 인터페이스 : 시스템 호출과 인터럽트
- 응용프로그램과 하드웨어 사이의 중계 역할
시스템 호출(system call)
- 커널과 응용프로그램 사이의 인터페이스
- 응용프로그램에서 커널 기능을 사용할 수 있는 유일한 방법
- 시스템 호출 라이브러리를 통해 다양한 시스템 호출 함수 제공
- 시스템 호출 라이브러리는 운영체제 패키지에 포함됨
- 예) 파일 읽기, 메모리 할당, 프로세스 정보 보기, 프로세스 생성 등
운영체제 커널 인터페이스 - 인터럽트
인터럽트(interrupt)
- 커널과 하드웨어 장치 사이의 인터페이스
- 장치들이 입출력 완료, 타이머 완료 등을 CPU에게 알리는 하드 웨어적 방법
- 인터럽트를 알리는 하드웨어 신호가 직접 CPU에 전달
- 인터럽트가 발생하면
- CPU는 하는 일을 중단하고 인터럽트 서비스 루틴 실행
- 인터럽트 서비스 루틴은 대부분 디바이스 드라이버 내에 있음
- 예) 키를 입력하면 커널의 키보드 인터럽트 서비스 루틴 실행, 키를 읽어 커널 버퍼에 저장
- 인터럽트 서비스 루틴은 커널 영역에 적재
- 인터럽트 서비스 루틴의 실행을 마치면 하던 작업 계속
- 인터럽트 활용
- 운영체제가 장치에게 지시한 입출력 작업의 완료, 예고 없는 네트워 크 데이터의 도착, 키보드나 마우스의 입력, 부족한 배터리 경고 등 장치와 관련된 모든 이벤트 처리
커널과 시스템 호출
응용프로그램의 자원 접근 문제
오늘날 운영체제는 다중프로그래밍 운영체제
- 다수의 응용프로그램이 한 컴퓨터에서 동시에 실행
문제
- 응용프로그램이 직접 컴퓨터 자원에 접근하면 충돌과 훼손 발생
- 다른 응용프로그램이 적재된 메모리 훼손 가능
- 다른 응용프로그램이 만든 파일 삭제 및 훼손 가능
- 응용 프로그램이 커널이 적재된 영역 훼손 가능
해결 방안
- 응용프로그램의 자원 접근 불허
- 자원에 대한 모든 접근은 커널에만 부여
구체적인 해결 방법
- 메모리 공간을 사용자 공간과 커널 공간으로 분리
- 응용프로그램은 사용자 공간에 적재, 커널은 커널 공간에만 적재 2) CPU의 실행 모드를 사용자 모드와 커널 모드로 분리
- 응용프로그램은 사용자 모드에서만 실행, 커널 코드는 커널 모드에서만 실행
- 사용자 공간에서 커널 공간의 코드를 직접 접근하지 못하게 하기 위해
- 사용자 모드에서 커널 코드를 접근하면 응용프로그램 강제 종료
- 응용프로그램이 커널 기능을 이용하고자 할 때, 시스템 호출을 이용해서만 커널 코드 이용
사용자 공간과 커널 공간
운영체제는 컴퓨터 메모리를 두 공간으로 분리
- 사용자 공간(user space) : 모든 응용프로그램들이 나누어 사용하는 공간
- 응용프로그램들이 적재되는 공간
- 커널 공간(kernel space) : 커널만 사용할 수 있는 공간
- 커널 코드, 커널 데이터 등 커널에 의해 배타적으로 사용되는 공간
- 디바이스 드라이버 포함
분리 이유
- 커널 코드와 데이터를 악의적인 응용프로그램이나 코딩 실수로부터 지키기 위함
사용자 공간 크기의 의미
사용자 공간 크기
- 한 응용프로그램의 최대 크기 결정
- 프로그램 코드 + 데이터(전역변수) + 힙(동적할당) + 스택 합친 크기
- 예) 32비트 Windows 운영체제에서 사용자 공간 2GB란 → 응용프로그램을 2GB 크기 이상 개발할 수 없음
사용자 공간의 주소 범위
- 응용프로그램은 운영체제가 설정한 사용자 공간의 주소 범위를 넘어설 수 없음
- 예) 32비트 Windows 운영체제에서,
응용프로그램은 0~7FFFFFFF 범위의 주소를 넘어 액세스하면,
바로 종료(심각한 오류)
- 예) 32비트 Windows 운영체제에서,
주소 공간은 가상 주소 공간
의문 해결
- 사용자 공간의 충돌 해결) 가상 주소 공간을 물리 메모리에 매핑
- 각 응용프로그램의 가상 주소 공간을 물리 주소 공간으로 매핑
- 매핑 테이블은 운영체제가 소유하고 관리
- 물리 메모리를 여러 응용프로그램의 사용자 공간이 나누어 사용
- 실제 각 응용프로그램은 사용자 공간의 일부만 사용
- 커널 공간 역시 물리 메모리에 매핑
- 각 응용프로그램의 매핑 테이블에 기록
- 커널 공간에 대한 매핑 테이블 부분을 모든 응용프로그램에서 동일
- 각 응용프로그램의 가상 주소 공간을 물리 주소 공간으로 매핑
- 물리 메모리가 작은 경우에 대한 해결) 물리 메모리가 부족하면 운영체제는 물리 메모리를 하드 디스크에 저장하여 물리 메모리의 빈 영역 확보(가상 메모리 기법)
사용자 모드와 커널 모드
CPU는 사용자 모드와 커널 모드 중 한 모드로 실행
- CPU 내부에 모드 상태를 나타내는 ‘모드 레지스터’ 있음
- 사용자 모드(user mode)
- CPU의 모드 비트 = 1
- CPU는 사용자 공간에 있는 코드나 데이터를 액세스하는 중
- CPU의 커널 공간 접근 불허 -> 응용프로그램으로부터 커널영역 보호
- 특권 명령(privileged instruction) 실행 불허
- 특권 명령 – 입출력 장치 등 하드웨어나 시스템 중단 등 시스템 관련 처리를 위해 설계된 특별 한 명령
- 커널 모드(kernel mode, supervisor mode)
- CPU의 모드 비트 = 0
- CPU가 커널 공간에서 실행하는 중, 혹은 사용자 코드를 실행하는 중
- 특권 명령 사용 가능
사용자 모드에서 커널 모드로 전환
사용자 모드에서 커널 모드로 전환하는 경우
- 오직 2 가지 경우 - 시스템 호출과 인터럽트 발생
시스템 호출
- 시스템 호출을 실행하는 특별한 기계 명령에 의해 진행
- 예) int 0x80/sysenter/trap/syscall 등 CPU마다 다름
- 기계 명령이 CPU의 모드 비트를 커널 모드로 전환
인터럽트
- CPU가 인터럽트를 수신하면 커널 모드로 자동 전환
- 인터럽트 서비스 루틴이 커널 공간에 있기 때문
- CPU는 인터럽트 서비스 루틴 실행
- 인터럽트 서비스 루틴이 끝나면 CPU는 사용자 모드로 자동 전환
사용자 모드와 커널 모드 비교
특권 명령
특권 명령
- 입출력 장치로부터의 입출력(I/O), 시스템 중단, 컨텍스트 스위칭, 인터럽트 금지 등 특별한 목적으로 설계된 CPU 명령
- 커널 모드에서만 실행
특권 명령 종류
- I/O 명령
- 하드웨어 제어 및 장치로부터의 입출력
- 사례) in eax, 300 ; I/O 포트 300 번지에서 값을 읽어 eax 레지스터에 저장 out 301, eax ; eax 레지스터에 있는 값을 I/O 포트 301 번지에 쓰기
- Halt 명령
- CPU의 작동을 중지시키는 명령. CPU를 유휴 상태로 만듦
- 인터럽트 플래그를 켜고 끄는 명령
- CPU 내에 있는 인터럽트 플래그 비트를 제어하여 CPU가 인터럽트를 허용하거나 무시하도록 지시
- 사례) cli(clear interrupt flag)/sti(set interrupt flag) 명령
- 타이머 설정 명령
- 컨텍스트 스위칭 명령
- 메모리 지우기 명령
- 장치 상태 테이블 수정 등의 명령
커널의 실체
커널은 부팅 시에 커널 공간에 적재된 함수들과 데이터 집합
- 커널은 컴파일된 바이너리 형태, 하드디스크 특정 영역에 저장, 부팅 시에 커널 공간의 메모리에 적재
커널 코드는 함수들의 집합
- 커널의 존재 - 커널 모드에서 실행되는 함수들과 데이터들의 집합
응용프로그램 빌딩
라이브러리
- 응용프로그램에서 활용하도록 미리 작성된 함수들,
컴파일 되어 바이너리 형태로 제공되는 파일 - 개발자는 라이브러리 활용 없이 응용프로그램 작성 불가
응용 프로그램이 활용하는 라이브러리는 2가지 유형
- 표준 라이브러리
- 사용자가 작성하기 힘든 함수 제공
- 운영체제나 컴퓨터 하드웨어에 상관없이 이름과 사용법 동일
- 시스템 호출 라이브러리
- 시스템 호출 함수들 포함
- 시스템 호출 함수들은 시스템 호출을 진행하여 커널 모드로 바꾸고 커널로 진입하여 커널에 만들어진 함수 실행
- 운영체제마다 시스템 호출 함수의 이름이 서로 다름
- 시스템 호출 함수를 커널 API라고 부름
시스템 호출 비용 : fread()와 read()의 비교
운영체제와 인터럽트
인터럽트
인터럽트
- 입출력 장치들이 비동기적 사건을 CPU에게 알리는 행위
- 비동기적이란 예정되지 않거나 발생시간을 예측할 수 없는 사건
- (키보드 입력, 네트워크로부터 데이터 도착 등)
- 하드웨어 인터럽트
- 장치들이 어떤 상황 발생을 CPU에게 알리는 하드웨어 신호
- CPU는 인터럽트를 수신하면 인터럽트 서비스 루틴 실행
- 소프트웨어 인터럽트
- CPU 명령으로 발생시키는 인터럽트
- 하드웨어 인터럽트를 수신한 것과 동일하게 처리
컴퓨터에서 인터럽트 활용
- 마우스를 움직이거나 클릭하는 등 마우스 조작
- 키보드 입력
- 네트워크로부터 데이터 도착
- 하드디스크의 쓰기 종료
- 시스템 클럭으로부터 일정한 시간 간격으로 알림
- 컴퓨터의 리셋 버튼 누르기 USB 메모리 부착 혹은 해제
'학교 공부 > 운영체제' 카테고리의 다른 글
[운영체제] 5주차 - 스레드와 멀티스레딩 (0) | 2023.04.21 |
---|---|
[운영체제] 스레드 동기화 (0) | 2023.04.17 |
[운영체제] 4주차 - 프로세스와 프로세스 관리 (0) | 2023.03.27 |
[운영 체제] 2주차 (0) | 2023.03.13 |