728x90
반응형

(최근에 이벤트 루프를 디자인 패턴으로 잘못 설명하여 다음엔 그러지 않기 위하여 이 포스트를 포스팅 합니다.)

 

디자인 패턴이란 객체 지향 프로그래밍 설계를 할 때 사용되는 패턴으로 자주 발생하는 문제를 피하기 위해 사용됩니다.

 

제가 이해한 흐름은 객체 지향 프로그래밍 설계를 할때 반복하여 발생하는 문제들에 직면하는 상황이 생겼습니다.

이러한 문제를 해결하는 방식들은 고착화 되었을 것입니다.

예를 들면 '메모리를 save하기 위해 전역 범위에 객체 인스턴스를 생성해두고 의존성이 주입되면 그때 이미 생성된 인스턴스를 참조할 수 있도록 하는 방법'이 있을 것입니다.

 

자주 발생하는 문제를 해결하기 위해 위와 같이 매번 말하는 방법도 있을 수 있고 이러한 패턴에 이름을 붙여 좀 더 간단하게 소통할 수 도 있을 것입니다.

농구를 예로 들면 가드가 숫자 1을 손가락으로 가리키면 픽&롤, 2를 가리키면 픽&팝, 3을 가리키면 엘레베이터 스크린 등의 동작을 수행하는 예시가 있을 수 있을것 같습니다.

 

디자인 패턴의 맹신 보다는 코드베이스의 간결성을 추구하는 것이 중요하다 합니다.

디자인 패턴 적용을 하지 않아도 되는 부분에서는 사용하지 말아야 한다는 의미인것 같습니다.

디자인 패턴이 왜 효율적인지를 이해하는 것이 중요하고 모든 상황의 해결책이 아니라는 것을 아는 것이 중요하다 합니다.

 


디자인 패턴은 여러가지 패턴이 있습니다.

생성 패턴, 구조 패턴, 행위 패턴 등이 있는데

여러 패턴에 대한 지식이 현재는 없어 제 기준 친숙한 두개의 패턴만 언급을 하려 합니다.

(공부를 해 나가는 대로 여러 패턴들은 추가될 예정입니다.)

 

생성 패턴에서의 추상 팩토리 패턴과 싱글턴 패턴 입니다.

 

팩토리 패턴

객체를 생성하는 인터페이스만 정의합니다. 인스턴스를 만드는 클래스는 서브 클래스에서 결정합니다.

프레임 워크처럼 기본 정보만 제공하고 활용은 스스로 하여라 라고 이해하였습니다.

저는 프레임 워크를 강아지 집으로 이해하고 있습니다.
프레임 워크를 이용하게 되면 아무 색깔도 칠해져 있지 않은 나무 그대로의 강아지 집을 전달 받습니다.
이후 라이브러리 or 코드를 이용하여 이 강아지 집을 색칠, 커스텀 하여 강아지 집을 완성하는 흐름입니다.

 

저는 알고리즘 cli를 만들때 여러 사이트들이 동일한 메서드로 동작할 수 있도록 설계를 하고 싶었습니다.

그래서 추상 클래스 하나를 만들고 모든 사이트 class는 해당 추상 클래스를 상속받고 추상 메서드를 구현하게 하여 

인스턴스의 생성은 서브 클래스에서 결정하도록 하였습니다.

 

추상 클래스 / 추상 메서드

import { InfoForGenerateFile } from "../interface";

export abstract class AbstractGenerator {
  constructor() {}

  public abstract generate({site, language, identifier}: InfoForGenerateFile) : void;
}

 

사이트 클래스들(서브 클래스들)

import { programmersJavascriptTemplate, programmersPythonTemplate, programmersJavaTemplate } from '../templates/index';
import { IndividualGeneratorInputProps } from './../interface/index';
import { AbstractGenerator } from "./abstract.generator";

export class ProgrammersGenerator implements AbstractGenerator {
  public generate({language}: IndividualGeneratorInputProps): string | Error {
    switch(language) {
      case "python" :
        return programmersPythonTemplate();
      case "javascript" :
        return programmersJavascriptTemplate();
      case "java" :
        return programmersJavaTemplate();
      default :
        return new Error('input wrong language');
    }
  }
  
}
import { swExpertAcademyJavaTemplate, swExpertAcademyPythonTemplate } from '../templates/index';
import { IndividualGeneratorInputProps } from './../interface/index';
import { AbstractGenerator } from "./abstract.generator";

