CS

CS) Synchronous & Asynchronous

2023. 2. 12. 18:04
728x90

Synchronous & Asynchronous

처리해야할 작업들을 어떠한 흐름(시간)으로 처리할것인가에 대한 관점이다.

Synchronous: 작업을 동시에 수행하거나, 동시에 끝나거나, 끝나는 동시에 시작

Asynchronous: 시작, 종료가 일치하지 않으며, 끝나는 동시에 시작을 하지 않음




Synchronous(동기)

synchronous

Synchronous함수A(caller)함수B(callee)의 작업 완료후 리턴을 기다린다.

이렇게 caller가 callee의 작업 완료 여부에 신경을 쓰면 Synchronous이다.





Asynchronous(비동기)

Asynchronous

Asynchronous함수A(caller)함수B(callee)를 호출할때 콜백 함수를 함께 전달한다.

그후 함수B(callee)의 작업이 완료되면 콜백함수를 실행하여 함수A(caller)에 정보를 보낸다.

이렇게 caller가 callee의 작업 완료여부에 신경을 쓰지 않으면 Asynchronous이다.





Blocking & Non-Blocking

제어권이 누구한테 있느냐가 관심사이다.

Blocking: 자신의 작업을 진행하다 다른 주체의 작업이 시작되면 다른 작업이 끝날 때 까지 기다렸다가 자신의 작업을 한다.

Non-Blocking: 다른 주체의 작업에 관련없이 자신의 작업을 한다.




Blocking

blocking

Blocking이란 함수A(caller)함수B(callee)를 호출하면, 제어권을 A가 호출한 함수 B에게 넘겨준다





Non-blocking

Non-blocking

Non-Blocking이란 함수A(caller)함수B(callee)를 호출하면 호출하는 순간에는 함수B(callee)에게 제어권을 넘겨주지 않아, 함수B(callee)의 완료 여부에 상관없이 함수A(caller)를 계속해서 실행한다.




Synchronous & Asynchronous + Blocking & Non-Blocking

Synchronous & Asynchronous + Blocking & Non-Blocking

Synchronous + blocking

함수A(caller)함수B(callee)를 호출한다.

이때 함수A는 함수B의 리턴값을 필요로한다 (동기)

따라서 제어권을 함수B에게 넘겨주고, 함수B로부터 제어권을 다시 받아올때까지 기다린다 (블로킹)




Synchronous + Nonblocking

함수A(caller)함수B(callee)를 호출한다.

이때 함수A는 함수B에게 제어권을 주지 않으며, 자신의 코드를 실행한다(논블로킹)

하지만 함수A는 함수B의 리턴값을 필요로하기때문에, 중간중간에 B함수가 실행을 완료했는지 확인한다.(동기)




ASynchronous + blocking

함수A(caller)함수B(callee)를 호출한다.

이때 함수A는 함수B의 작업에 신경을 쓰지않고 콜백함수를 보낸다.(동기)

함수A는 함수B의 작업 완료에 관심이 없지만 제어권을 함수B에게 넘긴다.(블로킹)

*ASynchronous + blocking은 Synchronous + blocking과 성능이 비슷해 사용하는 경우는 거의 없다고한다. *




ASynchronous + Nonblocking

함수A(caller)함수B(callee)를 호출한다.

이때 제어권을 함수B에게 넘기지 않고 자신이 가지고있는다 따라서, 함수B를 호출한 이후에도 함수A는 멈추지 않는다. (논 블로킹)

함수A는 함수B를 호출할때 콜백함수를 함께줘 함수B의 작업이 끝나면 함수A가준 콜백함수를 실행한다.(비동기)





Reference

728x90

'CS' 카테고리의 다른 글

CS) 프로세스와 스레드  (0) 2023.02.08
CS) Function,Predicate  (0) 2023.02.08
CS) Functional Programming  (0) 2023.02.08
CS) Mutable,Immutable  (0) 2023.02.08
CS) Tokenizer,Lexer,Parser  (0) 2023.02.08

CS) 프로세스와 스레드

