Skip to content

2주차 월요일 그룹 1

huiseung edited this page Jul 1, 2024 · 19 revisions

프로그램

  • 명령어로 이루어진 실행 가능한 파일

프로세스

  • 운영체제로 부터 자원을 할당 받아 실행중인 프로그램, 'Program in execution'
  • 자원 관리 단위
  • 메모리의 사용자 영역에 존재
  • CPU, PC-Register, 케시, 메모리 를 필요

할당 받아 사용하는 자원

  • CPU
  • Register
  • Memory
    • 코드 영역 : 실행할 프로그램 코드가 저장되는 부분
    • 데이터 영역 : 전역 변수나 static 변수 등 프로그램이 사용하는 데이터가 저장되는 부분
    • 힙 영역 : 동적 메모리 할당을 위한 부분
    • 스택 영역 : 지역 변수나 함수의 매개변수가 저장되는 부분

PCB (Process Control Block)

정의 PCB는 운영 체제가 각 프로세스를 관리하기 위해 사용하는 데이터 구조입니다. 프로세스의 상태, 카운터, 레지스터, 메모리 관리 정보, 스케줄링 정보 등을 포함합니다.

PCB가 포함하는 정보

  • 프로세스 상태: 새로운, 준비, 실행, 대기, 종료 등의 상태
  • 프로세스 번호: 프로세스 식별자 (PID)
  • 프로그램 카운터: 다음에 실행할 명령어의 주소
  • 레지스터: 프로세스가 실행 중인 동안 사용하는 모든 레지스터
  • 메모리 관리 정보: 페이지 테이블, 세그먼트 테이블 등
  • 회계 정보: CPU 사용 시간, 실제 사용 시간 등
  • 입출력 상태 정보: 할당된 입출력 장치, 열린 파일 목록 등

PCB의 생명 주기

  • 생성: 새로운 프로세스가 생성될 때 운영 체제는 PCB를 생성합니다. 예를 들어, 사용자가 새로운 애플리케이션을 실행하면 운영 체제는 해당 애플리케이션에 대한 PCB를 생성합니다.
  • 소멸: 프로세스가 종료되면 운영 체제는 해당 프로세스의 PCB를 소멸합니다.

Context Switch

  • CPU 가 수행하는 프로세스를 바꾸는 작업
    • 유저 공간에서 인터럽트 발생시 커널 공간 진입
    • 커널 공간에서 Context(레지스터에 값, statck pointer, PC값)를 PCB에 저장한다
    • 스케줄링이 선택한 프로세스의 PCB를 읽어 Context를 체운다
    • 유저 공간으로 전환, PC에 저장된 명령어를 수행한다
  • interrupt 발생시 스케줄링으로 다음 실행할 프로세스를 고르고 Context Switching 을 진행한다

스레드

  • 하나의 프로세스 안의 작업 단위
  • 하나의 프로세스 내에서도 여러 작업들이 병렬적으로 실행될 수 있도록 작업을 나눈 실행단위 스레드는 한 프로세스 내부에 적어도 하나 존재하며 스레드가 여러개 존재하는 것을 멀티스레드라고 한다.

할당 받아 사용하는 자원

  • 프로세스가 힐딩 받은 4가지 메모리 영역(Code, Data, Heap, Stack) 중 스레드는 Stack만 별도로 할당 받아 사용하고 Code, Data, Heap은 프로세스내의 다른 스레드들과 공유한다 .

스레드를 쓰는 이유?

문맥 교환 비용 절감
작업들 간 통신 비용 절감

TCB (Thread Control Block)

정의

TCB는 운영 체제가 각 스레드를 관리하기 위해 사용하는 데이터 구조입니다. 스레드의 상태, 스레드 번호, 프로그램 카운터, 레지스터, 스택 포인터 등을 포함합니다.

TCB가 포함하는 정보

  • 스레드 상태: 실행, 준비, 대기, 종료 등의 상태
  • 스레드 식별자: 스레드 ID
  • 프로그램 카운터: 다음에 실행할 명령어의 주소
  • 레지스터: 스레드가 실행 중인 동안 사용하는 모든 레지스터
  • 스택 포인터: 스레드의 스택 위치를 가리키는 포인터
  • 우선순위: 스레드의 우선순위 정보

