❗️출처: 하이애나 블로그
8.1 Exceptions
예외적인 제외흐름
예외상황 처리하고
예외테이블
예외상황과 프로시저콜의 차이점
운영체제는
8.1.2 예외의 종류
interrupt, trap, fault, abort 4가지가 있다
interrupt
trap
and system call
일부러 만든 예외상황
systemcall
fault
fault
abort
8.1.3 리눅스 x86-64 시스템콜
8.2 Processes
실행 프로그램
마치 운영프로그램을 독점하듯, 메모리를 독점하듯 보임
8.2.1 논리적인 제어흐름
8.2.2 concurrent flow
8.2.3 Private address space
한 프로그램이 메모리독차지?? ⇒ nono, 사실 아님
프로그램들은 자신만의 주소공간을 제공함(다쓰는거 아님, 난 여기까지만 쓰는거)
(위 그림)stack의 top부터 데이터를 넣어줌
8.2.4 user and kernel modes
8.2.5 context switch
context switch를 통해 multitasking 사용
그림보면, 유저영역이랑 커널 영역 와리가리 치면서 돌아다님
스케줄링
예시
read실행시키면,
메모리 접근해야되니까 잠깐 커널모드
잠깐 커널모드 해둔 상황에서, 놀수는 없지 ⇒ 하던거 잠깐 좀더 하고 있음
8.3 System Call Error Handling
포크 함수
if ((pid = fork()) < 0) {
fprintf(stderr, "fork error: %s\\n", strerror(errno));
exit(0);
}
strerror
함수는 errno의 특정값과 연계된 에러 string을 리턴.
이 코드를 다음과 같이 단순화 가능
void unix_error(char *msg) /* Unix-style error */
{
fprintf(stderr, "%s: %s\\n", msg, strerror(errno));
exit(0);
}
위처럼 함수로 쓰면???? 아래처럼 두줄로 소환
if ((pid = fork()) < 0)
unix_error("fork error");
이거를 Stevens가 개발한 error handling wrappers
이용 단순화 가능
pid_t Fork(void)
{
pid_t pid;
if ((pid = fork()) < 0)
unix_error("Fork error");
return pid;
}
그렇다면! 다음과 같이 한줄 가능
pid = Fork();
대문자는 wrapper
을, 소문자는 기본이름
을 나타냄
8.3장의 결론
wrapper
쓰면 사용시 코드 1줄로 짧아지니까, 에러핸들러좀 써줘라8.4 Process Control
Unix는 C로부터 프로세스를 제어하기 위한 많은 시스템콜을 제공, 그중 중요한 함수들을 설명하고 어떻게 사용되는지 예제를 제공
8.4.1 Obtaining Process IDs
#include <sys/types.h>
#include <unistd.h>
pid_t getpid(void);
pid_t getppid(void);
8.4.2 Creating and Terminating Processes
8.4.3 Reaping Child Processes(프로세서 청소)
8.4.4 Putting Processes to Sleep
8.4.5 Loading and Running Programs
8.4.6 Using fork and execve to Run Programs
8.5 Signals
8.6 Nonlocal Jumps
8.7 Tools for Manipulating Processes
8.8 Summary