Skip to content
Snippets Groups Projects
Commit e92f3846 authored by 이소현's avatar 이소현
Browse files

Update README.md

parent 74a1aebb
No related branches found
No related tags found
No related merge requests found
...@@ -654,3 +654,106 @@ mul_float 코드 ...@@ -654,3 +654,106 @@ mul_float 코드
* 그리고는 다시 255를 곱해주고 int로 변환하여 두 rgb의 곱한 rgb값을 return 하는 형태이다. * 그리고는 다시 255를 곱해주고 int로 변환하여 두 rgb의 곱한 rgb값을 return 하는 형태이다.
## lesson 13
* 곱셈과 나눗셈은 함수로 만들어서 성능과 정밀도 체크하기.
* 어떨 때 오버플로우가 생기는지도 생각해 보아야 한다.
1. thread 와 system call 에 대해
>* $ps : 현재 실행중인 Process 들을 보여준다.
>* 프로세스 상태에는 run, kill, stop 이 있다.
>* run 상태에는 fg(for ground), bg(back ground)가 있다.
>* fg : 그냥 그 작업을 바로 다시 하게 한다. (ex)잠깐 bg로 다른 것을 실행 했다가 fg를 통해 다시 원래로 돌아올 수 있다.
>* bg : 현재 실행중인 것은 그대로 돌게 냅두고 다른 것을 동시에 돌게 한다.
>> * stdin은 여러개의 bg와 하나만 존재하는 fg에서 어디로 갈지 정해야하므로 항상 fg로만 간다. 따라서 stdin을 사용하는 vi는 bg가 불가하다.
>* core 각각에 thread가 여러개 달려 있으면 cpu의 개수가 그만큼 있는 것으로 보인다.
>* context switching :
>>* 운영체제 입장에서는 memory에 system process를 하는 것이고 tty에서는 user pocess를 하는 것 이다.
>>* cpu는 개수가 한정되어 있지만 context switching은 동시에 여러 일을 할 수 있게 한다.
* core는 다양하게 thread를 쪼개서 사용가능하며 os의 작업 스케쥴러가 그것을 알아서 정하게 된다.
* system call : kernel 위의 system call 과는 조금 다른데 ":r!ls" 를 통해 ls결과물을 vi에서 읽거나 ":!cc test.c" 를 통해 test.c 를 vi에서 바로 컴파일 가능하게 해주는 등의 일을 한다.
2. fork 와 clone
>* fork가 없는 시스템에서는 clone을 사용하면 fork를 실행 할 수 있다.
>* fork를 하게 되면 pid가 다른 프로세스가 생성된다.
>* 따라서 fork한 뒤부터는 똑같은 것이 copy가 된 채 서로 다르게 사용가능하게 된다.
>* fork를 할 때에는 아래의 사항들이 필수이다.
>> * #include <sys/types.h>
>> * #include <unistd.h>
>* fork 후에는 static이든 뭐든 process가 새로 생성되므로 서로 수정한 것이 서로에게 영향을 주지 못한다.
>* fork한 것 끼리 통신하기 위해서는 pipe를 이용해야한다.(ipc)
>* 아래는 fork에 대한 실습인 forktest.c 파일의 코드이다.
```C
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
int a = 0;
pid_t pid ,pid2;
pid = fork();
pid2 = fork();
for (int i = 0; i < 100; i++)
{
sleep(1);
if(pid == 0)
printf("PID %d : PID2 %d : A=%d : i=%d : \n", pid,pid2, a++, i);
}
}
```
>* 위의 코드에서 보면 fork를 두 번 실행하는데 ps시 process는 4개가 뜨는 것을 확인 할 수 있다. 이러한 이유는 처음 fork시 process가 1개 에서 2개가 되었고, 두 번재 fork시 2개 모두 fork가 되어 2배인 4개가 되었기 때문이다.
>* 이처럼 fork 시에는 현재 process의 개수만큼 copy가 되어 2배씩 개수가 증가하는 것을 알 수 있다.
3. thread 와 pthread
>* thread는 꼭!!! 컴파일 시에 명령어 맨 뒤에 -lpthread를 붙여 컴파일 해야한다.
>* thread.h (c11) : 해당 버전에서는 함수 포인터를 파라메터로 받을 때 별달리 설정을 하지 않아도 된다.
>* pthread.h (POSIX) : 해당 버전에서는 함수 포인터를 파라메터로 받을 때에 해당 함수명앞에도 직접 *를 붙여야 한다.
>> * pthread_exit 사용시 함수를 중간에 끝낼 수 있다.
>> * pthread_join 은 동기화(synchronuzation)시 사용한다.
>> * pthread_self 이용시 내 thread의 번호를 알 수 있다.
>> * pthread_equal 사용시 두 thread가 같은지 비교할 수 있다.
* 아래는 thread에 관한 실습 코드이다.
```C
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int bbb = 0;
void fn_s()
{
static int a = 0;
printf("== %d %d ==",a++, bbb++);
}
void *run (void *arg)
{
printf("Hello world of POSXI threads.%d\n", (int) (0) ); // 버퍼를 잡아주기 위해 \n을 넣는다.
for (int i = 0; i < 10; i++)
{
sleep(1);
fn_s();
}
return 0;
}
int main()
{
int result1;
char bufff[10];
setvbuf(stdout,bufff, _IOFBF, 10);
run((void *) 0);
sleep(10);
run((void *) 0);
printf("Thread return %d at the end\n", result1);
}
```
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment