프로세스 : 실행 중인 프로그램
- 각 프로세스는 유일한 프로세스 번호 PID를 가짐(0~양수0
- ps 명령어를 사용하여 현 단말기에서 실행된 프로세스들을 볼 수 있다.
쉘의 역할 -> 커널을 사용자들이 마구잡이로 사용하는 것을 막기위한 의도
- 사용자가 명령어를 쓰기 위한 인터페이스같은 존재다.
- 쉘은 사용자와 운영체제 사이의 창구 역할을 하는 프로그램
- 명령어 처리기
- 사용자로부터 명령어를 받아 이를 처리한 후 결과 반환
쉘 실행 절차
- 시작 파일 읽고 실행
- 프롬포트 출력 후 사용자 명령 기다림
- 사용자 명령 기다림
사용자 차원 설정 파일
~/.bash_profile, ~/.bashrc
복합 명령어
- 명령어 열 : 명령어들을 순차적으로 실행
-> $ 명령어1; 명령어2; 명령어3; ...
- 명령어 그룹
- 명령어 그룹의 명령들은 순차적으로 실행되지만, 하나의 명령처럼 표준 입출력, 오류를 공유
-> $ (명령어1;...;명령어n)
전면처리
- 명령어를 입력하면 명령어가 전면에서 실행 -> 명령어 실행이 끝날 때까지 쉘이 기다린다.
$ 명령어
- ^C(강제실행종료)
- ^Z(실행 잠시 중단, 프로세스 종료 X)
- $ fg # 중단된 프로세스를 다시 전면 작업으로 실행
후면처리
- 명령어들이 후면에서 처리되고, 전면에서는 다른 작업을 할 수있어 동시에 여러 작업을 수행할 수 있다.
$ 명령어 &
$ fg %작업번호
후면 처리에서는 입출력 재지정을 이용(전면 처리의 입출력과의 혼동을 해결)
실행 잠시 멈춤 : sleep 초
$(echo 시작; sleep 10; echo 끝) -> 시작 메세지 출력, 10초 후 끝 메세지 출력
실행 강제 종료 : kill[-시그널] 프로세스번호
$(echo 시작;sleep 20; echo 끝) &
[작업 번호]프로세스 번호가 나옴
$kill %작업 번호 또는 $kill 프로세스 번호
wait [프로세스번호]
- 해당 프로세스 번호가 종료될 때까지 기다린다.
- 번호를 지정해주지 않으면, 모든 자식 프로세스를 기다린다.
exit
- 쉘을 종료하고 종료코드를 부모 프로세스에 전달
- $exit [종료코드]
프로그램을 실행시키는 방법
1. 쉘 프롬프트에서 프로그램을 지정하여 실행
2. 프로세스 내에서 exec를 호출하여 다른 프로그램 실행
- 두 방법이 근본적으로 동일
-> C 시작 루틴에 명령행 인수와 환경 변수를 전달하면 ,시작 루틴이 main 함수를 호출
- C 시작 루틴
-> main 함수를 호출하면서 명령행 인수, 환경 변수를 전달
- 종료시
- exit(main(argc,argv)); : main 실행이 끝나면 반환 값을 받아 OS에게 전달하고 스스로 종료
-> argc : 명령줄 인수의 개수, argv[] : 명령줄 인수 리스트를 나타내는 포인터 배열
환경변수 가져오기 getenv();
프로그램 종료
1. 정상 종료 : main()실행을 마치고 리턴하면 C 시작 루틴은 exit()호출
- 프로그램 내에서 직접 exit()호출 : cleanup처리 후 종료
- 프로그램 내에서 직접 _exit()호출 : 즉시종료
2. 비정상 종료
- abort()
- 시그널에 의한 종료
프로세스 ID
- 각 프로세스는 프로세스를 구별하는 번호인 프로세스 ID를 가진다.
- 각 프로세스는 자신을 생성해준 부모 프로세스가 있다.
int getpid(); 현 프로세스 ID 반환
int getppid(); 부모 프로세스의 ID 반환
프로세스의 사용자 ID : getuid 실제 그룹 ID : getgid()
- 프로세스를 실행한 원래 사용자의 사용자 ID
프로세스의 유효 사용자 ID : geteuid 유효 그룹 ID : getegid()
- 현재 유효한 사요자 ID로 새로 파일을 만들거나 파일에 접근할 때 주로 사용
- 보통 유효 사용자 ID와 실제 사용자 ID는 특별한 실행파일을 실행 할 때를 제외하고는 동일하다.
비밀번호 변경은 어떻게하는가?
이는 root만이 접근 가능 하지만 일반 사용자가 passwd를 변경한다.
이는 set-user-id를 사용하여 해결한다.
set-user-id는 유효 사용자 ID는 그 실행파일의 소유자로 바꾼다. 프로세스가 실행하는 동안만.
즉, 유효 사용자 ID 가 root가 되며 패스워드 변경이 가능해진다.
프로그램 상세
- 프로세스는 실행중인 프로그램
- 프로그램 실행을 위해서는 프로그램 코드, 데이터, 스택, 힙, U-영역 등이 필요하다.
-> 5자기 영역으로 구현되어있다.
- 프로세스 이미지(구조)는 메모리 내 프로세스 레이아웃
- 실행 파일 자체는 프로세스가 아니다.
프로세스 구조
1. 텍스트, 코드
- 실행 코드 저장
2. 데이터
- 전역 변수 및 정적 변수를 메모리 영여겡 저장 (bss:초기화 되지 않은 전역, 정적 변수)
3. 힙
- 동적 메모리 할당을 위한 영역
4. 스택
- 함수 호출을 구현하기 위한 실행시간 스택을 위한 영역으로 활성 레코드가 저장
5. U-영역
- 열린 파일 디스크립터, 현재 작업 디렉터리 등 같은 프로세스 관련 정보 저장
'학교수업' 카테고리의 다른 글
UNIX서버 6주차 (0) | 2022.04.20 |
---|---|
UNIX 서버 5주차 (0) | 2022.04.19 |
윈도우즈 프로그래밍 5주차 (0) | 2022.04.16 |
윈도우즈 프로그래밍 6주차 (0) | 2022.04.16 |
컴퓨터 구조 6주차 (0) | 2022.04.13 |