티스토리 뷰

 

  • 프로세스란??

 

개인적으로 처음에 배우기 가장 힘든 과목 중에 하나가 바로 운영체제라고 생각합니다. 

그리고 우분투와 리눅스 시스템과도 익숙하지 않아서 더 힘들었던 것 같습니다.

이번에는 운영체제 중에 프로세스와 그것을 코딩을 통해 실제로 확인했던것을 정리해보려 합니다.

 

일단 프로세스란 것은 간단하게 말하면 실행중인 프로그램입니다.

프로그램과의 차이를 묻는 것도 종종 나오곤 합니다.

여기서 프로그램은 보조기억장치에 존재하며 실행되기를 기다리는 데이터의 묶음 정도로 이해하시면 될 것 같습니다.

 

프로세스의 특징 중에 하나는 바로 여러 개가 동시에 실행된다는 것입니다.

하지만 실제로는 동시에 실행되는 것은 아니고 운영체제에 의해서 CPU가 실행할 프로세스를 끊임없이 교체하여

동시에 실행되는 것처럼 보이게 한다는 것이 특징입니다.

 

프로세스를 효율적으로 관리하는 방법은 다양한 방법이 있으며

이렇게 한정된 자원을 효율적으로 관리하는 것이 운영체제에 있어서 매우 중요한 부분임을 알 수 있습니다.

--> 원래 운영체제라는 것이 하드웨어가 효율적으로 동작할 수 있도록 관리해주는 소프트웨어 프로그램입니다.

 

 

 

  • 프로세스의 구성 및 자주 나오는 용어

 

 

프로세스에 대한 정보는 PCB(Process Control Block)이라는 프로세스 제어블록에 구조체 형태로 저장되어 있습니다.

운영체제는 바로 이 PCB에 있는 정보를 바탕으로 프로세스를 효율적으로 관리하게 됩니다.

이 PCB에는 다음과 같은 정보가 들어있습니다.


PID : 프로세스의 고유 번호

 

프로세스 상태 : 준비, 대기, 블록 상태로 분류하고 상태 전이를 통해 프로세스는 효율적이고 체계적으로 관리됩니다.

 

프로그램 카운터 : CPU가 다음으로 실행할 명령어를 가리키는 값 (마이크로 프로세서에 나오는 PC와 동일합니다.) 

 

스케쥴링 우선순위 : 여러 개의 프로세스 중 CPU에서 실행되는 순서를 결정

권한 :프로세스가 접근할 수 있는 자원을 결정하는 정보

 

부모 프로세스와 자식 프로세스 : 최초로 생성되는 init프로세스를 제외하고는 모든 프로세스는 부모  자식관계를 가지고 있습니다. 따라서 각 프로세스는 자식 프로세스와 부모 프로세스에 대한 정보를 가지고 있게 됩니다.

밑의 예제는 주로 이 관계에 대해 이해를 요하는 예제입니다.

 

프로세스의 데이터와 명령어가 있는 메모리 위치를 가리키는 포인터 : 프로세스는 프로그램 정보를 가지고 있어야 합니다. 이 프로그램으로 갈 수 있도록 포인터 값을 PCB가 가지고 있습니다.

 

실행 문맥 : 마지막으로 실행한 프로세서의 레지스터 내용을 담고 있습니다. 프로세스는 계속 교체되다가 자신의 차례가 되어서 다시 실행될 때는 마치 연속적으로 실행한 것처럼 하기 위해 이 레지스터 정보를 가지고 있습니다.


 

 

 

 

이제 예제 코드를 통해서 프로세스를 직접 생성해 보며 이해해 보도록 합시다.

https://ubuntu.com/

 

The leading operating system for PCs, IoT devices, servers and the cloud | Ubuntu

Ubuntu is an open source software operating system that runs from the desktop, to the cloud, to all your internet connected things.

ubuntu.com

