[명지대 2012] 시스템 프로그래밍 중간고사 시험 범위 요약
- 프로세스 정의 - 능동적인 상태(Active Substance)
(1) 실행 중인 프로그램(다음 실행 시킬 명령어를 갖고 있음) + 프로그램을 실행시킬 수 있는 하드웨어 또는 소프트웨어 환경
(2) 구성
가. 프로그램 코드 (text section)
나. Program Counter(PC) : 프로그램에서 다음 실행할 명령어의 주소를 저장
다. 스택 : 지역 변수 저장
라. 데이터 섹션 : 전역 변수 저장
2. 환경(Environment) 정의
(1) image 또는 context
(2) 프로그램 텍스트, 힙, 스택, 레지스터값, 시스템 데이터(현재 디렉토리, 파일 디스크립터 등..) 으로 구성되어 있다.
3. 프로그램 정의 - 수동적인 상태(Passive Substance)
(1) 명령들과 데이터들로 구성되어 디스크에 저장되어 있는 파일
(2) 파일 Protection Mode가 x로 설정 되어 있어야 한다.(executable)
(3) 프로그램이 실행 되기 위해서는 커널의 루틴과, 자원 들을 얻어야 한다.
4. 프로세스 모드
(1) 커널 프로세스
(2) 유저 프로세스
가. 유저프로세스는 커널 프로세스를 호출하기 위해 시스템 콜을 사용한다.
나. 트랩 명령(인터럽트)는 유저 프로세스 모드에서 커널 프로세스 모드로 변경시킨다.
5. 프로세스 레벨
: 프로세스가 생성 되었을 때 Process ID라는 고유한 넘버가 모든 프로세스에 할당된다.
: ID가 0인 프로세스는 특별한 커널 프로세스 이다.
: 위의 ID가 0인 프로세스가 fork 시스템 호출로 init이라는 ID가 1인 프로세스를 호출한다.
: 위의 fork 호출 후 특별한 커널 프로세스는 swapper(Scheduler)가 된다.
5.1 fork() 시스템 콜
부모 프로세스가 호출한 fork()함수는 자식 프로세스를 생성시킨다.
자식 프로세스는 부모 프로세스의 data space, heap, stack을 상속한다.
자식 프로세스와 부모 프로세스는 같은 파일 디스크립터와 파일 오프셋을 가진다.
fork 함수는 한 번 호출 되지만, 두 번 리턴 된다.
- 부모 프로세스에서는 자식 프로세스 ID를 return한다.
- 자식 프로세스에서는 0을 return 한다.
종종 exec() 함수 다음에 fork()가 따라온다.
종종 읽기 전용 text segment가 공유된다.
자식 프로세스는 getppid()로 부모 PID를 가져 올 수 있다.
5.2 vfork() 시스템 콜
자식프로세스로 상속되는 속성들
- Real user ID, effective user ID, Group ID
- set-user-ID flag, set-group-ID flag
- 현재 작업중인 디렉토리
- 루트 디렉토리
- file mode creation mask
- signal mask and dispositions
- the close-on-exec flag for any open file descriptors
- environment
- attached shared memory segments
- resource limits
자식 프로세스로 상속되지 않는 속성들
- fork()의 리턴값
- 각자의 프로세스 ID
- file locks
- pending alarms are cleared for the child
- the set of pending signals for the child is set to the empty set
Level 0 : swapper (스케쥴러) 프로세스
스스로 프로세스가 되거나 다른 것들을 실행시키는 커널 프로그램
Level 1 : 커널 프로세스
Level 2 : 시스템 프로세스
Level 3 : cmd 프로세스
Process ID 0 : swapper( 스케쥴러 프로세스 )
시스템프로세스
커널의 일부분
디스크 내의 어떠한 프로세스도 스케줄러 프로세스와 일치하는 것은 없다.
Process ID 1 : Init 프로세스
Init 프로세스는 시스템에 생성되는 모든 프로세스의 조상 프로세스 이다. 따라서, 프로세스 트리에서 Init 프로세스는 루트가 된다.
부트스트랩 과정의 마지막에 Special Kernel 프로세스에 의해 호출 된다.
일반 유저 프로세스이나 슈퍼 유저 권한을 갖고 있다.
영원히 죽지 않는 프로세스이다.
/etc/init/ 안에 있는 파일들을 읽어오고, /sbin/init 이라는 파일을 읽어온다
System-dependent initialization(/etc/rc*, rc로 시작하는 모든파일) 파일을 읽어온다.
PID 1로 영원히 남아있다.
Process ID 2 : pagedaemon 프로세스
커널 프로세스
가상메모레 시스템의 페이징을 지원한다.
6. 프로세스 상태
(왜 우기 쉬운 방법, 운동선수가 있다.(Created) 달리기 시합을 하는데 출발 준비(Ready) 한다. 달리기 시작한다.(Running) 달리기가 끝나고 힘들어서 좀비 처럼 흐느적 거린다.(Zombie) 그래서 자러갔다.(Sleeping)
6.1 Created : 프로세스가 새로 생성된 상태
: 부모프로세스는 자식 프로세스가 끝나기전까지 기다린다.
6.2 Running : 명령문이 실행되고 있는 상태
- Kernel Mode
- User Mode
6.3 Ready : 프로세스가 CPU에 할당 되기를 기다리는 상태
- In memory
- In swap space
6.4 Sleeping(Waiting) : 어떤 이벤트가 끝나기 까지 기다리는 상태
- In memory
- In swap space
6.5 Zombie(Terminated) : 프로세스가 모든 실행을 끝났을 때,
7. 프로세스 그룹
같은 login shell (부모프로세스) 로부터 생성된 자식 프로세스들은 같은 그룹이다.
같은 그룹 프로세스는 같은 프로세스 그룹 ID가 존재한다.
8. 프로세스 우선순위
Swapper가 프로세스들의 우선 순위를 지정해준다.
모든 프로세스들은 우선순위를 갖고 있다.
우선순위 범위 0(가장 높음)~127(가장 낮음)
프로세스 우선순위는 동적으로 바뀌며, 바뀌는 기회는 모두가 동적으로 제공받는다.
Nice() 시스템 콜은 자발적으로 프로세스의 우선순위를 낮춘다.
9. 프로세스 ID
9.1 유저ID
Real User ID : 실제로 파일을 실행 시키는 유저 ID
Effective User ID : 실행 될때의 유저 ID
9.2 그룹 ID
Real User ID : 실제로 파일을 실행 시키는 유저 ID
Effective User ID : 실행 될때의 유저 ID
일반적으로 Real UserID와 Effective User ID는 갖다. 그러나, 일반 유저가 root 권한으로 프로그램을 실행 시킬 경우 Effective User ID가 root로 될 수 있다. 비밀번호를 passwd라는 프로그램이 그 예이다. 어떠한 한 User가 자신의 ID로 접속한 뒤, 비밀번호를 변경하려 했을 때, 자신의 User ID로는 비밀번호가 저장된 파일을 수정할 수 없다. 따라서, Effective User ID를 root로 하여 마치 root가 비밀번호를 수정한 것 처럼 하는 것이다.
10. signal
실행중인 프로세스를 외부에서 제어하는 수단
프로세스간의 동기화를 얻는 수단.
SW interrupt로 구현된다.
Kill() 시스템 콜을 사용하여 프로세스간에 signal을 보낸다.
Signal() 시스템 콜은 프로세스가 Signal을 받았을 때 '무엇을 할것인가'에 대해 정의한다.
11. PCB(Process Control Block)
프로세스의 정보에 대해 저장해 놓은 일종의 구조체
11.1 프로세스 상태
: New, Ready, Waiting, Running
11.2 프로그램 카운터(PC)
: 다음 실행할 명렁의 주소
11.3 CPU 레지스터들
11.4 CPU 스케줄링 정보
: 프로세스 우선순위, 스케쥴링 큐를 가리키는 포인터
11.5 메모리 관리 정보
: 페이지 테이블, 세그먼트 테이블, base and limit resisters(프로세스 시작 주소, 프로세스 길이)
11.6 : Accounting information : 사용한 CPU 시간, 프로세스 넘버, Open한 File에 대한 정보
11.7 I/O 상태 정보
: 프로세스에 할당된 I/O 장치 리스트
프로세스가 실행 하기 직전, PCB정보를 불러오고
Context switching 이 일어나기 직전 PCB정보를 저장한다.
12. exit() 시스템 콜
(1) Exit Status
main()의 리턴값이다.
프로세스의 종료 결과를 알려준다.
자식 프로세스에서 부모 프로세스로 전달된다.
(2) Termination Status
정상 Termination : Exit Status가 Termination Status가 된다.
비정상 Termination : 커널이 비정상 Termination 원인을 찾아 Termination Status로 전달한다.
부모 프로세스가 Wait() 또는 Waitpid() 호출을 통해 얻을 수 있다.
부모 프로세스가 자식프로세스보다 먼저 종료 된다면, init 프로세스에 값을 전달한다.
자식프로세스는 종료되게 되면 부모프로세스가 wait() 또는 waitpid()를 하기 전까지 PID, termination status, CPU time값을 커널이 갖고 있게 된다. 그런데, 만약 부모 프로세스가 기다리지 않고 먼저 종료된다면, 커널은 계속 그 값을 간직하고 있는다 이때, 그 자식프로세스를 '좀비' 라고 한다.
13. wait(), waitpid() 시스템콜
wait()는 종료된 자식의 pid를 반환한다.
자식 프로세스는 종료 후 SIGCHLD 시그널을 부모에게 보낸다.
부모는 신호를 받은 뒤 유저가 정의한 시그널 핸들러가 없을 경우 시그널을 무시한다.
부모 프로세스는 running 중인 자식프로세스를 block 할수도 있고, 자식 프로세스로 부터 termination status 를 즉시 return 받을 수도 있다.