학교에서 듣는 수업의 중간고사 대비로
헷갈리는 부분을 정리한 것입니다.
개인저장용의 용도가 큽니다.
1. chmod: 특정 사용자의 permission을 변경할 수 있음.
[u]or[g]or[o]or[a] +(-) [permisson] 으로 각자의 권한 변경가능. (빼기는 권한없애기)
2. gcc hello.c -o hello : 실행 가능한 파일 hello.out 생성
3. os의 3대기능
communication(통신), concurrency(동시성), asynchronous operations(비동기적실행)
4. signals(시그널)
시그널은 이벤트가 일어났음을 알리는 소프트웨어 메커니즘이다. 시그널은 동기적 또는 비동기적으로 생성될 수 있다.
5. 인터럽트
하드웨어 플래그들을 검사하여 인터럽트 발생을 감지하면, 프로세서는 프로그램 카운터의 현재값을 저장하고 인터럽스 서비스 루틴이라 불리는 특별한 함수의 주소를 프로그램 카운터에 집어넣는다.
6.
프로그램(program)
정해진 일들을 실행하는 준비된 명령어들의 나열.
프로세스(process)
실행되고 있는 프로그램의 인스턴스이다.
7. 쓰레드(thread)
프로세스 내에서의 실행 흐름을 나타내는 추상적인 데이터 타입이다.
저장하는 정보의 양이 적어서 Multilple Process보다 유리하지만 추가적 동기화가 필요.
8. 프로그램 이미지
로딩 후, 프로그램은 실행 가능한 형태로 인접하는 블록들을 차지하게 되는데, 이것을 프로그램 이미지라고 부른다.
9. 활성화레코드
프로세스 스택 윗부분에 위치하며, 함수가 호출되는 동안의 실행 컨텍스트를 가지고 있다.
10. void perror(const char*s) : 에러메세지 출력
char* strerror(int errnum) : 에러 코드 errnum에 해당하는 시스템 에러 메시지를 가리키는 포인터를 리턴. (errnum 변경가능)
11. good model of a function
1) 함수 내부에서 프로그램을 종료시키지 마라. 그 대신 에러값을 리턴한다.
2) 버퍼의 크기에 대하여 불필요한 가정을 하지 마라.
3) 제한을 두어야 할 때, 다른 임의의 상수보다 시스템에 정의된 표준 제한을 사용해라.
4) 입력 매개변수의 값을 바꾸는 것이 정말 의미가 있지 않다면, 입력 매개변수의 값을 변경하지 마라.
5) 자동할당으로 충분하다면, 정적변수나 동적 메모리 할당을 사용하지 마라.
6) 시그널에 의해 인터럽트될 때의 결과를 분석해라.
12. char *strtok(char* s,char* sep)
실행시 strtok / 파싱할 string 으로 배열이 만들어지고, sep을 기준으로 토큰을 구분한다.
여러 문자열을 동시에 파싱하기 위해 strtok함수를 호출한다면(strtok를 사용하는 도중 또 strtok를 사용하면. ex 여러 라인의 문장을 라인별로 + 라인을 단어별로), strtok 함수는 파싱 대상 문자열을 위해 하나의 지역 변수만을 사용하기 때문에 이 문자열의 파싱은 서로 방해받고 말 것이다.
->char* strtok_r(char* s,char* sep,char **lasts)
별도의 공간을 파라미터로 추가해 문제를 해결. (다음 파싱이 시작되는 위치를 저장할 장소를 가리키는 포인터) 정적변수 겹치는 일 방지
13. extern char **environ 을 통해 환경변수들 활용가능
char* getenv(const char* name) 을 하면 해당 name과 같은 환경변수 값에 대한 포인트 반환
14. int atexit(void (*func)(void))
로 함수를 등록하여 exit시 종료전 실행할 함수 등록가능
15. 정상종료 - 메인함수 리턴
비정상종료 - abort함수를 호출하거나 종료를 야기하는 시그널을 처리
16. 프로세스는 PCB(process control block)안에서 관리
17. context switch 과정
1) cpu가 interrupt 인식 (cpu안의 하드웨어 플랙)
2) cpu(os)가 interrupt handler 시작. (in privileged mode, 특정모드)
3) (interrupt handler는 모든 interrupt를 안보이게 할 '수도' 있다. 이 경우 다른 인터럽트를 무시한다.)
4) 중단된 process 정보 저장
5) 발생 interrupt 처리 코드 처리 (by interrupt handler)
6) interrupt handler가 cpu 스케줄러에 의해 종료된다.
7) cpu 스케줄러가 선택한 프로세스의 상태를 불러옴
8) (3번과정이 실행되었을 경우엔 interrupt handler가 다시 interrupt가 가능하도록 한다.)
9) cpu(os)가 유저모드로 다시 돌리고, 선택된 프로세스를 실행한다.
18. fork()에서 자식프로세스에게 상속되지 않는 것
-Process ID / CPU 사용량 (자식은 0으로 리셋)
-rocks & alarm
-pending signal
19. if (childpid = fork()) 로 체인구조
if ((childpid = fork()) <= 0) 로 펜구조
20. about 자식프로세스
– WIFEXITED(int stat_val) : 정상종료시 0아닌 값
– WEXITSTATUS(int stat_val) : 정상종료된 해당 프로세스 리턴값 리턴
– WIFSIGNALED(int stat_val) : uncaught signal 때문에 종료됐다면, 0이 아닌값
– WTERMSIG(int stat_val) : uncaught signal의 signal의 넘버를 리턴한다.
– WIFSTOPPED(int stat_val) : stop되었다면, 0이 아닌값
– WSTOPSIG(int stat_val) : 해당 stop을 야기한 signal의 넘버를 리턴한다.
21. wait
'자식의 상태가 가능해질 때까지' 또는 'caller가 signal을 수신할 때까지' caller가 실행을 일시 중단
pid_t wait(int *stat_loc);
pid_t waitpid(pid_t pid, int *stat_loc, int options); 범용적 사용. non-blocking으로 제작가능.
22. 모든 자식프로세스 종료 기다리기
while(r_wait(NULL) > 0);
23. execl(경로, 구문0 ,구문1 , .... , 0)
execv(경로, 배열)
p: 경로 알아서찾기
e: 환경변수 조작가능
24. execcmd : exec함수들을 활용해 넘겨주는 리눅스 명령어를 그대로 실행하도록 짠 함수
'💻 CS > 시스템프로그래밍' 카테고리의 다른 글
[시스템프로그래밍] UNIX I/O - 2 (0) | 2019.11.07 |
---|---|
[시스템프로그래밍] UNIX I/O - 1 (2) | 2019.11.04 |
[시스템프로그래밍] Processes in UNIX (1) | 2019.10.12 |
[시스템프로그래밍] Programs, Processes and Threads (0) | 2019.10.12 |
[시스템프로그래밍] Technology’s Impact on Programs (0) | 2019.10.12 |