🔥딱 8일간! 인프런x토스x허먼밀러 역대급 혜택

[워밍업 클럽 CS 3기] 2주차 발자국

[워밍업 클럽 CS 3기] 2주차 발자국

운영체제

프로세스 간 통신

→ 한 컴퓨터내에서 파일과 파이프를 이용해서 통신, 쓰레드 통신, 네트워크 통신(소켓, RPC)

→ 공유 자원이란 프로세스가 같이 이용하는 파일, 변수

→ 공유 자원으로 인해 동기화 문제 발생

 

공유자원과 임계구역

→ 임계구역 : 여러 프로세스가 동시에 사용할 수 없는 구역

→ 경쟁조건 : 공유자원을 사용하기 위한 프로세스간 경쟁

→ 임계구역 문제 해결을 위한 상호배제 매커니즘

 

상호배제 메커니즘

→ 한번에 한 프로세스만 임계영역에 접근 가능, 대신 프로세스는 빠르게 나와야함.

→ 컨텍스트 스위칭: 운영체제가 현재 작업을 멈추고 다른 작업으로 전환

 

세마포어(상호배제 매커니즘)

→ 임계구역에 접근할 수 있는 권한 (여러개 존재 가능)

→ 장점: 동기화 문제 해결

→ 단점: 세마포어를 요청 또는 반납 하는 순서가 핵심, 모니터로 해결 가능

모니터(프로그래밍 언어로 해결)

→ 예시: JAVA에서 synchronized가 붙어있으면 동시에 여러 프로세스에서 실행시킬 수 없음

→ 이런식으로 컨트롤하는 것이 모니터

 

데드락

→ 프로세스들이 서로 작업 끝내길 기다리다가 아무도 작업을 하지 못하는 상태

→ 발생이유: 공유 자원

 

데드락 예시: 식사하는 철학자

→ 포크3개 철학자 3개 (포크가 2개 있어야 식사 가능)

 

교착 상태의 필요조건

→ 상호 배제 : 한 프로세스가 리소스를 점유했다면 그 리소스는 공유되어선 X (포크)

→ 비선점: A가 점유한다면 B는 뺏을 수 없다

→ 점유와 대기: 프로세스가 A를 갖고 B를 대기해야…

→ 원형 대기: 점유, 대기하는 관계가 원형

 

데드락 해결

→ 교착 상태 회피: 교착 상태가 발생하지 않는 수준의 자원 할당

→ 최대한 안정상태로 갈수있게, 불안정 상태는 교착 상황이 발생할 확률이 높음

 

은행원 알고리즘

→ 여윳돈과 대출 금액을 보고 안정상황인지 확인하고 돈을 빌려줌

 

알고리즘 구현

→ 운영체제는 시스템의 총 자원을 알아야함

→ 프로세스는 최대 요구 자원을 운영체제에게 알려줘야함

→ 은행원 알고리즘은 비효율적이고 비용이 많이 든다

교착상태는 허용, 그러나 해결할 수 있도록

 

검출 방법

→ 가벼운 교착 상태 검출 (프로세스가 작업을 진행하지 않는다면 교착)

→ 무거운 교착 상태 검출 (프로세스가 그래프로 어떤 자원 사용하는지 살펴보고 교착 상태 파악)

 

컴파일과 프로세스

→ 컴파일 언어

→ 개발자가 코드 작성, 컴파일 되고 실행파일을 만듦