export class SwExpertAcademyGenerator extends AbstractGenerator {
  public generate({language}: IndividualGeneratorInputProps): string | Error {
    switch(language) {
      case "python" :
        return swExpertAcademyPythonTemplate();
      case "java" :
        return swExpertAcademyJavaTemplate();
      default :
        return new Error('only python and java work')
    }
  }
  
}
import { baekjoonJavascriptTemplate, baekjoonPythonTemplate, baekjoonJavaTemplate } from '../templates/index';
import { IndividualGeneratorInputProps } from "../interface";
import { AbstractGenerator } from "./abstract.generator";

export class BaekjoonGenerator implements AbstractGenerator {
  public generate({language, identifier}: IndividualGeneratorInputProps): string | Error {
    switch(language) {
      case "python" :
        return baekjoonPythonTemplate(identifier);
      case "javascript" :
        return baekjoonJavascriptTemplate();
      case "java" :
        return baekjoonJavaTemplate();
      default :
        return new Error("input wrong language")
    }
  }
  
}

 

이렇게 사용함으로써 사이트가 추가되더라도 동일한 메서드를 구현하고 있음을 보장 받을 수 있었고

공통된 기능이 추가되야 한다면 추상 클래스에 추상메서드를 추가해줌으로써 

모든 사이트에 구현되어야 하는게 있다라는 것을 빠짐없이 알릴 수 있다고 생각합니다.

 

싱글턴 패턴

싱글턴 패턴은 객체의 인스턴스가 오직 1개만 생성되는 패턴입니다.

객체가 필요할 때마다 인스턴스를 생성하고 활용해야 한다면 중복된 객체가 생성될 수도 있고 메모리가 hard하게 사용될 수도 있습니다.

이러한 관점에서 싱글턴 패턴이 등장하였다고 알고 있습니다.

 

// 객체를 미리 생성해두고 항상 가져다 사용하는 방식

public class Singleton {
  private static Singleton instance = new Singleton();
  
  private Singleton() {
    // 생성자는 외부에서 직접 참조할 수 없도록 private
  }
  
  public static Singleton getInsance() { 
    return instance;
  }
  
  public void say() {
    System.out.println("hi, there")
  }
}

 

nestjs에서는 싱글턴 패턴을 사용한다고 합니다.

 

코드상에 존재하는 모듈들을 맨 처음 구동시 인스턴스화 합니다.

그리고 service, repository 클래스 들에서는 의존성 주입을 통해 어떤 객체가 필요한지를 nest에게 알립니다.

이럴때 두가지 방법이 있습니다.

매번 객체를 생성하는 것과 미리 전역 범위에 띄워놓고 생성되어 있는 객체를 참조하게 하여 원하는 동작을 수행할 수 있습니다.

이때 두번째 방법인 싱글턴 패턴을 이용합니다.

nestjs에서는 모듈 클래스에 토큰을 추가하여 이 토큰을 기반으로 전역범위에 생성된 모듈에 접근하고 생성을 합니다.

 

 

싱글턴 패턴을 사용하면 장/단이 있습니다.

* 메모리를 아낄수 있습니다.

* 데이터의 공유가 쉽습니다. 하나의 객체에 속성들을 업데이트 한다면 객체를 공유하는 여러곳에서 변경된 정보에 접근할 수 있습니다.

 

하지만

동시성 문제가 발생할 수 있습니다.

생성된 객체들은 전역에서 접근이 가능합니다.

여러 스레드에서 하나의 객체에 접근할 때 순서, 자원의 점유 등으로 인하여 동시성 문제가 발생하여 에러가 발생할 수 있습니다.

동시성 문제에 관하여는 따로 포스팅 하겠습니다.

 

nestjs에서 이러한 단점에도 싱글턴 패턴을 사용하였습니다.

node는 싱글스레드로 동작을 하게 되므로 동시성 문제에서 피해갈 수 있어 선택하지 않았을까 생각합니다.


(공부 이후에 해당 내용들은 수정될 수 있습니다.)

 

출처: https://tecoble.techcourse.co.kr/post/2020-11-07-singleton/

 

싱글톤(Singleton) 패턴이란?

이번 글에서는 디자인 패턴의 종류 중 하나인 싱글톤 패턴에 대해 알아보자. 싱글톤 패턴이 무엇인지, 패턴 구현 시 주의할 점은 무엇인지에 대해 알아보는 것만으로도 많은 도움이 될 것이라

tecoble.techcourse.co.kr

https://namu.wiki/w/%EB%94%94%EC%9E%90%EC%9D%B8%20%ED%8C%A8%ED%84%B4

 