TCB의 생성과 소멸

  • 생성: 새로운 스레드가 생성될 때 운영 체제는 TCB를 생성합니다. 예를 들어, 멀티스레딩 애플리케이션에서 새로운 스레드가 시작될 때 TCB가 생성됩니다.
  • 소멸: 스레드가 종료되면 운영 체제는 해당 스레드의 TCB를 소멸합니다.

PCB와 TCB의 비교

  • 범위:
    • PCB는 프로세스 단위로 관리되는 정보를 저장합니다.
    • TCB는 스레드 단위로 관리되는 정보를 저장합니다.
  • 정보:
    • PCB는 메모리 관리 정보, 입출력 상태 정보 등 더 많은 정보를 포함합니다.
    • TCB는 주로 스레드의 실행 상태와 관련된 정보를 포함합니다.

결론 PCB와 TCB는 각각 프로세스와 스레드를 관리하기 위한 중요한 데이터 구조입니다. 이들은 프로세스와 스레드의 생명주기를 관리하고, 적절한 스케줄링과 자원 관리를 가능하게 합니다. 프로세스가 생성되거나 소멸될 때 PCB가 생성되고 제거되며, 스레드가 생성되거나 소멸될 때 TCB가 생성되고 제거됩니다.

멀티 스레드

  • 동기화 문제
    • 스레드가 heap 영역의 공유 데이터에 접근할때, 이전 스레드가 이미 공유 자원을 사용하고 있는 경우 동기화 문제가 발생할 수 있다.
    • 예를 들어, 두 개의 스레드가 동시에 하나의 변수를 수정하려고 할 때, 스레드 컨텍스트 스위칭이 발생하면 변수의 값을 잘못된 값으로 업데이트 할 수 있는 것이다.
    • 이것을 스레드 간에 경쟁 조건 (race condition)이라고 한다.

Java 에서 Thread 사용

main thread

Thread vs Runnale

public class MyThread extends Thread {
    public void run() {
        // 스레드가 실행할 코드 작성
    }
}
MyThread myThread = new MyThread();
myThread.start();
public class MyRunnable implements Runnable {
    public void run() {
        // 스레드가 실행할 코드 작성
    }
}
MyRunnable myRunnable = new MyRunnable();
Thread thread = new Thread(myRunnable);
thread.start();

이미 Thread 를 상속받은 클래스를 오버라이드하는 목적이 아니라면 Runnable을 구현해서 사용하는 것이 좋을 것 같습니다. 하나의 클래스에서 여러 Runnable을 구현할 수 있으므로 더 유연한 설계가 가능합니다. 그리고 ExecutorService 에서도 Runnable 을 구현한 클래스로 스레드 풀을 관리하기 때문에 스레드 관리에 유용합니다.

Executor, ExecutorService

ExecutorService executor = Executors.newFixedThreadPool(5);
    
for (int i = 0; i < 10; i++) {
   executor.submit(new MyRunnableTask(i));
}
    
executor.shutdown();

Executor 는 Runnable 인터페이스를 받아서 execute 메서드를 실행할 뿐인 인터페이스입니다. ExecutorService 도 Executor 인터페이스를 받아 스레드 관리를 위한 메서드를 추가하여 더 확장한 인터페이스입니다. Executors 클래스를 이용하여 ExecutorService 의 구현체를 반환하여 Thread Pool 로 스레드를 관리합니다.

멀티 스레드 동기화 문제 해결법

  • synchronized
  • lock
  • Atomic 자료구조

👼 개인 활동을 기록합시다.

개인 활동 페이지

🧑‍🧑‍🧒‍🧒 그룹 활동을 기록합시다.

그룹 활동 페이지

🎤 미니 세미나

미니 세미나

🤔 기술 블로그 활동

기술 블로그 활동

📚 도서를 추천해주세요

추천 도서 목록

🎸 기타

기타 유용한 학습 링크

Clone this wiki locally