→ 컴파일하면서 오류 검사, 기계어로 실행 파일을 만들기 때문에 속도가 빠름 (C, C++, C#)

 

→인터프리터 언어

→ 실행시 코드를 한줄씩 실행해봄(JS, Ruby, Python)

→ 프로세스 내에는 코드, 데이터,힙(동적 메모리 할당), 스택(지역변수, 매개변수, 함수 리턴주소)

 

전처리기 (전처리 구문 처리, #include, #define, 주석 제거)

컴파일러 (기계어에 가까운 어셈블리어로 만든다)

어셈블러(오브젝트 파일로 변환시킴, 0과1로 구성)

링커(오브젝트 파일을 실행 파일로)

실행 파일( 완벽한 상태의 코드 영역, 데이터 영역 구성)

 

메모리

레지스터

→ 가장 빠름, CPU내에 존재

→ 컴퓨터 꺼지면 날아가서 휘발성 메모리(34bit, 64bit)

→ CPU는 계산 할때 메인 메모리에 있는 값을 레지스터로 가져와 계산하고 다시 메인메모리에 저장

 

램(메인메모리)

→ 레지스터와 메인 메모리 사이에 캐시

→ 운영체제, 프로세스가 올라가는 공간 (휘발성)

 

보조저장장치

→ 가격이 저렴해서 오래 저장 가능 (전원 공급 필요 없음, 비휘발성)

 

캐시

→ 메인메모리에서 필요한 데이터는 미리 가져와 캐시에 저장

→ 단계 별로 L1, L2,… 없으면 메인 메모리를 살펴봄

 

메인 메모리

→ 운영체제는 메모리 관리를 위해 1바이트 크기로 구역을 나누고 주소 매김

→ 32bit는 버스의 크기도 32 bit, 2에 32승으로 메모리도 4GB

 

 

물리 주소 공간

→ 메모리를 컴퓨터에 연결했을때 0x0번지부터 시작하는 주소 공간

논리 주소 공간

→ 사용자 관점에서 바라본 공간

 

경계 레지스터

메모리 관리자가 프로세스가 경계 레지스터를 벗어났는지 검사하고 벗어났다면 프로세스 종료

 

절대 주소(물리 주소 공간), 상대 주소(논리 주소 공간)

→ 컴파일러는 0x0번지라고 생각(상대 주소), 실제 주소는 0x4000번지(메모리 관리자가 보는 절대 주소)

 

메모리 할당 방식

→ 메모리 오버레이란 프로세스를 잘라 당장 필요한 부분만 메모리에 올리고 나머지는 하드디스크에

 

가변 분할 방식(연속 메모리 할당, 세그멘테이션)

→ 프로세스의 크기에 따라 메모리를 나눔

 

고정 분할 방식(비연속 메모리 할당)

→ 프로세스 크기 상관없이 메모리를 나눔

오늘날에는 둘을 혼합하고 있음

 

버디 시스템(2의 승수로 메모리를 할당)

-> 메모리 공간 확보가 간단

-> 내부 단편화가 발생, 많이 낭비되지는 않음

 

자료구조와 알고리즘

재귀

→ 어떤 것을 정의할 때 자기 자신을 참조하는 것

 

콜스택

→ 메모리 공간이 가득차서 자동 종료

→ 함수가 호출되면서 올라가는 메모리 영역 (스택)

→ FILO

→ 재귀 함수가 for문보다 메모리를 더 많이 씀

→ 문제를 더 쉽게 해결하려고 씀 (예: 팩토리얼)

재귀함수는 탈출 조건(기저 조건) 필수

특정 조건이 나오면 알아서 종료가 되어야 함

 

재귀의 패턴

→ 단순 반복 실행을 재귀로 (성능은 좋지 않음)

→ 하위 문제의 결과를 기반으로 현재 문제를 계산(팩토리얼)

→ for문은 상향식 계산, 재귀는 하향식 계산(하위 문제의 결과를 기반으로 현재 문제를 계산)

→ 상향식은 for문과 재귀 둘다 구현 가능, 하향식은 오로지 재귀로만

하노이탑

→ 하향식 문제의 예시

→ 원반 2,1을 기둥B로 옮기는 것이 하위 문제

→ 원반 1을 기둥c로 옮기는 것이 마지막 하위 문제

 

버블 정렬

→ 앞에 있는 숫자와 옆에 있는 숫자를 비교해서 자리를 바꿈

→ BIG-O는 O(N2)

 

선택 정렬

→ 첫번째부터 마지막까지 비교 후 가장 작은 값을 첫번째로

→ 정렬된 영역, 정렬되지 않은 영역으로 구분해서 정렬

→ BIG-O는 O(N2)

→ 버블 선택 모두 직관적이고 이해하기 쉬우나 성능이 나쁨



칭찬할 점: 예습을 좀 했습니다. 확실히 강의 내용이 머리에 더 잘 들어오는 것 같아요.

보완할 점: 재귀의 기저조건 찾는걸 잘 못하는 것 같아요. 재귀 원리는 이해가 되는데 기저 조건을 1인지 0인지 if문 2개로 해야할지..이런게 자꾸 어려워서 더 공부해야 할 것 같습니다.

다음 주 목표: 백준에서 재귀랑 정렬문제 각각 10개 이상씩 풀고 오전에는 예습, 저녁에는 강의 듣는 것이 목표입니다.

댓글을 작성해보세요.

채널톡 아이콘