🎁[속보] 인프런 내 깜짝 선물 출현 중🎁

[인프런 워밍업 클럽 스터디 3기] CS - 2주차 발자국

2주차 학습 내용 정리

 

운영체제

프로세스 동기화

프로세스는 독립적으로 실행되기도 하지만, 다른 프로세스와 데이터를 주고받으며 통신하는 경우도 있다. 프로세스 간 통신은 여러 방식으로 이루어질 수 있다.

프로세스 간 통신 방법

  • 한 컴퓨터 내에서의 통신

    • 파일을 이용한 방법: 여러 프로세스가 하나의 파일을 읽고 쓰며 통신

    • 파이프를 이용한 방법: 운영체제가 생성한 파이프를 통해 데이터 교환

    • 쓰레드를 이용한 방법: 한 프로세스 내 쓰레드들은 코드, 데이터, 힙 영역을 공유하므로 전역변수나 힙을 통해 통신 가능

  • 네트워크를 이용한 통신

    • 소켓 통신: 운영체제가 제공하는 소켓을 이용한 통신

    • RPC(원격 프로시저 호출): 다른 컴퓨터에 있는 함수를 호출하는 방식

공유자원과 동기화 문제

프로세스 간 통신 시 공동으로 이용하는 변수나 파일을 공유자원이라고 한다. 여러 프로세스가 공유자원에 접근할 때 각 프로세스의 접근 순서에 따라 결과가 달라질 수 있다.

컨텍스트 스위칭으로 인한 시분할 처리 때문에 어떤 프로세스가 먼저 실행될지 예측하기 어렵고, 이로 인해 연산 결과를 예측하기 힘든 동기화 문제가 발생한다.

임계구역과 상호배제

임계구역(Critical Section): 여러 프로세스가 동시에 사용하면 안 되는 영역

상호배제(Mutual Exclusion) 메커니즘의 요구사항:

  1. 임계영역에는 동시에 하나의 프로세스만 접근해야 함

  2. 여러 요청이 있어도 하나의 프로세스만 접근 허용

  3. 임계구역에 들어간 프로세스는 빠르게 나와야 함

동기화 해결 방법

세마포어(Semaphore)

  • 상호배제 메커니즘의 한 종류

  • 정수형 변수로 구현됨

  • 공유 자원의 개수에 따라 초기값 설정

  • wait() 함수로 시작하고 signal() 함수로 종료

  • 단점: wait()와 signal() 함수를 잘못 사용할 경우 문제 발생

모니터(Monitor)

  • 세마포어의 단점을 해결한 상호배제 메커니즘

  • 프로그래밍 언어 차원에서 지원하는 방법

  • 자바의 synchronized 키워드가 대표적 예시

데드락(교착상태)

데드락은 여러 프로세스가 서로 다른 프로세스의 작업이 끝나기를 기다리다가 아무도 작업을 진행하지 못하는 상태를 말한다.

교착상태의 필요조건

교착상태가 발생하기 위해서는 다음 4가지 조건이 모두 충족되어야 한다.

  1. 상호배제: 한 프로세스가 자원을 점유하면 다른 프로세스와 공유할 수 없음

  2. 비선점: 프로세스가 자원을 빼앗길 수 없음

  3. 점유와 대기: 프로세스가 자원을 가진 상태에서 다른 자원을 기다림

  4. 원형 대기: 점유와 대기 관계가 원형을 이룸

데드락 해결 방법

교착상태 회피(Deadlock avoidance)

  • 자원 할당 시 교착상태가 발생하지 않는 수준의 자원만 할당

  • 안정 상태(Safe state)와 불안정 상태(Unsafe state)로 구분

  • 은행원 알고리즘: 전체 자원과 프로세스의 최대요구자원을 고려해 자원 할당

교착상태 검출 및 해결

  1. 가벼운 교착상태 검출: 타이머를 이용

    • 일정 시간 동안 프로세스가 작업을 진행하지 않으면 교착상태로 간주

    • 체크포인트로 롤백하여 해결

  2. 무거운 교착상태 검출: 자원 할당 그래프 이용

    • 프로세스들 간 자원 점유와 대기 관계를 그래프로 표현

    • 순환구조가 생기면 교착상태로 판단

    • 교착상태를 일으킨 프로세스를 강제종료하고 체크포인트로 롤백

프로그래밍 언어와 프로세스

프로그래밍 언어 유형

컴파일 언어

  • 개발자가 작성한 코드를 컴파일 과정을 거쳐 기계어로 변환

  • 컴파일 과정에서 문법 오류 검사

  • 실행 속도가 빠름

  • C, C++, C# 등이 해당

인터프리터 언어

  • 코드를 한 줄씩 해석해 실행

  • 실행 시 오류가 발생할 수 있음

  • 컴파일 언어보다 속도가 느림

  • JavaScript, Python, Ruby 등이 해당

코드 실행 방식

컴파일 방식

  • 전체 코드를 기계어로 변환 후 실행

  • 실행 전 타입/문법 검사로 안정성 확보

  • 빠른 실행 속도 (C, C++, Java 등)

  • 처리 과정: 코드 → 전처리기 → 컴파일러 → 어셈블러 → 링커 → 실행파일

인터프리터 방식

  • 코드를 실행 시점에 한 줄씩 해석

  • 별도의 컴파일 과정 없음

  • 실행 속도는 상대적으로 느림 (JavaScript, Python, Ruby 등)

프로세스의 메모리 구조

