2024. 5. 8. 18:10ㆍ개인 공부
10. 프로그램이 컴파일 되어, 실행되는 과정을 간략하게 설명해 주세요.
프로그램이 컴파일되고 실행되는 과정은 크게 다음과 같습니다:
- 소스 코드 작성: 개발자가 컴퓨터가 이해할 수 있는 언어로 소스 코드를 작성합니다.
- 컴파일러: 소스 코드를 기계어 코드로 변환하는 단계입니다. 컴파일러는 소스 코드를 분석하고 최적화하여 중간 코드나 직접 실행 가능한 기계 코드를 생성합니다.
- 링커: 컴파일된 파일들을 하나로 묶어 실행 가능한 파일을 생성합니다. 이 과정에서 외부 라이브러리나 다른 모듈과의 연결이 이루어집니다.
- 로더: 링크된 실행 파일을 메모리로 적재하고, 실행을 시작합니다. 로더는 필요한 라이브러리와 함께 프로세스의 주소 공간에 적재합니다.
- 링커와 로더의 차이
- 링커: 독립적으로 컴파일된 여러 코드 모듈을 하나의 실행 파일로 합치는 역할을 합니다.
- 로더: 실행 파일을 실제 메모리에 적재하여 실행할 수 있도록 준비하는 역할을 합니다.
- 컴파일 언어와 인터프리터 언어의 차이
- 컴파일 언어: 전체 소스 코드를 미리 기계어로 번역하여 실행 파일을 생성합니다. 실행 속도가 빠르지만, 개발 과정에서의 유연성은 낮습니다 (예: C, C++).
- 인터프리터 언어: 소스 코드를 한 줄씩 읽고 즉시 실행합니다. 개발 및 테스트가 용이하나, 실행 속도가 상대적으로 느릴 수 있습니다 (예: Python).
- JIT이란
- JIT(Just-In-Time) 컴파일러: 컴퓨터 과학 과 프로그래밍 언어에서 사용하는 용어. C나 C++에서 하는 것처럼 프로그램을 실행하기 전에 처음 한 번 컴파일하는 대신, 프로그램을 실행하는 시점에서 필요한 부분을 즉석으로 컴파일하는 방식을 말합니다.
참고 링크 : https://hyeinisfree.tistory.com/26
[Java] JIT 컴파일러란?
JIT 컴파일(just-in-time compilation) 또는 동적 번역(dynamic translation)은 프로그램을 실제 실행하는 시점에 기계어로 번역하는 컴파일 기법이다. 컴파일러 vs 인터프리터 컴파일러와 인터프리터 모두 high
hyeinisfree.tistory.com
- JAVA는 어떤식으로 컴파일 및 실행되는가
- 개발자가 소스 코드를 작성자바 컴파일러(Java Compiler)가 자바 소스파일을 컴파일합니다. 이때 나오는 파일은 자바 바이트 코드(.class)파일로 아직 컴퓨터가 읽을 수 없는 자바 가상 머신이 이해할 수 있는 코드입니다. 바이트 코드의 각 명령어는 1바이트 크기의 Opcode와 추가 피연산자로 이루어져 있습니다.
- 자바 컴파일러가 자바 소스파일을 컴파일합니다. 이때 나오는 파일은 자바 바이트 코드(.class)파일로 아직 컴퓨터가 읽을 수 없는 자바 가상 머신이 이해할 수 있는 코드입니다.
- 컴파일된 바이트 코드를 JVM의 클래스로더(Class Loader)에게 전달합니다.
- 클래스 로더는 동적로딩, 즉 JVM의 메모리에 올립니다.
[Java] 컴파일 과정 | 👨🏻💻 Tech Interview
[Java] 컴파일 과정 들어가기전 자바는 OS에 독립적인 특징을 가지고 있다. 그게 가능한 이유는 JVM(Java Vitual Machine) 덕분이다. 그렇다면 JVM(Java Vitual Machine)의 어떠한 기능 때문에, OS에 독립적으로
gyoogle.dev
- 우리는 흔히 fork(), exec() 시스템 콜을 사용하여 프로세스를 적재할 수 있다고 배웠습니다. 로더의 역할은 이 시스템 콜과 상관있는 걸까요? 아니면 다른 방식으로 프로세스를 적재할 수 있는 건가요?
로더는 fork()와 exec() 시스템 콜을 통한 프로세스 생성 및 실행에서 특히 exec() 호출 시 중요한 역할을 합니다. fork()는 프로세스의 복제를 담당하고, exec()는 실제로 새로운 프로그램을 메모리에 적재하는 데 필요한 로더의 기능을 활용합니다. 따라서, 로더는 프로세스를 적재하는 데 있어 필수적인 컴포넌트입니다.
11. IPC가 무엇이고, 어떤 종류가 있는지 설명해 주세요.
IPC는 하나의 컴퓨터 안에서 실행 중인 서로 다른 프로세스 간에 발생하는 통신을 뜻하는 것으로 메시지 전달 방식과 공유 메모리 방식이 있다.
메시지 전달 방식 : 서로 독립된 공간에 있는 프로세스들이 자원을 공유하기 위해 커널에 있는 공유 공간 속에 데이터를 주고 받는 방식
공유 메모리 방식 : 프로세스들이 주소 공간의 일부를 공유하는 방식
※ 참고
원칙적으로 서로 다른 프로세스 A와 B는 각자 독립적인 주소 공간을 가지므로 자신이 아닌 다른 프로세스의 메모리에 대한 접근은 할 수 없습니다. 그러나 운영체제는 공유 메모리를 사용하는 시스템 콜을 지원해서 서로 다른 프로세스들이 그들의 주소 공간 중 일부를 공유할 수 있도록 합니다다. 즉, 프로세스가 공유 메모리 할당을 커널에 요청하면 커널은 해당 프로세스에 메모리 공간을 할당해줍니다. 이렇게 공유 메모리 구축 시에만 시스템 콜이 발생하고 커널이 직접 자원을 전달하는 것이 아니라 프로세스의 메모리를 접근하게 해줌으로써 어떤 프로세스건 해당 메모리 영역에 바로 접근하게 해줍니다.
공통점과 차이점
공통점:
- 둘 다 시스템의 효율적인 운영을 위해 중요합니다.
- 메모리 관리에 관련된 작업을 수행합니다.
차이점:
- 역할의 차이: 커널은 시스템의 모든 핵심 관리를 담당하는 반면, 공유 메모리는 프로세스 간의 데이터 공유 기능에 초점을 맞춥니다.
- 작동 수준의 차이: 커널은 운영 체제의 가장 깊은 부분에서 작동하는 반면, 공유 메모리는 응용 프로그램 수준에서 프로세스 간 통신을 용이하게 하는 방법입니다.
- 사용자와의 상호 작용: 일반 사용자는 직접적으로 커널과 상호작용하지 않지만, 개발자는 API나 시스템 콜을 통해 공유 메모리를 설정하고 사용할 수 있습니다.
참고 링크 : https://baebalja.tistory.com/359
[운영체제 8편] IPC란 무엇인가
안녕하세요! 개발자 배씨입니다~~ :) 저번 시간에는 인터럽트에 대해서 알아보았어요!! 오늘은 예전부터 언급했던 IPC 가 무엇인지 이제 배워볼게요 ㅎㅎ 지금껏 제가 설명드렸던 프로세스는 각
baebalja.tistory.com
- Shared Memory가 무엇이며, 사용할 때 유의해야 할 점에 대해 설명해 주세요.
공유 메모리는 여러 프로세스가 같은 메모리 영역에 접근하기 때문에 동시성 문제가 발생할 수 있다. 이는 세마포어, 뮤텍스, 락 등을 통해 해결할 수 있습니다.
- 메시지 큐는 단방향이라고 할 수 있나요
메시지 큐(message queue)는 일반적으로 양방향 통신을 지원하는 통신 메커니즘입니다. 즉, 프로세스 간에 메시지를 보내고 받을 수 있으므로, '단방향'이라고 정의하기보다는 '양방향'이라고 할 수 있습니다.
12. Thread Safe 하다는 것은 어떤 의미인가요?
Thread Safe는 다중 쓰레드 환경에서 안전하다는 뜻입니다. 일반 적으로 다음 상황들을 의미합니다.
- 상호 배제(Mutual Exclusion): 공유 자원에 대한 접근을 제한하여 한 번에 한 스레드만 접근할 수 있도록 합니다.
- 상태 공유 방지(State Confinement): 여러 스레드가 공유 상태를 변경하지 않도록 합니다. 즉, 객체의 상태를 변경하는 작업이 안전하게 이루어져야 합니다.
- 원자성(Atomicity): 연산이 원자적으로 실행되어 중간에 중단되거나 중복 실행되는 일이 없도록 보장합니다.
- Thread Safe 를 보장하기 위해 어떤 방법을 사용할 수 있나요?
- 상호 배제(Mutual Exclusion): 여러 스레드가 동시에 공유 자원에 접근하지 못하도록 한다. 대표적인 방법은 잠금(locking)을 사용하는 것입니다. 예를 들어, 스레드가 공유 자원에 접근할 때 잠금을 획득하고 사용이 끝나면 잠금을 해제하는 방식입니다. 이를 위해 뮤텍스(mutex), 세마포어(semaphore) 등의 동기화 메커니즘이 사용될 수 있습니다.
- 불변 객체(Immutable Objects): 객체의 상태가 변경되지 않도록 만들어서 여러 스레드가 안전하게 공유할 수 있도록 합니다. 객체가 한 번 생성되면 그 상태는 변경되지 않으므로 동기화가 필요하지 않습니다.
- 스레드 로컬 변수(Thread-Local Variables): 각 스레드가 자신만의 변수를 사용하도록 만듭니다. 이를 통해 스레드 간의 상태 공유를 방지하고 Thread Safe를 달성할 수 있습니다.
- 원자적 연산(Atomic Operations): 원자적 연산은 다중 스레드 환경에서 안전하게 실행되는 연산입니다. 예를 들어, 원자적으로 변수를 증가시키는 연산은 여러 스레드가 동시에 실행되더라도 안전하게 실행됩니다. 이를 통해 잠금의 오버헤드를 줄일 수 있습니다.
- 동기화 컬렉션(Synchronized Collections): 스레드 안전한 컬렉션은 여러 스레드가 안전하게 컬렉션에 접근할 수 있도록 동기화된 메서드를 제공합니다. Java에서는 Collections.synchronizedList, Collections.synchronizedMap 등의 메서드를 사용하여 동기화된 컬렉션을 생성할 수 있습니다.
- Peterson's Algorithm이 무엇이며, 한계점에 대해 설명해 주세요.
공유 메모리를 활용하여 여러 개의 프로세스가 하나의 자원을 함께 사용할 때 문제가 발생하지 않도록 해주는 알고리즘이다. 다만 3개 이상의 프로세스에 대해서는 처리할 수 없다는 단점이 있다.
- Race Condition 이 무엇인가요?
Race Condition은 다중 스레드 또는 프로세스 환경에서 발생하는 문제로, 두 개 이상의 스레드가 공유 자원에 접근하여 그 자원을 수정하려고 할 때 발생합니다. 이 때 스레드들의 실행 순서에 따라 결과가 달라질 수 있으며, 이로 인해 예상치 못한 동작이 발생할 수 있습니다.
예를 들어, 두 개의 스레드가 같은 변수를 증가시키는 작업을 수행한다고 가정해 봅시다. 첫 번째 스레드가 변수를 읽고 증가시키는 작업을 수행하기 전에 두 번째 스레드가 같은 변수를 읽어 증가시키는 작업을 수행할 수 있습니다. 이 경우 두 스레드가 동시에 변수를 읽은 후 증가시키기 때문에, 최종 결과는 예상치 못한 값이 될 수 있습니다.
락을 사용하는 것이 가장 일반적이지만, 상황에 따라서는 다른 방법을 선택하여 스레드 안전성을 달성할 수 있습니다. 선택한 방법은 애플리케이션의 요구 사항과 성능에 따라 다를 수 있습니다.
- Thread Safe를 구현하기 위해 반드시 락을 사용해야 할까요? 그렇지 않다면, 어떤 다른 방법이 있을까요?
- 원자적 연산(Atomic Operations): 일부 언어 및 라이브러리는 원자적인 증가, 감소, 교환 등의 연산을 제공합니다. 이러한 연산은 다중 스레드에서 안전하게 실행됩니다.
- 불변 객체(Immutable Objects): 객체가 생성된 후에는 내부 상태가 변경되지 않도록 만들면 스레드 안전성을 달성할 수 있습니다.
- 스레드 로컬 변수(Thread-Local Variables): 각 스레드가 자신만의 변수를 사용하여 상태를 관리하면 경쟁 조건을 회피할 수 있습니다.
- 동기화된 자료구조(Synchronized Data Structures): 일부 언어나 라이브러리에서는 동기화된 자료구조를 제공하여 스레드 간의 안전한 데이터 공유를 지원합니다.
'개인 공부' 카테고리의 다른 글
| CS 공부 - 3 (1) | 2024.05.21 |
|---|---|
| @Controller와 @RestController의 차이점 (0) | 2024.05.17 |
| CS 공부 - 2 (0) | 2024.05.13 |
| java stream()이란? (0) | 2024.03.13 |
| 클래스 완성도 높이기 (0) | 2024.03.12 |