소프트웨어 - from 1일 1로그

Ik·2022년 9월 15일
0

CS

목록 보기
2/27
post-thumbnail

컴퓨터

특징

  • 어떤 계산이라도 수행 가능
  • 일부 명령어뿐이지만 매우 빠르며 제어 가능
  • 극도로 상세하게 알려주지 않는다면 스스로 불가




소프트웨어

  • 컴퓨터에 사용하는 일련의 명령어를 의미하는 일반적인 용어




알고리즘

  • 특정 과제를 달성하기 위한 이상적인 절차
    • 얼마나 효율적으로 작동하느냐가 중요
    • 추상적이고 이상적인 절차를 기술한 것
      • 기본 연산을 사용하여 각 단계를 상세히 설명하고 모든 상황을 다루며 결국 멈춰야 한다
    • 최악의 경우(지름길 없이 모든 작업을 수행하는 경우)를 가정하기도 함
    • 과제의 본질적인 복잡도와 알고리즘의 복잡도가 같을 필요는 없다
  • 연산 횟수에 따라 선형 알고리즘, 지수 알고리즘 등으로 불림




프로그래밍 언어

  • 특정 과제를 달성하기 위한 이상적인 절차를 표현하려고 사용하는 언어
    • 사람에게도 어느 정도 자연스러운 형태로 표현하도록 해주는 언어
  • 초기에 코드 작성 어려워 수정, 변경, 추가 자체가 어려웠다
    • 개선 : 어셈블러 : 특정한 처리를 수행하는 프로그램, OS에 영향 많이 받으며 구문 오류 외적인 에러 검출 어려움
      • 개선 : 고수준 언어
        • 가장 중요한 언어 : C, C++, JAVA, JS, Python 등
        • C : 에러 검출 쉽지 않음
        • C++ : C 복잡성 관리 개선, 브라우저 및 맥에 기반, 프로그래밍의 편안함 보다는 컴퓨터의 효율
        • JAVA : 임베디드 -> 웹 페이지 -> 웹서버, C++ 보다는 단순, C 보다는 복잡
        • JS : 웹 페이지 동적인 효과, 광범위한 언어군
          • 모든 브라우저에 포함되어 있어 소프트웨어 별도 다운 필요 X
          • 약간의 HTML을 가미해야된다
        • Python : 가독성 초점
          • 폭넓으며 일상적인 프로그래밍이 가능
          • 방대한 Lib
  • 모든 언어들은 각자의 트레이드 오프를 고려하며 시대에 필요하게끔 발전
  • 어떤 언어도 단독으로 모든 프로그래밍 과제에 이상적이지 않음
    • 능숙한 개발자여도 사용할 수 있는 다수의 언어들의 수준이 동일하지 앟음




주요 개념

  • 구문 규칙(syntax)
    • 문법적으로 무엇이 맞고 무엇이 틀리는지 정의하는 규칙
    • 하나의 언어를 배운경우 나머지 언어들도 구문 규칙만 익히면 되기에 자연스럽게 익힐 수 있다
  • 의미 체계(semantics)
    • 해당 언어로 표현할 수 있는 모든 것에 대해 명확히 정의된 의미
    • ex) 자바스크립트 구현
    • 브라우저마다 다소 차이가 있고, 심지어 같은 브라우저라도 버전별로 다르기도 하다
  • 세 가지 측면
    • 언어 그 자체
    • 코드 라이브러리
    • 프로그램 실행환경에 접근하는 기능




자료구조

  • 과제 달성 과정에서 필요한 정보를 표현하고 관리하는 방법




프로그램

  • 실제 컴퓨터가 과제를 완료하기 위해 수행해야 하는 모든 단계를 구체적으로 서술, 추상적 X
  • 하나 이상의 알고리즘이 컴퓨터가 직접 처리할 수 있는 형태로 표현한 것
  • 알고리즘 외적으로 실질적인 문제도 고려 필요
    • 메모리, 프로세서 속도, 잘못된 입력 데이터, 하드웨어 결합, 네트워크 등