2023. 2. 8. 18:17
728x90

프로세스, 스레드

프로세스란?

프로세스

  • 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램
  • 운영체제로부터 시스템 자원을 할당받으며, 자체 메모리 공간을 가지고 있다. 즉 프로세스는 서로 독립된 메모리영역(Code,Data,Stack,Heap)을 할당받는다.
  • 각 프로세스는 별도의 주소공간에서 실행된다 따라서 하나의 프로세스가 다른 프로세스의 변수나 자료구조에 접근할수 없다.(IPC,inter-process communication을 통해 다른 프로세스의 자원에 접근 가능하긴 하다)
  • 하나 이상의 스레드에 의해 실행되는 컴퓨터 프로그램의 인스턴스이다.

 

 

스레드란?

스레드

  • 프로세스 내에서 실행되는 독립적인 실행 단위
  • 병렬로 실행될수 있으며, 동일한 주소공간과 시스템 리소스(Code,Data,Heap)영역은 공유한다.(Stack영역은 스레드간 따로 할당을 받는다)
  • 프로세스와 다르게 공유하는 시스템 리소스 영역이 존재한다 따라서 한 스레드가 프로세스 자원을 변경하면, 다른 이웃 스레드(sibling thread)도 그 변경 결과를 즉시 볼수 있다.

 

멀티프로세스와 멀티 스레드

멀티프로세스

  • 멀티 프로세스란 여러 프로세스가 서로 협력적으로 일을 처리하는것을말한다..
  • 멀티프로세스의 장점
    • 멀티 프로세스를 사용하게되면 하나의 프로세스가 죽더라도 다른 프로세스에는 영향을 미치지 않는다(프로세스는 서로의 메모리공간을 공유하지 않으므로)
  • 멀티스레드의 단점
    • 반면 멀티 프로세스에서 발생하는Context Switching 의 작업에 의해 오버헤드가 발생할수 있다.
    • 또한 위에서 말했다 싶이 프로세스들은 IPC기법을 사용하지 않으면 서로의 메모리 영역을 공유할수 없기때문에 프로세스들 사이의 변수를 공유할수 없다.
    • Context Switching
      • CPU에서 여러 프로세스가 돌아가면서 작업을 처리할때의 과정을 말한다. 이때 동작중인 프로세스가 대기를 하며 해당 프로세스의 상태(Context)를 보관하고, 대기하고 있던 다음 순서의 프로세스가 동작하면서 이전에 보관했던 프로세스의 상태를 복구하는 작업을 말한다.

 

멀티스레드

  • 멀티 스레드란 하나의 프로세스를 여러개의 스레드를 통해 서로 자원을 공유하며, 이를 통해 작업처리 속도를 향상시키는 것이다.
  • 이때, 다수의 스레드가 특정 자원을 동시에 사용한다, 따라서 동기화 처리가 필요하며 동기화를 통해 스레드의 적업 처리 순서와 공유자원에 대한 접근을 제어해야한다.
  • 멀티스레드의 장점
    • 멀티 스레드는 상대적으로 멀티 프로세스보다 적은 메모리 공간을 차지한다.
    • 스레드는 Heap영역을 공유하므로 서로 데이터를 주고 받는 것이 간단해진다.
  • 멀티스레드의 단점
    • 반면 위에서 말한 자원 공유의 문제 즉 동기화 문제가 존재하며 서로의 Heap영역을 공유하기때문에 하나의 스레드에 문제가 발생하면 전체 프로세스가 영향을 받는다.
    • 이때 하나의 스레드가 죽는다해서 무조건적으로 모든 스레드가 죽는것은 아니다. 각 스레드가 얼마나 동기화 되어있는지에 따라 하나의 스레드가 죽더라도 다른 스레드가 죽지 않을수있다.(근데 만약 하나의 스레드가 죽어 모든 스레드가 죽게된다면 프로세스는 terminate된다)

 

 

