목록전체 글 (253)
bdfgdfg
C#으로 만든 프로그램은 CLR 위에서 실행된다. CLR은 .NET 프레임우크와 함께 OS위에 설치된다. -> 자바의 JVM과 비슷한 역할. C#,JAVA같은 언어에서 컴파일 타임에 코드를 중간 언어(IL)로 바꾸고, 실행 시간에 CLR,JVM과 같은 가상머신을 통해 해당 중간 언어들을 CPU가 이해할 수 있는 바이너리 코드로 변환한다. C# 컴파일러는 C# 소스코드를 IL(Intermediate Language)라는 중간언어로 작성된 실행 파일을 만들어 낸다. -> 물론 해당 언어는 CPU가 이해할 수 있는 코드는 아니다. 사용자가 해당 실행 파일을 실행하면 CLR이 중간 코드를 읽어 들여 다시 CPU가 이해할 수 있는 바이너리 코드로 컴파일 한 후 실행시킨다. 이것을 JIT(Just In Time)컴..
메모리 할당방식 메모리보다 더 큰 프로그램을 메모리에 어떻게 올릴까? 방법은 간단하다. 롤이라는 프로그램을 당장 실행되는 부분만 메모리에 올리고 나머지 부분은 하드디스크에 저장한다. -> 정확히는 하디스크 내 스왑영역이라는 곳에 저장된다. -> 이 기법을 메모리 오버레이이라고 한다. 이 기법을 통해 사용자는 메모리가 적은 컴퓨터를 사용하더라도 크기가 큰 프로그램을 실행시킬 수 있다. 하지만 스왑이라는 과정을 거치기에 메인 메모리가 큰 컴퓨터보다는 느리게 동작한다. -> 스왑 : 스왑영역에 있는 데이터 일부를 메모리로 가져오고(스왑인) 메모리에 있는 데이터를 스왑영역으로 옮기는 것(스왑아웃). 이 과정은 옛날의 일괄처리 방식(한번에 하나의 프로세스만을 처리)에서도 사용된 기법. 그렇다면 멀티프로세스 환경에..
공유자원 멀티스레드 환경에서 스레드는 프로세스의 데이터,힙영역을 공유하게 된다. 여기서 여러 문제점이 발생할 가능성이 생기는데. 예로들어 밑의 코드와 같은 상황. int num = 0; void Inc() { for (int i = 0; i < 100'0000; ++i) num++; } void Des() { for (int i = 0; i < 100'0000; ++i) num--; } int main() { std::thread t1(Inc); std::thread t2(Des); t1.join(); t2.join(); std::cout t1쓰레드에서 num++를 진행하고 결과를 메인 메모리에 반영하기전에 t2쓰레드로 컨텍스트 스위칭이 일어나(혹은 동시실행) num--의 결과를 저장. 다시 t1쓰레드로..
프로그램은 디스크에 저장이 되어있고, 더블클릭을 하여 프로그램이 운영체제의 자원을 할당받아 메모리에 올라오며 실행되는 상태가 프로세스. 이러한 프로세스는 우리 컴퓨터의 메모리에 하나만 올라와있는것이 아니고 여러개가 존재하기에, CPU는 이 모든 프로세스를 돌아가며 실행시켜야 한다. 그 일을 담당하는 것이 바로 스케줄러. 선점형 OS와 비선점형 OS 프로세스의 실행을 다른 프로세스로 넘기는 방식에 따라 선점형 OS와 비선점형 OS를 구분한다. 먼저 비선점형 OS는 현재 실행중인 프로세스보다 높은 우선순위의 프로세스가 등장한다고 해서 실행의 대상을 바로 변경하지 않는다. 새로 등장했거나 높은 우선순위의 프로세스가 실행되기 위해서는 현재 실행중인 프로세스가 CPU 타임 슬라이스를 다 사용했거나 I/O작업으로 ..