728x90
반응형
728x90
반응형

멀티 프로세스

2개 이상의 프로세스가 동시에 실행 되는 것, 

여기서 동시에 실행되는 것은 1개의 cpu, 여러개의 cpu 일때가 있을수 있습니다.

1개의 cpu일때는 여러 프로세스를 짧은 시간동안 할당받아 번갈아 가면서 수행하는 시분할 시스템으로 실행이 되고 

복수개 일때는 각각의 cpu가 각각의 process를 수행함으로써 process가 동시에 수행됩니다.

 

1개의 cpu는 한번에 하나의 연산만 수행할 수 있습니다. 그런데 우리가 사용하는 컴퓨터에서는 음악도 들을 수 있고 카톡도 보낼수 있고 웹 서핑도 할 수 있습니다. 하나의 cpu라고 가정했을때 이게 가능한 이유는 cpu가 수 ms 동안 프로세스를 번갈아 수행함으로써 우리는 프로세스 들이 동시에 실행되고 있다고 느끼게 됩니다. 

프로세스를 번갈아 수행하는 것을 시분할 시스템이라고 부릅니다.

 

이때 여러 process 들은 메모리에 적재가 되어 있습니다. 이때 각 process들이 자신의 영역에만 접근할 수 있도록 운영체제가 관리해줍니다.(운영체제 또한 프로세스에 적재 되어 있습니다. 운영체제도 실행되어야 하는 프로그램이기 때문입니다.)

 

cpu의 내부에는 PC(Program Counter) 레지스터, 캐시등 다양한 것들이 존재합니다.

PC에는 프로세스의 다음 실행 코드 주소가 기록되어 있습니다.

그래서 cpu는 pc 레지스터의 값을 읽어들인후 해당 코드를 실행하게 됩니다.

 

Context 라는 것은 process가 현재 어떤 상태(waiting, running, block)로 수행되고 있는지에 대한 정보를 의미합니다.

이 context 정보들은 PCB(Process Control Block)에 저장이 됩니다. 

이 PCB에 PC(Program Counter)의 값도 저장이 되어있습니다. 

추가로 cpu에 필요한 레지스터들 (stack pointer)의 정보도 PCB에 저장을 합니다.

 

대표적인 Pcb 정보들

Process State new, running, waiting 등 process의 상태
Process Number process의 number
Program Counter(PC) process가 다음에 실행할 명령어 주소
Registers 다양한 register 값들
Memory limits base register, limit register, page table, segment table 등등
기타 등등!  

 

PCB 들은 커널 내에 저장되는 것으로 알고 있습니다(커널은 운영체제 많이 접근이 가능한 영역입니다)

 

a 프로세스를 수행하다가 b 프로세스를 수행해야 할때 Context switching이 일어납니다.

위에서 context는 프로세스가 현재 어떤 상태로 수행되고 있는지에 대한 정보라고 하였습니다.

b 프로세스를 수행해야 하므로 현재 까지 실행한 a 프로세스에 대한 정보를 a 의 pcb에 저장해두고 

이제 b 프로세스의 pcb를 읽어 다음 동작을 수행해야 합니다.

이렇게 이전의 context를 저장하고 새로운 context를 읽어와 다음 동작을 수행하면서 cpu의 제어권이 넘어가는 것을 context switching이라 합니다.

 

프로세스는 3개의 상태를 같습니다. running, ready, block

running : cpu를 점유하여 실행 되어 지고 있는 상태
ready: cpu만 할당받으면 바로 실행할 수 있는 상태
block: cpu를 할당받아도 명령을 실행할 수 없는 상태 - I/O 작업 기다리는 경우

 


 

싱글 스레드 => 하나의 process가 하나의 일만 수행할 수 있도록 하는 것입니다.(하나의 프로세스에서 하나의 thread만 사용합니다.)

싱글 스레드 장점 

* 자원의 동기화에 대하여 신경쓰지 않아도 됩니다(데드락과 같은 현상이 발생하지 않습니다.)

* context switching이 일어나지 않습니다. 
   context switching이 일어나지 않으므로 단순한 작업이라면 멀티 스레드에 비해 작업 시간이 빠를수 있습니다.

 

싱글 스레드 단점

* 동시성의 장점을 누리기 어렵습니다. 사용자는 하나의 스레드에서 함수가 실행되는 동안 다른 함수의 실행을 확인할 수 없습니다.

* 여러개의 cpu가 있는 경우 이를 활용하지 않는 것은 매우 비효율적입니다.

 

 

