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 |