참고: 이화여대 반효경 교수님의 운영체제 강의, 운영체제와 정보기술의 원리 책, 아래 첨부한 블로그들
프로세스(PROCESS) , 스레드(THREAD) #2
프로세스란
process is a program in execution 실행중인 프로그램
디스크에서 실행파일로 존재하던 프로그램이 메모리에 올라가서 실행되면 프로세스가 된다.
시분할 시스템에서는 여러 프로세스가 함께 수행되어서 CPU를 획득해서 사용하고, 일정 시간이 되면 뺏기는 것이 반복된다.
프로세스의 문맥(context)
프로세스가 실행되면 프로세스만의 독자적인 주소 공간(stack, data, code)을 갖는다.
프로세스가 CPU를 잡게되면 CPU의 PC(program counter)가 프로세스의 code의 어느 부분을 가르키고 있고, 매순간 프로세스의 code에서 instruction을 CPU 안으로 불러들여서 값을 넣고 연산을 하고, 그 결과를 레지스터 또는 프로세스의 메모리에 저장한다.
이러한 과정을 거치는 프로세스가 지금 어느 상태에 와있느냐를 나타내는 것이 프로세스의 문맥이다.
원칙적으로 프로세스는 각자의 주소공간을 가지고 수행되므로 다른 프로세스의 수행에 영향을 미치지 못한다.
프로세스간 협력 메커니즘(IPC : Inter Process Commmunication)
프로세스간의 통신(communication)과 동기화를 이루기 위한 메커니즘
IPC를 통해 하나의 프로세스가 다른 프로세스의 수행에 영향을 미칠 수 있다.
프로세스의 상태(process state)
프로세스는 상태(state)가 변경 되며 수행된다.
*구분
-Blocked : 자신이 요청한 event 가 만족되면 ready
-Suspended : 외부에서 resume(재개)해 주어야 Active
Thread
프로세스내에서 CPU 실행단위
스레드는 프로세스 하나에서 공유할 수 있는 건 최대한 공유한다.
스레드가 동료 스레드와 공유하는 부분
→ Thread 가 여러개여도 task는 하나
멀티 Thread 의 장점
응답성(Responsiveness)
사용자의 입장에서 빠르다.
→ 하나의 프로세스가 스레드를 여러개 두는 경우, 하나의 스레드가 blocked(wait)상태일 때,
다른 스레드가 CPU를 잡고 running 할 수 있어서 응답시간이 빨라진다.
자원 공유(Resource Sharing)
경제성 (Economy, 응답성과 다른 의미로 빠르다는 걸 의미)
Utilization of MP Architectures (MP : Multi Process, CPU가 여러개 있는 환경)
멀티 Thread 단점
아래 블로그 참조함
https://kyu9341.github.io/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C/2020/10/04/OS_Process_Structure/
→ Stack과 Heap은 사실 같은 공간을 공유한다. heap이 메모리의 낮은 주소부터 할당되면 stack은 높은 주소부터 할당된다. 각 영역이 상대 공간을 침범하면 stack overflow, heap overfloew라고 한다.
→Data 영역과 BSS영역을 구분하는 이유?
초기화된 데이터는 초기값을 저장해야해서 Data영역에 저장되어 ROM에 저장된다. 하지만 초기화되지 않은 데이터까지 ROM에 저장한다면 더 큰 사이즈의 ROM이 필요해서 Data영역과 BSS영역으로 나누었다.
*결론 : 프로세스와 스레드의 차이란? (면접 단골 질문)
프로세스는 실행중인 프로그램을 뜻하고, 스레드는 그 프로세스안의 CPU 실행 단위이다.
프로세스는 운영체제에게 메모리 영역(Code, Data, Stack, Heap)을 할당 받고, 운영체제에게는 프로세스가 최소 작업 단위이다.
스레드는 프로세스 내에서 Stack 영역을 제외한 다른 메모리 영역을 다른 스레드와 공유한다.
프로세스는 다른 프로세스와 정보를 공유하려면 IPC(프로세스간 협력 메커니즘)을 이용해야하지만, 스레드는 메모리영역과 다른 자원들을 공유하기 때문에 정보 공유가 더 쉽다.
스레드의 스케쥴링은 운영체제가 담당하지 않아서 프로그래머가 직접 동기화문제를 다뤄야한다.
자바의 정석 ch8 예외처리 학습
키워드 throw를 이용해 고의로 예외를 발생시킬 수 있다.
→ 위의 두 과정을 한줄로 요약할 수 있다.
throw new Exception("고의로 발생시켰음");
Exception 인스턴스를 생성할 때, 생성자에 String을 넣어주면 이 String이 Exception 인스턴스의 메시지로 저장된다. 이 메시지는 getMessage()를 이용해서 불러올 수 있다.
checked 예외 : 컴파일러가 예외 처리 여부를 체크함 (예외처리 필수)
→ Exception과 그 자손
unchecked 예외 : 컴파일러가 예외처리 여부를 체크 안함 (예외처리 선택)
→ RuntimeException과 그 자손
예외를 처리하는 방법 세가지
void method() throws Exception1, Exception2, ... ExceptionN {
// 메서드 내용
}
메서드에 예외 선언한 것
이 메서들를 호출하면 이런 예외가 발생할 것이라고 알려주는 것
이 메서드를 호출하는 쪽에서 예외처리를 해준다. (try-catch문 또는 예외 선언(던지기) )
메서드 내에서 예외처리를 할지, 호출하는 쪽으로 던져서 호출하는 쪽에서 예외처리를 하게 할지는 직접 판단해서 try-catch 문을 어디에 넣을지 결정한다.
Java API문서를 보고 사용하고자 하는 메서드의 선언부와 Throws:를 보고, 이 메서드에서는 어떤 예외가 판단할지 보고 예외처리를 해주는 것이 좋다.
예외 선언 예제
import java.io.File;
public class ExceptionEx16 {
public static void main(String[] args) {
try {
File f = createFile("");
System.out.println(f.getName() + "파일이 성공적으로 생성되었습니다.");
} catch (Exception e) {
System.out.println(e.getMessage() + "다시 입력해 주시기 바랍니다.");
}
}
static File createFile(String fileName) throws Exception {
if (fileName == null || fileName.equals("")) throw new Exception("파일 이름이 유효하지 않습니다.");
File f = new File(fileName);
f.createNewFile();
return f;
}
}
예외 발생 여부에 상관없이 무조건 실행될 코드를 포함한다.
코드 중복을 제거하는 기능
(주말 학습)
아니 그 논문은 추천해 준 건 아니구요 ㅎㅎ 그런 것도 있다 정도입니다. 읽지 말고 다른 자바 공부 더 하시는 걸 추천!
정리 넘 잘하셨네요!