프로세스는 네 가지 메모리 영역으로 구성된다.

  1. 코드 영역: 실행할 코드가 저장된 영역

  2. 데이터 영역: 전역변수나 배열이 저장되는 영역

  3. 스택 영역: 지역변수, 함수 매개변수, 함수의 리턴 주소 등이 저장

  4. 힙 영역: 동적 메모리 할당이 이루어지는 영역

프로그램 실행 과정

  1. 사용자가 프로그램 실행 → 운영체제가 프로세스 생성

  2. exe 파일의 코드와 데이터 영역을 프로세스의 해당 영역에 로드

  3. 빈 스택과 힙 영역 할당

  4. PCB(Process Control Block) 생성하여 관리

  5. 프로그램 카운터를 코드 영역의 첫 주소로 설정

  6. CPU 스케줄링에 따라 프로세스 실행

메모리

메모리의 종류와 특징

  1. 레지스터

    • 가장 빠른 기억장소로 CPU 내에 존재

    • 휘발성 메모리

    • CPU 비트(32비트/64비트)를 결정

    • 계산 시 메인메모리 값을 레지스터로 가져와 처리

  2. 캐시

    • 레지스터와 메인메모리 사이의 중간 매개체

    • 필요할 것 같은 데이터를 미리 가져와 저장

    • 여러 레벨로 구성(L1, L2, L3)

  3. 메인메모리(RAM)

    • 운영체제와 실행 중인 프로그램이 올라가는 공간

    • 휘발성 메모리

    • HDD/SSD보다 빠르지만 비싸서 실행 중인 프로그램만 저장

  4. 보조저장장치(HDD, SSD)

    • 비휘발성 메모리

    • 가격이 저렴하고 용량이 큼

    • 데이터 영구 저장에 적합

메모리 주소

  • 물리 주소: 실제 메모리의 위치(하드웨어 관점)

  • 논리 주소: 사용자 관점에서의 주소

  • 절대 주소: 메모리 관리자가 바라본 실제 프로그램 위치

  • 상대 주소: 컴파일러가 0번지로 가정한 주소

메모리 관리 방식

유니프로그래밍 환경

  • 메모리 오버레이: 큰 프로그램을 작게 나눠 일부만 실행

멀티프로그래밍 환경

  1. 가변 분할 방식

    • 프로세스 크기에 따라 메모리 할당

    • 장점: 내부 단편화가 없음

    • 단점: 외부 단편화 발생

  2. 고정 분할 방식

    • 정해진 크기로 메모리 분할

    • 장점: 구현이 간단하고 오버헤드가 적음

    • 단점: 내부 단편화 발생

  3. 버디 시스템

    • 2의 승수로 메모리 분할

    • 장점: 가변/고정 분할 방식의 단점 최소화

    • 외부 단편화 방지에 용이하며, 내부 단편화도 최소화


자료구조와 알고리즘

재귀(Recursion)

재귀는 어떠한 것을 정의할 때 자기 자신을 참조하는 방식이다. 재귀 함수는 자기 자신을 호출하는 함수로, 반드시 탈출조건(기저조건)이 있어야 한다.

재귀 함수의 특징

  • 콜스택에 함수 호출이 쌓임(FILO 구조)

  • 탈출조건이 없으면 스택 오버플로우 발생

  • 구현 시 자기 자신이 이미 구현되어 있다고 가정하면 쉽게 작성 가능

재귀적 사고 패턴

  1. 단순 반복 실행: 성능은 for문보다 떨어짐

  2. 하위 문제 결과 기반 계산: 팩토리얼 같은 문제에 적합

    • 하향식 계산: 재귀를 통해 큰 문제를 작은 문제로 분할하여 해결

    • 상향식 계산: for문이나 재귀로 작은 문제부터 해결하여 큰 문제 해결

하노이 탑

재귀 함수의 대표적인 예시로, 하향식 계산의 좋은 사례입니다.

  • 세 개의 기둥과 크기가 다른 원반들로 구성

  • 규칙: 한 번에 하나의 원반만 이동, 작은 원반 위에 큰 원반이 올 수 없음

  • 하위 문제로 분할하여 해결

정렬 알고리즘

버블 정렬(Bubble Sort)

가장 간단한 정렬 알고리즘 중 하나로, 인접한 두 요소를 비교하여 정렬한다.

특징

  • 구현이 매우 간단함

  • 성능은 O(n²)으로 좋지 않음

  • 매 반복마다 가장 큰 요소가 마지막으로 이동

선택 정렬(Selection Sort)

정렬되지 않은 영역에서 최솟값(또는 최댓값)을 찾아 정렬된 영역의 끝에 배치하는 알고리즘이다.

특징

  • 구현이 간단함

  • 성능은 O(n²)으로 좋지 않음

  • 정렬된 영역과 정렬되지 않은 영역으로 구분하여 처리

두 정렬 알고리즘 모두 이해와 구현은 쉽지만, 대용량 데이터나 성능이 중요한 경우에는 더 효율적인 정렬 알고리즘을 사용하는 것이 좋다.

 


벌써 2주차가 지나갔다. 이번주에 강의를 몰아듣게 되어 학습 후에 머리속에 정리가 되지 않았는데 발자국을 작성하며 학습정리에 도움이 된거 같다. 남은 기간은 미리 강의를 듣고 미리 잘 정리해두도록 해야겠다.

 

 

참고 출처

https://www.inflearn.com/course/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EA%B8%B0%EB%B3%B8

https://www.inflearn.com/course/%EB%B9%84%EC%A0%84%EA%B3%B5%EC%9E%90-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C

댓글을 작성해보세요.


채널톡 아이콘