프로세스 스케줄링 기법

  1. FCFS(First Come First Served)
    • 비선점형(Non-preemptive) 스케쥴링으로, 먼저 온 프로세스부터 처리하는 스케쥴링이다.
    • 단점
      • convoy effect(소요시간이 긴 프로세스가 먼저 도착하면 효율이 떨어진다)가 발생할수 있다.
  2. SJF(Shortest - Job - First)
    • 비선점형 스케쥴링으로, 다른 프로세스가 먼저오더라도 실행시간이 가장 짧은것 부터 처리하는 스케쥴링이다.
    • 단점
      • starvation(특정 프로세스의 동작시간이 지나치게길면 영원히 CPU를 할당받지 못하는현상)이 일어날수있다.
  3. SRT(Shortest Remaining time First)
    • 선점형 스케쥴링 으로, 새로운 프로세스가 도착할때마다 새로운 스케쥴링이 이루어진다.
    • 현재 수행중인 프로세스보다 짧은 동작시간을 가지는 프로세스가 들어오면 CPU를 재할당한다.
    • 단점
      • SRT또한 starvation이 생길수 있고, 새로운 프로세스가 도착할때마다 스케쥴링을 다시하기 때문에 CPU사용시간을 측정할수 없다.
  4. Priority Scheduling
    • 우선순위가 가장 높은 프로세스에게 CPU를 할당한다. (우선순위는 정수로표현하며 작은 정수일수록 우선순위가 높다)
    • 우선순위 스케줄링은 선점방식, 비선점방식 두방법 모두 가능하다.
    • 선점형 스케쥴링 방식을 사용하면, 더 높은 우선순위를 가진 프로세스가 도착하면 실행중인 프로세스를 멈추고 CPU를 선점한다.
    • 비선점형 스케쥴링 방식을 사용하면, 더 높은 우선순위인 프로세스가 들어오더라도 ready queue의 앞에 집어넣고 현재 실행중인 프로세스가 끝날때까지 기다린후 실행된다.
    • 단점
      • Starvation이 발생할수있다. 이때 발생하는 Starvation은 aging 기법으로 해결할수 있다.
    • 해결법
    • aging이란 아무리 우선순위가 낮은 프로세스라도 오래 기다렸으면 우선순위를 높여주어 Starvation을 예방한다.
  5. Round Robin
    • 현대적인 CPU 스케줄링
    • 각 프로세스는 동일한 크기의 할당 시간을 갖게 된다.
    • 할당 시간이 지나면 ready queue의 제일뒤에가서 다시 자기 차례가 올때까지 대기한다.
    • Round Robin은 CPU사용시간이 랜덤한 프로세스들이 섞여있을 경우에 효율적이다.
    • 단점
      • 할당 시간이 너무 커지면 FCFS와 같아지고, 너무작으면 잦은 contest switch로 overhead가 발생할수있다. 따라서 적정한 할당시간을 설정해야한다.

 

 

PCB,TCB

  • PCB(Process Control Block)
    • PCB란 특정 process의 정보를 저장하는 데이터 구조이다.
    • 프로세스의 상태, 메모리 할당, 그리고 process가 사용중인 resource등의 정보를 포함하고 있으며, 운영체제는 PCB에 있는 정보를 사용하여 프로세스의 실행을 관리한다.
  • TCB(Thread Control Block)
    • TCB란 스레드의 실행상태, 스택포인터, 프로그램 카운터등 스레드의 실행을 관리하기 위해 운영체제에서 필요로 하는 기타 정보를 포함하여 특정 스레드에 대한 정보를 저장하는 데이터 구조이다.
    • 다중 스레드 환경에서 각 스레드는 고유한 TCB를 가지고 있지만, 프로세스 내의 모든 스레드는 동일한 PCB를 공유한다.

 

 

Hyper-threading

  • Hyper-threading기술이란 다중 스레드 소프트웨어 응용 프로그램의 성능을 향상시키는 데 사용되는 기술이다.
  • 하이퍼 스레딩 기술을 통해 물리적 코어 하나가 두개의 논리적 코어로 나타나도록 작동을 하며 각각은 별도의 명령 스트림을 실행할수 있다.
  • 이 기술을 통해 운영체제는 단일 물리적 코어에서 더 많은 스레드를 예약할수 있수 있으므로 사용 가능한 병렬 처리의 활용도가 향상된다.