Lib

  • 어떤 프로그램도 완전히 처음부터 새로 만들어지지 않음
    • 다른 사람들이 이미 만들어 놓은 함수를 이용해서 계산을 수행 할 수 있으며 함수 내부적으로 어떻게 일이 진행되는지는 알 필요 X
  • 함수들의 모음
  • API(Application Programming Interface) 제공
    • 함수의 설명서라 생각하면 된다
    • 시스템을 사용과 관련된 여러 문서들
  • SDK(소프트웨어 개발 키트, Software Development Kit)
    • 복잡한 소프트웨어 Lib를 다루게 해주며 SDK 자체도 대형 소프트웨어 시스템
  • 소프트웨어를 개발할 때 프로그래머 < 테스터
    • 출시 전에 버그 발견 목적




운영체제

  • 컴퓨터 하드웨어를 관리하고 다른 프로그램을 실행할 수 있게 하는 소프트웨어의 기초 구조물
  • 하나의 프로그램
  • 과거에 하나의 운영체제에 하나의 App만 실행 가능
    • 때문에 구분안함
  • 컴퓨터의 자원을 제어하고 할당
    • 프로세서 관리, 스케줄링
    • 자원 독점 방지
    • 이벤트에 따른 프로그램 상태 관리
    • 프로세서 속도의 따른 자원 할당
  • Application에 차례로 통제권을 준다
  • 시스템 콜 - system call
    • 운영체제에 사용자가 원하는 서비스를 요청하는 진입점을 칭하는 말
  • 주기억 장치
    • 메모리에 프로그램 로드해 명령어 실행하게끔
    • 스와핑(swaping)
      • 용량 충분치 못한 경우 일부 프로그램 일시적으로 디스크(virtual memory)에 복사했다가 여유 생길 때 다시 옮겨오는 것
      • 프로그램은 메모리가 무제한인 것처럼 행동, 스와핑을 통해 착시 시킴
    • 보조 기억 장치에 저장된 정보 관리
    • 메모리 겹치는 것 방지
    • 디바이스 드라이버 : 특정 종류의 하드웨어 장치 간에 가교 역할
      • 컴퓨터에 연결된 장치들 활동 관리 및 조정
        • ex) 키보드, 마우스
  • 멀티 부트 - multiple boot
    • 디스크에 몇 개의 운영체제를 저장해 두고 컴퓨터를 킬 때마다 어느 것을 실행할지 결정
  • 가상 머신 - virtual machine
    • 호스트 운영체제에서 특정 운영체제를 게스트 운영체제로 실행할 수 있게 해주는 것
    • 호스트는 일부 권한들 컨트롤
  • 클라우드 컴퓨팅
    • 클라우드 서비스 제공 업체는 가상 머신에 의존저장 공간과 네트우크 대역폭이 충분한 물리적 컴퓨터를 대량으로 보유, 자원을 고객에게 제공
    • ex) AWS




Application

  • 운영체제 위에서 실행되는 프로그램
    • 운영체제를 플랫폼으로 삼아 작업을 수행하는 온갖 종류의 프로그램이나 소프트웨어 시스템을 총칭하는 용어
  • 하나의 기능만 실행하는 것부터 복잡한 작업을 수행하는 대형 프로그램까지 다양




브라우저

  • 웹 서버에 요청을 보내고 화면에 표시할 정보를 웹 서버에서 받아온다
  • 비동기적(asynchronous, 예측할 수 없는 시점에 순서 없이 발생하는) 이벤트로 인해 굉장히 복잡
    • 위 이벤트만 기다릴 수 없기 때문
  • 운영체제와 유사
    • 자원을 관리하고, 동시에 일어나는 활동을 제어하며 조정




운영체제 <-> Application

  • 사용자가 원하는 작업(App)이 자원을 효율적이고 공평하게 공유하면서 서로 간섭하지 않을 것을 보장하는 조정자(운영체제)
  • 그 중 Linux는 범용 OS 시스템이라 생각하면 된다




컴퓨터 간단한 구조

                                          <어플리케이션, Lib>
                                             System Call
                                             <소프트웨어>
                                            Device Driver
                                              <하드웨어>
  • 계층화
    • 각 계층은 서로의 관심사를 구분 지으며 프로그래머가 복잡성을 처리하는 데 도움이 되는 중요한 아이디어 중 하나




프로세서

  • 컴퓨터가 켜졌을 때 영구 기억 장치에 저장된 약간의 명령어를 실행해서 작동을 시작하도록 구성
    • 작은 플래시 메모리에서 명령어를 읽음
    • 이 과정을 부팅이라 부른다
      • 부팅 시에 장치의 수 많을수록 시간 더 걸림

정리

0개의 댓글