일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 |
- spring
- binary semaphore
- cpython
- 토스NEXT
- 자료구조
- Garbage Collecting
- Java
- 해시테이블
- Demand Paging
- MappingRegistry
- 카카오 기술면접
- 토스공채
- 토스 합격
- 카카오 블라인드 공채
- HandlerMapping
- 2022 블라인드 공채
- 카카오 면접 후기
- 컴공 3학년
- 카카오 코딩테스트
- 운영체제
- 인덱스 자료구조
- 카카오
- Python
- 프로세스
- 토스면접
- spring boot
- 스케쥴링 알고리즘
- 경주로 건설
- HashTable
- 토스코테
- Today
- Total
목록운영체제 (10)
weasel의 우당탕탕 개발기
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/kWF4a/btrMkf5Gu3y/MzLxd8OYmj2aNKJ4vISEU0/img.png)
이전편 : 가상 메모리 지역성 페이지 교체 알고리즘에 대해 언급하기 전에 먼저 지역성이라는 것에 대해서 알아야 한다. 시간 지역성 (Temporal Locality ) : 현재 참조된 메모리가 가까운 미래내에 참조될 가능성이 높음 loop,subroutine,stack 공간 지역성 (Spatial Locality) : 하나의 메모리가 참조되면 주변의 메모리가 참조될 가능성이 높음 Array 순회, 명령어의 순차실행 프로그램의 메모리 참조는 고도의 지역성을 가진다. 임의의 시간 Δt 내에 프로그램의 일부분만을 집중적으로 참조한다는 것이다. 이러한 지역성이 있기 때문에 적절한 페이지 교체 알고리즘이 중요하다. 왜 중요할까? 예를 들어서 주기적으로 두개의 페이지만 참조하는 로직이 있다고 해보자. 만약 그 두개..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/2o3Ps/btrMrTM3Bny/SN7GRtcRrSYBDdUzTcWWw1/img.png)
난 운영체제가 제일 재밌고 좋다. 최고👍 세마포어와 뮤텍스를 본격적으로 얘기하기에 앞서서 두 방법이 나오게 된 문제상황인 Race Condition과 Critical-Section을 먼저 소개한다. Race condition 두 개 이상의 프로세스가 공유 데이터에 대해서 동시에 접근하고 조작하려하는 상황을 의미한다. 즉 Race라는 뜻 그대로 하나의 자원을 놓고 서로 경쟁하려는 상태이다. 이 공유된 데이터의 마지막 값은 어느 프로세스가 마지막으로 끝내는지에 따라 달려있다. 만약 interleaved execution(서로 번갈가면서 명령어 수행시) 데이터의 무결성이 침해받는다. → 불확실성 이것을 예방하기 위해서, 동시에 진행되는 프로세스는 반드시 동기화가 되어야 한다. Critical-Section 이..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bfSTBS/btrMrxQOqnA/YNqJ1fB4Ugcz2Ap7bcYWV0/img.png)
이전편 : 페이징 가상 메모리 (Virtual Memory) 가상 메모리는 논리적 메모리와 물리 메모리를 분리시켜, 프로세스 전체가 메모리내에 올라오지 않아도 실행가능하도록 하는 기법이다. 물론 프로그램이 실행되기 위해서는 메모리에 프로세스가 올라와야 하는것은 맞다. 하지만 특정 부분을 실행할때는 그 부분만 메모리 위에 올라와있어도 구동이 된다. 그렇기 때문에 논리적 주소공간은 실제 물리적 주소공간보다 훨씬 커도 된다. 왜냐면, 어차피 일부만 실행할때 필요하니까.. 그럼 가장 핵심적인 기술은 프로세스를 실행할때, 필요한 메모리를 불러오고(swapped in) 필요하지 않은 부분은 내리는(swapped out) 과정이 필요하다. 가상메모리는 요구 페이징(Demand Paging) 이라는 기술로 구현된다. ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/dEMfpz/btrMqsPIgYN/Ofp4fuivoe4A566fn4I79k/img.png)
운영체제의 핵심 부분인 하나인 메모리 관리에 대해서 적겠다. 대략 3편으로 구성되며 페이징,가상메모리,페이지 교체 알고리즘 순이다. MMU CPU는 프로세스를 구동할 때 PC를 참조해서 다음 명령어를 메모리에서 가져온다. 명령어를 참고해 필요한 데이터가 있으면 메모리에서 가져오는데 이때 주소체계가 서로 다르다. 아래의 그림처럼 base와 limit 레지스터 안에 있는 값들을 조합해서 CPU가 사용하는 주소(논리 주소)와 실제 메모리 주소(물리 주소)를 구할 수 있다. 그러면 왜 두 주소를 구분하였을까? 가장 큰 이유는 보안이다. Limit 레지스터를 둠으로써, P1이 P2의 메모리 영역을 참조하는 Memory Illegal Access를 방지하는 Protection의 기능을 수행한다. MMU는 Memor..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bIi7Tp/btrMkgcpEpD/uKHRm7eK33SCrBhcc5Cl91/img.png)
일단 프로세스 스케쥴링 알고리즘에 대해서 언급하기 전에, 프로세스의 상태와 Context-Switching에 대해서 알아야 한다. 여러가지 프로세스의 상태를 기반으로 전이(Transition)되며 이를 바탕으로 스케쥴링 알고리즘이 이루어진다. 프로세스의 상태 프로세스의 상태는 OS에 따라서 개수도 다르고, 명칭도 조금 다르지만, 가장 대표적인 그림은 위의 상태와 같다. new : 프로세스가 생성된 상태이다. 이때는 Readuy Queue 안에 들어 있지 않기 때문에 CPU를 받을 대상이 아니다. ready : 프로세스가 CPU를 할당받기 위해 대기하는 상태이다. 보통 Ready Queue 안에 들어와있는 상태라고 얘기한다. 스케쥴링의 대상이 된다. running : 현재 CPU를 할당받아 작업중인 상태다..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/co8tWD/btrMkdNxpjX/pTcFQedYt4uP3AFlvwhkf0/img.png)
프로세스란, 실행중인 프로그램을 의미한다. 프로그램을 실행하기 위해서는 주소공간,파일,메모리 등이 필요한데 운영체제로부터 이런 것을 할당받은 프로그램을 프로세스라 한다. 프로그램은 어떤 작업을 수행하기 위한 파일로써 정적인 상태이고, 프로세스는 그 작업을 수행하는 동적인 상태다. 프로세스의 메모리 구조 프로세스는 아래 그림과 같은 메모리 구조를 띄고 있다. 프로세스는 각자 본인이 사용하는 메모리 영역과 레지스터 값을 가진다. 프로세스의 메모리 영역은 코드,데이터,힙,스택 영역으로 구성된다. 코드 : 사용자가 작성한 프로그램 함수들의 코드가 기계어 명령 형태로 변경되어 저장되는 공간 데이터 : 전역 변수 또는 static 변수 등 프로그램이 사용하는 데이터를 저장하는 공간 스택 : 함수의 복귀주소와 지역변..
운영체제 과제 4(double indirect inode) 테스트 환경 OS : Ubuntu 16.04 gcc : gcc 5.4.0 개요 운영체제 네번째 과제인 double indirect inode에 대한 내용입니다. 크게 fs.c안의 bmap , itrunc함수를 수정하고, fs.h와 file.h, param.h의 값을 조금 수정함으로써 double indirect inode를 구현합니다. 과제 명세 먼저 xv6의 기본적인 inode의 구조에 대한 간단한 구조입니다. dinode 구조체에서 direct block pointer는 12개가 존재하고, 1개의 indirect block pointer가 존재합니다. 그런 구조를 아래와 같이 수정해야합니다. dinode 구조체에서 direct block po..
운영체제 과제 3(LWP) 테스트 환경 OS : Ubuntu 16.04 gcc : gcc 5.4.0 개요 운영체제 세번째 과제인 Light-weight Process인 Thread에 대한 내용입니다. 크게 thread_create, thread_exit, thread_join을 통해 구현됩니다. thread 구현을 위한 proc 구조체 변경사항 int isThread,int numOfThread,int nextThreadId,thread_t tid,void * retval, struct proc*p creator 등을 추가했습니다. 그중에서 creator 멤버는 기존 proc 구조체의 parent와 비슷한 역할을 수행합니다. 이번 설계에서 process와 thread_create를 통해 생성된 threa..
운영체제 과제 2(implementing simple schedulers on xv6) 테스트 환경 OS : Ubuntu 16.04 gcc : gcc 5.4.0 개요 운영체제 두번째 과제인 Implementing simple schedulers (FCFS,MLFQ) 에 대한 내용입니다. 크게 FCFS 정책과 MLFQ 정책을 사용하게끔 분기됩니다. FCFS 과제 명세 : 먼저 FCFS 스케쥴링의 명세는 다음과 같습니다. 먼저 생성(fork())된 프로세스가 먼저 스케줄링 되어야 한다. 스케줄링된 프로세스는 종료되기 전까지는 swithc-out 되지 않는다. 프로세스가 스케쥴링 된 이후 100ticks이 지날때까지 종료되거나 sleeping 하지 않으면 종료해야한다. 실행중인 프로세스가 sleeping으로 ..
운영체제 과제 1 ( Simple User-level Unix Shell) 테스트 환경 : OS : Ubuntu 16.04 gcc : gcc 5.4.0 개요 : 운영체제 첫번째 과제인 Simple User-level Unix shell에 대한 내용입니다. 크게 interactvie mode와 batch mode로 나뉘어지고 사용자가 입력한 명령 혹은 batch file을 읽어와서 명령을 수행하고 그 결과를 출력하는 프로그램입니다. 작동과정 설명 : Interactvie Mode 첫번째로 interactvie mode내에서의 작동 과정과 예시입니다. 크게 사용자로부터 입력을 받아오고, 입력을 특정한 기준을 가지고 분할하여 execvp 함수를 사용하여 처리합니다. fgets() 함수를 통해 사용자에게 입력을..