본문 바로가기

CS

(19)
운영체제에 대한 소개 지금부터 운영체제가 무엇을 해야하는지 간단히 생각해보도록 합시다. 1. 운영체제는 자원을 할당해주어야 합니다. 여기서 자원이란 무엇인가를 알아보기 위해 예시를 들어보겠습니다. cpu가 1대 있고 실행 중인 프로세스 A,B,C 3개가 있을 때, 사실 cpu는 프로세스 3개를 동시에 수행할 수 없습니다. 그런데 우리 눈에는 프로세스 3개가 동시에 수행 중인 것으로 보이는데 이는 사실 프로세스 3개를 매우 빠른 속도로 번갈아 수행하는 것입니다. 그럼 cpu 1대가 100초 동안 실행된다고 하면 그 중 40초는 A, 40초는 B, 20초는 C를 수행할 수 있습니다. (만약 이런 상황이라면 C가 A,B에 비해 상대적으로 덜 중요, 혹은 상대적으로 cpu를 쓰지 않는 프로세스이겠지요.) 이 때 우리는 시간을 할당하..
[Linux] Thread (쓰레드) 1. Thread란 Thread : 프로세스 내에서 독립적인, 별도의 컴퓨팅 단위 현재 우리 컴퓨터에는 수십개의 프로세스가 돌고 있는데, 프로세스가 실시간으로 바뀔 때마다 Context - Switching이 일어나면서 새로운 Process가 실행되는 내용을 불러온다. (Context - Switching 이 반복되며 계속 실행하는 Process 가 바뀐다.) 그런데 Context - Switching이 생각보다 시간을 잡아먹는 행위이다. 그래서 Context - Switching에 드는 시간을 줄이는 것이 OS에서의 과제 중 하나였다. Process를 계속 바꾸는 것이 시간을 많이 잡아먹으므로 상대적으로 작은 정보를 옮기면서 여러 일을 수행할 필요가 있었다. 그래서 생긴 것이 Thread이다. 간단한 ..
[Linux] Signal Handler 보충 시작하기 전 C에서 현재 시간을 출력하는 방법 #include #include int main () { time_t ct; struct tm tm; ct = time (NULL); tm = *localtime (&ct); printf ("%d-%d-%d hour: %d, min : %d, sec: %d\n", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec); } localtime 함수는 time_t 변수를 우리가 알아볼 수 있는 struct tm구조체로 변환해서 그 포인터를 넘겨준다. 따라서 *로 이 리턴값을 참조하여 struct tm 변수에 대입하였다. tm.tm_year은 1900년 기준으로 0이므로 +19..
[Linux] Semaphore 1. 들어가기 전에 다음의 코드를 한번 같이 작성해보자. shminit.c #include #include #include #include #include int main() { key_t key; int shmid; int* shmaddr; shmid = shmget(key, sizeof(int), IPC_CREAT | 0666); // key로 shmid 얻어옴 shmaddr = shmat(shmid, NULL, 0); // 2번째 매개변수 - 이 근처로 할당, 3번째 매개변수는 flag *shmaddr = 0; // 0으로 공유 메모리에 저장된 값을 초기화 printf("*shmaddr = %d\n", *shmaddr); return 0; } shmsum.c #include #include #inc..
[Linux] 공유 메모리를 이용한 데이터 교환 전 게시글에서 메시지 큐에 대해서 보았다. 이번에는 공유 메모리를 이용한 데이터 교환에 대해서 볼 것인데 메시지 큐와 구조는 매우 비슷하다. 다음의 코드를 shmwrite.c 라는 이름으로 작성해보자. #include #include #include #include #include int main() { key_t key = 1234; int shmid ; char* shmaddr; char buf[100]; shmid = shmget(key, 100, IPC_CREAT | 0666); printf("shmid = %d\n", shmid); shmaddr = shmat(shmid, NULL, 0); printf("shmaddr = %p\n", shmaddr); printf("Enter a string t..
[Linux] 메시지 큐(message queue) 1. 시작하기 전에 프로세스간 데이터를 주고 받는 두가지 방법이 있다. 1. 메시지 기반 2. 공유 메모리 기반 메시지(message) 기반은 앞에서 보았던 FIFO 와 굉장히 비슷하다. 한 프로세스가 send로 메시지를 보내면 다른 프로세스는 receive로 메시지를 받을 수 있다. 순차적으로 보냈던 메시지를 받으므로 메시지 기반의 방법을 일반적으로 메시지 큐(Message Queue)라 한다. 공유 메모리 (Shared Memory) 기반에 대해서도 간단하게 알아보자. 원래는 서로 다른 프로세스는 서로의 메모리를 공유할 수 없다. 한 프로세스에서 쓰는 메모리를 virtuall memory라고 하는데 이는 한 기계에서 고유한 physical memory 와 다르기 때문이다. 한 프로그램에서 x = 0인..
[Linux] pipe의 개념 및 구현 들어가기 전에 #include #include #include int main() { int fd, pid; fd = open("test.txt", O_RDWR | O_CREAT, 0666); printf("fd = %d\n", fd); write(1, "hello\n", 6); } 이 코드의 수행 결과로 우리는 아래의 출력을 볼 수 있다. 이를 통해 두가지를 알 수 있다. 첫번째는 어떤 파일을 open을 통해 open해도 fd(file discriptor)가 3 미만은 나오지 않는데 이를 통해 0, 1, 2는 이미 다른 파일 세개가 선점하고 있다는 것을 알 수 있다. (사실 유추하기는 어렵지만 이 코드를 통해 기억해두기를 바란다.) 두번째는 stdout이 fd가 1이라는 것을 이를 hello가 출력되는..
[Linux] sort 명령어 및 '<' 와 '>' 그리고 '|' (1) sort , '' (right arrow) '>'는 명령어의 결과를 program의 stdout(출력 결과)를 file과 redirect해준다. 그래서 ls - l > b.txt 를 해주면 b.txt가 생기고 생긴 b.txt를 열어보면 ls -l 의 결과가 b.txt에 저장되어있는 것을 볼 수 있다. (3) '|' (vertical bar, pipe) a | b 를 해주면 a의 실행결과가 b에 redirect되어 실행된다. 예시를 보기 위해 다음과 같은 프로그램을 짜고 a.out으로 컴파일해보자 #include int main() { char buf[100]; while(gets(buf) != NULL) { printf("I say %s\n", buf); } return 0; } 그리고 ls | ..