Lecture note6

Download Report

Transcript Lecture note6

Term Project Team Member
1조
2005200021 권용일
2006200030 김나연
2006200089 김나영
2조
2006200031 김다영
2003200039 김범석
2004200055 김석영
3조
2003200066 김영호
2004200081 김재면
2003200079 김지수
4조
2004210014 김지훈
2004200116 김현준
2002200129 남대영
5조
2002200139 문규호
2003210014 박세진
2004200170 박해민
6조
2005200160 박효선
2005200171 서영연
2004200186 석민걸
7조
2002200201 손완기
2003200183 신상배
2003200211 유시현
8조
20031794 이민우
2004200274 이성종
2005200269 이승진
9조
2002200301 이종민A
2004200298 이종민B
2003200303 장경훈
1
10조
11조
12조
2006200310 장성만
2003200309 장한솔
2003200311 전광현
200032627 정경민
2003200323 정승옥
2006200346 조무형
2005200382 최천사
2004200404 탁우영
2002200410 허영수
2003200408 황현준
2
Unix Process
School of Electronics and Information.
Kyung Hee University.
Dae Sun Kim
<[email protected]>
3
다중 접속 서버의 구현 방법들
 프로세스 생성을 통한 멀티태스킹(Multitasking) 서버의 구현.
 select 함수에 의한 멀티플렉싱(Multiplexing) 서버의 구현.
 쓰레드를 기반으로 하는 멀티쓰레딩(Multithreading) 서버의 구현
4
프로세스에 대한 이해
 프로세스란 실행되고 있는 프로그램의 기본 단위이다.
 생성된 프로세스는 운영체제의 의해 할당된 고유한 ID를 지닌다.
 하나의 프로그램 내에서 여러 개의 프로세스가 동시에 실행 될 수 있다.
5
Process의 정의
 Program 이란
C, C++, Java와 같은 프로그램 언어로 작성된 소스코드
 Process 란
Running program
hard disk
main memory
read
Process 1
Process 2
read
Program 1
Program 2
CPU
Process 3
read
Process 4
read
Program 3
Program 4
6
 Process는 User mode 또는 Kernel mode에서 실행
void main()
{
char buf[512];
User mode에서 실행
int n = read(0, buf, 512};
Kernel mode에서 실행
n++;
User mode에서 실행
exit(0);
Kernel mode에서 실행
}
running state
waiting state
zombie state
stop state
7
 Running state
프로세스가 CPU 서비스를 받을 수 있는 상태
 Waiting state
입출력 처리와 같은 어떤 조건을 기다리는 상태
 Stop state
특정 시그널을 커널로 부터 받아 프로세스의 동작이 정지된 상태
 Zombie state
프로세스의 실행은 끝났으나 여전히 메모리에 존재하는 상태
8
프로세스에 대한 이해
9
#include<stdio.h>
#include<stdlib.h>
extern char **environ;
int init_global_var = 3;
int unint_global_var;
//extern 변수
//초기화된 global 변수
//초기화되지 않은 global 변수
int main(int argc, char **argv) {
int auto_var;
//자동 변수
static int static_var;
//static 변수
register int reg_var;
//register 변수
char *auto_ptr;
//자동 변수
auto_ptr
= malloc(10); //메모리 10byte 할당
return 0;
}
메모리 영역
환경변수와 명령해 인자 영역
데이터 영역
메모리 내용 및 변수들
*envirron 내용
stack
argc, argv, auto_var, reg_var, auto_ptr
heap
malloc()이 할당한 10 byte
초기화 안 된 영역
초기화 된 영역
코드영역
unint_global_var, static_var
init_global_var = 3
어셈블된 프로그램 코드
10
 Stack
func() 호출
process
int main() {
char *ptr;
ptr = func();
}
char *func() {
char arr[10];
return arr;
}
10 byte 배열 할당
Address return
Stack 영역
11
 heap
