728x90

1970년대 운영체제: 제대로된 운영체제의 등장 - UNIX OS


배경: UNIX OS의등장

UNIX OS란?

  • 미국 AT&T사의 벨 연구소에서 켄톰슨, 데니스리치(C언어의 창시자)에 의해 제작
  • 시분할시스템, 멀티태스킹, 멀티 프로그래밍등의 기술이 들어간 최초의 OS
  • 다중사용자 지원 가능
  • 현대 운영체제의 기본기술을 모두 포함한 OS

+)C언어가 필요했던 이유

-기존에 Assembly언어로 소프트웨어 개발이 이루어졌는데 c언어의 등장으로 인해 컴파일러가 있어 다시 작성할 필요가 없었으며, 어셈블리언어에 비해 프로그래밍 복잡도가 낮아 c언어로 개발을 하게 되었다.

 

1980년대 운영체제: 개인용 컴퓨터의 등장


배경: 개인용 컴퓨터 시대

-1980년대 이전: 대형 컴퓨터를 여러명이 접속해서 사용(UNIX)

-1980년대 이후: Personal Computer(pc)의 등장

 

CLI와 GUI

-CLI(Command Line Interface): 터미널환경 -> 쉽게 말해 키보드로만 이루어진 인터페이스

-GUI(Graphical User Interface): GUI환경 -> 쉽게 말해 마우스까지 사용가능한 인터페이스

--> 1980년대 초반까지 CLI환경이 주도했다면 중후반부터는 GUI환경의 OS가 점차 확장되기 시작했다. 

 

정리


1970년대: UNIX OS의 등장

1980년대: GUI환경의 OS 확장 및 개인용 컴퓨터의 등장

728x90
728x90

1950년대 운영체제


배경: 첫번째 컴퓨터라고 불리는 ENIAC이 등장

-당시 운영체제는 없었음

-애니악은 1개의 응용프로그램을 실행시키기도 바밨기 때문에 애초에 기능이 필요없었음

-응용프로그램이 직접 시스템 자원을 제어함

 

1960년대 초반


배경: 50년대보다 더나아가 여러개의 응용프로그램을 실행시켜주길 원함 --> 배치처리 시스템의 출현

배치처리 시스템(batch processing system)이란?

-여러 응용 프로그램을 등록시켜놓으면, 시스템상 순차적으로 처리하는 시스템

-이를 기반으로 운영체제가 출현함

ex. 프로그램1: 12시간, 프로그램2: 30분의 실행시간이 소요되는 두가지 프로그램이 있을때

배치 처리 시스템은 순차적으로 프로그램1 -> 프로그램2를 실행시킨다.

 

 

1960년대 후반


배경: 여러명의 사용자에게 프로그램을 제공하길 원함 --> 시분할시스템/ 멀티태스킹 출현

시분할시스템(Time Sharing System)이란?

-응용 프로그램이 CPU를 사용하는 시간을 잘개 쪼개서, 여러개의 응용 프로그램을 동시에 실행시키는 기법

-다중 사용자를 지원할때 중요한것은 응답시간을 줄이는것인데, 때문에 시분할시스템이 출현한것

 

멀티태스킹(Multi Tasking)이란?

-단일 CPU에서 여러 응용 프로그램의 병렬 실행을 가능케 하는 시스템 (ex. flipbook)

-보통, 시분할 시스템 = 멀티태스킹이라 생각할정도로 유사한 개념이라고 생각하면됨

+)멀티 프로그래밍: 시간을 짧게 쓰는것은 유사하지만 초점은 최대한 CPU를 시간대비 많이 활용하도록 하는 시스템 --> 배치 처리 시스템의 단점을 보완할수 있음

+)위와 같은 개념이 등장한것이지 이때까지 아직 기술로 구현은 안된상태임

 

ex. 프로그램1: 1시간(이중 30분은 CPU사용X 저장매체에서 데이터를 가져오는데 사용), 프로그램2: 30분의 실행시간이 소요되는 두가지 프로그램이 있을때

배치 파일 시스템의경우 프로그램2를 실행하기 위해서는 프로그램1의 1시간을 모두 지나고 실행하게됨

하지만 시분할 시스템은 프로그램1이 처음10분 실행후 30분동안 저장매체에서 데이터를 가져오는데 사용될때 CPU사용을 안하므로 10분이 지나고 바로 실행할수 있음

