이전 게시글 GIT / GITHUB
https://hoozy.tistory.com/entry/GIT-GITHUB
카테고리 : 운영 체제
터미널이란
- 유닉스 기반의 대형 컴퓨터에서 사용자들이 컴퓨터에 접속하기 위해 사용했던 단말기로 요즘에는 컴퓨터를 직접 제어하기 위해 사용하는 소프트웨어이다.
- 익숙한 그래픽 기반의 GUI 보다 텍스트 기반의 CLI(명령어로 컴퓨터를 조작하는 방식)를 통해 터미널을 사용한다.
- 이유는 속도가 빠르고, 더 많은 명령과 스크립트에 접근할 수 있기 때문.
- 사용자가 컴퓨터에 명령어를 터미널에 입력하면, 쉘이 해당 명령어를 해석하고, 커널이 이를 실행하는 구조이다.
리눅스 터미널 기본 명령어
https://hoozy.tistory.com/manage/posts/
쉘이란
- 터미널을 사용하기 위한 소프트웨어 환경이다.
- 유닉스 쉘 종류
- sh : 초기의 유닉스 쉘.
- ksh : 콘 쉘 이라고도 불리며, sh를 확장하여 만듬
- csh : C언어를 기반으로 만든 쉘이다.
- bash : sh와 대부분 호환되며 요즘에 쓰이는 쉘이다.
- 리눅스와 Mac OS는 유닉스 커널을 사용해서 유닉스 쉘과 일치한다.
- 윈도우즈 쉘 종류
- cmd : Command의 준말로, 절차지향적 성격을 가지고 있으며 윈도우 NT 계열에서 만듬
- Power Shell : .NET Framework라는 객체를 사용하여 객체지향적 성격을 가지고 있으며, 모든 결과들이 객체로 표현된다.
커널이란
- 모든 OS는 커널을 가지고 있다.
- 커널은 OS계층이며 HW와 컴퓨터에서 돌아가는 프로그램들을 연결해주는 역할을 한다.
- OS의 핵심이며 컴퓨터를 부팅시키면 가장 먼저 메모리에 올라오고 컴퓨터가 꺼질 때까지 메모리에 상주하게 된다.
- 모든 어플리케이셔네세 인터페이스를 제공하며 HW를 컨트롤하고 프로세스들이 서로 정보를 주고 받는 것을 허락해준다.
POSIX 란
- 이식 가능한 운영 체제 인터페이스의 줄임말이며, 인터페이스 규격이기도 하다.
- UNIX(유닉스)의 API 규격이고, 이 규격을 따르면 유닉스와 직접적인 연관이 없어도 유닉스 호환 운영체제라고 부른다.
- 리눅스도 유닉스 호환 운영체제이다.
- 규격의 내용으로는 커널로의 C언어 인터페이스인 시스템 콜, 프로세스 환경, 파일과 디렉터리, 시스템 데이터베이스(암호파일 등), tar 압축 포맷 등 다양한 분야를 이룬다.
- 유닉스 계열이 아니지만 윈도우 NT는 POSIX 1.0에 준하는 POSIX 서브 시스템을 탑재하고 있다.
- 임베디드 리눅스는 유닉스와 유사한 POSIX 기반의 운영체제이며, POSIX 기반의 프로그램 개발이 가능하다.
- Mac OS 도 POSIX를 따른다.
운영 체제란
- OS라고 하며, 컴퓨터 시스템의 자원들을 효율적으로 관리하며, 사용자가 컴퓨터를 편리하고, 효과적으로 사용할 수 있도록 환경을 제공하는 여러 프로그램의 그룹이다.
- 사용자와 하드웨어 간의 인터페이스로서 동작하는 시스템 소프트웨어의 일종으로 다른 응용프로그램이 유용한 작업을 할 수 있도록 환경을 제공한다.
- 종류는 윈도우, Mac OS, 리눅스, 유닉스 등이 있다.
운영 체제의 기능
- 프로세서, 기억장치, 입출력 장치, 파일 및 정보 등의 관리
- 자원을 효율적으로 관리하기 위해 자원의 스케쥴링 기능 제공
- 사용자와 시스템 간의 편리한 인터페이스 제공
- 시스템의 각종 하드웨어와 네트워크를 관리 및 제어
- 데이터를 관리하고 데이터 및 자원의 공유 기능 제공
- 시스템의 오류를 검사 및 복구
- 자원 보호 기능 제공
- 입출력 보조 기능 제공
운영 체제의 목적
- 아래 4가지 기준은 운영 체제의 목적이면서 성능을 평가하는 기준이 된다.
- 처리능력 : 일정 시간 내에 시스템이 처리하는 일의 양
- 반환시간 : 시스템에 작업을 의뢰한 시간부터 처리가 완료될 때까지 걸린 시간
- 사용가능도 : 시스템을 사용할 필요가 있을 때 즉시 사용 가능한 정도
- 신뢰도 : 시스템이 주어진 문제를 정확하게 해결하는 정도
메모리 관리
- 어떤 프로그램이든 프로세스가 되어 프로세서에 적재되기 위해서는 메모리에 적재되어야 실행이 가능하다.
- 메모리는 중요한 작업 공간이고, 한정된 메모리를 다중 프로그래밍 환경에서 이용하기 위해서는 여러 프로세스가 함께 메모리를 사용하므로 효율적으로 관리해야한다.
- 이러한 메모리 관리를 위해 메모리 관리자가 존재하고, 메모리 관리 장치와 OS 관리 모듈과 함께 진행한다.
- 이때 몇가지 정책에 따라 메모리 관리를 진행한다.
- 적재 정책 : 디스크에서 메모리로 프로세스를 언제 가져와야 할지를 정하는 것
- 배치 정책 : 디스크에서 메모리로 가져온 프로세스를 어느 위치에 저장할 것인지 정하는 것
- 대치 정책 : 메모리가 충분하지 않을 때 현재 메모리에 적재된 프로세스 중 제거할 프로세스를 결정하는 방법
자바에서 JVM의 메모리 관리
메모리 주소, 메모리 매핑
- 논리적 주소 : 가상 주소라고도 하며, 프로그래머가 목적 코드가 저장된 공간과 프로그램에서 사용하는 배열, 구조체 등이 해당한다.
- 물리적 주소 : 논리적 주소에 대응되는 실제 주소로 메모리 칩이나 디스크 공간에서 만든다.
- 이때 논리적 주소와 물리적 주소 변환은 MMU에서 관리한다.
- MMU : CPU에서 논리적 주소를 받아 고정 분할, 동적 분할. 페이징, 세그멘테이션 등을 이용한 변환 방법을 통해 물리적 주소로 변환시켜 접근한다.
- 바인딩
- 호출부에는 함수가 저장된 메모리 값이 할당되고, 코드가 메모리에 저장된 후 프로그래머가 값을 변경할 수 없는 상태.
- 값들이 확정되어 구속(Bind)되어있는 상태
- 함수 호출된 부분에서 함수가 위치한 메모리 주소를 연결
- 정적 바인딩
- 실행시간 전에 일어나고, 실행중에 변하지 않는 상태로 유지되는 바인딩
- EX) int a; 컴파일할 때 메모리에 'a'라는 변수가 정수형으로 할당되므로 정적.
- 동적 바인딩
- 실행 시간중에 일어나거나 프로그램 실행과정에서 변경되는 것 (정적 바인딩한 변수들도 실행중에 변경되면 동적 바인딩이다.)
- EX) int a = 1; -> 실행시에 1로 값이 할당되므로 동적.
- 할당
- 기억장소 할당 : 변수에 메모리 공간을 바인딩하는 과정
- 정적 할당
- 메모리에 적재될 크기를 미리 아는 것
- 런타임에 각 타임에 맞는 메모리 영역(세그먼트)에 할당
- 동적 할당
- 외부 환경에 의해 변화하여 크기를 미리 알 수 없는 것
- 명시적인 명령어에 의해 실행되는 할당
- 힙영역에 할당된다.
- 포인터나 참조 변수를 통해 접근이 가능하다.
- 바인딩 타임
- 프로그램에서 변수들이 갖는 속성이나 값이 완전히 결정되는 시간. -> 이름에 속성이 연결되는 시간
- 종류
- 컴파일 시간
- 프로세스가 메모리에 적재될 위치를 컴파일 과정에서 알 수 있다면 바로 물리적 주소를 생성할 수 있다.
- 원시 프로그램을 번역할 때 이루어지며, Data, Stack 등 메모리에 들어갈 변수가 정해짐
- 정적 바인딩, 변수의 이름 또는 형과 프로그램 문장 구조
- 고레벨 언어를 Binary File, Obj 파일로 전환 -> 이때 코드가 문법에 맞는지 검사 (Parsing)
- 적재 시간
- 프로세스를 어디에 적재해야 할 지 컴파일 과정에서 알려주지 않으면 컴파일러는 대체 가능한 상대 주소를 생성한다.
- 변수를 메모리로 적재할 때 (상대 주소가 결정됨) 운영 체제에서 메모리로 프로그램을 불러와 실행
- 실행 시간
- 한 프로세스가 동일한 장소에서 작동한다면 적재 시간 과정에서 바인딩 할 수 있지만, 프로세스를 실행하는 도중에 메모리의 한 세그먼트에서 다른 세그먼트로 이동한다면 바인딩은 수행 시간까지 지연된다.
- 프로그램을 실행할 때 이루어지며 변수의 값을 확정
- 변수의 기억장소 할당
- 실행부터 종료까지 변수값을 바인딩
- 컴파일 시간
- 링커
- 모든 오브젝트 파일들을 하나의 오브젝트 파일로 합친다. (Executable File로 합친다.)
- 로더
- Executable File을 읽는다.
- 메인 메모리에 오브젝트 파이에 있는 내용들을 올리고, context들을 만들고 프로그램을 수행시킬 수 있도록 만든다.
- OS의 한 부분이다.
- 연속 메모리 할당 방법
- 연속 메모리 할당 : 메모리에 프로세스를 적재할 때 연속적으로 적재하는 방법
- 고정 분할 방법
- 사용자가 쓸 수 있는 메모리의 범위 내에서 특정 크기로 잘라 분할된 메모리를 만드는 것
- 이때 각 부분마다 분할된 시작 주소가 생성되고 각 분할에는 하나의 프로세스만 포함되게 된다.
- 분할 기준 레지스터 값 + 논리적 주소 값으로 생성하는데 이때 논리적 주소가 분할된 메모리보다 크면 오류가 발생하고 작으면 내부 단편화가 발생한다.
- EX) 분할 기준 레지스터 값이 100이고, 분할 메모리 주소가 100
200, 논리적 주소가 0101 이면 100201까지 참조하기에 크기가 커져서 오류가 발생한다. 만약 논리적 주소가 050이면 100150까지 참조하기에 151200까지 빈공간이 되어서 내부 단편화가 일어난다. - 이때 고정 분할에서 하나의 분할에는 하나의 프로세스만 오기에 내부 단편화가 일어나면 그 메모리는 프로세스가 종료하기 전까지 쓸 수 없게 된다.
- 가변 분할 방법
- 각 프로세스가 필요한 만큼만 메모리를 할당하는 방법
- 이때 기준 레지스터와 경계 레지스터를 사용하여 각 프로세스의 분할 영역을 나타낼 수 있게되고, 프로세스로 생성한 논리적 주소가 경계 레지스터 값보다 커지면 오류가 발생한다.
- 하지만, 가변 분할 방법을 이용하면 프로세스가 계속해서 적재되고 빠져나감에 따라 외부 단편화가 발생하게 된다.
- 따라서 프로세스를 어디 메모리 부분에 적재해야 할 지 고민해야하며 아래의 방법들이 존재한다.
- 최초 적합 방법
- 메모리를 탐색하다가 프로세스가 들어갈 수 있는 첫 번째 공간에 할당하는 것이다.
- 장점 : 빠르게 프로세스를 적재할 수 있다.
- 단점 : 공간 활용률이 떨어지게 된다.
- 최적 적합 방법
- 메모리 공간 중 프로세스가 들어갈 수 있는 가장 작은 공간에 할당하는 방법
- 장점 : 사용 공간 이용률이 좋아짐
- 단점 : 사용 가능 공간이 크기순으로 정렬되어 있지 않으면 전체를 검색해야하고 정렬을 계속해야한다.
- 최악 적합 방법
- 프로세스를 메모리 공간 중 가장 큰 곳에 배치한다.
- 장점 : 가장 큰 공가네 메모리를 할당하기에 가장 작은 공간을 만들어 사용하는 것보다 유리하다.
- 단점 : 공간을 크기 순으로 정렬해야 한다.
다음 게시글 운영 체제 2
https://hoozy.tistory.com/entry/%EB%B0%B1%EC%97%94%EB%93%9C-%EC%9A%B4%EC%98%81-%EC%B2%B4%EC%A0%9C-2
참고 자료
https://inpa.tistory.com/entry/%EB%B0%B1%EC%97%94%EB%93%9C-%EB%A1%9C%EB%93%9C%EB%A7%B5-%F0%9F%92%BB-%ED%84%B0%EB%AF%B8%EB%84%90%EC%9D%B4%EB%9E%80
https://i5i5.tistory.com/578
https://computer-science-student.tistory.com/384
https://www.crocus.co.kr/1376
'CS > 운영 체제' 카테고리의 다른 글
[백엔드] 리눅스 터미널 명령어 (0) | 2023.03.31 |
---|---|
[백엔드] 스레드 (0) | 2023.03.30 |
[백엔드] JVM 메모리 관리 (0) | 2023.03.30 |
[백엔드] 운영 체제 2 (0) | 2023.03.30 |
댓글