Search
Duplicate

์‹œ์Šคํ…œ ์ฝœ(System Call)

ํƒœ๊ทธ
1 more property

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
๋ณต์‚ฌ