[회고] 신입 iOS 개발자가 되기까지 feat. 카카오 자세히보기
반응형

분류 전체보기 495

[운영체제] 분할

분할(Partition) 방법 여러 개의 프로그램을 적재하기 위해 메모리 공간을 여러개로 분할한다. 분할의 수가 다중 프로그래밍 가능의 정도가 된다. 이는 다시 고정분할 방법과 가변 분할 방법으로 나뉜다. 고정분할 방법 고정분할 방법은 분할의 단위가 되는 'Partition'의 크기가 고정된 것이다. 따라서 분할의 수도 고정된다. 이 경우 주소결속 방법이 간단하다.상한 레지스터와 하한 레지스터를 두고,상한 레지스터에는 영역의 크기가, 하한 레지스터에는 영역의 시작주소가 기록된다. CPU가 논리주소로 메모리를 접근하려 하면 먼저 그 논리주소값이 상한 레지스터에 기록된 영역의 크기값을 초과하는지 확인한다. 만약 초과한다면 이를 진행시킬 경우 다른 영역을 침범하게 될 것이므로 에러처리한다. 이러한 문제가 없다..

[운영체제] 메모리 경영

시분할 시스템에서는 여러 프로세스들이 동시에 수행된다. 즉, 여러 프로세스들이 메인메모리 상에 공존하고 있어야 한다. 제한된 용량의 메인메모리에서 이를 제대로 실현시켜 주어야 각 프로세스들의 성능도 저하되지 않고 CPU의 이용률도 올라가게 된다. 이런 맥락에서 이번 장부터는 메인메모리를 관리하는 다양한 기법들을 알아볼 것이다. 분할기법, 페이징기법, 세그먼테이션 기법 등이 그 예이다. 더 중요하다고 할 수 있는 가상 메모리 기법은 다음 파트에서 다룰 것이다. 다양한 기법들을 공부하기 전에 먼저 컴퓨터 시스템의 주소체계에 대한 이해가 필요하다. 따라서, 이와 관련된 개념들인 논리주소, 물리주소, 주소결속 등에 대하여 알아볼 것이다. 프로그램이 돌아가는 과정 int g_a; main() { … g_a++; ..

[운영체제] 교착상태 처리

교착상태 처리 방법 교착상태가 발생하지 않도록 하는 방법과 교착상태를 방치하고 이를 탐지하여 복구하는 방법이 있다. 이에 따라 예방, 회피 / 탐지, 복구로 나뉘어 진다. 교착상태 예방 교착상태 발생의 4가지 필요충분조건 중 한가지만 일어나지 않아도 예방이 된다. "상호 배제" 조건 부정 : 상호배제 조건을 부정하는 것은 사실상 불가능하다. 자원자체가 상호배제를 요구하는 것을 전제로 했기 때문이다. "점유 대기" 조건 부정 : 모든 자원을 실행 전에 미리 확보하도록 한다. 이렇게 되면 대기 자체가 필요없어져 교착상태를 예방할 수 있다. 하지만 자원을 바로 사용하지 않고도 장시간 점유를 해야하기 때문에 다른 프로세스에 악영향을 줄 수 있다. 또한 하나의 프로세스가 자원들을 독점하여 자원의 활용도가 낮아진다..

[운영체제] 교착상태

교착상태 한 프로그램에 공유자원은 여러개이다. 이에 따라 임계구역도 여러곳에 존재한다. 이런 경우 자원의 소유와 대기에 있어 물고 물리는 관계가 되면서 프로그램의 수행이 정지할 수 있다. 이를 '데드락' 혹은 '교착상태'라고 한다. 교착상태는 즉, 서로에게 필요한 자원을 서로 요구하는 경우이다. 각 프로그램이 지켜야할 프로토콜을 설정하여 해결할 수 있다. 예를 들면 반대쪽의 프로그램이 실행중임을 확인하면 한쪽편의 프로그램은 대기하고 있는 것이다. 그러나 이 역시 반대쪽에서 계속해서 프로그램이 등장하면 한쪽편은 기아상태가 발생할 수 있다. (이는 에이징 등의 기법으로 해결한다.) 교착상태의 예 : 세마포어 // T0 P(A); P(B); V(A); // T1 P(B); P(A); V(B); 세마포어에서 각..

[운영체제] 세마포어

Busy Wating 기존에 배웠던 방식의 공통점은 모두 while문을 사용했다. 즉, Busy Wating 알고리즘이다. 이는 무한루프를 돌면서 기다리고, 계속해서 타임슬라이스를 사용하기 때문에 낭비이다. 이에 대한 대안으로 제안된 것이 '세마포어'이다. 하지만 무한루프를 도는 것이 무조건 나쁜 것은 아니다. 커널 내에서 루프를 활용해 임계구역에 락을 거는 것을 'spin lock'이라고 한다. 상호 배제 관계에 있는 임계구역의 계산량이 현저히 적다는 것을 이미 개발자가 알고 있다면 spin lock을 활용하는 것이 세마포어보다 문맥교환의 오버헤드를 줄일 수 있어 효과적이다. 세마포어 세마포어는 임계구역을 진입하기 어려울 때, 자발적으로 '대기(BLOCK)'상..

[운영체제] 임계구역의 조건 및 구현

임계구역에 대한 요구사항 임계 구역을 만들 때 내부를 어떻게 설계해야 제대로 임계구역을 만든 것인가? Mutex (상호 배제, **MUTual EXclusion)** : 한 프로세스가 임계 구역을 실행 중일 때는 다른 어떤 프로세스도 임계구역을 실행할 수 없다. 진행 : 임계구역을 실행하는 프로세스가 없고 여러개의 프로세스들이 임계구역에 들어오려고 시도하면 이 중 하나의 프로세스만 선택하는 '결정 기법'이 있어야 하며, 이러한 결정은 무한정 미뤄져선 안된다. 제한된 대기 : 한 프로세스가 임계 구역에 대한 진입을 요청하고 요청이 수락될 때까지, 다른 프로세스가 임계구역을 실행하는 횟수에는 제한이 있어야 한다. 어떤 프로세스든 일정 시간 내에는 임계구역에 들어갈 수 있도록 다른 프로세스에 제..

[운영체제] 생산자, 소비자 쓰레드 / 원소적 실행

생산자/소비자 쓰레드 #include #include void consumer (void); char buffer[n]; int n, in = 0, out = 0; int main () { char nextp; int i; pthread_t tid; pthread_create (&tid, NULL, consumer,NULL); for (i = 0; i < 500; i++) { produce an item in nextp while ((in+1) % n == out) ; // 대기 loop buffer[in] = nextp; in++; in %= n; } pthread_join (tid); } void consumer(void) { char nextc; for (i = 0; i < 500; i++) { w..

[자료구조] Linked List

본 게시글은 대학생이 수업을 듣고 내용을 정리한 것입니다. 따라서 완벽하지 않은 부분이 있을 수 있습니다. 아울러 본 게시글에 포함된 코드들은 대략적인 개념 이해만을 위해 작성된 것으로 완전하지 않은 코드임을 알려드립니다. 링크드 리스트의 개념 링크드 리스트는 데이터를 순서대로 저장해준다. 계속해서 새로운 요소를 추가할 수 있다. 배열과는 다르게 각 요소는 사실상 독립적인 레퍼런스에 위치해있다. 각 요소를 노드라고 하고, data 속성과 next 속성을 보유한다. next에는 다음 노드에 대한 레퍼런스가 들어있다. 따라서 실제 메모리에 각 노드들이 여기저기에 흩어져있어도 next속성을 통해 이어진 것처럼 활용할 수 있다. 링크드 리스트의 구현 class Node { int a; Node *n; } 노드는..

[운영체제] 상호작용 프로세스와 동기화

상호작용 프로세스 (Cooperating process) 상호작용 프로세스 : 컴퓨터에는 여러 프로세스들이 집합을 이루고 있다. 그런 프로세스들이 서로 상호작용을 한다는 의미이다. 쓰레드끼리의 상호작용도 해당개념에 포함된다. 상호작용이 원활히 되면 좋겠지만 결정성, 상호배제와 동기화, 교착상태, 기아 등의 이슈가 존재한다. 해당 파트에서는 결정성, 상호배제와 동기화에 대해 중점적으로 학습한다. 프로세스 시스템 프로세스 시스템 : 상호작용 프로세스의 모델링이다. 프로세스의 집합과 이들의 선행 제약으로 정의된다. 선행제약 : 프로세스의 집합 내에서 프로세스 간의 제약 관계를 뜻한다. 예들 들어 순서에 대한 제약관계가 있다. 해당 순서관계는 부분 순서의 성질을 갖는다. 즉, 집합에 존재하는 모든 프로세스 간에..

[자료구조] Stack & Queue

본 게시글은 대학생이 수업을 듣고 내용을 정리한 것입니다. 따라서 완벽하지 않은 부분이 있을 수 있습니다. 아울러 본 게시글에 포함된 코드들은 대략적인 개념 이해만을 위해 작성된 것으로 완전하지 않은 코드임을 알려드립니다. Stack Insert/Delete만 제공 Push/Pop이라고 부름 Last in, First Out 성능 : Push O(1), Pop O(1) Stack Pointer(SP) : 스택의 최상위 부분. 주로 다음 저장될 위치, 즉 빈 공간을 지칭한다. Stack의 구현 int Stack[N]; int SP; int init() { SP = 0; } int isEmpty() { return SP == 0; } int Push(int x) { Stack[SP] = x; SP++; } ..

반응형