728x90

'CS' 카테고리의 다른 글

CS) Synchronous & Asynchronous  (0) 2023.02.12
CS) Function,Predicate  (0) 2023.02.08
CS) Functional Programming  (0) 2023.02.08
CS) Mutable,Immutable  (0) 2023.02.08
CS) Tokenizer,Lexer,Parser  (0) 2023.02.08

CS) Function,Predicate

2023. 2. 8. 18:16
728x90
  • FunctionPredicate에 정의된 메서드를 알아본다.

Function에 정의된 메서드

test(T t), andThen(), compose(), identity()
test(T t) -> Function에 존재하는 abstract method로 하나의 argument 를 받아 boolean을 return해준다.

Function<Integer, Integer> f1 = x -> x + 1;
Function<Integer, Integer> f2 = x -> x * 2;

// Apply f2 after f1
Function<Integer, Integer> f4 = f1.andThen(f2);
System.out.println(f4.apply(2));  // Outputs 6

// Compose f2 before f1
Function<Integer, Integer> f3 = f1.compose(f2);
System.out.println(f3.apply(2));  // Outputs 5

위 코드에서 f1.andThen(f2)는 f1을 실행한뒤 f2를 실행한다.
즉 f1에 의하여 x->3 이되고 f2에의하여 x->6이된다.

f2.compose(f1)은 f2을 실행한뒤 f1를 실행해 결과값이 5가된다.

identity 는 항등함수로서 함수를 적용하기 이전과 이후 동일한 결과가 필요할때 사용한다.
람다식으로 표현해보면 x -> x 이다.


Predicate에 정의된 메서드

test(), and(), or(), negate(), isEqual()

test() -> 추상메서드로서 우리가 원하는 타입의 파라미터를 통해 boolean을 return해준다.

List<String> list = Arrays.asList("apple", "banana", "cherry", "date");

Predicate<String> p1 = s -> s.length() > 4;
Predicate<String> p2 = s -> s.startsWith("c");
Predicate<String> p3 = Predicate.isEqual("apple");

// Use and to combine predicates
Predicate<String> pAnd = p1.and(p2); //and사용
System.out.println("Words with length greater than 4 and starting with 'c':");
list.stream().filter(pAnd).forEach(System.out::println);

// Use or to combine predicates
Predicate<String> pOr = p1.or(p2); //or사용
System.out.println("Words with length greater than 4 or starting with 'c':");
list.stream().filter(pOr).forEach(System.out::println);

// Use isEqual to compare for equality
System.out.println("Words that are equal to 'apple':");
list.stream().filter(p3).forEach(System.out::println);
    //출력
Words with length greater than 4 and    starting with 'c':
cherry
Words with length greater than 4 or      starting with 'c':
banana
cherry
apple
Words that are equal to 'apple':
apple
  • 위 코드는 and or isEqual 을 사용한 예제이다.
    and()를 사용하여 글자수가 4이상이며 c로 시작하는 단어를 찾으면 결과값으로 cherry가 나오는것을 볼수있다.

  • negate()는 조건식 전체를 부정하는 메서드이다.
List<String> list = Arrays.asList("apple", "banana", "cherry", "date");

Predicate<String> p = s -> s.length() > 4;
System.out.println("Words with length greater than 4:");
list.stream().filter(p).forEach(System.out::println);

// Use negate to reverse the result of the predicate
Predicate<String> pNegated = p.negate();
System.out.println("Words with length less than or equal to 4:");
list.stream().filter(pNegated).forEach(System.out::println);
Words with length greater than 4:
banana
cherry
date
Words with length less than or equal to 4:
apple
  • 위 코드를 보면 .filter(pNegated) 로 인해 글자의 크기가 4이하인 단어 apple이 출력되는것을 볼수있다.

Reference

  • Java의 정석
728x90

'CS' 카테고리의 다른 글