+) 멀티프로그래밍의 개념이 적용되어 시간을 더욱 잘개 쪼갤경우 프로그램1이 자리를 비웠을때 프로그램3이 있다면 프로그램2,3이 서로 잘개 쪼개진 시간동안 프로그램을 마치 동시에 실행하는 것처럼 번갈아가며 CPU를 사용하게 됨.

 

정리


1950년대: ENIAC컴퓨터의 등장, 운영체제 없음 -> 응용프로그램이 시스템 자원을 직접 관리하기때문

1960년대 초반: 배치처리 시스템의 출현 - 여러 응용프로그램을 순차적으로 실행하는 시스템

1960년대 후반: 시분할시스템/ 멀티태스킹의 출현 - 마치 동시에 응용프로그램을 실행하는 것처러 CPU 사용시간을 잘개 쪼개어 여러 응용프로그램을 번갈아 가며 실행시키는것 -> 다중사용자 지원에 적합

 

배치 처리시스템의 단점

-컴퓨터 응답시간이 오래걸릴 수 있다.(앞단에 실행시간이 많이 필요로 하는 응용프로그램이 실행될경우)

-실행시간도 오래걸릴수 있다.(CPU가 필요없음에도 응용프로그램이 CPU를 점유할수 있기 때문)

--> 위의 단점을 해결하기 위해 등장한것이 시분할시스템/멀티태스킹(멀티프로그래밍)이다.

728x90
728x90

1. 운영체제는 시스템 자원(Operating Resource)관리자라고 불리운다.

시스템 자원 = 컴퓨터 하드웨어이며, 하드웨어에는

  • CPU(중앙처리장치)
  • Memory(DRAM,RAM)
  • I/O(입출력장치- 모니터, 키보드, 마우스)
  • 저장매체(SSD, HDD)

컴퓨터 하드웨어는 스스로 할수 있는것이 없다.

  • CPU: 각프로그램이 얼마나 CPU를 사용할지 스스로 결정 X
  • Memory: 프로그램이 어느 주소에 저장되어야 하는지, 어느 정도의 메모리 공간을 확보해야 하는지 스스로 결정 X
  • 저장매체: 어떻게, 어디에 저장할지 스스로 결정 X
  • 키보드/미우스: 스스로 표시할수 없음

대표적인 운영체제 - windowOS, MacOS, UNIX

현재 대중적으로 많이쓰이는것은 window, mac이지만 개발자라면 UNIX에 대해 기본상식이라 할만큰 알아야한다.

UNIX와 사용법이나 OS구조가 유사한OS는 대표적으로 LINUX가 있다.

 

2. 사용자와 컴퓨터간의 커뮤니케이션지원

가령, 운영체제가 깔려있지 않은 노트북을 실행한다고 했을때 노트북은 애초에 실행자체가 되지 않는다. 각각의 하드웨어들에 명령을 내려 동작을시키고 사용자가 컴퓨터를 이용할수 있는 인터페이스를 제공해줘야할 운영체제가 없다는 이모든것은 불가능하다.

 

3. 응용프로그램 관리

응용프로그램이란?

프로그램= 소프트웨어 = 운영체제, 응용프로그램(엑셀, 파워포인트, 개발자가 만든 프로그램등)

응용프로그램 = application(일반 pc에서의 프로그램) = app(스마트폰에서의 프로그램)

 

운영체제와 응용프로그램간의 관계 -> 운영체제는 응용프로그램을 관리한다.

  • 운영체제는 응용프로그램을 실행시킨다.
  • 운영체제는 응용프로그램의 권한을 관리해준다. (ex. 관리자 권한 실행)
  • 운영체제는 응용프로그램을 사용하는 사용자를 관리해준다. (ex. 로그인)

ex) 응용프로그램은 누구나 만들수 있기때문에 문제가 생겼음을 예시로듭니다.

-응용프로그램을 잘못 작성해서, 프로그램이 다운할 경우 운영체제는 모든 파일 삭제막기를 실행한다.

-응용프로그램이 CPU를 너무 많이 사용할경우, 운영체제는 이를 효율적으로 조절해준다.

 

운영체제의 역할 정리


- 운영체제는 응용프로그램을 관리한다.

