앞 포스팅 정리 프로그램을 실행시키면 가상 주소 공간을 할당 받으며 이 공간은 논리 주소로 구성 되어 있다. 이 프로세스를 CPU가 한줄 한줄 읽으면서 실행시키게 되는데 이때 CPU는 논리 주소를 사용하기 때문에 이것을 물리 주소로 변경 해야 제대로 된 메모리를 읽을 수 있다. 이때, 만약 메모리 관리 기법이 연속 할당 기법으로 되어 있는 경우엔 MMU 속의 base register와 limit register를 통해 간단하게 주소를 변환 할 수 있다. 하지만 페이징이나 세그멘테이션과 같은 불연속 메모리 할당 기법을 사용하면 페이징 테이블 또는 세그멘테이션 테이블이라는것이 필요하다. 이 테이블들은 메모리에 있기 때문에 cpu가 프로세스를 실행 시키기 위해서는 1. 페이지 테이블 엑세스를 위한 메모리 접근..
디스크에 있는 프로그램을 실행시키면 그 프로세스(실행중인 프로그램)는 가상 주소 공간(가상 메모리의 공간)을 할당 받는다. 가상 주소 공간은 논리 주소로 이루어져 있는 공간이며 일부는 물리 메모리로 구성 되어 있고 일부는 디스크로 구성 되어 있다. 프로세스를 실행 시키기 위해서는 이 논리 주소를 물리 주소로 바꾸는 변환 과정이 필요한데, 이것이 매핑 되어 있는 테이블이 바로 페이지 테이블이다. 만약 가상 메모리의 어떤 페이지를 읽었는데 그것이 실제 물리 메모리에 있었으면 페이지 hit이다. 하지만, 물리 메모리가 아니라 디스크에 있었다면 페이지 miss가 일어나며 운영체제가 디스크에 있는 페이지를 물리 메모리로 올리는 과정을 해주어야 한다. 그리고 나서 페이지 테이블을 수정하는 역할 까지 담당한다. 페이..
결론부터 얘기하면 동기화를 제공하기 위해선 Lock, 세마포어, 모니터 등의 방법을 사용 할 수 있으나 Lock을 사용하는 방식엔 문제가 있다. 여러개의 프로세스가 하나의 공유자원에 동시에 접근하게 될 경우 공유 자원의 값이 꼬이는 현상이 발생 할 수 있는데 이것을 race condition(경쟁 상태)이라고 한다. 동기화라는것은 내가 알고 있는 정보와 니가 알고 있는 정보가 일치해야 한다는것이다. 프로세스의 관점에서 보면 프로세스 A와 B가 있을때 서로가 알고 있는 공유자원의 값이 같아야 한다는것이다. 공유 자원에 접근하는 코드 영역을 Critical Section(임계 영역)이라고 하는데, 이 임계영역에 프로세스가 동시에 접근하게 되면 경쟁 상태가 발생하는 것이다. 그러므로 동기화( 프로세스 A,B가..
디스크에서 메모리로 로드된 프로그램을 프로세스라고 한다. 즉, 프로세스는 실행중인 프로그램이다. 이 프로세스는 cpu를 할당 받아서 실행되는데 총 3가지 상태가 있다. Ready -> Run -> Block 의 3가지 상태가 있다. 여기서 Run 상태란 프로세스가 CPU를 할당받아 실제로 실행되는 상태이다. 스케쥴링이라는 것은 Ready큐에서 실행을 대기 하는 여러개의 프로세스들의 실행 순서를 결정하는 일이다. 레디 큐에 10개의 프로세스들이 있는데, 이 프로세스들중에 중요한것과 그렇지 않은것들이 섞여있을것이다. 중요도를 기준으로 무엇을 먼저 실행시킬까 하는것이 스케쥴링 알고리즘의 핵심이다. 스케쥴링 알고리즘은 두가지 방식이 있다. 1. 선점형 스케쥴링 - cpu를 할당받은 프로세스가 아직 실행을 끝마치..
Q> 식사하는 철학자 문제란? A> 원탁에 여러명의 철학자가 앉아 있고 철학자의 수만큼의 포크가 철학자들 양옆에 놓여 있다. 만약에 4명의 철학자가 있다면 포크가 4개밖에 없기 때문에 최대 2명의 철학자가 동시에 식사를 할 수 있다. 여기서 철학자를 쓰레드로보고 포크를 공유 자원으로 보자. 각 쓰레드들은 포크(공유자원)를 얻기 위해서 계속 노력할것이다. 그런데 만약 모든 쓰레드들이 왼쪽에 있는 포크를 얻으면 어떻게 될까? 남아 있는 포크가 없는 상태에서 오른쪽 포크를 얻기 위해서 계속 오른쪽 철학자의 포크가 사용 가능해질때까지 기다릴것이다. 즉, 모든 철학자가 밥을 먹지 못하게 된다. 이것이 바로 데드락이다. 한 쓰레드가 얻고자 하는 공유 자원을 왼쪽 쓰레드가 갖고 있고 왼쪽 쓰레드는 또 왼쪽왼쪽쓰레드가..
공유 자원에 접근하고자 하는 두개의 쓰레드 a,b가 있다고 해보자. 이때, 공유 자원은 한번에 하나의 쓰레드만 접근해야 race condition이 발생하지 않기 때문에 하나의 쓰레드가 공유자원을 사용중이라면 다른 쓰레드는 그 쓰레드가 공유 자원을 모두 사용할때까지 기다려야 한다. 이때, 기다리는 쓰레드가 공유 자원을 사용할수 있는지 없는지 계속해서 무한 루프를 돌면서 조건문을 체크하는 방식이 busy waiting이다.이 바쁜대기라고 불리는 busy waiting은 cpu의 자원을 쓸데없이 낭비하기 때문에 좋지 않은 쓰레드 동기화 방식이다. 그렇기 때문에 쓰레드의 동기화를 위해서 busy waiting 방법을 쓸게 아니라 , 뮤텍스 세마포어(mutual exclusion) 또는 모니터를 사용해야 한다...
프로세스들을 하나 만들려면 별도의 주소공간을 할당해야하고 PCB(프로세스 테이블의 한 엔트리)를 만들어야 하기 때문에 좀 무겁다.그렇기 때문에 한 프로세스내에 같은 일이 반복적으로 발생할때에는 쓰레드를 여러개 생성하는게 프로세스를 여러개 생성하는거보다 훨씬 좋다.퍼포먼스가 향상된다( 어떤 쓰레드는 블럭 되더라도 다른 쓰레드는 여전히 실행이 가능하므로)또한 쓰레드는 여러개의 씨피유가 있는 환경에서 병렬적으로 동시에 실행될수 있기 때문에 성능이 대폭 향상된다. 만약 워드 프로세서 응용프로그램을 실행중이라고 치자.사용자로부터 키보드 입력을 받아서 화면에 출력해주는 일이 필요하고, 사용자가 첫 페이지에 한줄을 지웠을때 그 뒤에 입력 되어있던 글들을 앞으로 땡겨주는 일이 또 필요하고, 주기적으로 디스크에 저장을 ..
- Total
- Today
- Yesterday
- useEffect
- es6
- state
- async
- useRef
- reducer
- Polyfill
- await
- reactdom
- promise
- props
- computed
- react
- design system
- storybook
- rendering scope
- mobx
- Action
- react hooks
- reflow
- server side rendering
- typescript
- Next.js
- javascript
- return type
- webpack
- hydrate
- Babel
- type alias
- atomic design
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |