Ch1. A Tour of Computer Systems(1.7 ~ 1.9)
1-7. The Operating System Manages the Hardware
- 운영체제 : 하드웨어와 소프트웨어 사이에 위치한 소프트웨어 계층
- 응용 프로그램이 하드웨어를 제어하려면 언제나 운영체제를 통해야한다.
운영체제의 목적
- 응용프로그램들이 하드웨어를 잘못 사용하는 것 방지
- 응용프로그램이 저수준의 하드웨어 장치를 효율적으로 조작할 수 있도록 함
운영체제의 추상화
- 운영체제의 목적을 추상화(abstraction)를 통해 달성한다.
- 파일 : 입출력 장치의 추상화
- 가상메모리 : 메인 메모리와 디스크 입출력 장치의 추상화
- 프로세스 : 프로세서, 메인 메모리, 입출력 장치 모두의 추상화 결과
💡 운영체제에서의 추상화(Abstraction)?
- 정의하고자 하는 대상의 디테일, 자세하고 사소한 특징들을 숨기고 주요한 특징을 대상으로 정의하는 것
- 사용자는 시스템 내에서 복잡한 작업을 거치지 않고도 시스템 콜(system call)을 통해 단순하게 수행할 수 있다.
- 시스템 콜(System call) : os가 자원들을 사용할 수 있도록 제공하는 일종의 API 개념이라고 생각!
1-7-1. Process
- 프로세스
- 각각 Code, Data, Stack, Heap 의 구조로 되어있는 독립된 메모리 영역을 할당받는다.
- 각 프로세스는 별도의 주소 공간에서 실행된다.
- 다른 프로세스의 자원에 접근할 수 없다.
- 프로세스는 최소 하나 이상의 스레드를 포함한다.
- 운영체제는 사용자로 하여금 시스템에서 한 개의 프로그램만 실행되는 것 같은 착각에 빠지도록 한다.
- → 자원을 모두 독차지 하고 있다고 느낀다.
- 다수의 프로세스들은 동일한 시스템에서 동시에 실행될 수 있으며, 각 프로세스는 하드웨어를 배타적으로 사용하는 것 처럼 느낀다.
Context Switching
- Context : 프로세스가 실행하는 데 필요한 모든 상태 정보
- 프로세스의 PCB(Process Control Block)에 저장된다.
- 단일 프로세서 시스템은 한 개의 프로세스의 코드만 실행할 수 있으므로, 운영체제는 현재 프로세스에서 다른 새로운 프로세스로 제어를 옮기려고 할 때, 현재 프로세스의 context를 저장하고 새 프로세스의 context 복원을 수행한다. → “Context Switching”
- Ex. 쉘 프로세스 → hello 프로세스 수행 과정
💡 병행 프로세스 (concurrent process) : 메모리에 다수의 프로세스가 같이 존재한다는 의미
1. 쉘 프로세스 혼자서 동작하다가 명령줄에서 입력을 기다린다.
2. [쉘 프로세스] hello 프로그램을 실행하라는 명령 → 시스템 콜
호출
→ 운영체제로 제어권이 넘어간다.
3. [운영체제] 쉘의 Context 저장 → 새로운 hello 프로세스와 hello Context 생성
→ hello 프로세스로 제어권이 넘어간다.
4. [hello 프로세스] hello 프로세스 종료
→ 운영체제로 제어권이 넘어간다.
5. [운영체제] 쉘 프로세스의 Context 복구
→ 쉘 프로세스로 제어권이 넘어간다.
커널(kernel)
- 모든 프로세스를 관리하기 위해 시스템이 이용하는 코드와 자료 구조의 집합
- 하나의 프로세스에서 다른 프로세스로의 전환을 관리한다.
- 시스템 콜 실행시, 커널에 제어를 넘겨준다.
1-7-2. Thread
- 쓰레드(thread)
- 프로세스 실행의 단위
- 프로세스는 다수의 실행 단위(쓰레드)로 구성된다.
- 쓰레드의 중요성
- 데이터의 공유가 더 쉽다.
- 쓰레드가 프로세스보다 더 효율적이다.
- 프로세스 🆚 쓰레드
- 실행 중인 프로그램
- 프로세스의 실행 단위
1-7-3. Virtual Memory
- 각 프로세스들이 메인 메모리 전체를 독점적으로 사용하고 있는 것 같은 환상을 제공하는 추상화
- ‘가상주소 공간’ 이라는 균일한 메모리 형상을 갖는다.
- 주소 공간의 하위 영역은 사용자 프로세스의 코드와 데이터를 저장한다.
- 프로그램 코드와 데이터영역 (Code, Data)
- 모든 프로세스들이 같은 고정 주소에서 시작
- 컴파일 타임에 크기 결정
- 힙(Heap)
- 런타임 힙
- 프로세스가 실행되면서 런타임에 동적으로 할당
- 공유 라이브러리
- 주소공간의 중간 부근에 C표준 라이브러리나 수학 라이브러리와 같은 공유 라이브러리의 코드와 데이터를 저장하는 영역에 존재
- 스택(Stack)
- 컴파일러가 함수 호출을 구현하기 위해 사용하는 사용자 스택
- 커널 가상메모리
- 주소공간의 맨 윗 부분은 커널을 위해 예약되어 있음
- 커널 코드 내에 정의된 함수를 직접 호출하는 것도 금지되어 있음
1-7-4. Files
- Unix I/O 라는 시스템 콜이용해서 파일을 읽고 쓰는 형태
- 응용 프로그램에 시스템에 들어 있는 다양한 입출력장치들의 통일된 관점 제공
1-8. Systems Communicate with Other Systems Using Networks
- 네트워크 : 또 다른 입출력 장치
- 시스템은 다른 컴퓨터로부터 받은 데이터를 읽어서 메인 메모리에 복사
- telnet 응용을 사용
💡 telnet : 인터넷이나 로컬 영역 네트워크 연결에 쓰이는 네트워크 프로토콜
- “hello” 스트링을 telnet 클라이언트에 입력하고 엔터 키를 누른다.
- 클라이언트 프로그램은 이 스트링을 telnet 서버로 보낸다.
- telnet 서버가 네트워크에서 스트링을 받은 후에 원격 쉘 프로그램에 이들을 전달한다.
- 다음으로 원격 쉘은 hello 프로그램을 실행하고 출력을 다시 telnet 서버로 전달한다.
- telnet 서버는 네트워크를 거쳐 울력 스트링을 telnet 클라이언트로 전달하고 클라이언트 프로그램은 출력 스트링을 자신의 로컬 터미널에 표시한다.
1-9. Important Themes
1-9-1. Amdahi’s Law
- 컴퓨터 프로그램 같은 프로세스의 성능 향상에 대한 정보를 제공
💡 암달의 법칙에서 Performance?
- 프로세스 완료까지의 소요 시간
Example
- $f$ : 전체 시스템 시간에서 개선된 부분이 차지하고 있는 시간의 비율
- $S$ : 성능 향상 배수
$$
S_{latency} = {1\over (1-f) + {f\over s}}
$$
만약 초기에는 전체 시간의 60%($f = 0.6$) 만 소모한 시스템의 일부분이 3배 속도($S = 3$)가 빨라졌다고 한다면 속도향상($S_{latency}$)은 1.67을 얻는다.
⭐ 시스템의 주요 부분에 대해 실질적인 개선을 했지만 총 속도 향상은 매우 적다.
→ Amdahi의 법칙의 주요 맹점
병렬 처리에서의 Amdahi 법칙
병렬 컴퓨팅에서 멀티 프로세서를 사용할 때 프로그램의 성능향상은 프로그램의 순차적인 부분에 의해 제한된다. 예를 들면, 프로그램의 95%가 병렬화 할 수 있다면 이론적인 최대 성능 향상은 아무리 많은 프로세서를 사용하더라도 최대 20배로 제한된다.
Amdahi의 법칙의 시사점
- 아무리 최적화를 하더라도 이 최적화로부터 영향을 받지 않는 다른 부분으로 그 효과는 제한적일 수 있다.
- 프로그래머가 프로그램의 성능을 개선할 때 헛된 곳에 시간을 낭비하지 말고 가장 많은 시간이 소요되는 곳에 집중해야함
- Make the common case fast : 자주 생기는 일을 단순화하여 성능을 개선하기 쉬운 경우가 많다.
- 상대성능 표현하기좋은 방법
$T_{old} / T_{new}$
- $T_{old}$ : 원본 프로그램에서의 요구 시간
- $T_{new}$ : 개선된 프로그램에서의 요구 시간
⭐ 현재에 비교해서 나타내는 게 더 낫다!
1-9-2. Concurrency and Parallelism
- 동시성(Concurrency)
- 다수의 동시에 벌어지는 일을 갖는 시스템
- ‘Context Switching’ 프로세서 하나가 여러 작업을 돌아가며 일부분씩 수행하는 방식
- 병렬성(Parallelism)
- 동시성을 사용해서 시스템을 보다 빠르게 동작하도록 하는 것
- 프로세서 하나에 코어 여러개가 달려서 각각을 동시에 작업하는 방식
Thread-Level Concurrency
- 쓰레드를 이용하면 한 개의 프로세스 내에서 실행되는 다수의 제어흐름을 가질 수도 있다.
- 시간공유(time-sharing)
- 한 개의 컴퓨터가 실행하는 프로세스를 빠르게 전환하는 방법을 사용
- 다수의 사용자들이 시스템과 동시에 교신할 수 있음
- 한 명의 사용자가 다수의 태스크에 동시에 연관될 수 있게 함
- 단일 프로세서 시스템 : 한 개의 프로세서
- 멀티프로세서 시스템 : 여러 개의 프로세서를 가지고 하나의 운영체제 커널의 제어 하에 동작
- 하이퍼쓰레딩(=멀티쓰레딩)
- 하나의 CPU가 여러 개의 제어 흐름을 실행할 수 있게 해주는 기술
- 프로그램 카운터나 레지스터 파일 같은 여러 개의 동일한 CPU 하드웨어를 가짐
- 부동소수 연산기와 같은 다른 부분들은 한 개의 하드웨어만 가지고 있음
- 하이퍼쓰레드 프로세서
- 매 사이클마다 실행할 쓰레드 결정
- 시스템 성능 개선을 위한 멀티프로세싱
- 다수의 태스크를 실행할 때, 동시성을 시뮬레이션할 필요를 줄여줌
- 프로그램이 병렬로 효율적으로 실행할 수 있는 멀티쓰레드 형태로 표현되었을때만 멀티프로세싱으로 한 개의 응용프로그램을 빠르게 실행할 수 있음
Instruction-Level Parallelism
- 여러 개의 인스트럭션을 한 번에 수행할 수 있다.
- 파이프라이닝
- 하나의 인스트럭션을 실행하기 위해 요구되는 일들을 여러 단계로 나누고 프로세서 하드웨어가 일련의 단계로 구성되며 이들 단계를 하나씩 각각 수행
- 병렬도 동작가능
- 사이클당 한 개의 인스트럭션 실행에 근접하는 실행속도를 유지할 수 있다.
- Single-Instruction, Multiple-Data (SIMD) Parallelism
- 사이클당 한 개 이상의 인스트럭션을 실행할 수 있는 프로세서
1-9-3. The Importance of Abstractions in Computer Systems
- 인스트럭션 집합 구조 : 실제 프로세서 하드웨어의 추상화
- 파일 : 입출력 장치의 추상화
- 가상메모리 : 프로그램 메모리의 추상화
- 프로세스 : 실행 중인 프로그램의 추상화
- 가상머신 : 운영체제, 프로세서, 프로그램 모두를 포함하는 컴퓨터 전체의 추상화
Computer Systems: A Programmer's Perspective, 3rd Edition
Randal Bryant (Author), David O'Hallaron (Author)
🔗 Reference
- OS를 알아보자 - 1편. Abstraction
- (https://velog.io/@jungbumwoo/OS를-알아보자)
- IT_Dexter :: 병행 프로세스 (Concurrent Process), 임계구역, 상호배제
- (https://itdexter.tistory.com/395)
- CS 225 | Stack and Heap Memory
- (https://courses.engr.illinois.edu/cs225/fa2022/resources/stack-heap/)
- 텔넷 이란?(TELNET) 왜 사용할까? :: 개발천국
- (https://taewooblog.tistory.com/130)
- 암달의 법칙 (Amdahl's law) - 기계인간 John Grib
- (https://johngrib.github.io/wiki/amdahl-s-law/)
- Amdahl's law - Wikipedia
- (https://en.wikipedia.org/wiki/Amdahl's_law)
'🖥️ Computer Science > Computer Architecture' 카테고리의 다른 글
Chapter 11. Network Programming (0) | 2022.12.20 |
---|---|
Ch9. Dynamic Memory Allocation(9.9) (1) | 2022.12.06 |
Ch1. A Tour of Computer Systems(1.1 ~ 1.6) (0) | 2022.11.03 |