멀티 스레드 => 하나의 process가 동시에 여러개의 일을 수행할 수 있도록 해주는 것입니다. (하나의 프로세스에 여러개의 thread를 사용합니다.)

한 process내에 복수 개의 thread는 프로세스의 stack 메모리 영역을 제외한 code, data, heap 메모리 영역을 공유합니다.

스레드는 각자의 스택을 가집니다(PC(program counter), stack pointer)

멀티 스레드 장점

* 새로운 프로세스를 생성하는 것보다 같은 프로세스내의 스레드를 생성하는 것이 더 빠릅니다.

* 프로세스간의 context switching보다 context switching이 빠릅니다.

* 프로세스의 자원과 상태를 공유하며 효율적으로 운영할 수 있습니다. 

 

멀티 스레드 단점

* 스레드 스케쥴링에 신경써야 합니다.

* 자원간의 동기화에 신경써야 할 수도 있습니다.

 

   

출처 : https://velog.io/@eunjin/OS-%EC%8B%B1%EA%B8%80%EC%8A%A4%EB%A0%88%EB%93%9C-%EB%A9%80%ED%8B%B0%EC%8A%A4%EB%A0%88%EB%93%9C%EC%9D%98-%EC%9D%98%EB%AF%B8

728x90
반응형
728x90
반응형

프로세스

 

프로세스는 실행중인 프로그램을 의미합니다. 프로그램이 memory에 적재되어 cpu를 할당받아 실행되는 것을 프로세스라 합니다

memory는 cpu가 직접 접근할 수 있는 컴퓨터 내부의 기억장치 입니다. cpu는 하드디스크에 직접 접근할 수 없습니다.

하드 디스크에 저장되어 있는 프로그램은 메모리에 적재되어 cpu를 할당받아야 실행이 될 수 있습니다.

폰 노이만 구조는 실행되는 모든 프로그램은 메모리에 적재되어야 한다는 구조, 폰 노이만 구조 전에는 프로세스를 변경하려면 외부 전선을 변경해 주었어야 하는데 등장 후에는 메모리상의 프로그램만 변경해주면 된다(추후 수정 예정)

프로세스는 코드, 데이터, 힙, 스택으로 구성되어 있습니다.

코드에는 실제 코드

데이터 영역에는 전역변수와 할당이 되지 않은 변수들이 위치 하게 되는데 이 둘은 데이터 영역 내에서 서로 다른 part에 위치하게 됩니다.

힙에는 런타임 중에 메모리를 동적으로 할당하는 영역입니다.

스택에는 함수 호출시 생성되는 지역변수, 매개변수들이 임시로 저장됩니다. 

 

cpu는 다음에 읽어야 하는 코드의 위치를 pc(program) register에 저장해 둡니다. 그래서 이 레지스터의 값을 토대로 다음에 읽어야할 코드의 주소값을 알 수 있습니다. 

 

프로세스의 스택과 힙 사이에는 여유 메모리 영역이 있는데 
멀티 스레드 작업의 경우 이 영역에 스레드를 할당합니다.

 

스레드

 

스레드는 한 프로세스내에서 실행되는 동작(함수)의 단위입니다. 

프로세스 내의 각 스레드는 스택 메모리 영역을 제외한 나머지 memory 영역(data, code, heap)을 공유할 수 있습니다.

스레드는 함수의 동작을 의미하기 때문에 각자의 stack 영역을 가지게 됩니다.  

스레드에는 stack memory와 PC(Program Counter)가 필요하게 되는 것이지요

함수의 실행에는 매개변수, 함수의 return address, 함수 내의 지역변수 등을 저장하기 위한 영역이 필요하고 이 영역은 프로세스 내의 stack 영역입니다.

thread는 process 내에서 독립적인 기능을 수행합니다. 각 thread가 독립적인 기능을 수행한다는 것은 독립적으로 함수를 호출함을 의미합니다.  그러므로 독립적으로 thread가 실행되기 위해서는 각 thread는 자신만의 stack 영역을 가지고 있어야 합니다. 

 


둘의 차이

 

process는 운영체제로 부터 자원을 할당받는 작업의 단위, thread는 process가 할당받은 자원을 이용하는 실행의 단위 입니다.

process는 프로그램이 메모리에 적재되어 cpu를 할당받아 실행되는 것이고 thread는 프로세스 내에서 실행되는 동작의 단위입니다(함수의 실행과 같이)

process는 memory 공간에 code, data, heap, stack 영역이 있습니다.