func() 호출
process
int main() {
char *ptr;
ptr = func();
free(ptr)
}
char *func() {
char *arr;
arr = malloc(10);
return arr;
}
free(ptr) 호출
10 byte 배열 할당
Address return
heap 영역
12
fork 함수 호출을 통한 프로세스의 생성
 fork 함수 호출을 통한 프로세스의 생성은 복사에 의한 생성이다.
#include <sys/types.h>
#include <unistd.h>
pid_t fork(void);
13
fork 함수 호출을 통한 프로세스의 생성
int a=10;
int main()
{
pid_t pid;
int b=20;
pid = fork();
…….
}
a=10
Data 영역
int main()
{
pid_t pid;
int b=20;
pid = fork();
…….
pid=1133
b=20
Stack 영역
원본 프로세스
int a=10;
}
a=10
Data 영역
pid=0
b=20
Stack 영역
복사본 프로세스
14
Parent process
PID = 100
Fork()
Parent process
PID = 100
Return 값 = 101
*. 자기 자신을 복제
*. 메모리 영역은 독립
*. PID 는 다름
*. 완전히 복제된 두 개의 Process 가
돌게 된다.
Child process
PID = 101
Return 값 = 0
15
PID = fork();
If (PID == 0)
child_work();
// child process에서 처리
Else
parent_work();
// parent process에서 처리
16
프로세스의 종료
 종료 조건
main() 함수에서 return 되는 경우
exit() 함수를 호출할 경우
프로세스 종료 signal을 받은 경우
17
예제 확인 #1
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main(int argc, char **argv)
{
pid_t pid;
int data=10;
pid=fork();
if(pid==-1)
printf("fork 실패, 프로세스 id : %d \n", pid);
printf("fork 성공, 프로세스 id : %d \n", pid);
if(pid==0)
else
/* 자식 프로세스라면 */
data+=10;
/* 부모 프로세스라면 */
data-=10;
printf("data : %d \n", data);
return 0;
}
18
예제 확인 #1
 실행 화일
fork.c
 실행 결과
19
예제 확인 #2
int global_var = 0;
// 전역 변수 선언
int main(void) {
pid_t pid;
int local_var = 0;
// 지역 변수 선언
if((pid = fork()) < 0) {
printf("fork error\n");
exit(0);
// 자식 프로세스
} else if (pid == 0) {
global_var++;
local_var++;
printf("CHILD - my pid is %d and parent's pid is %d\n", getpid(), getppid());}
else {
// 부모 프로세스
sleep(2); // 2초 쉰다
global_var += 5;
local_var += 5;
printf("PARENT - my pid is %d, child's pid is %d\n", getpid(), pid);}
printf("\t global var : %d\n", global_var);
printf("\t local var : %d\n", local_var);
20
예제 확인 #2
 실행 파일
fork_test.c
pid_t getpid(void)
//자신의 PID를 얻음
pid_t getppid(void)
//부모 프로세스의 PID를 얻음
21
예제 확인 #3
 파일명
tcp_talkserv.c
tcp_talkcli.c
 프로그램 설명
토크서버에서는 먼저 listen()을 호출하고 accept()를 호출하여 클라이언트와
연결하고 연결이 이루어지면 fork()를 호출
부모 프로세스는 사용자의 키보드 입력을 받아 클라이언트에게 전송
자식 프로세는 클라이언트가 보내온 메시지를 화면에 출력
strstr(검색당할문자열, 검색할문자열);

리턴값: 검색당할문자열에서 검색할문자열중에 일치하는 문자가 발견된 포인터.
22
예제 확인 #3
char string[100] = "이문자열은 3을 포함함.\n";
char * result;
result = strstr( string, "0123456789" );
printf( "%s\n", result);
/* 출력 */
3을 포함함.
23
실습과제
 새로운 프로세스를 생성하고 이 프로세스에서 10초 간격으로 현재의
시간을 클라이언트에게 전송 하는 프로그램 작성
TCP 이용
UDP 이용
24