ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 운영체제 01
    쾌락없는 책임 (공부)/운영체제 2021. 4. 9. 10:23
    반응형

    본 포스트는 '신용현'교수님의 운영체제 강의를 듣고

    이해, 정리한 내용들을 올린 포스트입니다.

    - 강의자료는 올리지 않습니다.


    <캐싱>

     현재 컴퓨터는 프로그램을 돌릴때 저장장치, 메모리, CPU, 레지스터가 서로 데이터를 주고 받으면서 작동하고 있습니다. 여기서 캐싱이란 엑세스 속도를 위해서 데이터를 속도가 빠른 저장장치로 이동시키는 것으로 여러 레벨(여러 저장장치)에서 이루어지게 됩니다. 빠른 저장장치는 CPU에 있으니 CPU가 일을 잘 하기 위해서 필요한 작업이라고 볼 수 있습니다.

     ( 같은 데이터를 여러번 읽을 확률이 높으니 앞으로 있을 요청도 빠르게 처리할 수 있습니다 )

     

     캐싱을 하면 일단 자신의 로컬에 데이터가 있는지 확인합니다. 있다면 바로 사용하면 되는 것이고 없으면 가져와서 로컬 캐시에 카피를 하게 됩니다. (복사를 하는게 더 빠릅니다) 대신 캐시의 크기가 한정되어 있으니 전부 복사할 수 없습니다. 때문에 복사된걸 대체하는 대체 알고리즘이 요구됩니다.

     

     

    데이터 캐싱하기

     데이터를 정확하게 전달하는것이 중요한데 복사 과정에서 데이터 불일치 문제가 발생할 수 있습니다.

     멀티프로세서의 경우 한 CPU의 캐시 데이터가 변경되면 다른 CPU도 동기화를 해줍니다. 이때 동기화하는건 가장 최신 값으로 변경하는 것입니다.

     

     

    <OS의 구조>

    CPU는 Time Sharing을 통해서 여러 프로그램을 동시에 작동하는 것처럼 보여주게 됩니다. 동시에 하는것처럼 보이지만 실제로는 아주 빠른 속도로 번갈아가면서 프로그램들을 변경하고 있습니다. (이 방법은 유닉스가 많이 사용한다고 합니다)

     - 이세돌이 초등학생들 16명이랑 바둑두는것과 비슷 (이세돌 : CPU, 초등학생 : 프로그램)

     

     OS는 event driven으로 이벤트가 있기 전까지는 작동하지 않고 기다리고 있습니다. 그리고 이벤트가 발생하면 다 처리해주는 좋은 친구라 할 수 있습니다.

     

     또한 OS는 2개의 모드를 유저모드/커널모드를 가지고 잇으며 유저모드는 사용자 어플을 조작하고 커널 모드는 OS가 수행하는 모드라고 생각하면 됩니다.

     

     - 커널모드 : 일반 사용자가 접근할 수 없습니다, 시스템 콜 같은걸 합니다.

     

     - 각 보드를 상징하는 비트는 유저모드가 1, 커널 모드가 0입니다.

     

     

    <OS 가 하는 일들>

    1. 프로세스 관리

     프로세스는 '프로그램이 수행하는 것'으로 많은 리소스들을 요구하게 됩니다. 이런 프로세스를 관리하는 차원에서 운영체제가 CPU 스케쥴링, 프로세스 동기화, 데드락 처리 등을 하고 있습니다.

     

    * 데드락(교착상태) : 서로 원하는 리소스가 상대방에게 할당되어 서로 기다리기만 하는 등의 상태

     

    2. 메모리 관리

     메모리의 어느 부분(물리적으로)을 사용하는지, 어떤 것을 삭제하는지, 메모리 공간을 얼마나 할당할지 등을 OS 가 해줍니다. 이 과정은 OS가 '가상의 메모리'가 있다고 생각하고 프로그램이 한 메모리에 잇는 것처럼 가정하고 작동하게 됩니다.

     - 실제 물리 주소 순서는 다를 수 있습니다.

     - 가상화 덕분에 장치들의 구체적인 구조를 몰라도 사용이 가능합니다.

     

    3. 저장공간 관리

    파일들을 디렉토리에 저장해주고 OS의 일부로 사용자에게 파일 시스템을 보여줍니다. 윈도우의 탐색기, 맥의 Finder를 생각하면 됩니다.

     (OS의 관리 속도보다 저장장치 자체의 스펙이 더 속도에 영향을 미칩니다)

     

    4. I/O Subsystem

    또 운영체제는 각 장치들의 역할을 관리해 유저 편의성을 증가시켜줍니다.

     각 디스크의 경우 드라이버들이 해결해 줍니다 (Buffering, Cashing, Spooling)

     

    5. 그 외 특별한 경우

    5-1. 리얼타임 시스템

     - 군사,의료적인 시스템이 이에 해당하게 됩니다.

     - 응답 시간이 얼마나 빠른지(Deadline)가 아주 중요하며 이 빠른 정도는 시스템에 빠라 다릅니다 (Hard / Soft = 군사 시설 / 그냥 키보드)

     

    5-2. 멀티미디어 시스템

     - 동영상 재생기 같은거

     

    5-3. 모바일 시스템

     - 모바일 환경에 맞게 OS 제작

     

     

    <Virtual System>

     원래 운영체제는 한개만 쓸 수 있으나 여러 운영체제를 쓸 수 있는것처럼 보이게 할 수 있다. 흔히 보는 PC에서 모바일 기기를 작동시키는게 이런 가상 머신이라고 할 수 있습니다.

     

    + 부팅시 운영체제를 지정하는건 가상머신이라고 보기 힘들다!

     

     

     

    <OS 가 제공하는 것들>

    1. 사용자에게

     - CLI, GUI 같은 UI를 제공해줍니다. (CLI는 이전 도스 시절을 생각하면 될 것 같습니다)

     - 입출력 장치를 제어할 수 있게 해줍니다. (키보드, 마우스 ,모니터)

     - 각 프로그램들을 수행하고 종료하는 역할을 합니다.

     - 파일 관리 시스템 제공

     - 프로세스간 정보 공유

     - 에러 탐지  (이걸 탐지해서 자체 조정하거나 사용자에게 알려준다)

     

    2. 시스템의 입장에서는

     - 리소스를 할당해 메모리, 입출력 등을 할당해줍니다.

     - 어떤 유저가 어떤 리소스를 얼마나 사용하고 있는지 파악합니다.

     - 보호 / 보안 (엑세스 제어, 검증/공격으로부터 보호)  = 윈도우의 방화벽을 생각하면 될 것 같습니다.

     

    <시스템 콜>

     운영체제가 제공하는 인터페이스로 유저와 운영체제를 연결하는 역할을 해줍니다. 이를 통해서 사용자가 요구를 할 수 있고 운영체제가 이에 따른 응답을 보내줍니다. 사용자가 파일을 보는것도, 복사하는 것도 이 시스템 콜을 통해서 이루어지게 됩니다.

      - 직접 접근하려면 주소값도 알아야하고 복잡한 일들이 많습니다.

      - 이런 시스템 콜은 커널 레벨에서 이루어집니다. (유저가 볼 일이 없다는 뜻)

     

    + API (Application Program Interface)

      - 프로그래머가 시스템콜을 잘 몰라도 프로그램을 사용할 수 있게 해주는 것이다.

      - 각 언어들의 라이브러리도 포함된다 (호환성 좋고 사용하기도 편하다)

     

    시스템 콜의 파라미터 패싱

     시스템 콜마다 타입, 정보 요구량, 인자 종류/수가 달라집니다.

     이런 인자를 운영체제에 전달하는 3가지 방법은

      1. CPU의 레지스터를 통해 인자 전달

      2. 메모리의 table에 저장한 뒤 레지스터에 이 테이블에 해당하는 주소값 전달

      3. 스택에 넣어서 사용하기

     

    시스템 콜의 종류

     - 프로세스 관리 : 생성, 로드, 기다리기 등등 프로세스 전반을 관리

     - 파일 관리 : 파일 생성, 삭제, 읽기 등

     - 메모리 관리 : 메모리 할당 등

     - 정보 유지 : 날짜, 시간, 파일 등등 정보들을 가져온다

     - Commiunicaition : 다른 컴퓨터와 연결, 송/수신 등 컴네에서 내우는 것들

     

     

    <OS 설계>

    설계 목표

     - 하드웨어와 시스템의 종류를 결정한다.   (정확해야 하는지, 빨라야 하는지 등)

     - 유저와 시스템의 요구사항들 비교.

      (유저 입장에서는 편하고 빨라야 하며 시스템 입장에서는 유연하고 효율적이며 에러가 적어야 합니다.)

     - 우선순위를 어디에 둘 것인가?

     

    추가로 고려할 것들

     - 정책 : 정부의 정책같은 것들

     - 매커니즘 : 

     

     이전에는 어셈블리어로 운영체제를 만들었지만 요즘은 C나 C++ 같은 언어로 제작하기도 한답니다. 어셈블리어보다 개발이 더 쉽고 이식성도 좋습니다. 대신 이전에 비해서 알고리즘이 더 중요하게 작용합니다.

     

    OS의 구조

    1. 간단한 구조  (옛날 MS DOS)

     - 프로그램이 장치 드라이버를 직접 접근 가능

     - 옛날에는 메모리에 항상 켜져있는 시스템 프로그램이 있어 이를 통해 작동이 되었지만 그냥 바로 하는 경우도 있었습니다.

     

    2. 레이어 구조

     - 제일 안에 하드웨어 레이어가 있고 제일 밖에는 사용자 레이어가 있습니다.

     - 각 레이어를 거쳐가기 때문에 디버그하기 쉽습니다. (레이어마다 역할이 정해짐)

     - 대신 레이어를 분류하는데 어려움이 잇습니다.

     

    3. Microkernel 구조

     - 이전보다 커널을 조금 더 줄이고 줄인것들을 유저 모드에 이전

     - 확장과 port가 용이합니다.

        (커널은 한 덩어리라 확장이 복잡)

     - 커널에 돌아가는게 적기 때문에 버그 발생시 해결이 쉽습니다.

     - 대신 유저 모드와 커널 모드간 소통이 많아져 성능은 떨어집니다.

     

    4.모듈 구조 (리눅스, OS X 등)

     - 파일 시스템, 시스템 콜, 장치 드라이버 등이 모듈 형태로 되어 있습니다 (마인드맵같이)

     - 사용시에만 커널에 로드합니다

        ( 자주 사용하는건 메모리에 계속 올려둡니다 - 코어 커널 )

     

    <시스템 부팅>

     어떻게 커널을 로드해야 하나? 커널이 올라오기 전 bootloader이 커널의 위치를 찾아 메모리에 올리고 커널을 시작해줍니다. 그리고 이 붓로더는 디스크의 첫 섹터에 위치해 있습니다.

       (작은 시스템-디스크가 없는 장치네는 운영체제가 ROM에 있습니다.   예시 - 블랙박스본 포스트는 '신용현'교수님의 운영체제 강의를 듣고

     

    이해, 정리한 내용들을 올린 포스트입니다.

     

    - 강의자료는 올리지 않습니다.

     

    <캐싱>

     

     현재 컴퓨터는 프로그램을 돌릴때 저장장치, 메모리, CPU, 레지스터가 서로 데이터를 주고 받으면서 작동하고 있습니다. 여기서 캐싱이란 엑세스 속도를 위해서 데이터를 속도가 빠른 저장장치로 이동시키는 것으로 여러 레벨(여러 저장장치)에서 이루어지게 됩니다. 빠른 저장장치는 CPU에 있으니 CPU가 일을 잘 하기 위해서 필요한 작업이라고 볼 수 있습니다.

     

     ( 같은 데이터를 여러번 읽을 확률이 높으니 앞으로 있을 요청도 빠르게 처리할 수 있습니다 )

     

     

     

     캐싱을 하면 일단 자신의 로컬에 데이터가 있는지 확인합니다. 있다면 바로 사용하면 되는 것이고 없으면 가져와서 로컬 캐시에 카피를 하게 됩니다. (복사를 하는게 더 빠릅니다) 대신 캐시의 크기가 한정되어 있으니 전부 복사할 수 없습니다. 때문에 복사된걸 대체하는 대체 알고리즘이 요구됩니다.

     

     

     

     

     

    데이터 캐싱하기

     

     데이터를 정확하게 전달하는것이 중요한데 복사 과정에서 데이터 불일치 문제가 발생할 수 있습니다.

     

     멀티프로세서의 경우 한 CPU의 캐시 데이터가 변경되면 다른 CPU도 동기화를 해줍니다. 이때 동기화하는건 가장 최신 값으로 변경하는 것입니다.

     

     

     

     

     

    <OS의 구조>

     

    CPU는 Time Sharing을 통해서 여러 프로그램을 동시에 작동하는 것처럼 보여주게 됩니다. 동시에 하는것처럼 보이지만 실제로는 아주 빠른 속도로 번갈아가면서 프로그램들을 변경하고 있습니다. (이 방법은 유닉스가 많이 사용한다고 합니다)

     

     - 이세돌이 초등학생들 16명이랑 바둑두는것과 비슷 (이세돌 : CPU, 초등학생 : 프로그램)

     

     

     

     OS는 event driven으로 이벤트가 있기 전까지는 작동하지 않고 기다리고 있습니다. 그리고 이벤트가 발생하면 다 처리해주는 좋은 친구라 할 수 있습니다.

     

     

     

     또한 OS는 2개의 모드를 유저모드/커널모드를 가지고 잇으며 유저모드는 사용자 어플을 조작하고 커널 모드는 OS가 수행하는 모드라고 생각하면 됩니다.

     

     

     

     - 커널모드 : 일반 사용자가 접근할 수 없습니다, 시스템 콜 같은걸 합니다.

     

     

     

     - 각 보드를 상징하는 비트는 유저모드가 1, 커널 모드가 0입니다.

     

     

     

     

     

    <OS 가 하는 일들>

     

    1. 프로세스 관리

     

     프로세스는 '프로그램이 수행하는 것'으로 많은 리소스들을 요구하게 됩니다. 이런 프로세스를 관리하는 차원에서 운영체제가 CPU 스케쥴링, 프로세스 동기화, 데드락 처리 등을 하고 있습니다.

     

     

     

    * 데드락(교착상태) : 서로 원하는 리소스가 상대방에게 할당되어 서로 기다리기만 하는 등의 상태

     

     

     

    2. 메모리 관리

     

     메모리의 어느 부분(물리적으로)을 사용하는지, 어떤 것을 삭제하는지, 메모리 공간을 얼마나 할당할지 등을 OS 가 해줍니다. 이 과정은 OS가 '가상의 메모리'가 있다고 생각하고 프로그램이 한 메모리에 잇는 것처럼 가정하고 작동하게 됩니다.

     

     - 실제 물리 주소 순서는 다를 수 있습니다.

     

     - 가상화 덕분에 장치들의 구체적인 구조를 몰라도 사용이 가능합니다.

     

     

     

    3. 저장공간 관리

     

    파일들을 디렉토리에 저장해주고 OS의 일부로 사용자에게 파일 시스템을 보여줍니다. 윈도우의 탐색기, 맥의 Finder를 생각하면 됩니다.

     

     (OS의 관리 속도보다 저장장치 자체의 스펙이 더 속도에 영향을 미칩니다)

     

     

     

    4. I/O Subsystem

     

    또 운영체제는 각 장치들의 역할을 관리해 유저 편의성을 증가시켜줍니다.

     

     각 디스크의 경우 드라이버들이 해결해 줍니다 (Buffering, Cashing, Spooling)

     

     

     

    5. 그 외 특별한 경우

     

    5-1. 리얼타임 시스템

     

     - 군사,의료적인 시스템이 이에 해당하게 됩니다.

     

     - 응답 시간이 얼마나 빠른지(Deadline)가 아주 중요하며 이 빠른 정도는 시스템에 빠라 다릅니다 (Hard / Soft = 군사 시설 / 그냥 키보드)

     

     

     

    5-2. 멀티미디어 시스템

     

     - 동영상 재생기 같은거

     

     

     

    5-3. 모바일 시스템

     

     - 모바일 환경에 맞게 OS 제작

     

     

     

     

     

    <Virtual System>

     

     원래 운영체제는 한개만 쓸 수 있으나 여러 운영체제를 쓸 수 있는것처럼 보이게 할 수 있다. 흔히 보는 PC에서 모바일 기기를 작동시키는게 이런 가상 머신이라고 할 수 있습니다.

     

     

     

    + 부팅시 운영체제를 지정하는건 가상머신이라고 보기 힘들다!

     

     

     

     

     

     

     

    <OS 가 제공하는 것들>

     

    1. 사용자에게

     

     - CLI, GUI 같은 UI를 제공해줍니다. (CLI는 이전 도스 시절을 생각하면 될 것 같습니다)

     

     - 입출력 장치를 제어할 수 있게 해줍니다. (키보드, 마우스 ,모니터)

     

     - 각 프로그램들을 수행하고 종료하는 역할을 합니다.

     

     - 파일 관리 시스템 제공

     

     - 프로세스간 정보 공유

     

     - 에러 탐지 (이걸 탐지해서 자체 조정하거나 사용자에게 알려준다)

     

     

     

    2. 시스템의 입장에서는

     

     - 리소스를 할당해 메모리, 입출력 등을 할당해줍니다.

     

     - 어떤 유저가 어떤 리소스를 얼마나 사용하고 있는지 파악합니다.

     

     - 보호 / 보안 (엑세스 제어, 검증/공격으로부터 보호) = 윈도우의 방화벽을 생각하면 될 것 같습니다.

     

     

     

    <시스템 콜>

     

     운영체제가 제공하는 인터페이스로 유저와 운영체제를 연결하는 역할을 해줍니다. 이를 통해서 사용자가 요구를 할 수 있고 운영체제가 이에 따른 응답을 보내줍니다. 사용자가 파일을 보는것도, 복사하는 것도 이 시스템 콜을 통해서 이루어지게 됩니다.

     

      - 직접 접근하려면 주소값도 알아야하고 복잡한 일들이 많습니다.

     

      - 이런 시스템 콜은 커널 레벨에서 이루어집니다. (유저가 볼 일이 없다는 뜻)

     

     

     

    + API (Application Program Interface)

     

      - 프로그래머가 시스템콜을 잘 몰라도 프로그램을 사용할 수 있게 해주는 것이다.

     

      - 각 언어들의 라이브러리도 포함된다 (호환성 좋고 사용하기도 편하다)

     

     

     

    시스템 콜의 파라미터 패싱

     

     시스템 콜마다 타입, 정보 요구량, 인자 종류/수가 달라집니다.

     

     이런 인자를 운영체제에 전달하는 3가지 방법은

     

      1. CPU의 레지스터를 통해 인자 전달

     

      2. 메모리의 table에 저장한 뒤 레지스터에 이 테이블에 해당하는 주소값 전달

     

      3. 스택에 넣어서 사용하기

     

     

     

    시스템 콜의 종류

     

     - 프로세스 관리 : 생성, 로드, 기다리기 등등 프로세스 전반을 관리

     

     - 파일 관리 : 파일 생성, 삭제, 읽기 등

     

     - 메모리 관리 : 메모리 할당 등

     

     - 정보 유지 : 날짜, 시간, 파일 등등 정보들을 가져온다

     

     - Commiunicaition : 다른 컴퓨터와 연결, 송/수신 등 컴네에서 내우는 것들

     

     

     

     

     

    <OS 설계>

     

    설계 목표

     

     - 하드웨어와 시스템의 종류를 결정한다. (정확해야 하는지, 빨라야 하는지 등)

     

     - 유저와 시스템의 요구사항들 비교.

     

      (유저 입장에서는 편하고 빨라야 하며 시스템 입장에서는 유연하고 효율적이며 에러가 적어야 합니다.)

     

     - 우선순위를 어디에 둘 것인가?

     

     

     

    추가로 고려할 것들

     

     - 정책 : 정부의 정책같은 것들

     

     - 매커니즘 : 

     

     

     

     이전에는 어셈블리어로 운영체제를 만들었지만 요즘은 C나 C++ 같은 언어로 제작하기도 한답니다. 어셈블리어보다 개발이 더 쉽고 이식성도 좋습니다. 대신 이전에 비해서 알고리즘이 더 중요하게 작용합니다.

     

     

     

    OS의 구조

     

    1. 간단한 구조 (옛날 MS DOS)

     

     - 프로그램이 장치 드라이버를 직접 접근 가능

     

     - 옛날에는 메모리에 항상 켜져있는 시스템 프로그램이 있어 이를 통해 작동이 되었지만 그냥 바로 하는 경우도 있었습니다.

     

     

     

    2. 레이어 구조

     

     - 제일 안에 하드웨어 레이어가 있고 제일 밖에는 사용자 레이어가 있습니다.

     

     - 각 레이어를 거쳐가기 때문에 디버그하기 쉽습니다. (레이어마다 역할이 정해짐)

     

     - 대신 레이어를 분류하는데 어려움이 잇습니다.

     

     

     

    3. Microkernel 구조

     

     - 이전보다 커널을 조금 더 줄이고 줄인것들을 유저 모드에 이전

     

     - 확장과 port가 용이합니다.

     

        (커널은 한 덩어리라 확장이 복잡)

     

     - 커널에 돌아가는게 적기 때문에 버그 발생시 해결이 쉽습니다.

     

     - 대신 유저 모드와 커널 모드간 소통이 많아져 성능은 떨어집니다.

     

     

     

    4.모듈 구조 (리눅스, OS X 등)

     

     - 파일 시스템, 시스템 콜, 장치 드라이버 등이 모듈 형태로 되어 있습니다 (마인드맵같이)

     

     - 사용시에만 커널에 로드합니다

     

        ( 자주 사용하는건 메모리에 계속 올려둡니다 - 코어 커널 )

     

     

     

    <시스템 부팅>

     

     어떻게 커널을 로드해야 하나? 커널이 올라오기 전 bootloader이 커널의 위치를 찾아 메모리에 올리고 커널을 시작해줍니다. 그리고 이 붓로더는 디스크의 첫 섹터에 위치해 있습니다.

     

       (작은 시스템-디스크가 없는 장치네는 운영체제가 ROM에 있습니다. 예시 - 블랙박스)

       (큰 시스템에서는 붓로더가 ROM, 운영체제는 디스크에 있습니다.)

    반응형

    '쾌락없는 책임 (공부) > 운영체제' 카테고리의 다른 글

    운영체제 06  (0) 2021.05.27
    운영체제 05  (0) 2021.05.19
    운영체제 04  (0) 2021.05.19
    운영체제 03  (0) 2021.04.10
    운영체제 02  (0) 2021.04.10

    댓글

Designed by Tistory.