thread는 process 내에서 stack영역을 제외한 code, data, heap 영역을 공유합니다.

 

728x90
반응형
728x90
반응형

최근에 알게된 CQS 원칙에 대하여 정리해놓으려 합니다.

영어로는 Command Query Separation입니다. 

한글로는 명령과 조회는 분리되어야 한다는 뜻입니다.

저는 Command(set)과 Query(get)은 분리되어야 한다는 것으로 이해하였습니다.

 

Command(set)을 할때 요청에 대한 결과를 return하지 않는 것이 대표적인 적용 예시 일것 같습니다.

 

 

아래는 개선 전

class People {
  constructor(name) {
    this.name = name;
  }
  
  setName(newName){
    this.name = newName;
    return this.name
  }
}

const test = new People('test');
console.log(test.setName("123")) // "123"
console.log(test) // People {name: "123"}

 

아래는 개선 후 입니다.

class People {
  constructor(name) {
    this.name = name;
  }
  
  getName() {
    return this.name;
  }
  
  setName(newName){
    this.name = newName;
  }
}

const test = new People('test'); 
console.log(test.setName("123")) // undefined
console.log(test.getName()) // "123"
console.log(test) // People {name: "123"}

 

쿼리는 조회만을 하기 때문에 side effect를 발생시키지 않지만

커맨드는 상태를 변경시키기 때문에 side effect을 주의하여야 합니다.

그러므로 둘의 역할을 분리하는 것이 나중을 위해 좋습니다. 

나중을 위해 좋은 내용은 아래에 있습니다!

 

이러한 원칙을 적용하면서 기대할 수 있는 효과는 어떤 것이 있을까요??

1.  디버깅이 편리해 집니다.

2. 각 메소드의 의미가 더 명확해 집니다.

3. 결국 유지보수가 편리해 집니다.


 

이 원칙은 가능하면 지키는것이 좋지만 예외가 필요할 때는 예외를 허용하는 것이 좋다고 합니다.

ex) 1. api 요청에서 put or patch를 이용할때 데이터를 update후에 변경된 데이터를 response로 반환하는 경우 

      2. 자료구조 stack에서 pop을 하면 stack은 상태가 변경되고 가장 나중에 들어온 값을 반환해 줍니다. 

           이러한 경우또한 예외상황이 될것 같습니다.

stack = [1,2,3,4,5]

print(stack.pop()) # 5
print(stack) # [1,2,3,4]

 

 

출처 : https://dundung.tistory.com/183

 

Command Query Separation 원칙

우테코에서 로또 미션을 구현할 때 다음과 같은 메소드를 작성한 적이 있다. public boolean hasNext() { return this.count-- > 0; } 작성할 당시엔 위 메소드에 아무런 문제가 없다고 생각했다. 하지만 위 사

dundung.tistory.com

 

728x90
반응형
728x90
반응형
1. 전원이 들어오면 cpu는 ROM에 있는 BIOS 프로그램을 메모리에 올려 실행시킵니다.
2. BIOS(Basic Input Output System)은 POST(Power On Self Test)를 실행하여 필요 하드웨어에 이상이 없는지 체크합니다.
3. BIOS는 저장매체의 첫번째 섹터에 있는 MBR에 접근하여 부트 로더를 메모리에서 실행시킵니다.
4. 메모리에서는 부트 섹터에 접근하고 운영체제 이미지를 메모리에 올려 운영체제를 실행시킵니다.

 

과정 도식화

 

 

1. 전원이 들어오면 cpu는 ROM에 있는 BIOS 프로그램을 메모리에 올려 실행시킵니다.

컴퓨터가 켜지면 power supply에 전원이 들어오고 메모리(ROM) 0번지 주소의 데이터를 읽습니다.

ROM-BIOS에서 BIOS프로그램이 메모리로 올라갑니다.

이는 메모리에 프로그램을 올려서 실행시키는 것이 속도가 빠르고 현재의 컴퓨터들은 폰 노이만 구조를 따르기 때문입니다.

부팅을 위해 컴퓨터의 전원스위치를 켜면, 제일 먼저 롬 바이오스라고 불리는 기본적인 프로그램이 동작하게 되는데, 이 프로그램은 전원이 꺼지더라도 기억할 수 있도록 ROM이라는 메모리에 기록되어 있습니다.

BIOS 프로그램은 2번의 과정을 실행시킵니다.

 

 

