JAVA 20일차

MOZZI KIM·2022년 11월 18일
0

JAVA

목록 보기
20/21
post-thumbnail

1. 프로세스와 쓰레드의 차이점은?


📌 프로세스(Process) 란?

  1. “컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램”
  2. 메모리에 올라와 실행되고 있는 프로그램의 인스턴스(독립적인 개체)
  3. 운영체제로부터 시스템 자원을 할당받는 작업의 단위
  4. 즉, 동적인 개념으로는 실행된 프로그램을 의미한다.

📌 참고 할당받는 시스템 자원의 예

  1. CPU 시간
  2. 운영되기 위해 필요한 주소 공간
  3. Code, Data, Stack, Heap의 구조로 되어 있는 독립된 메모리 영역

📌 특징

  • 프로세스는 각각 독립된 메모리 영역(Code, Data, Stack, Heap의 구조)을 할당받는다.
  • 기본적으로 프로세스당 최소 1개의 스레드(메인 스레드)를 가지고 있다.
  • 각 프로세스는 별도의 주소 공간에서 실행되며, 한 프로세스는 다른 프로세스의 변수나 자료구조에 접근할 수 없다.
  • 한 프로세스가 다른 프로세스의 자원에 접근하려면 프로세스 간의 통신(IPC, inter-process communication)을 사용해야 한다.
  • Ex) 파이프, 파일, 소켓 등을 이용한 통신 방법 이용

📌 스레드(Thread) 란

  1. “프로세스 내에서 실행되는 여러 흐름의 단위”
  2. 프로세스의 특정한 수행 경로
  3. 프로세스가 할당받은 자원을 이용하는 실행의 단위

📌 특징

  • 스레드는 프로세스 내에서 각각 Stack만 따로 할당받고 Code, Data, Heap 영역은 공유한다.
  • 스레드는 한 프로세스 내에서 동작되는 여러 실행의 흐름으로, 프로세스 내의 주소 공간이나 자원들(힙 공간 등)을 같은 프로세스 내에 스레드끼리 공유하면서 실행된다.
  • 같은 프로세스 안에 있는 여러 스레드들은 같은 힙 공간을 공유한다.
  • 반면에 프로세스는 다른 프로세스의 메모리에 직접 접근할 수 없다.
  • 각각의 스레드는 별도의 레지스터와 스택을 갖고 있지만, 힙 메모리는 서로 읽고 쓸 수 있다.
  • 한 스레드가 프로세스 자원을 변경하면, 다른 이웃 스레드(sibling thread)도 그 변경 결과를 즉시 볼 수 있다.

2. 쓰레드에서 동기화란 무엇인가?

📌 동기화(Synchronization)

여러 스레드가 한 리소스를 사용하려 할 때,
사용하려는 스레드 하나를 제외한 나머지 스레드들은 리소스를 사용하지 못하도록 막는 것을 말한다.

멀티스레드 프로그래밍을 하다보면 스레드를 동기화 해주어야 한다. 스레드를 동기화 하는 이유는 여러 개의 스레드가 같은 프로세스 내의 자원을 공유하면서 작업하는 경우에 서로의 작업이 다른 작업에 영향을 주기 때문이다.

스레드의 동기화를 위해서 임계영역(critical section)과 잠금(lock)을 사용한다.
임계영역을 지정하고, 임계영역이 가지고 있는 lock을 단 하나의 스레드에게 빌려주는 개념이다.
lock은 단 하나의 스레드만이 가질 수 있고, 임계영역에 내에서 수행할 코드를 수행한 이후에는 lock을 반납하여야 한다.


3. 아래가 돌아 가도록 구현하시오.

main(){

ThreadCount threadCount = new ThreadCount();

threadCount.start();


String input = JOptionPane.showInputDialog("아무 값이나 입력하세요."); 

System.out.println("입력하신 값은 " + input + "입니다.");

}


10 9 8 7 6 ...1초마다 실행 되도록 쓰레드를 완성하시오.

=============================================

import javax.swing.JOptionPane;

public class TimeThread {

	public static void main(String[] args) {
		ThreadCount threadCount = new ThreadCount();

		threadCount.start(); 

		String input = JOptionPane.showInputDialog("아무 값이나 입력하세요.");

		System.out.println("입력하신 값은 " + input + "입니다.");

	}

}
class ThreadCount {
	public void start() {
		for (int i = 10; i > 0; i--) {
			System.out.println(i);
			try {
				Thread.sleep(1000);
			} catch (Exception e) {}

		}
		return;
	}
}