- 운영체제는 시스템자원(하드웨어)를 관리한다.

- 운영체제는 사용자와 컴퓨터간의 커뮤니케이션을 지원한다.(인터페이스)

-->운영체제의 목표: 사용자가 사용하는 응용 프로그램이 효율적으로, 적절하게 동작하도록 지원

-->운영체제는 응용 프로그램이 요청하는 시스템 리소스를 효율적으로 분배하고, 지원하는 소프트웨어

 

+) 운영체제는 저장매체에 저장되며, 컴퓨터를 킬경우, memory에 올라가게 된다.

728x90
728x90

학교 운영체제 과목을 수강하며 진행했던 nachos os 설치및 컴파일 과정입니다. 프로젝트 진행당시 제대로된 레퍼런스가 없어 고생한 기억이 있어 참고용으로 업로드하였습니다.

1) ThreadedKernel, UserProgKernel class는 어떤 관련이 있는가? (코드 분석 설명)

ThreadedKernel
UserProgKernel

-> c++에서

..

class 클래스명 {

// ..

}

class (상속받을)클래스명 : 접근제한자 (상속할) 클래스명 {

// ..

}

..
이러한 구조를 띠는 것은 상속(Inheritance)을 의미합니다.  상속이란 한 클래스가 다른 클래스에서 정의된 속성(자료,함수)를 이어받아 그대로 사용하는 것이며, 이미 정의된 클래스를 바탕으로 필요한 기능을 추가하여 정의할 수 있는 것입니다. UserProgKernel함수와 ThreadedKernel함수는

이러한 구조를 가지고 있기 때문에 UserProgKernel이 상속받는 관계로써 상속받는 UserProgkernel은 자식, ThreadedKernel은 부모의 관계입니다. 즉 객체지향의 상속 관계에서 보았을 때 is a 관계라고 할 수 있다.

그림으로 표현한다면 다음과 같습니다.

2) thread/nachos, userprog/nachos 두 실행 파일을 실행할 때의 main 함수가 수행하는 작업의 차이점은 무엇인가? (main.h, main.cc)

main.cc
main.h

우선 main.h에서 표시한 부분을 분석해보자면

1. 첫 줄의 #ifdef만약 ~가 정의되어 있다면 실행하는 것을 뜻하며 if문과는 달리 이 값이 True인지 False인지 상관하지 않습니다. 그렇기 때문에

2-1. USER_PROGRAM이 정의되어 있다면 아래의 코드를 실행합니다.

- #define은 메크로 함수이다. 메크로 함수란 함수처럼 인자를 설정할 수 있는 매크로를 의미합니다형식은 [#define (메크로 함수 이름) (메크로 함수 기능)]으로 작성한다.

-, userprog/nachos main.h에서 KernelType UserProgKernel로 정의된다.

2-2. 만약 - USER_PROGRAM이 정의되어 있지 않다면 아래의 코드를 실행합니다.

-, thread/nachos main.h에서 KernelType ThreadedKernel로 정의가 된다.

 

3. main.cc의 표시한 부분을 보면 Kernel KernelType에 따라서 객체가 생성되고,

각각 KernelType에 따라서 Initialize, Run, SelfTest 함수를 실행하는 것을 알 수 있다. 이는 각각의 thread/nachos userprog/nachos의 세 함수의 내용이 KernelType에 의해 서로 다른 실행 결과를 나타내는 것을 의미한다.

-, 2-1일 경우 (USER_PROGRAM이 정의되어 있다면) main.cc에서 UserProgKernel class의 멤버함수들이 수행되고, 2-2일경우 (USER_PROGRAM이 정의되어 있지 않다면) main.cc에서 ThreadedKernel class의 멤버함수들이 수행된다.

 

3. 고찰