CS) Synchronous & Asynchronous  (0) 2023.02.12
CS) 프로세스와 스레드  (0) 2023.02.08
CS) Functional Programming  (0) 2023.02.08
CS) Mutable,Immutable  (0) 2023.02.08
CS) Tokenizer,Lexer,Parser  (0) 2023.02.08

CS) Functional Programming

2023. 2. 8. 17:58
728x90

명령형, 선언형 프로그래밍

  • 명령형 프로그래밍이란 특정 기능을 수행하기 위해 어떻게(how)에 집중하는 방식을 의미한다.
//명령형 프로그래밍의 예시
List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
int result = 0;
for(int n:list){
        if(n%2==0){
            result +=n;
        }
}
System.out.println("result = " + result);
//출력
//result = 30
  • 선언형 프로그래밍이란 특정기능을 수행하기위해 무엇(what)에 집중하는 방식이다.
//선언형 프로그래밍의 예시
List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
int result = 0;
result = list.stream()
        .filter(n-> n%2==0)
        .mapToInt(Integer::intValue)
        .sum();
System.out.println("result = " + result);
//출력
//result = 30

함수형 프로그래밍

함수형 프로그래밍이란

  • 함수형 프로그래밍은 선언형 프로그래밍을 따르는 대표적인 프로그래밍 패러다임이다.
  • 함수형 프로그래밍은 함수들의 집합으로 프로그램이 구성된다.

함수형 프로그래밍을 사용하는 이유

  • 기존 명령형 프로그래밍으로 개발한 소프트웨어의 크기가 커짐에 따라 복잡하게 엉켜있는 코드를 유지보수하기가 너무힘듬, 이를 해결하기위해 함수형프로그래밍을 사용하여 작은 문제를 해결하기 위한 함수를 작성하여 가독성을 높이고 유지보수를 용이하게 해준다.

함수형 프로그래밍의 특징

  1. 순수함수(Pure Function)
  • 동일한 입력값에 대해서 항상 같은값을 반환한다(참조 투명성). 또한 전역변수를 사용하거나 변경해서 예상하지 못한 Side effect(부수효과)를 발생시키지 않는다.

    private String name = "chanyoun";

      //Not Pure 
      public String greeting() {
          return "Hello " + name;
      }

      //Pure function 
      public static String greeting(String name) {
          return "Hello" + name;
      }
  • Pure function은 name(입력) 에 대해 항상 같은 결과 Hello + name 를 가진다 따라서 참조 투명성의 특성을 가지며, 함수가 결과값 외 다른 상태를 변경시키지 않으므로 Side effect가 없다고 볼수있다.
  1. No Iterate
    • for,while문에는 가변적인 값들과 처리에 대한 코드가 섞여있어 반복문을 사용하지않는다.대신 map,filter같은 함수를 매개변수로 받는 메서드를 이용한다.
  2. 불변의 자료구조(Immutable)
  3. 일급 객체
    • 일급객체란 다음과 같은 것들이 가능한 객체이다.
      • 함수를 변수 혹은 특정 데이터 구조에 담을수 있다.
      • 함수를 파라미터를 통해 전달할수있다
      • 함수를 결과로 반환할수 있다.
      • 할당에 사용된 이름과 무관하게 고유한 구별이가능하다.
    • 자바에서 일급객체는 함수형 인터페이스(추상 메서드가 하나인 인터페이스)를 통해 구현이 가능하다.

Lambda,Stream에 관하여

Reference

728x90

'CS' 카테고리의 다른 글

CS) 프로세스와 스레드  (0) 2023.02.08
CS) Function,Predicate  (0) 2023.02.08
CS) Mutable,Immutable  (0) 2023.02.08
CS) Tokenizer,Lexer,Parser  (0) 2023.02.08
CS) DOM  (0) 2023.02.08

CS) Mutable,Immutable

2023. 2. 8. 17:50
728x90
CS08 immutable,mutable

사전적 의미

immutable: 불변의 mutable: 변할수 있는


Immutable, Mutable