4. IO 스트림에 대하여 설명하시오.

📌 스트림(stream)

자바에서는 파일이나 콘솔의 입출력을 직접 다루지 않고, 스트림(stream)이라는 흐름을 통해 다룬다.
스트림(stream)이란 실제의 입력이나 출력이 표현된 데이터의 이상화된 흐름을 의미한다.
즉, 스트림은 운영체제에 의해 생성되는 가상의 연결 고리를 의미하며, 중간 매개자 역할을 한다.

📌 입출력 스트림

스트림은 한 방향으로만 통신할 수 있으므로, 입력과 출력을 동시에 처리할 수 없다.
따라서 스트림은 사용 목적에 따라 입력 스트림과 출력 스트림으로 구분된다.
자바에서는 java.io 패키지를 통해 InputStream과 OutputStream 클래스를 별도로 제공한다.
즉, 자바에서의 스트림 생성이란 이러한 스트림 클래스 타입의 인스턴스를 생성한다는 의미이다.
👉 InputStream 클래스에는 read() 메소드가, OutputStream 클래스에는 write() 메소드가 각각 추상 메소드로 포함되어 있다.
사용자는 이 두 메소드를 상황에 맞게 적절히 구현해야만 입출력 스트림을 생성하여 사용할 수 있습니다.


5. IO 스트림을 이용하여 아래와 같이 프로그램을 완성하시오.


대상 파일: a.java
사본 이름: x:\b.java
파일 복사가 되었습니다.
=====================================================================================

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Scanner;

public class BytesFileCopier {
   public static void main(String[] args) {
      Scanner sc = new Scanner(System.in);
      System.out.print("대상 파일 : ");
      String src = sc.nextLine();
      System.out.print("사본 이름 : ");
      String dst = sc.nextLine();
      
      try(InputStream in = new FileInputStream(src);
         OutputStream out = new FileOutputStream(dst)) {
         int data;
         while(true) {
            data = in.read();
            if(data == -1)
               break;
            out.write(data);
         }
      }
      catch(IOException e) {
         e.printStackTrace();
      }
      System.out.println("파일 복사가 되었습니다.");
      sc.close();
   }
}

6. try catch resource 에 대하여 설명하시오.

Java 7 버전 이전에는 다 사용하고 난 자원(resource)을 반납하기 위해서 try-catch-finally 구문을 사용했다.
Java 7버전 이후에 추가된 try with resources 기능은
try 구문에 리소스를 선언하고, 리소스를 다 사용하고 나면 자동으로 반납(close) 해주는 기능이다.

java.lang.AutoCloseable 인터페이스를 구현하는 객체가
try with resources의 resource로 사용될 수 있다.

try (Scanner scanner = new Scanner(new File("input.txt"))) {
            System.out.println(scanner.nextLine());
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

⭐try옆에 괄호안에서 리소스를 생성⭐합니다.

그리고, 어느 곳에서도 생성된 리소스를 반납하는 코드가 없다.

try with resources 구문을 사용하면 자동으로 리소스가 반납되기 때문이다.

try with resources 구문에 사용 되는 리소스는 (try옆의 괄호 안에서 정의 될수 있는 리소스)

반드시 java.lang.AutoCloseable 인터페이스를 구현해야한다.


7. ⭐balance 가 음수값이 나오는 이유를 설명하시오.⭐

class Account {
	private int balance = 1000;

	public  int getBalance() {
		return balance;
	}

	public void withdraw(int money) throws InterruptedException{
		
		if(balance >= money) {
			//try { 
			Thread.sleep(1000);
			//} catch(InterruptedException e) {}
			balance -= money;
		}
	} // withdraw
}

class RunnableEx21 implements Runnable {
	Account acc = new Account();

	public void run() {
		while(acc.getBalance() > 0) {
			// 100, 200, 300중의 한 값을 임으로 선택해서 출금(withdraw)
			int money = (int)(Math.random() * 3 + 1) * 100;
			try {
				acc.withdraw(money);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			System.out.println("balance:"+acc.getBalance());
		}
	} // run()
}


class ThreadEx21 {
	public static void main(String args[]) {
		Runnable r = new RunnableEx21();
		
		new Thread(r).start(); 
		new Thread(r).start(); 
	}
}
profile
코린이

0개의 댓글