사실 학교 팀프로젝트 과제로 nachos설치를 받았을땐 별로 어려운 과정이 아닐꺼라 생각하고 있었지만 정말 3일동안 밤을 새며 진행한 기억이있다. 애초에 낯설기만 했던 우분투환경에서 익숙치 않은 c++을 다뤄보게 되었고 난생 처음보는 에러들이 눈앞에 뜰때마다 스트레스를 장난아니게 받았다. 사실 nachos자체를 컴파일하는 과정은 운영체제 학습에 도움이 되었나?라는 질문을 던진다면 그렇지 않다라고 말할것 같다. 하지만 이프로젝트에서 얻은 것은 소프트웨어 상에서 문제가 생겼을때 이것을 해결하는 능력에 대한 소양을 기를 수 있다는 점에 있다. 낯선 언어에 대한 마음의 장벽을 허물수 있었고 에러에 대한 스트레스를 받는것이 아닌 해결할수 있다는 자신감을 키워준 프로젝트 였다. 또한 어려움을극복 해냈을때 거기서 멈추는게 아닌 문제 해결방법을 공유하는 것에 대해 중요함을 느끼게 된 계기가 되었다.

728x90
728x90

학교 운영체제 과목을 수강하며 진행했던 nachos os 설치및 컴파일 과정입니다. 프로젝트 진행당시 제대로된 레퍼런스가 없어 고생한 기억이 있어 참고용으로 업로드하였습니다.

1. Nachos 설치 과정

# tar xzvf nachos-4.0.tar.gz

~ 위치에서(중요) 압축해제 기존에 작업 하던 / 위치에서 나초스 설치시 계속된 오류가 떠서 ~ 위치에서 작업을 하니 오류가 해결되었다. 이유는 아무래도 크로스 컴파일러 적용이나 configure할 때 문제였던 것 같다.

# ln -s ports/x86.linux Makefile.dep

x86플랫폼 의존성 파일을 Makefile.dep로 심볼릭 링크로 만들어줌

# make depend

# make -i LANGUAGE=c

threads디렉터리에서 make depend, make -i LANGUAGE=c 명령어를 차례로 시행 후 nachos파일이 생성됨을 확인

2. Nachos test application 컴파일 및 실행결과

code/bin 디렉터리에서 make실행후 coff2noff파일 생성됨을 확인(cross compile시에 coff형식으로 생성된 실행파일을 nachos에서 지원하는 noff형식으로 바꾸어주는 프로그램)

make depend, make -I LANGUAGE=c명령어로 nachos파일이 userprog디렉터리에 생성됨을 확인

 

728x90
728x90

학교 운영체제 과목을 수강하며 진행했던 nachos os 설치및 컴파일 과정입니다. 프로젝트 진행당시 제대로된 레퍼런스가 없어 고생한 기억이 있어 참고용으로 업로드하였습니다.

1. 작업환경

-컴퓨터 환경

 

-리눅스 환경

우분투 버전은 https://releases.ubuntu.com/14.04/ 링크에서 14.04 32bit용 데스크탑 이미지를 다운받아 사용하였다.

2. cross-compiler란?

크로스 컴파일러(cross compiler)는 컴파일러가 실행되는 플랫폼이 아닌 다른 플랫폼에서 실행 가능한 코드를 생성할 수 있는 컴파일러이다. 크로스 컴파일러 툴은 임베디드 시스템 혹은 여러 플랫폼에서 실행파일을 생성하는데 사용된다. 이것은 운영 체제를 지원하지 않는 마이크로 컨트롤러와 같이 컴파일이 실현 불가능한 플랫폼에 컴파일하는데 사용된다. , 컴파일이 불가능한 곳에서 컴파일하여 실행파일을 생성하는 데 사용하기 위한 것으로 정의할 수 있다. 이것은 시스템이 사용하는데 하나 이상의 플랫폼을 쓰는 반가상화에 이 도구를 사용하는 것이 더 일반적이게 되었다. 아래는 cross컴파일러와 일반적으로 사용되는 Native컴파일러의 차이점에 관한 표이다.

종류 차이점
Native(네티이브) 컴파일러 동일한 환경에서 동작되는 컴파일러로 이로 인해 생성되는 실행 파일을 동일한 환경에서 수행할 수 있음.
cross(크로스) 컴파일러 컴파일러가 동작하는 시스템과 컴파일러에 의해 생성된 실행 파일이 동작하는 시스템이 다른 것

3-1) cross컴파일러와 Native컴파일러의 차이점

3.  cross-compiler설치

binutils설치
gcc구버전 설치

Nachos os는 오래된 os로써 컴파일간 에러가 많이 떳으므로 binutils gcc를 구버전을 구글 검색을 통해 다운받았다. (우분투 웹에서 직접 다운)

# sudo passwd root

#su

