[워밍업 클럽 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개 이상씩 풀고 오전에는 예습, 저녁에는 강의 듣는 것이 목표입니다.