본문 바로가기

컴퓨터공학기초 개념/운영체제41

23. 코드를 통한 프로세스 실행과정의 이해 - 지금까찌 프로세스를 이해하기 위한 다양한 개념들을 배웠다. - 실제 코드를 보면서 그동안 익힌 프로세스 개념들을 복습해보자. 1. 예제 코드를 통한 프로세스의 이해 #Include #Include #Include #Include Int main() { int fd; fd = open("data.txt".O_RDONLY); if(fd == -1) { printf("Error: can not open file\n"); /* 파일을 열지 못하므로 그냥 종료 */ return 1; } else { printf("File opened and now close_\n"); close(fd); return(); } } a) 위의 소스코드가 실행되기까지의 과정 소스코드가 컴파일 된다. 컴파일된 소스코드로 이루어진 실.. 2021. 4. 28.
22. 프로세스 - IPC 기법(signal, socket) - IPC 기법이란, 컴퓨터 구조적으로 불가능한 커뮤니케이션 간의 소통을 가능하게 하는 일종의 우회방법이다. - 다양한 IPC 기법이 존재하지만, 가장 많이 사용하고 있는 signal과 socket이 있다. - 사실 signal과 socket은 IPC를 위해서 만들어진 기능은 아니지만, IPC가 가능하기에 많이 사용되고 있다. - signal과 socket의 개념을 간단하게 알아보자. 1. Signal 기법이란? 유닉스에서 30년 이상 사용된 전통적인 기법 어떤 커널 또는 프로세스에서 다른 프로세스에게 어떤 이벤트가 발생되었는지를 알려주는 기법 프로세스 코드에 시그널 핸들러를 등록하여, 해당 시그널을 처리하는 방식으로 동작한다. a) Signal 이란? 시그널은 운영체제에 기본적으로 정의되어 있는 이벤트.. 2021. 4. 27.
21. 프로세스 - IPC기법(공유메모리) 1. 공유메모리(shared memory) 기법 커널 영역에 메모리 공간을 만들고, 해당 공간을 변수처럼 쓰는 방식 message queue처럼 FIFO 방식이 아니라, 해당 메모리 주소를 마치 변수처럼 접근하는 방식 공유 메모리의 key를 가지고, 여러 프로세스가 접근 가능 2. 공유메모리 예제 코드 a) 공유메모리 생성 및 주소 얻기 shmid = shmget((key_t)1234, SIZE, IPC_CREAT|0666)) // shmid = shared memory id shmaddr = shmat(shmid, (void *)0, 0) // shmaddr = shared memory address b) 공유 메모리에 쓰기 strcpy((char *)shmaddr, "Linux Programming".. 2021. 4. 26.
20. 프로세스 - IPC 기법(메세지 큐) 1. 메세지 큐(Message Queue) 큐(Queue) 자료구조를 이용한 IPC 기법 기본적으로 FIFO 방식으로 데이터를 전송한다. a) 그림으로 보는 메세지 큐 기법 간단하게, A라는 프로세스에서 데이터를 insert하면 B라는 프로세스에서 받아오는 방식으로 통신한다. b) 메세지 큐 예제 코드 - 간단한 예시 코드를 통해 메세지 큐의 개념을 살펴보자. 프로세스 A에서 데이터를 삽입 msqid = msgget(key, msgflg) // key는 1234, msgflg는 옵션 msgsnd(msqid, &sbuf, buf_length, IPC_NOWAIT) // msgsnd = message send 프로세스 B에서 프로세스A가 삽입한 데이터를 반환받는다. msqid = msgget(key, msg.. 2021. 4. 23.
19. 프로세스 - IPC 기법(파일, 파이프) - IPC 기법을 온전히 이해하기 위해서는 코드를 기반한 이해가 가장 적합하다. - 이를 위해서는 C언어 기반의 지식을 알고 있어야 하고, 실제로 IPC 기법을 구현한 코드를 이해하기는 그 복잡성으로 인해 쉽지않다. - 그러므로 이번 포스팅에서는 각 IPC 기법의 특징과 개념을 이해하는 것에 중점을 두자. 1. File 사용 기법 shared.txt와 같은 파일에 현재 커널 영역의 상태 정보를 기입한다. 통신이 필요한 프로세스의 상태정보를 알기위해 shared.txt 파일을 읽고 확인하다. 이 과정을 반복한다. a) File 사용기법을 잘 사용하지 않는 이유 프로세스에서 통신이 필요할 때마다 매번 shared.txt 파일을 읽어야 한다. 프로세스의 커널 영역의 상태정보가 변할 때마다 해당 파일을 upda.. 2021. 4. 22.
18. 프로세스 - IPC의 개념 1. IPC(Inter-Process Communication) 배경지식 - 운영체제에서 프로세스 간의 직접적인 커뮤니케이션(= 통신) 방법은 존재하지 않는다. - 그러나 프로세스 간의 커뮤니케이션이 필요할 때, 사용할 수 있는 방법을 IPC라고 한다. a) 프로세스간 통신이 불가능한 이유 프로세스는 다른 프로세스의 공간을 접근할 수 없다. 이는 프로세스의 데이터나 코드가 바뀔 가능성을 없애기 위함이다. (프로세스 데이터 변경가능 = 해킹 위험성) b) 프로세스간 통신이 필요한 이유 요즘 CPU는 코어를 적게는 8개, 많게는 64개까지 갖고있다. CPU의 효율/성능을 높이기 위해 여러 코어를 동시에 활용하도록 다수의 프로세스를 동시에 실행시킨다. 다양한 프로세스를 동시에 실행시키는 경우, 프로세스간의 상.. 2021. 4. 21.
17. 프로세스 구조 - 컨텍스트 스위칭(context switching) 1. Context Switching 이란? 어떤 프로그램을 실행하기 위해서는 해당 프로그램을 스케줄러에 등록한다. 스케줄러에 등록된 프로그램을 프로세스 A라고 하자. 프로세스 A의 상태가 ready에서 running으로 전환되면서 소스코드가 읽히면서 프로세스 메모리에 차곡차곡 쌓이게 된다. 이때, 다른 프로그램인 프로세스 B를 실행하려고 한다. 프로세스 A는 block 또는 ready 상태로 변하고, 프로세스 B의 상태가 running으로 바뀌게 된다. 프로세스가 바뀌는 이 과정을 컨텍스트 스위칭이라고 하는데 , 이 과정에서 PC와 SP가 중요한 역할을 한다. 2. 어떤 과정을 거칠까? - 간단한 예제를 이용하여 컨텍스트 스위칭이 어떻게 진행되는지 알아보자. int global_data1; int gl.. 2021. 4. 20.
16. 프로세스 구조(4) - BSS와 Data 1. BSS와 Data 영역 프로세스 구조에서 Data 영역은 BSS와 Data 영역으로 나뉜다. a) BSS - 초기화 값이 없는 전역변수를 의미한다. b) Data - 초기화 값이 있는 전역변수를 의미한다. 2. 코드를 통해서 살펴보자 - 예제 코드 int global_data1; //초기화 값이 없는 변수 int global_data2 = 1; // 초기화 값이 있는 변수 int main() { int *data; data = (int *) malloc(sizeof(int)); *data = 1; printf("%d\n", *data); return 0; } - 프로세스 - 딱 두가지만 확인하자. main 함수 내부에 있는 변수(= 지역변수)는 Stack에 쌓인다. main 함수 밖에 있는 변수(=.. 2021. 4. 15.
15. 프로세스 구조(3) - Heap 1. Heap 이란? Heap은 개발자에 의해 동적으로 할당되는 메모리 영역이다. 파이썬과 같은 최신언어는 동적할당을 요구하지 않는다. 하지만, 컴퓨터의 내부 요소까지 모두 조절할 수 있는 C언어의 경우 동적할당은 필수적이다. a) 어떻게 동적할당을 할까? #include #include int main() { int *data; // 포인터 변수(주소값을 갖고 있다) data = (int *) malloc(sizeof(int)); // C언어에서 int는 32bit = 4bytes의 크기를 갖는다. // data라는 변수는 heap의 메모리 공간에 올라가게 된다. *data = 1;// 포인터 변수의 주소에(= 위치에) 1을 넣는다. printf("%d\n", *data); return 0; } mal.. 2021. 4. 14.