nachos설치 진행간 사용권한이 필요하므로 초기 루트계정 패스워드 설정 및 root사용자 전환을 해준다.

 

# apt-get upgrade

개발환경을 최신상태로 업그레이드 해준다.

# g++ -v

# apt-get install g++

g++ 버전 확인후 설치가 안됨을 인지하고 g++ 설치하였다.

# apt-get install csh

추후 Makefile 파일에서 csh을 이용하여 명령어를 주는 경우가 있기 때문에 설치하였다.

#tar xzvf binitils-2.11.2.tar.gz

#tar xzvf gcc-3.0.1.tar.gz

/ 위치에서 tar파일의 압축을 해제한다.

Binutils-2.11.2디렉터리로 이동 후,

# ./configure --prefix=/usr/local --target=decstation-ultrix

binutils가 설치될 위치를 지정해준다.

# make

# make install

# mkdir gcc-build

gcc-build 디렉터리 생성 후 이동

# ../gcc-3.0.1/configure --target=decstation-ultrix --with-gnu-as --with-gnu-ld --prefix /usr/local --with-local-prefix=/usr/local --enable-languages=c

거짓 libgcc.alibgcc2.a를 만들어 make시의 에러를 방지

# make -i LANGUAGE=c

# make -I install LANGUAGE=c

make오류가 뜨는걸 방지하기 위해 make -i LANGUAGE=c / make -I install LANGUAGE=c를통해 해결

 

nachos를 정상적으로 구동하기 위한 cross-complier설치과 완료되었다.

728x90
728x90

학교 운영체제 과목을 수강하며 진행했던 nachos os 설치및 컴파일 과정입니다. 프로젝트 진행당시 제대로된 레퍼런스가 없어 고생한 기억이 있어 참고용으로 업로드하였습니다.

1. Nachos란?

U.C.Berkeley대학의 Tom Anderson 교수가 운영체제 실습을 위해 만든 Operating System이다. Nachos와 운영체제의 차이점을 살펴보자면 운영체제는 기본적으로 컴퓨터의 하드웨어를 제어하고 응용소프트웨어를 위한 기반 환경을 제공하여, 사용자가 컴퓨터를 사용할 수 있도록 중재하는 프로그램이다. Nachos는 운영체제와는 달리 하드웨어 위에서 하드웨어를 직접 제어하는 OS가 아니라 HOST OS위에 작동하는 가상의 OS이며, MIPS machine을 가상으로 시뮬레이션하여 이 가상으로 작동하고 있는 MIPS 머신 위에서 커널로서 작동하게 된다.

종류 차이점 공통점
Nachos 유닉스나 리눅스의 응용프로그램의 형태, MIPS 또는 I386 machine 등의 하드웨어 위에서 구동된다. 인터럽트, 가상메모리, 입출력장치사용가능
실제 운영체제 하드웨어 기반에서 동작한다

Nachos의 경우 운영 체제 시뮬레이터는 단순히 Bochs/VMware와 유사한 다른 OS(호스트 OS) 위에 OS(게스트 OS)를 실행할 수 있다는 것을 의미한다다음에 대한 에뮬레이션 기능을 제공한다.

·         CPU(MIPS CPU)

·         하드 드라이브

·         인터럽트 컨트롤러, 타이머 및 misc. 기타 구성 요소

 

Nachos MIPS또는 i386 machine 등의 하드웨어 위에서 real OS로 사용할 수 있을 정도 수준이어서 실제 운영체제가 하는 것처럼 인터럽트, 가상메모리, 입출력장치 등을 시뮬레이션 할 수 있다. 교육 목적으로 만들어 진 것으로 소스 코드를 이해하는 것이 비교적 용의하며 kernel의 내부가 단순하고 체계적이므로 기본 os기능을 이해하기가 쉽다.

 

프로젝트 실습시에는 debugging이나 test의 편의를 위해 Nachos를 실제 하드웨어위에 동작 시키지 않고 LinuxSolaris등의 다른 운영 체제에서 하나의 응용 프로그램을 실행시킨다. 그래서 일반 응용 프로그램을 debugging하는 것과 마찬가지로 GDB 등을 그대로 사용할 수 있다. 이럴 경우에는 하드웨어를 대신할 수 있는 시뮬레이터를 사용하게 되며 일반적으로 Nachos MIPS 시뮬레이터 코드도 함께 포함하고 있어 Nachos 커널과 MIPS 시뮬레이터를 하나의 프로그램으로 링크하여 사용한다. Nachos C++로 만들어졌으며 코드를 이해하고 수정하기 위해서 C++언어를 알아야 한다.

