본문 바로가기
dev/Linux

Linux 프로세스 (Process)

by Kyulee 2021. 9. 10.
반응형

1. Process 생성

program 실행 : system

#include <stdlib.h>
int system (const char*string);
  • 새로운 프로그램을 실행하는 가장 간단한 방법
  • 실행할 프로그램명을 인자로 지정

예제

 

 

ps : 현재 실행 중인 프로세스의 목록을 보는 명령어

  • -e : 실행 중인 모든 프로세스의 정보를 출력한다.
  • -f : 프로세스에 대한 자세한 정보를 출력한다.
  • -u : 특정 사용자에 대한 모든 프로세스의 정보를 출력한다.
  • -p : pid로 지정한 프로세스의 정보를 출력한다.

 

Process 생성 : fork

#include <sys/types.h>
#include <unistd.h>
pid_t fork(void);
  • 새로운 프로세스를 생성 : 자식 프로세스는 반환 값이 0을 가진다. (return value 0)
  • fork 함수를 호출한 프로세스를 부모 프로세스라고 했을 때, 자식 프로세스는 부모 프로세스의 메모리를 복사
  • 부모 프로세스와 자식 프로세스는 열린 파일을 공유

 

fork를 활용한 병렬 처리와 일반 처리와 얼마만큼 차이?

소수를 구하는 함수를 활용해서 연산 시간을 통해 연산의 차이를 확인해 보도록 하자.

4개의 병렬 처리를 위해 두 번의 fork 함수를 호출 pid가 0, 0이 아닌 값을 통해 각각의 프로세스에 접근을 통한 처리를 진행한다.

 

 

 

clock함수로 출력된 시간은 ms(0.001s)이다. 이에 CLOCKS_PER_SEC로 나누어 s(초)로 결과를 확인한다.

 

fork 함수를 여러 개 호출하면 어떤 식으로 구조를 이루는가? 아래의 블로그를 참조

https://kjwsx23.tistory.com/117

 

2. exec 함수 활용

exec 함수군

  • exec로 시작하는 함수들로, 명령이나 실행 파일을 실행
  • exec로 함수가 실행되면 프로세스의 메모리 이미지는 실행파일로 교체

exec 함수군의 형태

#include <unistd.h>
int execl(const char *path, const char *arg0,
						 ..., const char *argn, (char *) 0);
int execv(const char *path, char *const argv[]);
int execle(const char *path, const char *arg0, 
						 ..., const char *argn, (char *)0, char *const envp[]):
int execve(const char *path, char *const argv[], char *const envp[]);
int execlp(const char *file, const char *arg0, ..., const char *argn, (char *)0);
int execvp(const char *file, char *const argv[]);
  • path : 명령의 경로 지정
  • file : 실행 파일명 지정
  • arg#, argv : main 함수에 전달할 인자 지정
  • envp : main 함수에 전달할 환경변수 지정
  • 함수의 형태에 따라 NULL 값 지정에 주의

exec 함수군과 fork 함수

fork로 생성한 자식 프로세스에서 exec 함수군을 호출

  • exec 함수군
    • 자식 프로세스의 메모리 이미지로 대체
    • 부모 프로세스 이미지는 사라짐
  • 부모 프로세스와 다른 프로그램 실행 가능
  • 부모 프로세스와 자식 프로세스가 각기 다른 작업을 수행
    • fork와 exec 함수를 함께 사용

 

 

3.  프로세스 동기화 함수

프로세스 동기화 : wait

#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(int *stat_loc);
  • stat_loc : 상태 정보를 저장할 주소.
  • wait 함수는 자식 프로세스가 종료할 때까지 부모 프로세스를 기다리게 함
  • 부모 프로세스가 wait 함수를 호출하기 전에 자식 프로세스가 종료하면 wait함수를 즉시 리턴
  • wait 함수의 리턴 값은 자식 프로세스의 PID
  • 리턴 값이 -1 이면 살아있는 자식 프로세스가 하나도 없다는 의미
  • >> (shift) 연산을 통해 stat_loc의 저장된 값을 8비트를 이동하면 원하는 자식 프로세스의 리턴값을 알 수 있음.

 


학교에서 배운 이론에 대해 각각의 예제 문제들이 있으나 과제에 대한 부분도 있고, 혹시 몰라 같이 올리진 않겠습니다.

내용에 대한 궁금한 사항이나, 수정이 필요한 부분이 있어 댓글로 남겨주시면

수정하도록 하겠습니다.

 

추가적으로, makefile에 대한 내용을 조만간 정리해서 포스팅을 하겠지만

본 내용을 실습하면서 같이 makefile에 대한 내용을 학습했는데 친구들이 어려움을 겪는 것 같아 남깁니다.

 

반응형

'dev > Linux' 카테고리의 다른 글

Linux 소켓 (socket)  (0) 2022.01.12
Linux 쓰레드 (threads)  (0) 2021.09.12
Linux 파일 전송 및 가져오기 SCP 명령어 ( & zip)  (0) 2021.09.04