2. BIOS(Basic Input Output System)은 POST(Power On Self Test)를 실행하여 필요 하드웨어에 이상이 없는지 체크합니다.

 

post는 필요 하드웨어가 정상적으로 동작하는지 테스트 하는 것입니다.

이때 발견되는 에러들은 치명적인 에러여서 컴퓨터는 부팅되지 않습니다.

이외에도 BIOS 프로그램은 아래의 것들을 실행합니다.

  • 하드웨어 초기화
  • 메모리와 cpu 레지스터를 초기화
  • 저장매체의 MBR(Master Boot Record) 읽기(3번에서 설명)

3. BIOS는 저장매체의 첫번째 섹터에 있는 MBR에 접근하여 부트 로더를 메모리에서 실행시킵니다.

MBR(Master Boot Record)에는 부트로더 라는 프로그램이 있습니다. 

부트로더 에는 파티션들의 정보가 들어있는 파티션 테이블이 들어있습니다.

결국 부트로더 프로그램이 실행되면 파티션 테이블들이 메모리에 올라가지고 메모리는 이중에 운영체제 이미지가 있는 파티션에 접근이 가능합니다.

MBR은 운영체제가 어디에, 어떻게 위치해 있는지를 식별하여 컴퓨터의 주기억 장치에 적재될 수 있도록 하기 위한 정보로서 하드디스크나 디스크의 첫번째 섹터에 저장되어 있습니다.
MBR은 또한 '파티션 섹터' 또는 '마스터 파티션 테이블' 이라고도 불리는데, 그 이유는 하드디스크가 포맷될때 나누어 지는 각 파티션의 위치에 관한 정보를 가지고 있기 때문입니다.
그 외에도 MBR은 메모리에 적재될 운영체제가 저장되어 있는 파티션의 부트 섹터 레코드를 읽을 수 있는 프로그램을 포함하고 있는데, 부트섹터 레코드에는 다시 운영체제의 나머지 부분들을 메모리에 적재시키는 프로그램을 담고 있다.

4. 메모리에서는 부트 섹터에 접근하고 운영체제 이미지를 메모리에 올려 운영체제를 실행시킵니다.

 

이제 메모리는 운영체제가 들어있는 파티션을 알게되었고 메인파티션에 있는 부트 섹터에 들어있는 부트코드를 읽습니다.

부트코드는 메모리에서 실행이 되어지고 실행된 부트코드는 운영체제의 이미지를 메모리에 올려 운영체제가 실행되어 집니다.

 

 

 

헷갈릴 만한 용어 정리

부트 로더 : MBR에 위치되어 있는 프로그램으로 파티션들에 대한 정보를 제공해줍니다.

부트 섹터 : 메인파티션에 위치해 있는 것으로 부팅프로그램을 담을수 있는 기억장치의 섹터를 말한다

부트 코드 : 운영체제의 실행 이미지를 메모리에 올려주는 코드

 

 

- 잘못된 정보가 있으면 알려주세요. 빠른 수정 반영할게요!!

 

출처: https://lipcoder.tistory.com/entry/%EC%BB%B4%ED%93%A8%ED%84%B0-%EB%B6%80%ED%8C%85-%EA%B3%BC%EC%A0%95-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8%EC%9D%98-%EB%8F%99%EC%9E%91-%EC%9B%90%EB%A6%AC

 

컴퓨터 부팅 과정, 프로그램의 동작 원리

동작 원리 이번에는 응용 소프트웨어, 시스템 소프트웨어, 하드웨어를 아울러 컴퓨터가 켜지고, 프로그램이 실행되는 과정을 정리한다. 컴퓨터가 켜지는 과정 CPU는 컴퓨터에 전원이 들어오면

lipcoder.tistory.com

https://neos518.tistory.com/113

 

부팅 시 운영체제가 실행되는 과정

부팅 시 운영체제가 실행되는 과정 1. 바이오스 - BIOS (Basic Input Output System) - 메모리와 CPU 레지스터를 초기화 시킨다. - 디스크로부터 부트 로더를 불러 온다(부트 로더로는 grub나 lilo 등이 있다). -

neos518.tistory.com

https://velog.io/@hyun0310woo/13-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%EB%B6%80%ED%8C%85

 

#13 운영체제 | 간단한 부팅 과정

컴퓨터를 켜서 동작시키는 절차Boot 프로그램: 운영체제 커널을 Storage에서 특정 주소의 물리 메모리로 복사하고 커널의 처음 실행위치로 PC를 가져다 놓는 프로그램

velog.io

 

728x90
반응형

+ Recent posts