![[워밍업 클럽 CS 3기] 2주차 발자국](https://cdn.inflearn.com/public/files/blogs/f28a62a6-44e4-4e37-8e63-ac1e6eca1b69/336224.png)
[워밍업 클럽 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개 이상씩 풀고 오전에는 예습, 저녁에는 강의 듣는 것이 목표입니다.
댓글을 작성해보세요.