System Call
โข
์ด์์ฒด์ ๋ ์ปค๋ ๋ชจ๋(Kernel Mode)์ ์ฌ์ฉ์ ๋ชจ๋(User Mode)๋ก ๋๋์ด์ ๊ตฌ๋๋๋ค.
โข
์ด์์ฒด์ ์์ ํ๋ก๊ทธ๋จ์ด ๊ตฌ๋๋๋๋ฐ ์์ด ํ์ผ์ ์ฝ์ด ์ค๊ฑฐ๋, ํ์ผ์ ์ฐ๊ฑฐ๋, ํน์ ํ๋ฉด์ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํ๋ ๋ฑ ๋ง์ผ ๋ถ๋ถ์ด ์ปค๋ ๋ชจ๋๋ฅผ ์ฌ์ฉํ๋ค.
โข
์์คํ
์ฝ์ ์ด๋ฌํ ์ปค๋ ์์ญ์ ๊ธฐ๋ฅ์ ์ฌ์ฉ์ ๋ชจ๋๊ฐ ์ฌ์ฉ ๊ฐ๋ฅํ๊ฒ, ์ฆ ํ๋ก์ธ์ค๊ฐ ํ๋์จ์ด์ ์ง์ ์ ๊ทผํด์ ํ์ํ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๊ฒ ํด์ค๋ค.
โข
๊ฐ ์์คํ
์ฝ์๋ ๋ฒํธ๊ฐ ํ ๋น๋๊ณ ์์คํ
์ฝ ์ธํฐํ์ด์ค๋ ์ด๋ฌํ ๋ฒํธ์ ๋ฐ๋ผ ์ธ๋ฑ์ค ๋๋ ํ
์ด๋ธ์ ์ ์ง๋๋ค.
System Call์ ๋งค๊ฐ๋ณ์ ์ ๋ฌ ๋ฐฉ๋ฒ
1.
๋งค๊ฐ๋ณ์๋ฅผ CPU ๋ ์ง์คํฐ ๋ด์ ์ ๋ฌํ๋ค.ย ์ด ๊ฒฝ์ฐ์ ๋งค๊ฐ๋ณ์์ ๊ฐฏ์๊ฐ CPU ๋ด์ ์ด ๋ ์ง์คํฐ ๊ฐ์๋ณด๋ค ๋ง์ ์ ์๋ค.
2.
์์ ๊ฐ์ ๊ฒฝ์ฐ์ ๋งค๊ฐ๋ณ์๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๊ณ ย ๋ฉ๋ชจ๋ฆฌ์ ์ฃผ์๊ฐ ๋ ์ง์คํฐ์ ์ ๋ฌ๋๋ค. (์๋ ๊ทธ๋ฆผ ์ฐธ๊ณ )
3.
๋งค๊ฐ๋ณ์๋ ํ๋ก๊ทธ๋จ์ ์ํดย ์คํ(stack)์ผ๋ก ์ ๋ฌ(push)ย ๋ ์๋ ์๋ค.
๋๋ฒ์งธ๋ ์ธ๋ฒ์งธ ๋ฐฉ๋ฒ์ ๊ฒฝ์ฐ ์ ๋ฌ๋๋ ๋งค๊ฐ๋ณ์์ ๊ฐ์๋ ๊ธธ์ด์ ์ ํ์ด ์๊ธฐ ๋๋ฌธ์ ๋ช๋ช ์ด์์ฒด์ ์์ ์ ํธํ๋ ๋ฐฉ์์ด๋ค.
System Call์ ์ ํ
ํ๋ก์ธ์ค ์ ์ด(Process Control)
โข
๋๋ด๊ธฐ(end), ์ค์ง(abort)
โข
์ ์ฌ(load), ์คํ(execute)
โข
ํ๋ก์ธ์ค ์์ฑ(create process)
โข
ํ๋ก์ธ์ค ์์ฑ ํ๋๊ณผ ์ค์ (get process attribute and set process attribute)
โข
์๊ฐ ๋๊ธฐ(wait time)
โข
์ฌ๊ฑด ๋๊ธฐ(wait event)
โข
์ฌ๊ฑด์ ์๋ฆผ(signal event)
โข
๋ฉ๋ชจ๋ฆฌ ํ ๋น ๋ฐ ํด์ : malloc, free
ํ์ผ ์กฐ์(File Manipulation)
โข
ํ์ผ ์์ฑ(create file), ํ์ผ ์ญ์ (delete file)
โข
์ด๊ธฐ(open), ๋ซ๊ธฐ(close)
โข
์ฝ๊ธฐ(read), ์ฐ๊ธฐ(write), ์์น ๋ณ๊ฒฝ(reposition)
โข
ํ์ผ ์์ฑ ํ๋ ๋ฐ ์ค์ (get file attribute and set file attribute)
์ฅ์น ๊ด๋ฆฌ(Devide Management)
โข
์ฅ์น๋ฅผ ์๊ตฌ(request devices), ์ฅ์น๋ฅผ ๋ฐฉ์ถrelease device)
โข
์ฝ๊ธฐ, ์ฐ๊ธฐ, ์์น ๋ณ๊ฒฝ
โข
์ฅ์น ์์ฑ ํ๋, ์ฅ์น ์์ฑ ์ค์
โข
์ฅ์น์ ๋
ผ๋ฆฌ์ ๋ถ์ฐฉ(attach) ๋๋ ๋ถ๋ฆฌ(detach)
์ ๋ณด ์ ์ง(Information Maintenance)
โข
์๊ฐ๊ณผ ๋ ์ง์ ์ค์ ๊ณผ ํ๋(time)
โข
์์คํ
๋ฐ์ดํฐ์ ์ค์ ๊ณผ ํ๋(date)
โข
ํ๋ก์ธ์ค ํ์ผ, ์ฅ์น ์์ฑ์ ํ๋ ๋ฐ ์ค์
ํต์ (Communication)
โข
ํต์ ์ฐ๊ฒฐ์ ์์ฑ, ์ ๊ฑฐ
โข
๋ฉ์์ง์ ์ก์ , ์์
โข
์ํ ์ ๋ณด ์ ๋ฌ
โข
์๊ฒฉ ์ฅ์น์ ๋ถ์ฐฉ ๋ฐ ๋ถ๋ฆฌ
System Call ์ฃผ์ ํจ์
fork
โข
์๋ก์ด Process๋ฅผ ์์ฑํ ๋ ์ฌ์ฉ๋๋ค.
โข
Fork๊ฐ ์คํ๋๋ ์๊ฐ, ๋์ผํ ์ฝ๋๋ฅผ ๊ฐ์ง ๋๊ฐ์ ํ๋ก์ธ์ค๊ฐ ์์ฑ๋๋ค. ํ์ง๋ง ์ฒ์ fork()๋ฅผ ์คํํ Parent์ Child์ ๋ฆฌํด๊ฐ์ด ๋ค๋ฅด๋ค.
โข
parent์ child์ ์์๋ Scheduler๊ฐ ๊ฒฐ์ ํ๋ฏ๋ก ์คํํ ๋๋ง๋ค ๋ค๋ฅธ ์์๋ก ์คํ๋ ์ ์๋ค.
โข
fork()์ ๋ฆฌํด๊ฐ
โฆ
Parent : Child์ pid
โฆ
Child : 0
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
printf("pid : %d", (int) getpid()); // pid : 29146
int rc = fork(); // ์ฃผ๋ชฉ
if (rc < 0) { // (1) fork ์คํจ
exit(1);
}
else if (rc == 0) { // (2) child ์ธ ๊ฒฝ์ฐ (fork ๊ฐ์ด 0)
printf("child (pid : %d)", (int) getpid());
}
else { // (3) parent case
printf("parent of %d (pid : %d)", rc, (int)getpid());
}
}
C
๋ณต์ฌ
pid : 29146
parent of 29147 (pid : 29146)
child (pid : 29147)
C
๋ณต์ฌ
wait
โข
Child Process๊ฐ ์ข
๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ์์
โข
wait() ํจ์๋ child๊ฐ ๋๋๊ธฐ ์ ์ return ํ์ง ์์ผ๋ฏ๋ก, ๋ฐ๋์ child๊ฐ ๋จผ์ ์คํ๋๋ค.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
int main(int argc, char *argv[]) {
printf("pid : %d", (int) getpid()); // pid : 29146
int rc = fork(); // ์ฃผ๋ชฉ
if (rc < 0) {
exit(1);
}
else if (rc == 0) { // (2) child ์ธ ๊ฒฝ์ฐ (fork ๊ฐ์ด 0)
printf("child (pid : %d)", (int) getpid());
}
else { // (3) parent case
int wc = wait(NULL) // ์ถ๊ฐ๋ ๋ถ๋ถ
printf("parent of %d (wc : %d / pid : %d)", wc, rc, (int)getpid());
}
}
C
๋ณต์ฌ
exec
โข
ํ์ฌ ์คํ์ํค๊ณ ์๋ process๋ฅผ exec์ ํตํด ํธ์ถํ process๋ก ๊ต์ฒดํ๋ค.
โข
์๋ก์ด ํ๋ก์ธ์ค๋ฅผ ์ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ์ง ์๊ณ , exec()์ ์ํด ํธ์ถ๋ ํ๋ก์ธ์ค๋ง ๋ฉ๋ชจ๋ฆฌ์ ๋จ๊ฒ ๋๋ค.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
int main(int argc, char *argv[]) {
printf("pid : %d", (int) getpid()); // pid : 29146
int rc = fork(); // ์ฃผ๋ชฉ
if (rc < 0) {
exit(1);
} // (1) fork ์คํจ
else if (rc == 0) { // (2) child ์ธ ๊ฒฝ์ฐ (fork ๊ฐ์ด 0)
printf("child (pid : %d)", (int) getpid());
char *myargs[3];
myargs[0] = strdup("wc"); // ๋ด๊ฐ ์คํํ ํ์ผ ์ด๋ฆ
myargs[1] = strdup("p3.c"); // ์คํํ ํ์ผ์ ๋๊ฒจ์ค argument
myargs[2] = NULL; // end of array
execvp(myarges[0], myargs); // wc ํ์ผ ์คํ.
printf("this shouldn't print out") // ์คํ๋์ง ์์.
}
else { // (3) parent case
int wc = wait(NULL) // ์ถ๊ฐ๋ ๋ถ๋ถ
printf("parent of %d (wc : %d / pid : %d)", wc, rc, (int)getpid());
}
}
C
๋ณต์ฌ