OS 커널의 다양한 시스템 호출에 대한 함수는 일반적으로 UNIX 시스템 호출과 유사한 방식으로 구현된다. 다양한 부분에서 운영 체제의 native코드를 사용하여 개체로 instance화 된다. 예를 들어 클래스 Machine은 파일 시스템, 프로세서, 타이머, 등 다양한 하드웨어 측면을 시뮬레이션하기 위해 정의되는 다양한 개체를 포함한다.

Nachos를 컴파일하기 위해서는 gcc가 필요하며, Nachos가 수행시키는 응용 프로그램이 MIPS코드로 컴파일 되어 있어야 하므로 cross-compiler가 필요하다. 따라서 Nachos compile 하고 cross-compiler를 설치한 후, 응용프로그램을 MIPS binary code로 만들어 Nachos에서 수행시킨다.

 

더 많은 내용은 Nachos공식사이트(https://homes.cs.washington.edu/~tom/nachos/)에서 찾아볼 수 있다.

2. Nachos의 역사

Nachos 1992년 처음 개발되었을 때에는 C++로 만들어졌지만, 이식성 문제로 적극적으로 사용되지 않고 있었다. 2000UC Berkeley Dan Hennta JAVA로 다시 작성하여 학생들이 더 쉽게 Nachos를 사용할 수 있도록 만든 Nachos 5.0j 버전이 업데이트 되었다. 이는 JVM을 사용하여 쓰레드를 돌리는 것으로 확인되었다.

3. Nachos의 구조

그림2-1) Nachos의 구성
그림2-2) Nachos의 실행구조

그림2-1Nachos의 구조를 나타내고 있다.  Nachos HOST OS위에서 작동하는 가상의 OS이다. MIPS머신을 가상으로 시뮬레이션 하며 이 가상으로 작동하고 있는 MIPS머신위에서 커널로서 작동하게 됨을 알 수 있다.

4. Nachos의 구성요소

Nachos Machine 3가지로 구성된다. 이는 레지스터, 물리적 메모리, 가상메모리이다.

- 레지스터: 프로세서에 위치한 고속 메모리로 극히 소량의 데이터나 처리 중인 중간 결과와도 같은 프로세서가 바로 사용할 수 있는 데이터를 담고 있는 영역을 말한다. Nachos에서는 40개의 레지스터로 이루어진 하나의 array는 스택 포인터, 더블 레지스터, 프로그램 카운터, 넥스트 프로그램 카운터, 레지스터 타겟 등으로 이루어져 있다. 이 레지스터는 0~39의 번호가 할당되어 있다.


-
메인 메모리: Random Access Memory (랜덤 액세스 메모리)또는 RAM이라고 한다. 이것은 중앙 처리 장치 (CPU)가 작업을 수행하는 데 필요할 때 빠르고 직접 액세스 할 수 있도록 운영 체제 소프트웨어, 소프트웨어 응용 프로그램 및 기타 정보를 저장하는 컴퓨터의 일부이다.  Nachos에서 메모리는 바이트 단위의 주소를 가지며, 128바이트의 페이지들로 구성되어 있다. 이것은 디스크 섹터와 같은 크기이다. 메모리는 물리적인 주소를 메모리 주소로 엑세스 할 수 있게 한다. 기본적으로 Nachos Machine 31페이지의 물리적 메모리를 갖는다.

 

- 가상메모리: 가상 메모리는 메모리를 관리하는 방법의 하나로, 각 프로그램에 실제 메모리 주소가 아닌 가상의 메모리 주소를 주는 방식을 말한다. 이러한 방식은 멀티태스킹 운영 체제에서 흔히 사용되며, 실제 주기억장치(RAM)보다 큰 메모리 영역을 제공하는 방법으로 사용된다. Nachos single linear page나 소프트웨어로 관리되는 TLB 등으로 통해 가상메모리를 지원한다. 이러한 선택은 TLB Page Table 변수를 초기화 하는 것에 영향을 끼친다.

 

 

728x90

+ Recent posts