Table of contents
오늘 한일
그림으로 배우는 구조와 원리: 운영체제
day1, day2, day3, day4 복습.
day1
- 컴퓨터 하드웨어의 구성
- 프로세서, 레지스터, 메모리, 시스템 버스, 주변 장치
- 컴퓨터 시스템의 동작
- 명령어의 구조, 명령어 사이클, 인터럽트
- 컴퓨터 하드웨어의 구성
day2
운영체제의 개념과 발전 목적
- 운영체제의 개념: "사용자와 하드웨어 사이의 중간 매개체로 응용 프로그램의 실행을 제어하고 , 자원을 할당 및 관리하며, 입출력 제어 및 데이터 관리와 같은 서비스를 제공하는 소프트웨어"
- 운영체제의 발전 목적: 편리성, 효율성, 제어 서비스 향상
운영체제의 기능
- 자원(메모리, 프로세스, 주변장치, 파일) 관리, 시스템(시스템 보호, 네트워킹, 명령 해석기) 관리
운영체제의 발전 과정과 유형
일괄 처리 시스템
- 작업을 모아서 처리
- 일괄처리, 버퍼링, 스풀링
다중 프로그래밍
- 메모리에 프로세스(프로그램)를 여러 개 올려놓고 하나의 프로세서에서 번갈아가면서 처리
- 유휴시간 활용
시분할 시스템
- 다중 프로그래밍 + 규정 시간량 할당
- 음답시간 최소화
다중 처리 시스템
- 단일 컴퓨터 시스템 내에서 둘 이상의 프로세서를 사용하여 동시에 둘 이상의 프로세스(프로그램)를 지원
- 프로세서 하나가 고장나도 다른 프로세서에서 처리 가능
실시간 처리 시스템
- 더 높은 적시 응답을 요구
- 데이터 흐름 또는 프로세서 연산에 엄격한 시간 요구
- 경성 실시간 처리 시스템
- 치명적인 영향을 미침
- Ex) 무기 제어, 발전소 제어
- 연성 실시간 처리 시스템
- 치명적이지 않음
- Ex) 동영상 스티리밍
분산 처리 시스템
- 시스템마다 독립적인 운영체제와 메모리로 운영, 필요할 때 통신
- 사용자에게는 중앙집중식 시스템처럼 보이나, 실제로는 다수의 독립된 프로세서에서 실행
- 데이터를 여러 위치에서 처리, 저장하며 여러 사용자가 공유 가능
- 하나의 프로그램을 여러 프로세서에서 동시에 실행 가능
day3
- 운영체제의 서비스
- 부팅 서비스
- 초기화 목적
- 부팅 or 부트스트래핑
- 부트 로더
- 사용자 서비스
- 프로그래머가 프로그래밍 작업을 쉽게 할 수 있도록 서비스 제공
- 사용자 인터페이스, 프로그램 실행, 입출력 동작 수행, 파일 시스템 조작, 네트워크 통신, 오류 탐지
- 시스템 서비스
- 시스템 자체의 효율적인 동작을 보장
- 자원 할당, 계정, 보호와 보안
- 시스템 호출
- 실행 중인 프로그램과 운영체제 간의 인터페이스 (API)
- 사용자 프로그램은 시스템 호출을 하여 운영체제의 기능을 제공받음
- 프로그램에서 명령어나 서브루틴의 호출 (프로그래밍 언어)
- 명령 해석기를 사용하여 대화 형태로 호출
- 부팅 서비스
- 운영체제의 구조
- 단일 구조 운영체제
- 모놀리식 커널 구조
- 대부분의 기능을 커널에 그룹화해서 구현
- 직접 통신하여 시스템 자원을 효율적으로 관리할 수 있음
- 커널 크기가 커지면서 오류 검출 등 유지보수 어려움
- 계층 구조 운영체제
- 비슷한 기능을 수행하는 요소를 그룹화하여 계층적으로 구성
- 한 계층에서 다음 계층으로 데이터를 전달할 때마다 추가적인 시스템 호출이 발생
- 성능 저하
- 각 계층은 자신의 하위 계층 서비스와 기능만 사용하므로 설계나 구현이 단순해지며 오류 검출 등 유지보수 용이
- 계층을 정의하기가 애매
- 마이크로 커널 구조 운영체제
- 커널에는 최소 기능만 포함시켜 크기를 대폭 줄여 커널의 기능을 많이 제외
- 기타 기능은 사용자 공간으로 옮겨 사용자 영역에서 수행하는 서버 구현 방법
- 커널은 하드웨어 초기화, 메모리 관리, 프로세스 관리, 프로세스 간 통신, 프로세스 간 협력을 하는 동기화 기능 등 기본 기능만 실행
- 사용자 영역의 서버에서 네트워크 시스템, 파일 시스템 상호작용과 장치 관리 등 대부분의 운영체제 구성 요소 제공
- 모듈화 정도가 높아 확장성, 이식성, 규모 확장성이 높지만, 모듈 간에 통신이 빈번하게 발생하여 성능 저하 가능성: 프로세스 간 통신 발생을 최소화시키는 것이 중요 과제
- 단일 구조 운영체제
- 운영체제의 서비스
day4
- 프로세스의 개념
- 프로그램
- 보통 디스크에 존재
- 컴파일한 코드, 초기화 전역변수, 문자열과 문자열 상수 등 정적 데이터를 포함하는 정적 개념
- 프로세스
- 실행 중인 프로그램
- 디스크에 있던 프로그램을 메모리에 적재하여 운영체제의 제어를 받는 상태가 됨
- 프로그램 카운터, 레지스터 내용을 포함하는 동적 개념
- 스택
- 데이터를 일시적으로 저장
- 지역변수, 반환 주소, 반환 값 등
- 힙
- 코드 영역과는 별도로 유지되는 자유 영역
- 수동으로 메모리 할당/해제
- 스택과 인접한 방향으로 커짐
- 스택 포인터와 힙 포인터가 만나면 메모리가 소진되었다는 의미
- 데이터
- 프로그램의 가상 주소 공간
- 전역번수, 정적변수 저장
- 코드
- 실행 명령을 포함하는 메모리 혹은 목적 파일에 있는 프로그램 영역
- 디스크에서 읽혀진 컴파일한 프로그램을 저장
- 읽기전용
- 프로그램
- 프로세스의 상태변화와 상태 정보
- 상태변화
- 생성, 비실행, 실행, 종료 (비실행 -> 실행: 디스패치, 실행 -> 비실행: 인터럽트)
- 생성, 준비, 실행, 대기, 종료 (준비 -> 실행: 디스패치, 실행 -> 준비: 타임아웃, 실행 -> 대기: 블락, 대기 -> 준비: 웨이크업)
- PCB
- 프로세스 상태 정보를 저장하는 프로세스 제어 블록
- 문맥교환 시 이전 PCB 저장, 현재 PCB 로드
- 상태변화
- 프로세스의 관리
- 계층형
- 생성, 종료, 제거
- 중단과 재시작
- 인터럽트 사용
- 시스템 부하를 조절하는데 용이
- 중단된 준비와 중단된 대기
- 프로세스의 개념
소프트웨어 악취를 제거하는 리팩토링
- 누락된 추상화
- 클래스나 인터페이스가 아닌 데이터 무리나 인코딩된 문자열을 사용
- "뚜렷한 개념적인 경계와 독자성 제공" 위반
- 명령 추상화
- 연산을 클래스로 사용 (클래스 내부에 정의된 메서드가 하나밖에 없는 클래스 형태)
- "도메인 사상(문제 도메인 -> 해법 도메인)" 위반
- 때로는 연산을 클래스로 변환하는 편이 바람직할 수도 있음
- 불완전한 추상화
- 추상화가 상호 보완적이거나 상호 연관된 메소드를 완벽하게 지원하지 못함 (add가 있으면 remove도...)
- "일관성과 완결성 보증" 위반
- 다면적인 추상화
- 추상화에 할당된 책임이 둘 이상
- "의미있는 단일 책임 할당" 위반
오늘 느낀점
학교에서 운영체제를 배웠는데, 하나도 기억이 안난다... 분명 A+를 받았었는데, 무슨 일이 일어난거지..
내일 할일
- 로또 4단계 피드백 요청
- 사다리 1단계 피드백 반영
- 플러터 1/4/7/14 앱 기능 설계