리눅스 환경에서 실행해야 하므로 우분투를 설치해 주시고 실행해주시면 됩니다.

혹시 라즈베리파이를 가지고 있다면 바로 키보드 모니터 연결해주시고 작업해주시면 됩니다.

 

 

먼저 fork()를 활용하여 부모 프로세스에서 자식 프로세스를 생성하여

두 프로세스가 어떻게 동작하는지 확인하고자 합니다.

프로세스는 스케쥴링 정책 상 한 프로세스가 독점하여 사용하지 않고 번갈아가며 실행됩니다.

-> 따라서 부모 프로세스가 일부 실행되고 자식 프로세스가 일부 실행되는 것을 예상할 수 있습니다.

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
31
32
33
34
35
36
37
38
39
40
41
#include <stdio.h>
#include <unistd.h> //UNIX상의 C컴파일러
 
void C_Process(int pid);
void P_Process(int pid);
 
int main(){
 
 
    pid_t pid;
 
    pid = fork(); //자식생성
 
    if(pid<0){ //자식생성 실패
        printf("error!");
 
    else if(pid==0){
       C_Process(getpid());}
    else {
   P_Process(getpid());}
 
return 0;
 
}
 
void C_Process(int pid){
int j=0;
for(j=0;j<201;j++){
 
    printf("This line is from child, ChildPID = %d , value = %d \n", pid, j);
    
}
}
 
void P_Process(int pid){
int j=0;
for(j=0;j<201;j++){
    printf("This line is from Parents, ParentsPID = %d , value = %d \n", pid, j);
}
 
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
cs

 

그리고

 

부모 프로세스에서 단일 프로세서가 아닌 다중 프로세스를 생성하면 실행 순서가 어떻게 되는지 확인하고 싶다면??

 

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
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <stdio.h>
#include <unistd.h>
#include <time.h>
#include <sys/time.h>
 
int main(){
 
    pid_t pid[10];
    FILE *f;
    time_t timer;
    struct tm *t;
    struct timeval val;    
    int j = 0 ;
    int i = 0 ;
    f = fopen("OUT.txt","w");
    for(j=0;j<10 ; j++){
    pid[j] = fork();
    if(pid[j]<0)
        printf("error! \n");
    else if(pid[j] ==0){
    
    printf("ParentsPID : %d \n", getpid());
    for(i=0 ; i<100 ; i++){
        timer = time(NULL);
        gettimeofday(&val,NULL);    
        t = localtime(&timer);
        f = fopen("out_1.txt","a");
        double millsec = ( val.tv_usec)/1000;
        fprintf(f ,"[Process%d  #%d, PID(%d) current time : %dy %dm %dd %dh %dm %dsec %4.0f  mill] \n"
                ,j,i, getppid(),t->tm_year+1900, t->tm_mon, t->tm_mday, t->tm_hour,t->tm_min,t->tm_sec, millsec);
        usleep(1000);
        fclose(f); 
        
 
    else{
    wait(NULL);
    printf("Child has finished %d \n" , pid[j]);
    return 0;
 
}
return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
cs

이것을 실행시켜 보면 자식 프로세스가 여러 개 일 때 부모 프로세스와 -자식 프로세스가 번갈아서 실행되었던 것과 달리

다중 프로세스를 생성하면 자식 프로세스가 순차적으로 실행된다는 것을 볼 수 있습니다.

 

 

 

 

 

이론으로 잘 알고 있다고 하더라도 코딩을 하기에는 막막한 경우가 많습니다.

이것을 보고 조금이나마 도움이 됐기를 바랍니다.

또 직접 실행해 보며 운영체제에 대한 이해에도 도움이 되었으면 좋겠습니다.

 

 

 

 

'공부공부 > 아두이노' 카테고리의 다른 글

GPS이용  (0) 2018.02.19
LED연결  (0) 2018.02.19
아두이노 첫 설명& IDE  (0) 2018.02.13
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
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 31
글 보관함