Program vs Process

  • 프로그램 : 실행할 프로그램 + 데이터, 컴퓨터 시스템에 실행 요청 전의 상태
  • 프로세스 : Running program, 실행을 위해 시스템(커널)에 등록된 작업, 시스템 성능 향상을 위해 커널에 의해 관리됨

Process ID(PID)

  • Process에 부여된 식별 번호(유일성)
  • Parent process : 자신을 생성한 프로세스, 모든 프로세스는 부모 프로세스가 있음
  • parent process id(ppid)

getting pid / ppid

#include <sys/types.h>
#include <unistd.h>

pid_t getpid(void);
pid_t getppid(void);

Process group

  • 관련된 process들을 묶은 것 ex) shell script 내부의 명령어들
  • 하나의 job 수행을 목적으로 하는 process들
  • Process group에 전달된 signal은 그룹 내 모든 프로세스에게 전달됨
  • process group leader가 존재
  • process group id(pgid) = group leader의 pid

getting process group id

#include <unistd.h>

pid_t getpgid(pid_t pid);
pid_t getpgrp(void);
  • pid : group id를 얻으려는 pid, 0이라면 실행 중인 프로세스
  • return : pgid, -1 : error

setting process group id

#include <unistd.h>

int setpgid(pid_t pid, pid_t pgid);
  • 프로세스 그룹 변경(pid의 그룹을 pgid로 옮김, 같은 세션 내의 그룹)
  • pid = 0인 경우, 실행 중인 프로세스
  • pgid = 0인 경우, pgid를 pid로 설정

Session

  • 사용자가 로그인 해 작업하고 있는 터미널 단위로 프로세스 그룹을 묶은 것
  • 프로세스 그룹의 상위
  • 사용자 로그인 시, 새로운 session이 생성됨
  • process group과 interrupt unit을 연결하는 방법
  • 하나의 foreground process group과 0개 이상의 backgroud process group을 가짐
  • foreground process group : 사용자의 입력을 받는 process group, terminal을 통해 전달되는 signal을 받음
  • background process group : foreground process group 외의 process group, output은 terminal에 출력됨
  • session leader : login shell process
  • session id = session leader pid

getting / setting session ID

#include <unistd.h>

pid_t getsid(pid_t pid);
pid_t setsid(void);
  • 새로운 session 생성
  • setsid를 호출한 process가 현재 session의 리더가 아니면, 새로운 session을 생성하고 생성된 session의 리더가 됨
  • 생성된 sessoin은 controlling terminal을 갖지 않음

Running time of a process

  • process running time = system running time + user running time
  • system running time : kernel code를 수행한 시간(system call에 소요된 시간)
  • user running time : 사용자 모드에서 수행한 시간(사용자 작성 코드를 실행하는데 걸린 시간)

getting process running time

#include <sys/times.h>

clock_t times(struct tms* buf);
  • buf : running time 정보를 저장할 tms 구조체의 포인터
  • return
    • 특정 시점부터 경과한 시간
    • -1 : error

Example

#include <sys/types.h>
#include <sys/times.h>
#include <time.h>
#include <limits.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>

int main(void) {
        time_t t;
        struct tms mytms;
        clock_t t1, t2;

        if ((t1 = times(&mytms)) == -1) { perror("times 1"); exit(1); }

        sleep(5); // process가 멈추는 시간

        for (int i = 0; i < 999999; i++) time(&t); // if문은 user mode시간, time은 system mode시간

        if ((t2 = times(&mytms)) == -1) { perror("times 2"); exit(1); }

        printf("Real time : %.1f sec\n", (double)(t2 - t1) / sysconf(_SC_CLK_TCK));
        printf("User time : %.1f sec\n", (double)mytms.tms_utime / sysconf(_SC_CLK_TCK));
        printf("System time : %.1f sec\n", (double)mytms.tms_stime / sysconf(_SC_CLK_TCK));
        return 0;
}

Environment variables

  • Process 실행환경에 정의되어 있는 변수
  • 환경변수 명은 관례적으로 대문자 사용
  • 시스템마다 원하는 파일의 경로가 달라질 수 있기 때문에 환경변수를 등록해서 유연하게 처리

Example

#include <stdlib.h>
#include <stdio.h>

extern char **environ;

int main(void) {
        char **env;

        env = environ;
        while (*env) {
                printf("%s\n", *env);
                env++;
        }

        return 0;
}
#include <stdio.h>

int main(int argc, char** argv, char** envp) {
        char** env;

        env = envp;
        while (*env) {
                printf("%s\n", *env);
                env++;
        }

        return 0;
}

getting environment variables

#include <stdlib.h>

char* getenv(const char* name);
  • name : 읽어올 환경변수 명
  • return : 환경변수 값 주소, NULL : error

setting environment variables

#include <stdlib.h>

int putenv(char* string);
int setenv(const char* name, const char* value, int overwrite);
  • 환경 변수 추가
  • process에 의해 추가된 환경 변수는 자신과 자식 프로세스에게만 유효
  • string ex) "SHELL=/usr/bin/csh"

unsetting environment variables

#include <stdlib.h>

int unsetenv(const char* name);
  • 환경 변수 삭제
  • name : 삭제할 환경 변수
  • return
    • 0 : success
    • -1 : error

 

'💻 Computer Science > System' 카테고리의 다른 글

[System] 시그널  (1) 2024.01.25
[System] 프로세스 관리  (1) 2024.01.25
[System] 시스템 정보  (0) 2024.01.24
[System] Files in Unix/Linux  (1) 2024.01.24
[System] High-Level File I/O  (1) 2024.01.24