Immutable이란 객체의 수정을 허용하지 않는다. 즉 이미 존재하는 객체이더라도 새로운 객체를 생성하여 재할당 한다.

Mutable이란 객체가 생성된 이후 수정이 가능하며, 이미 존재하는 객체에 재할당(값 변경)한다.

Immutable의 예로 String class가 존재한다.

String text = "kimchi";
System.out.println("text = " + text);

 text = "delicious";
System.out.println("text = " + text);

        //result
//      text = kimchi
//      text = delicious

위 코드에서 text = "delicious"에 의해 text는 새로운 객체를 할당받아 값이 바뀐것이다.


반면 아래와 같이 String이 아닌 StringBuilder를 통해 객체를 만든다고 가정해보자.

StringBuilder text = new StringBuilder();
text.append("Hello");
text.append("World");
System.out.println("text = " + text);

		//result
//      text = HelloWorld

이때는 append를 통해 text에 새로운 문자열을 추가한다. -> 문자열을 추가할때마다 객체가 재할당 되는 형태가 아니다.



Immutable, Mutable 특징

Mutable과 Immutable을 정리해보자면 다음과 같다.

ImmutableMutable
생성된 이후 수정이 불가능하며 값변경시 새로운 객체를 할당받는다.생성된 이후 수정이 가능하며 이미 존재하는 객체에 재할당(값을 변경)한다.
값을 변경할수 있는 메소드를 제공한다(위에서 .append)값을 변경할수 있는 메소드를 제공하지 않는다.
Wrapper Class, String Class..StringBuffer,StringBuilder..
병렬 프로세스나 쓰레드에 안전하다.병렬 프로세스나 쓰레드 사용시 값을 보장하지 못한다.


Reference

728x90

'CS' 카테고리의 다른 글

CS) Function,Predicate  (0) 2023.02.08
CS) Functional Programming  (0) 2023.02.08
CS) Tokenizer,Lexer,Parser  (0) 2023.02.08
CS) DOM  (0) 2023.02.08
CS) HTML,XML  (0) 2023.02.08

CS) Tokenizer,Lexer,Parser

2023. 2. 8. 17:40
728x90

컴파일러

  • 컴파일러란 고급언어로 작성된 프로그램을 번역해 기계어로된 프로그램을 만들어 주는 역활을 한다.
  • 이때 구문분석 -> 최적화 -> 코드생성 -> 링킹의 과정을 거치는데, 구문분석 과정에서 소스코드는 Tokenizer, Lexer, Parser를 차례로 거친다. 이포스팅에선 구문분석에 대해 알아 보겠다.

Tokenizer, Lexer

  • Tokenizer란 어떤 구문에서 의미있는 요소들을 의미있는 단위의 토큰으로 쪼개는 역활을 한며 Lexer토큰의 의미를 분석하는 역활을 한다 이두역활을 합쳐 Lexical Analyze라 한다.
  • 예를들어 ex) Age is no guarantee of maturity 라는 문장에서 'A','g','e'을 따로 보면 어떠한 의미도없지만 Age라는 하나의 조각을 보면 의미를 갖게된다.
  • 이렇게 의미가 있는 토큰 단위로 그 데이터를 Parser에게 넘겨주게 된다.

Parser

  • ParserLexical Analyze되어 Tokenizer된 데이터를 구조적으로 나타낸다.
  • 이때 Parser에 의해 도출된 결과를 AST(Abstract Syntax Tree)라 한다.

  • AST는 위와 같은 구조로 존재하며, Lexical Analyze된 데이터를 Parser를 통해 컴퓨터가 쉽게 이해할수 있는 구조로 나타낸것이며, 구문 분석 단계의 결과이다.

Reference

728x90

'CS' 카테고리의 다른 글

CS) Functional Programming  (0) 2023.02.08
CS) Mutable,Immutable  (0) 2023.02.08
CS) DOM  (0) 2023.02.08
CS) HTML,XML  (0) 2023.02.08
CS) 객체지향(OOP)  (0) 2023.02.08

+ Recent posts