Now Loading ...
-
chapter3 프로세스 관리
프로세스 개념
프로세스란 실행 중인 프로그램이다. 프로세스의 현재 활동 상태는 프로그램 카운터(pc)값과 프로세서 레지스터의 내용으로 나타낼 수 있다.
텍스트 섹션 - 실행 코드
데이터 섹션 - 전역 변수
힙 섹션 - 프로그램 실행 중에 동적으로 할당되는 메모리
스택 섹션 - 함수를 호출할 때 임시 데이터 저장장소
텍스트 섹션, 데이터 섹션은 크기가 고정된다.
스택, 힙 섹션은 동적으로 크기가 변화된다. 함수가 호출될 때 마다 지역 변수, 복귀 주소를 포함하는 activation record가 스택에 푸시 된다.
프로세스는 다음에 실행할 명령어를 찾는 능동적인 존재이다. 실행 파일이 메모리에 적재될 때 프로그램은 프로세스가 된다.
프로세스 상태
new : 프로세스가 생성 중
running : 명령어들이 실행 중
waiting : 프로세스가 어떤 이벤트(입출력 완료 or 신호의 수신)이 일어나기를 기다린다
ready: 프로세스가 처리기에 할당되기를 기다린다
terminated: 프로세스의 실행이 종료되었다
어느 한 순간에 한 처리기 코에에서는 오직 하나의 프로세스만이 실행된다는 것을 인식하는 것이 중요하다.
프로세스 제어 블록 Process Control Block
프로세스 제어 블록, PCB, processed control block은 특정 프로세스와 연관된 여러 정보를 수록
프로세스 상태 : 상태는 new, ready, running, waiting, halted 등이 있다.
프로그램 카운터 : 프로세스가 이 프로세스가 다음에 실행할 명령어 주소를 가리킨다
cpu 레지스터들 : 누산기, 인덱스 레지스터, 스택 레지스터, 범용 레지스터들과 상태 코드 정보가 포함된다.
cpu 스케쥴링 정보 : 프로세스 우선순위, 스케쥴 큐에 대한 포인터와 다른 스케쥴 매개변수를 포함
메모리 관리 정보 : 시스템에 따라 base, limit 레지스터의 값, 운영체제가 사용하는 메모리 시스템에 따라 페이지 테이블 or 세그먼트 테이블 등과 같은 정보를 포함한다.
회계 정보 : cpu 사용 시간과 경과된 실시간, 시간 제한, 계정 번호, 잡 or 프로세스 번호 등을 포함
입출력 상태 정보 : 이 프로세스에 할당된 입출력 장치들과 열린 파일의 목록 등을 포함한다.
thread
프로세스는 여러 쓰레드를 허용한다. 한 번에 하나 이상의 일을 수행할 수 허용한다.
여러 쓰레드를 병렬로 진행하는 것이 가능하다.
프로세스 스케쥴링
시분할의 목적은 CPU 코어를 빈번하게 교체하는 것이다. 이를 달성하기 위해 프로세스 스케줄러 or 각 cpu 코어는 한 번에 하나의 프로세스를 실행할 수 있다.
현재 메모리에 있는 프로세스의 수는 “다중 프로그래밍 정도”라고 한다..
I/O 바운드 프로세스는 계산에 소비하는 것보다 I/O에 더 많은 시간을 소비한다
CPU 바운드 프로세스는 계산에 더 많은 시간을 사용한다.
스케쥴링 큐
프로세스가 시스템에 들어가면 준비 큐에 들어가서 ready 상태가 되어 cpu코어에서 실행되기를 기다린다. 이 큐는 연결리스트로 되어있다.
ready queue 헤더에는 첫번째 PCB에 대한 포인터가 저장되고 각 PCB에는 준비 큐의 다음 PCB를 가리키는 포인터 필드가 포함된다.
프로세스 스케쥴링의 일반적인 표현은 queuing diagram이다. 원은 큐에 서비슬 제공하는 자원을 의미하고 화살표는 시스템의 프로세스 흐름을 나타낸다.
CPU 스케쥴링
프로세스는 수명주기 동안 준비 큐와 다양한 대기 큐를 이주한다. CPU 스케쥴러의 역할은 준비 큐에 있는 프로세스 중에서 선택된 하나의 프로세스에 CPU 코어를 할당하는 것이다.
일부 운영체제는 스와핑으로 알려진 중간 정도의 스케쥴링을 가지고 있는데 여기의 핵심 아이디어는 때로 메모리에서 cpu에 대한 능동적 경쟁에서 프로세스를 제거하여 다중 프로그래밍의 정도를 감소시키는 것이 유리하다는 것이다.
스와핑 : 메모리에서 디스크로 스왑 아웃하고 현재 상태를 저장 → 디스크에서 메모리로 스왑인 하여 상태를 복구
Context switch, 문맥 교환
인터럽트가 발생하면 인터럽트 처리가 끝난 후 context를 복구할 수 있도록 현재 실행중인 프로세스의 현재 문맥을 저장할 필요가 있다.
state save
커널 모드, 유저 모드이든 CPU의 현재 상태를 저장하는 행위이다.
state restore
나중에 연산을 재개하기 위해 상태 복구 작업을 수행한다.
context switch
이전의 프로세스의 상태를 PCB에 보관하고 새로운 프로세스의 보관된 상태를 복구하는 작업이다.
이 작업은 순수 오버헤드이라서 하드웨어의 지원에 따라 많이 좌우된다.
프로세스에 대한 연산
대부분 시스템 내의 프로세스들은 병행 실행될 수 있으며, 반드시 동적으로 생성되고, 제거되어야 한다.
unix, Linux → pid를 사용하여 프로세스를 구분한다. 이 식별자는 보통 정수이다. 두 자식 프로세스 logind와 sshd 프로세스를 볼 수 있다.
프로세스를 생성하기
부모와 자식과 병행하게 실행을 계속한다
부모는 일부 or 모든 자식이 실행을 종료할 때까지 기다린다.
새로운 프로세스들의 주소 공간 측면에서 볼 때 두가지 기능이 있다
자식 프로세스는 부모 프로세스의 복사본이다
자식 프로세스는 자신에게 적재될 새로운 프로그램을 가진다
새로운 프로세스는 fork() system call로 생성된다. 이는 원래 프로세스의 주소 복사본으로 구성된다. 이를 통해 부모 프로세스가 쉽게 자식 프로세스와 통신할 수 있게 된다.
exec()는 이진 파일을 메모리로 적재하고 그 프로그램의 실행을 시작한다 .window에서는 createProcess()의 형태로 진행이 된다.
프로세스가 종료되는 경우
작업이 완료되는 경우 모든 자원을 운영체제에 반납하고 시스템 테이블에서 제거가 이루어진다.
만약 제대로 된 종료가 이루어지지 않았을 때의 경우
zombile 프로세스
프로세스가 종료되었지만 부모 프로세스가 아직 wait()를 하지 않는 경우
orphan process
부모 프로세스가 wait()를 호출하는 대신 종료
android의 process종류
전경 프로세스 : forground process- 사용자가 현재 상호 작용하고 있는 응용 프로그램, 화면에 보이는 현재 프로세스
visible process: 전경에서 직접 볼 수 없지만 전경 프로세스가 참조하는 활동(현재 상태에서 forground process에 표시되는 활동을 수행하는 프로세스)을 수행하는 프로세스
service process: background process와 유사하지만 사용자가 인지할 수 있는 활동을 수행하는 프로세스
background process : 활동을 하고 있지만 사용자가 인식못하는 프로세스
empty process : 응용 프로그램과 관련된 활성 구성요소가 없는 프로세스
프로세스 간 통신
프로세스 협력을 허용하는 환경을 제공하는 이유
정보 공유
여러 프로그램이 동일한 정보에 흥미를 느낄 수 있기 때문에
계산 가속화
특정 태스크를 빠르게 하고자 하면, 각각이 다른 서브태스크들과 병렬로 실행되도록 하는 것
모듈성
시스템 기능을 별도의 프로세스 or thread들로 나누어 모듈식 형태로 시스템을 구성하길 원하는 것
IPC (interprocess communication, 프로세스 간 통신)기법이 필요
프로세스 모델의 두가지 종류
공유 메모리 모델
프로세스 간 통신은 shared memory, message passing 두개의 모델이 있다. 공유 메모리 모델에서는 협력 프로세스들에 의해 공유되는 메모리 영역이 구축된다.
프로세스들은 그 영역에 데이터를 읽고 쓰고 함으로써 정보를 교환할 수 있다.
메시지 전달 모델
시스템 콜 사용하여 구현, 분산시스템에서 구현하기가 쉽다.
다만 시스템 콜을 사용하기 때문에 부가적인 시간 소비가 된다.
동기화, synchronization
메시지 전달 모델에서 프로세스간 통신은 send, receive primitive에 의한 호출에 의해 발생된다
봉쇄형 보내기 : 송신하는 프로세스는 메시지가 수신 프로세스 or 메일박스에 의해 수신될 때까지 봉쇄된다.
비봉쇄형 보내기 : 송신하는 프로세스가 메시지를 보내고 작업을 재시작한다
봉쇄형 받기 : 메시지가 이용 가능할 때까지 수신 프로세스가 봉쇄된다.
비봉쇄형 받기 : 송신하는 프로세스가 유효한 메시지 or null을 받는다.
둘다 봉쇄형인 경우 rendezvous, 랑데부를 하게 된다. → blocked process끼리 하는 통신
파이프
두 프로세스가 통신할 수 있게 하는 전달자
일반 파이프
생산자는 파이프의 쓰기 종단에 쓰고 소비자는 읽기 종단에 읽는다. 오직 단방향 통신만 가능하게 한다. 양방향 통신이 필요하다면 두개의 파이프를 써야 한다.
지명 파이프, named pipe
일반 파이프보다 강력한 통신기구, 통신은 양방향 모두 가능하고 부모 자식관계도 필요하지 않는다. 이를 기준으로 여러 프로세스들이 통신할 수 있다.
소켓
통신의 endpoint, 두 프로세스가 네트워크 상에서 통신하기 위해서 필요
각 소켓은 IP 주소와 포트 번호로 접합하여 구분한다
크게 TCP, UDP 소켓으로 나뉘어진다.
참고 : 127.0.0.1은 접속시 루프백을 해주는 IP주소
-
chapter2 운영체제 구조
운영체제 서비스
사용자 인터페이스
GUI, CLI
프로그램 수행
입출력 연산
파일 시스템 조작
통신
한 프로세스가 다른 프로세스와 정보를 교환할 때
네트워크에 의해 묶여 있는 서로 다른 컴퓨터 상에서 실시될 때
오류 탐지
자원할당
다수의 프로세스나 다수의 작업이 동시에 실시될 때
CPU를 효율적으로 사용하기 위해서
기록작성
보호와 보안
사용자와 OS 인터페이스
사용자와 운영체제가 접촉하기 위해서는 CLI 아니면 Command interpreter가 필요하다.
명령 인터프리터
쉘이라는 인터프리터 해석기를 이용한다
대부분 유사한 기능을 제공
사용자가 지정한 명령을 가져와서 그것을 수행
아니면 UNIX 명령어로 구현이 가능하다
GUI, 그래픽 기반 사용자 인터페이스
window의 사용방식
터치스크린 인터페이스
인터페이스 선택
시스템 관리자는 CLI를 선호
쉘 스크립트를 좋아한다.
시스템 콜
운영체제에 의해 사용 가능하게 된 서비스에 대한 인터페이스를 제공
하드웨어에 직접 접근해야 하는 저수준의 작업에서 어셈블리 명령을 통해 작성된다.
API, 응용 프로그래밍 인터페이스
각 함수에 전달되어야 할 매개변수들과 프로그래머가 기대할 수 있는 반환값을 포함하여 application programmer가 사용 가능한 집합을 명시한다,
API를 구헝하는 함수들은 프로그래머를 대신하여 실제 시스템 콜을 호출한다.
API 함수를 통해 시스템 콜을 사용하는 이유 → 어느 시스템에서건 실행하는 것을 기대할 수 있기 때문에
RTE→ 실행시간 환경
운영체제가 제공하는 시스템 콜에 대해 연결고리 연결 역할을 하는 시스템 콜 인터페이스를 제공
이 번호에 따라서 색인되는 테이블을 유지한다.
시스템 콜 유형
프로세스 제어
파일 조작
장치 조작
정보 유지 보수
통신과 보호
프로세스 제어
실행중인 프로그램 수행을 end() 하거나 abort()를 시행할 수 있어야 한다
문제가 발생해 trap이 발생한 경우 오류 메시지를 출력하거나 디버거에 의해 검사될 수 있다.
API를 통한 시스템 콜로 데이터를 읽을거나 쓸 수 있고 또한 데이터 공유를 일관성을 위해 잠글 수 있다. → acquire_lock(), release_lock()
다른 시스템 콜 집합은 프로그램 디버깅에 도움이 된다. 많은 시스템이 메모리를 dump()하기 위한 시스템 콜이 제공된다.
링커와 로더
링커 → 재배치 가능 오브젝트 파일을 하나의 이진 실행 파일로 결합
로더 → 이진 실행 파일을 메모리에 적재하는데 사용
이 둘은 재배치를 하여 프로그램 부분에 최종 주소를 할당하고 프로그램 코드와 데이터를 해당 주소와 일치하도록 조정하여 프로그램이 실행될 때 코드가 라이브러리 함수를 호출하고 변수에 접근가능하도록 한다.
윈도우는 이를 위해 동적 링킹 라이브러리 (DLL, dynamic, linked library)
unix, linux는 표준형식을 ELF(executable and linkable format)으로 제공한다. 재배치 가능 파일과 실행파일 각각을 위한 별도의 ELF 형식이 제공된다.
운영체제 구조
현대의 운영체제는 한개의 일관된 시스템보다는 테스크를 작은 구성요소로 분할하는 것이다.
여러 함수를 만들고 main()에 모아서 한꺼번에 호출하는 형태를 가진다.
모놀리식 구조, monolithic structure
일반적인 기술
최초의 UNIX OS, 커널과 시스템 프로그램 2 부분으로 구성
커널
여러가지 인터페이스와 장치 드라이버로 구성
시스템 콜 인터페이스 아래와 물리적 하드웨어 위의 모든 것이 커널이다.
성능에는 뚜렷한 이점이 있다.
오버헤드가 거의없고 커널 안에서 통신 속도가 빠르다
단순하지만 구현 및 확장이 어렵다
계층적 접근
느슨하게 결합된 시스템
기능이 개별적이고 작은 구성요소로 나뉜다
모든 구성요소가 합쳐져 커널을 구성
여러층의 인터페이스를 가진다
구현과 디버깅이 간단해진다.
각 층은 자신보다 하위 수준의 층에 의해 제공된 연산들만 사용해 구현
마이크로 커널
모든 중요하지 않은 요소는 커널에서 제거
이들을 별도의 주소 공간에 존재하는 사용자 수준 프로그램으로 구현, 운영체제를 구성
장점
운영체제의 확장이 쉽다
단점
가중된 시스템 기능 오버헤드 때문에 성능이 나빠진다
모듈
적재가능 커널 모듈(loadable kernel module)기법의 사용
커널은 핵심적인 구성요소의 집합을 가진다
핵심은 커널은 핵심 서비스를 제공하고 다른 서비스는 커널이 실행되는 동안 동적으로 구현
서비스를 동적으로 링크하는 것은 새로운 기능을 직접 커널에 구현하는 것보다는 바람직
전체적인 결과는 커널의 각 부분이 정의되고 보호된 인터페이스를 가진다
그렇지만 모듈에서 임의의 다른 모듈을 호출할 수 있다는 점에서 계층 구조보다 유연
중심 모듈은 단지 핵심 기능만을 가지고 있고 다른 모듈의 적재 방법과 모듈들과 어떻게 통신하는지 안다는 점은 마이크로 커널과 유사
하이브리드 시스템
linux는 전부가 하나의 주소공간에 존재하여 효율적인 성능을 제공하기 때문에 모놀리식 구조이다.
성능상의 이유로 window도 모놀리식 구조이다.
그렇지만 이 os들은 모듈을 사용하기 때문에 새로운 기능을 동적으로 커널에 추가하는 것이 가능하다.
사용자 모드 프로세스로서 실행되는 모든 서브 시스템을 os의 인격이라고 알려진 부분을 마이크로커널의 형태를 유지하고 있다.
-
chapter1 운영체제 서론
공부하는 이유
모든 코드가 운영체제 위에서 실행되고 OS를 사용하거나 프로그램을 작성하는 사람들에게 알아야하는 지식이다.
OS는 자원할당자 라고 볼 수가 있다. 그리고 제어프로그램의 역할도 수행한다. 또한 다른 프로그램이 잘 돌아갈 수 잇는 환경을 제공한다.
시스템의 구성
CPU, CPU와 메모리 사이의 공통 버스, 장치 컨트롤러
장치 컨트롤러 마다 장치 드라이버가 있고 나머지 OS에 대해 일관된 인터페이스를 제공한다.
CPU와 장치 컨트롤러는 병렬로 실행되어 메모리 사이클을 놓고 경쟁한다. 공유 메모리를 질서 있게 엑세스하기 위해 메모리 컨트롤러는 메모리에 대한 엑세스를 동기화한다.
인터럽트(Interrupt)
일반적인 컴퓨터 작업을 고려하자. 입출력, 디스크에 대한 전송이 있을 때 커널의 모드를 바꾸어 제어를 넘기게 되거나 , 작업을 완료했다는 사실을 알리게 된는데 이는 인터럽트를 통해 이루어진다.
CPU가 인터럽트 되면
하던 일을 중단 하고 즉시 고정된 위치로 실행을 옮긴다. 고정된 위치는 일반적으로 인터럽트를 위한 서비스 루틴이 위차한 시작 주소를 가지고 있다. 그리고 인터럽트 서비스 루틴이 실행된다.
인터럽트는 몇 가지 기능은 공통으로 가진다.
적절한 서비스 루틴으로 제어를 전달한다.
그러나 인터럽트는 매우 빈번하게 발생을 하기 때문에 필요한 속도를 위해 인터럽트 루틴에 대한 포인터들에 대한 테이블을 이용한다.
테이블을 사용하면 중간 루틴을 둘 필요가 없이 간접적으로 인터럽트 루틴이 호출 될 수가 있다.
일반적으로 포인터들의 테이블은 하위 메모리에 저장된다.
첫 100개의 주소에 저장된다.
이들 위치에는 여러 장치에 대한 인터럽트 서비스 주소가 들어있다.
인터럽트가 요청 되는 경우 이 주소의 배열, 인터럽트 벡터가 인터럽트 요청과 함께 유일한 장치 번호로 색인이 된다.
인터럽트 구조는 인터럽트 된 모든 정보를 저장해야 인터럽트를 처리한 후 이 정보를 복원할 수 있다.
처리기의 상태(레지스터의 값)을 변경 할 필요가 있다면, 인터럽트 루틴은 반드시 현재의 상태를 저장해야 하고 복귀하기전 상태를 복원해야 한다.
인터럽트를 서비스 한 후, 저장되어 있던 복귀 주소를 프로그램 카운터에 적재하고, 인터럽트에 의해 중단되었던 연산이 인터럽트가 발생되지 않았던 것처럼 다시 시작된다.
구현
인터럽트 요청라인이 CPU하드웨어에 존재하는데 이는 하나의 명령어의 실행을 완료할 때마다 CPU가 이 선을 감지한다. CPU가 컨트롤러가 인터럽트 요청 라인에 신호를 보낸 것을 감지하면, 인터럽트 번호를 읽고 이 번호를 인터럽트 벡터의 인덱스로 사용하여 인터럽트 핸들러 루틴으로 점프를 하게 된다. 그런 다음 해당 인덱스와 관련된 주소에서 실행한다.
인터럽트 처리기는 인터럽트 signal이 보내져오면 작업중에 변경될 상태를 store, 인터럽트 원인을 확인, 필요한 처리르 수행, return_from_interrupt 명령어를 실행하여 되돌린다.
인터럽트를 발생, raise→ CPU는 인터럽트를 포착 catch→ 인터럽트 핸들러로 dispatch → 핸들러는 장치를 서비스하여 지운다. clear
그렇지만 최신 OS에서는 더 정교한 인터럽트가 고려된다.
중요한 처리 중에 인터럽트 처리를 연기할 수 있어야 한다
장치의 적절한 인터럽트 핸들러로 효율적으로 디스패치를 할 방법이 필요하다
운영체제가 우선순위가 높은 인터럽트와 우선순위가 낮은 인터럽트를 구분하고 긴급도에 따라 대응이 가능해야 한다.
대부분의 CPU에는 2개의 인터럽트 요청라인이 있다.
복구할 수 없는 메모리 오류와 같은 이벤트를 위해 예약된 마스크 불가능 인터럽트(nonmaskable interrupt)
인터럽트 되어서는 안되는 중요한 명령 시퀸스를 시작하기전 CPU에 의해 인터럽트를 끌 수 있다.
마스킹 가능
장치 컨트롤러가 서비스를 요청하기 위해서 사용한다
벡터 방식 인터럽트 기법의 목적은 서비스가 필요한 장치를 결정하기 위해서 하나의 인터럽트 핸들러가 가능한 모든 인터럽트 소스를 검색할 필요를 줄이기 위한 것이라는 것을 상기하자.
→ 실제로는 인터럽트 벡터의 주소개수 보다 많은 인터럽트 처리기가 존재한다. 따라서 인터럽트 체인이라는 방법을 사용한다.
인터럽트 벡터의 각 우너소는 인터럽트 핸들러 리스트의 헤드를 가리킨다. 인터럽트가 발생하면 요청을 처리할 수 있는 핸들러가 발견될 때까지 상응하는 리스트의 핸들러가 하나씩 요청된다.
인터럽트 기법은 인터럽트 우선순위 레벨을 구현한다. 이 레벨을 통해 CPU는 모든 인터럽트 레벨을 마스킹하지 않아도 우선순위가 낮은 인터럽트 처리를 연기할 수 있다.
인터럽트 요약
최신 OS에서 비동기 이벤트를 처리할 때 사용, 장치 컨트롤러, 하드 웨어 오류가 있는 경우 발생
가장 긴급한 작업을 먼저 수행하기 위해 최신 컴퓨터는 인터럽트 우선순위 시스템을 사용한다. 인터럽트는 시간에 민감한 처리에 빈번하게 사용되기 때문에 성능을 좋게 하기 위해서는 효율적인 처리가 필요하다.
저장장치 구조- storage structure
메인 메모리는 RAM(random access memory)라 불리는 메모리에서 가져오게 된다. 휘발성을 가지고 있기 때문에 부트스트랩 프로그램을 유지하는 용도로 사용하는 것은 안된다.
컴퓨터는 전기적으로 소거가능한 EEPROM 및 기타 형태의 펌웨어를 사용한다.
메모리는 바이트 배열을 제공하고 load, store 명령을 통해 이루어진다.
load 적재 명령은 메인메모리로 부터 CPU 내부의 레지스터로 워드를 옮기는 것이다.
store 저장 명령은 레지서터의 내용을 메인 메모리로 옮기는 것이다.
폰노이만 구조 시스템에서는 명령을 인출하고 그 명령을 명령 레지스터에 저장한다. 명령을 해독하고 메모리로부터 피연산자를 인출하여 내부 레지스터에 저장되도록 한다.
여기서 메모리는 단지 일련의 메모리 주소만을 인식하게 된다.
저장장치의 기본 단위는 비트이고 바이트는 8비트로 이루어져 있다. 워드는 컴퓨터 구조의 단위이다.
워드는 하나이 상의 바이트로 구성된다. 예를 들어 64비트 레지스터와 64비트 메모리 주소지정을 가지는 컴퓨터는 64비트(8바이트) 워드를 가지게 된다.
컴퓨터는 많은 연산을 한 번에 한 바이트 단위가 아니고 본연의 워드 단위로 실행된다.
메모리의 확장은 보조저장장치를 제공한다. 예시로 HDD(하드 디스크 드라이브)와 비휘발성 메모리(NVM)장치이다. 이들은 메인메모리보다 느리다.
그래서 휘발성 저장 장치를 메모리라고 책에서 주로 표현하고 비휘발성 저장장치는 NVS라고 한다.
입출력 구조 I/O Structure
시스템 버스를 통해 데이터를 교환할때 대량의 데이터를 이동하는 경우 높은 오버헤드가 유발될 수가 있다. 이를 해결하기 위한 것이 직접 메모리 엑세스(DMA)이다.
장치에 대한 버퍼 및 포인터, 입출력 카운트를 세팅하고 장치 제어기는 CPU 개입 없이 메모리로부터 자신의 버퍼 장치로 또는 버퍼로부터 메모리로 데이터 전체를 전송한다.
이때 전송에는 인터럽트가 발생하는데 발생 단위는 바이트가 아닌 블럭단위로 전송이 완료될 때마다 발생한다.
몇몇 고가의 시스템에서는 버스 대신에 스위치 구조를 사용하는데 이는 사이클을 경쟁하지 않고 다수의 구성요소가 다른 구성요소들과 동시에 통신하는 것이 가능하다.
컴퓨터 시스템 구조 computer system Achitecture
다중 처리기 시스템
각각 단일 코어 CPU가 있는 두개 이상의 프로세서가 존재한다.
프로세서는 컴퓨터 버스, 클록, 메모리 및 주변 장치를 공유하게 된다.
다중 처리 시스템의 이점은 처리량 증가이다. 그렇지만 프로세서가 늘어난다고 n배가 되는 것은 아니다. 공유 자원에 대한 race는 추가 프로세서의 이득을 낮추기 때문이다.
가장 일반적인 다중 처리기 시스템은 cpu 프로세서가 운영체제 기능 및 사용자 프로세서를 포함한 모든 자원을 수행한느 symmetric multiprocessing을 수행한다. 각 cpu처리기에는 래지서터와 로컬 개별 캐시가 있다. 그리고 시스템 버스를 통해 공유를 하게된다.
요즘은 캐시를 2개 사용하는데 레벨1 L1 캐시 와 레벨 2 L2캐시이다. L1은 자체 로컬 캐시이고 L2는 칩에 국한 되지만 두 처리 코어에서 공유를 한다.
NUMA (non uniform memory access)는 모든 cpu가 공유 시스템으로 연결되어 있고 하나의 물리 주소 공간을 공유한다. 병목 현상에 대응하기 위해 각cpu에 작고 빠른 로컬 버스를 통해 엑세스 되는 자체 로컬 메모리를 이용하는 것이다.
장점은 더 많은 프로세서가 추가될 수록 효과적으로 확장하는 것이 가능하다.
단점은 CPU가 시스템 상호 연결을 통해 원격 메모리에 엑세스를 해야 할 때 지연 시간이 증가하여 성능 저하가 일어날 수 있다는 점이다.
블레이드 서버는 다수의 처리기 보드 및 입출력 보으, 네트워킹 보드를 하나의 chassis안에 장착되는 형태를 가진다.
독립적으로 부팅 될 수 있고 각자 자기의 운영체제를 수행한다는 것이다.
클러스터형 시스템
여러 cpu를 가진다. 저장 장치를 공유하고 근거리 통신망(lan)이나 InfiniBand와 같은 고속 상호 연결망과 연결된다.
클러스터링은 높은 가용성(availability)를 제공하기 위해서 사용된다. 높은 가용성은 중복을 통해 얻어진다.
각 노드는 하나 이상 노드들을 감시하고 감시하던 노드가 고장난 노드의 저장장치에 대한 소유권을 넘겨받는다.
높은 가용성은 안정성을 향상해 많은 응용 프로그램에 중요한 영향을 미치게 된다.
남아 있는 하드웨어 수준에 비례하여 계속 제공하는 기능을 우아한 성능 저하(graceful deg-aradation)이라고 한다.
다른 말로 결함 허용시스템이라고 한다.
병렬화 기법을 이용하여 클러스터의 각 계산 문제 일부를 해결한 후 모든 노드의 결과를 결합하여 최종 해답을 얻고는 한다.
DLM, 분산 잠금 관리자라고 불리는 이 기능은 몇몇 클러스터에 포함되어 있다.
스토리지 전용 네트워크(storage-area network, san)에 의해 가능해졌다.
san에 저장된다면 클러스터 sw는 연결된 임의의 호스트에서 수행이 가능하도록 응용배정이 가능하다. DB클러스테에서 수십개의 호스트가 동일한 DB를 공유할 수가 있어서 성능과 신뢰도를 높이게 된다.
운영체제의 작동
컴퓨터가 실행될 때 초기 프로그램을 실행해야 한다. 일반적으로 컴퓨터 하드웨어 내 펌웨어에 저장된다.
CPU 레지스터에서 장치 컨트롤러, 메모리 내용에 이르기까지 시스템의 모든 측면을 초기화한다. 부트스트랩 프로그램은 os를 적재하는법과 해당 시스템의 실행을 시작하는 방법을 알아야한다.
부트스트랩 프로그램은 os 커널을 찾아 메모리에 적재를 해야한다.
커널이 적재되어 실행되면 system과 user에게 서비스를 제공할 수 없다. 커널이 실행되는 전체 시간동안 실행되는 시스템 데몬이 되기 위해 부팅할 때 메모리에 적재되는 시스템 프로그램에 의해 커널 외부에서 제공된다.
os는 응답할 사용자가 없는 경우 이벤트가 발생하는 것을 기다린다. 이벤트는 항상 인터럽트를 발생시키고 trap interrupt(오류, 특정 상황)가 일어나는 경우, system call 특수 연산을 실행하여 요청되고 os가 제공하는 서비스가 수행될 것을 요구한다.
다중 프로그래밍과 태스킹 (Multiprogramming and multitasking)
CPU가 항상 한개는 실행하도록 프로그램을 구성해서 CPU 이용률 높일 수 있다.
이때 여러 프로세스를 동시에 메모리에 유지한다. OS는 다른 프로세스의 모드 전환 waiting → running을 통해 cpu가 계속 실행되도록 한다.
multitasking은 다중 프로그래밍의 논리적 확장이다. cpu는 여러 프로세스를 전환하여 프로세스를 실행하지만 전환을 빠르게 하여 사용자에게 빠른 응답시간을 제공받는다. 여기서 결정을 내리는 것은 CPU 스케쥴링이다. 그리고 프로세스 스케쥴링, 디스크 및 메모리 관리를 통해 os의 모든 단계에서 서로 미치는 영향이 제한받게 된다.
multi programming에서 적절한 응답을 보장하기 위해 가상메모리가 필요하다(virtual memory) 이것은 일부만 메모리에 적재된 프로세스의 실행을 허용하는 것이다. 그리고 프로그램이 물리적 메모리보다 커도 된다는 것이다. 논리 메모리를 만들어 메모리의 한계를 극복하게 해준다.
다중 프로그래밍 다중 태스킹 시스템도 파일 시스템을 제공해야 한다. 그리고 저장장치 관리와 부적절한 접근으로부터 자원을 보호해야 한다.
이중 모드와 다중 모드 운용(Dual-Mode and Multi-Mode operation)
이중 모드 → 사용자 모드로 mode bit 0,1로 구분된다 0은 커널 모드, 1은 사용자 모드
평소에는 사용자 모드로 1이지만 os로부터 서비스를 요청하면 커널모드로 전환을 하게 된다.
그리고 시스템 콜을 실행하게 된다.
또한 인터럽트나 트랩이 발생하면 mode bit이 0으로 전환이 된다.
Intel process는 보호링이라고 4개의 분리된 것이 있다.
링 0이고 링 3은 사용자 모드를 제공한다
시스템 콜은 computer system의 처리기가 지원하는 기능에 따라 다양한 방법으로 호출된다
또한 시스템 콜은 일반적으로 인터럽트 벡터의 특정 위치로 트랩을 거는 형태로 시행된다.
타이머
사용자 프로그램이 무한 루프에 빠지거나 시스템 서비스 호출에 실패를 하여 os로 복귀를 할 수 없는 경우를 방지해야 한다.
그래서 이러한 목적을 위해 타이머를 사용한다. 타이머의 지정한 시간이 지난 후 컴퓨터를 인터럽트 하게 설정이 가능하다.
가변 타이머도 있는데 이는 고정률의 클록(fixed rate clock), 계수기로 구현가능하다.
이를 이용하여 인터럽트를 허용하게 된다.
자원관리자, Resource Management
프로세스 관리
실행중인 프로그램은 프로세스이고 프로세스는 자원을 필요로 한다.
또한 하나의 프로그램은 프로세스가 아니다. 프로그램은 passive한 자원이지만 프로세스는 프로그램키운터(program counter, pc)를 가진 active한 자원이다. 그리고 한 프로세스의 실행은 순차적이다.
그리고 다중 스레드 프로세서가 있는데 여기에는 여러 개의 pc를 가지고 있고 이 pc들은 각 스레드가 실행된 다음 명령어를 가리키게 된다.
한 프로세스는 한 시스탬 내의 작업의 단위를 의미한다. 따라서 시스템은 프로세스의 집합이라고 볼 수 있고 일부는 OS의 프로세스이고 일부는 사용자의 프로세스이다.
이 프로세스들은 한 cpu를 멀티플렉싱(다중화)를 하던가 여러 cpu코어를 사용할 수 있다
프로세스 관리를 위한 os의 일
사용자 프로세스, 시스템 프로세스의 생성과 제거
CPU에 프로세스와 스레드 스케쥴 추가
프로세스의 일시 중지와 재수행
프로세스 동기화를 위한 기법 제공
프로세스 통신을 위한 기법 제공
메모리 관리
메모리는 대용량 배열이라고 생각하면 되고 각 바이트는 자기의 주소를 가지고 있다
메인 메모리는 CPU와 입출력 장치에 의해 공유하는 가장 빠른 접근이 가능한 데이터 저장소이다.
폰노이만 방식에서 CPU는 instruction fetch-cycle 동안 메인 메모리로부터 명령어를 읽고
자료 인출 사이클(data fetch-cycle)동안 메인 메모리로부터 데이터를 읽는다
그리고 직접 접근가능한 유일한 대량 메모리이다.
프로그램이 실행되기 위해서는 absoulute address로 매핑이 되어야 하고 메모리에 적재가 되어야 한다.
적절한 응답 속도를 위해 우리는 여러 개의 프로그램을 관리할 필요가 있고 이를 위해 메모리 관리 기법이 존재한다.
메모리 관리를 위해 os가 하는 일
메모리의 어느 부분이 현재 사용되고 있으며 어느 프로세스에 의해 사용되고 있는지를 추적
필요에 따라 메모리 공간을 할당하고 회수
어떤 프로세스들을 메모리에 적재하고 제거할 것인가를 결정
파일 시스템 관리
OS는 저장장치의 물리적 특성을 추상화학 논리적 저장단위인 파일을 정의한다.
파일은 파일 생성자에 의해 정의된 관련 정보의 집합체이다. OS는 이를 관리함으로써 파일의 추상적인 개념을 구현한다. 그리고 파일은 사용하기 쉽도록 통상 디렉토리들로 구성된다.
그리고 파일에 대한 접근을 관리한다,
파일관리를 위해 OS가 하는일
파일의 생성 및 제거
디렉터리의 생성 및 제거
파일과 디렉터리를 조작하기 위한 프리미티브의 제공
파일을 보조저장장치로 매핑
안정적인(비휘발성) 저장 매체에 파일을 저장
대용량 저장장치 관리
메인 메모리 백업을 위해 보조 저장장치를 사용한다. HDD, NVM 장치를 주요 온라인 저장 매체로 사용을 한다. 웹 브라우저, 워드 프로세서 등 프로그램은 메모리에 적재되기 전에 이러한 장치에 저장이 된다.
이에 대한 관리를 위해 OS가 하는일
마운팅과 언마운팅
사용가능 공간(free space) 관리
저장장소 할당
디스크 스케쥴링
저장장치 분할
보호
보조저장장치는 빈번하고 폭넓게 사용되므로 효율적인 사용이 필요하다. 전체 동작 속도는 보조저장장치를 조작하는 알고리즘 속도에 큰 영향을 받게 된다. 제 3저장장치 DVD, CD와 같은 것은 OS에 의해 관리되어야만 한다.
캐시 관리
정보는 사용됨에 따라 빠른 장치인 캐시에 일시적으로 복사가 된다. 그리고 특정 정보가 필요한 경우 우선 캐시에 있는지 조사를 하게 된다.
시간 지역성(다시 접근), 공간 지역성(비슷한 곳 접근)를 생각하여 캐시에 넣는다
CPU 내부의 레지스터는 메인 메모리를 위한 고속 캐시라고 생각해도 무방하다. 어느 정보를 메인 메모리에 둘 지, 어느 정보를 레지스터에 둘 지를 결정하는 레지스터 할당 정책과 교체 알고리즘을 구현가능하다.
하드웨어로 구현가능한 캐시도 있다. 시스템 콜을 담는 명령 캐시는 OS로 제어를 하지는 않는다.
그렇지만 CPU 명령어를 빠르게 가져오는데 사용을 한다.
캐시관리도 중요한 설계 문제이다. 캐시 정책을 통해 성능이 크게 향상될 수 있기 때문이다.
디스크 → 메인 메모리 → 캐시 → 하드웨어 레지스터
이런 식으로 호출을 하게 된다.
하지만 다중 태스킹 환경에서는 주의 필요하다. 그리고 캐시 일관성 문제를 조심해야 한다.
입출력 시스템 관리
OS의 목적 중 하나는 사용자에게 특정 하드웨어 장치를 숨기는 것이다. UNIX에서 입출력 장치의 특성은 입출력 서브시스템에 의해 OS 자체의 대부분으로 많이 숨겨져 있다.
입출력 시스템은 다음과 같다.
버퍼링, 캐싱, 스풀링을 포함한 메모리 관리 구성요소
일반적인 장치 드라이버 인터페이스
특정 하드웨어 장치들을 위한 드라이버
12장에서 입출력 서브 시스템이 다른 시스템 구성요소와 어떻게 인터페이스를 하고, 장치를 관리, 데이터를 전송, 입출력 완료를 알아내는지 논의를 하게 된다
보안과 보호
보호는 컴퓨터 시스템이 정의한 자원에 대해 프로그램, 프로세스, 또는 사용자들의 접근을 제어하는 기법이다. 보호는 구성요소 서브시스템 간의 인터페이스에서 잠재적인 오류를 검출하여 시스템의 신뢰성을 증가시킨다.
외부 or 내부의 공격을 방어하는 것이 보안 기능이다. ex) 바이러스, 웜, 디도스, 식별자 도용 과 같은 공격에 대비한다
가상화, virtualization
단일 컴퓨터의 하드웨어를 여러가지 실행 환경으로 추상화를 하여 개별환경이 자신만의 컴퓨터에서 실행되고 있다는 환상을 만드는 기술이다. 사용자는 단일 운영체제에서 동시에 실행되는 다양한 프로세스 간에 전환되는 것과 동일한 방식으로 다양한 운영체제 간에 전환할 수 있다.
가상화 소프트웨어는 에뮬레이션을 포함하는 클래스의 구성원이다. 소프트웨어로 하드웨어를 시뮬레이션하는 에뮬레이션은 소스 CPU 유형이 대상 CPU 유형과 다른 경우 주로 사용한다.
→ 에뮬레이션은 비용이 크므로 원래 소스보다 느리게 실행된다.
가상화 기술로 호스트와 게스트라는 여러 os 복사체를 이요앟여 관리한다. VMM(가상 머신 관리자)를 통해 자원을 이용하고 각 게스트를 서로로부터 보호한다.
분산 시스템, distributed systems
떨어져 있는 여러 컴퓨터의 집합, 시스템 내의 다양한 자원을 접근 가능하게 한다. 네트워크는 여기서 두 개 이상 시스템 간의 통신 경로이다. 분산 시스템의 많은 기능은 네트워킹에 의존하고 있다.
TCP/IP가 일반적인 네트워킹 프로토콜로 인터넷의 기본 구조를 제공한다.
네트워킹 운영체제는 다른 컴퓨터의 다른 프로세스가 메시지를 제공가능하게 통신체계를 갖추고 파일 공유와 같은 기능을 제공하는 운영체제이다.
커널 자료구조, Kernel Data Structures
시스템에서 데이터가 구조화 되는 방법이다.
리스트, 스택 큐
메인 메모리는 배열로 구성
데이터 수 * 데이터 크기로 지정
CPU에서 수행가능한 태스크가 큐로 구성이 된다.
트리
Linux에서 CPU 스케쥴링 알고리즘 일부로 red-black tree로 알려진 균형 이진 탐색 트리를 사용한다
균형 이진 탐색트리의 최악의 성능이 O(lg n)이다
해시 함수와 맵
해시 함수는 데이터를 받아 연산을 더해 수로 반환을 한다
이는 os에서 많이 사용된다
해시맵
해시 함수를 통해 key value를 연결한다
보안을 위해서 많이 사용된다
비트맵
n개의 항의 상태를 나타내기 위한 n개의 이진 비트의 스트링이다.
사용 가능함과 사용 불가능함을 표시한다.
공간 효율을 잘 쓸 수 있다.
Touch background to close