My Project
Loading...
Searching...
No Matches
td_kernel_engine.c
Go to the documentation of this file.
1/*
2 * Advanced Kernel Engine Implementation
3 *
4 * Maintainer: Azabell1993 Github master
5 * Created : 2024-09-04
6 *
7 * Purpose : Implements advanced kernel operations, including
8 * thread/process management, error handling, synchronization
9 * mechanisms, and data structures.
10 */
11
12#include <stdlib.h>
13#include <stdio.h>
14#include <string.h>
15#include <errno.h>
16#include <unistd.h>
17#include <sys/wait.h>
18#include <pthread.h>
19#include <semaphore.h>
20#include <sys/socket.h>
21#include <fcntl.h>
22
23// td_kernel_engine.c 파일에 정의된 함수를 사용하기 위해 헤더 파일을 포함합니다.(정적 라이브러리와 무관)
24#include "kernel_chat.h"
25#include "kernel_engine.h"
26#include "kernel_print.h"
27#include "kernel_smartptr.h"
28
29#define NUM_THREADS 3
30#define NUM_PROCESSES 2
31#define DEFAULT_TCP_PORT 5100
32
33// Forward declarations of test functions
34static void test_smart_pointer();
35static void test_file_reading();
36static void test_multithreading();
37static void test_multiprocessing();
38static void test_synchronization();
39static void run_all_tests();
40static pid_t kernel_fork();
41static void kernel_create_thread(pthread_t *thread, void *(*start_routine)(void *), void *arg);
42static void kernel_join_thread(pthread_t thread);
43static void kernel_socket_communication(int sock_fd, const char *message, char *response, size_t response_size);
44static void kernel_wait_for_process(pid_t pid);
45
46
47void run_multithreading(int num_threads, int use_semaphore, ...);
48void* semaphore_thread(void* arg);
49void* mutex_thread(void* arg);
50void* thread_function(void* arg);
51
52
53// Function prototype for process function
54static void process_function();
55
56// Main function
57int main(int argc __attribute__((unused)), char** argv __attribute__((unused))) {
58 kernel_printf("커널 메인 함수 시작\n");
59
60 // 단계 1: 변수 초기화
61 int ret, sock_fd[2];
62 char buf[] = "부모 프로세스에서 보냄!", line[BUFSIZ];
63 pid_t pid;
64 int thread_ids[NUM_THREADS] = {1, 2, 3};
65 pthread_t threads[NUM_THREADS];
66 sem_t* kernel_semaphore;
67 pthread_mutex_t* kernel_mutex;
68
69 // 단계 2: 환경 설정
70 kernel_printf("커널 환경 설정 중\n");
71 kernel_semaphore = init_semaphore(1);
72 kernel_mutex = init_mutex();
73
74 // 단계 3: IPC를 위한 소켓 페어 생성
75 kernel_printf("IPC를 위한 소켓 페어 생성 중\n");
76 ret = socketpair(AF_LOCAL, SOCK_STREAM, 0, sock_fd);
77 if (ret == -1) {
78 kernel_printf("소켓 페어 생성 실패\n");
79 }
80 kernel_printf("소켓 페어 생성됨: FD1=%d, FD2=%d\n", sock_fd[0], sock_fd[1]);
81
82 // 단계 4: 자식 프로세스 생성
83 kernel_printf("자식 프로세스 생성 중\n");
84 pid = kernel_fork();
85
86 if (pid == 0) { // 자식 프로세스
87 kernel_printf("자식 프로세스 시작됨\n");
88 close(sock_fd[0]); // 사용하지 않는 소켓 닫기
89
90 // 단계 5: 자식 프로세스 작업 수행
91 kernel_printf("자식 프로세스 작업 수행 중\n");
92 kernel_socket_communication(sock_fd[1], buf, line, sizeof(line));
93
94 safe_kernel_printf("자식 프로세스가 테스트를 시작합니다...\n");
95
96 // 자식 프로세스에서 테스트 실행
97 test_file_reading(); // 자식 프로세스에서 파일 읽기 테스트 실행
98 // run_all_tests();
99
100 // 자식 프로세스에서의 특정 작업
101 kernel_printf("자식 프로세스에서 특정 작업 실행 중\n");
102 kernel_create_thread(&threads[0], thread_function, &thread_ids[0]);
103 kernel_join_thread(threads[0]);
104
105 kernel_printf("자식 프로세스 작업 완료\n");
106 close(sock_fd[1]); // 소켓 닫기
107 kernel_printf("자식 프로세스 종료\n");
108 exit(0);
109 } else { // 부모 프로세스
110 printf("부모 프로세스 시작됨\n");
111 close(sock_fd[1]); // 사용하지 않는 소켓 닫기
112
113 // 단계 6: 부모 프로세스에서 메시지 전송 및 수신
114 printf("부모 프로세스가 자식과 통신 중\n");
115 kernel_socket_communication(sock_fd[0], buf, line, sizeof(line));
116 printf("부모 프로세스에서 받은 메시지: %s\n", line);
117
118 kernel_wait_for_process(pid); // 자식 프로세스 대기
119
120 close(sock_fd[0]); // 소켓 닫기
121
122 // 부모 프로세스에서 테스트 실행
123 test_file_reading(); // 부모 프로세스에서 파일 읽기 테스트 실행
124
125 // 단계 7: 부모 프로세스에서 멀티스레딩 테스트 수행
126 kernel_printf("부모 프로세스에서 멀티스레딩 테스트 수행 중\n");
127 for (int i = 0; i < NUM_THREADS; i++) {
128 kernel_create_thread(&threads[i], thread_function, &thread_ids[i]);
129 }
130 for (int i = 0; i < NUM_THREADS; i++) {
131 kernel_join_thread(threads[i]);
132 }
133
134 // 단계 8: 스마트 포인터 연산 테스트
135 kernel_printf("부모 프로세스에서 스마트 포인터 연산 테스트 중\n");
136 SmartPtr sp = create_smart_ptr(256);
137 retain(&sp);
138 release(&sp);
139 release(&sp);
140
141 // 단계 9: 세마포어 동기화 테스트
142 kernel_printf("부모 프로세스에서 세마포어 동기화 테스트 중\n");
143 pthread_t sem_threads[2];
144 for (int i = 0; i < 2; i++) {
145 kernel_create_thread(&sem_threads[i], semaphore_thread, kernel_semaphore);
146 }
147 for (int i = 0; i < 2; i++) {
148 kernel_join_thread(sem_threads[i]);
149 }
150
151 // 단계 10: 뮤텍스 동기화 테스트
152 kernel_printf("부모 프로세스에서 뮤텍스 동기화 테스트 중\n");
153 pthread_t mutex_threads[2];
154 for (int i = 0; i < 2; i++) {
155 kernel_create_thread(&mutex_threads[i], mutex_thread, kernel_mutex);
156 }
157 for (int i = 0; i < 2; i++) {
158 kernel_join_thread(mutex_threads[i]);
159 }
160
161 // 단계 11: 고급 오류 처리 테스트
162 kernel_printf("부모 프로세스에서 고급 오류 처리 테스트 중\n");
163 char *invalid_ptr = NULL;
164 if (invalid_ptr == NULL) {
165 kernel_errMsg("널 포인터 감지, 복구 시도 중\n");
166 }
167
168 FILE *invalid_file = fopen("/invalid/path", "r");
169 if (!invalid_file) {
170 kernel_errMsg("유효하지 않은 파일 열기 실패, 계속 진행\n");
171 }
172
173 // 단계 12: 프로세스 관리 시뮬레이션
174 kernel_printf("부모 프로세스에서 프로세스 관리 시뮬레이션 중\n");
175 pid_t worker_pid = kernel_fork();
176 if (worker_pid == 0) {
177 kernel_printf("작업자 프로세스 시작됨\n");
178 process_function();
179 kernel_printf("작업자 프로세스 종료\n");
180 exit(0);
181 } else {
182 kernel_wait_for_process(worker_pid);
183 }
184
185 // 단계 13: 메모리 관리 시뮬레이션
186 kernel_printf("부모 프로세스에서 메모리 관리 시뮬레이션 중\n");
187 void *memory_block = malloc(1024);
188 if (!memory_block) {
189 kernel_printf("메모리 할당 실패\n");
190 }
191 kernel_printf("메모리 할당됨, 주소: %p\n", memory_block);
192 free(memory_block);
193 kernel_printf("메모리 해제됨\n");
194
195 // 단계 14: 장치 I/O 시뮬레이션
196 kernel_printf("부모 프로세스에서 장치 I/O 시뮬레이션 중\n");
197 int fd = open("/dev/null", O_WRONLY);
198 if (fd == -1) {
199 kernel_printf("'/dev/null' 열기 실패\n");
200 }
201 write(fd, "커널 테스트 데이터", 16);
202 close(fd);
203 kernel_printf("장치 I/O 완료\n");
204
205 // 단계 15: 파일 시스템 작업 시뮬레이션
206 kernel_printf("부모 프로세스에서 파일 시스템 작업 시뮬레이션 중\n");
207 char *test_file_path = "/tmp/kernel_test_file";
208 FILE *test_file = fopen(test_file_path, "w");
209 if (!test_file) {
210 kernel_printf("테스트 파일 생성 실패\n");
211 }
212 fprintf(test_file, "커널 테스트 데이터\n");
213 fclose(test_file);
214 kernel_printf("테스트 파일 생성됨: %s\n", test_file_path);
215
216 test_file = fopen(test_file_path, "r");
217 if (test_file) {
218 char read_buffer[128];
219 while (fgets(read_buffer, sizeof(read_buffer), test_file)) {
220 kernel_printf("테스트 파일에서 읽음: %s", read_buffer);
221 }
222 fclose(test_file);
223 }
224
225 if (remove(test_file_path) == 0) {
226 kernel_printf("테스트 파일 삭제됨: %s\n", test_file_path);
227 } else {
228 kernel_errMsg("테스트 파일 삭제 실패\n");
229 }
230
231 // 단계 16: 네트워크 시뮬레이션 (스텁)
232 kernel_printf("부모 프로세스에서 네트워크 작업 시뮬레이션 중\n");
233 // 보통 여기서는 소켓과 네트워크 인터페이스를 포함합니다.
234 kernel_chat(2, "127.0.0.1", DEFAULT_TCP_PORT);
235 kernel_printf("네트워크 작업 시뮬레이션 완료\n");
236
237 // 단계 17: 시스템 호출 시뮬레이션
238 kernel_printf("부모 프로세스에서 시스템 호출 시뮬레이션 중\n");
239 int syscall_result = getpid(); // 시스템 호출을 getpid()로 대체
240 kernel_printf("시스템 호출 SYS_getpid 반환값: %d\n", syscall_result);
241
242 syscall_result = getuid(); // 시스템 호출을 getuid()로 대체
243 kernel_printf("시스템 호출 SYS_getuid 반환값: %d\n", syscall_result);
244
245 // 단계 18: 하드웨어 인터럽트 시뮬레이션 (스텁)
246 kernel_printf("부모 프로세스에서 하드웨어 인터럽트 시뮬레이션 중\n");
247 // 보통 여기서는 인터럽트 벡터와 핸들러를 포함합니다.
248 kernel_printf("하드웨어 인터럽트 시뮬레이션 완료\n");
249
250 // 단계 19: 커널 패닉 시뮬레이션
251 kernel_printf("부모 프로세스에서 커널 패닉 시뮬레이션 중\n");
252 if (1 == 0) { // 이 조건은 절대 참이 아닙니다.
253 kernel_printf("이 패닉은 절대 발생하지 말아야 합니다\n");
254 } else {
255 kernel_printf("커널 패닉 시뮬레이션 회피됨\n");
256 }
257
258 // 단계 20: 최종 정리 작업
259 kernel_printf("부모 프로세스에서 최종 정리 작업 수행 중\n");
260
261#ifdef __APPLE__
262 // macOS 특정 정리 작업
263#else
264 sem_destroy(kernel_semaphore); // 다른 플랫폼
265#endif
266 pthread_mutex_destroy(kernel_mutex);
267
268 kernel_printf("최종 정리 작업 완료\n");
269 }
270
271 // 단계 21: 커널 종료
272 kernel_printf("커널 메인 함수 종료\n");
273 kernel_printf("*************************************************\n");
274 kernel_printf("**** log file end *******************************\n");
275 kernel_printf("\n\n");
276 return 0;
277}
278
279
280// Function definitions
281
282static pid_t kernel_fork() {
283 pid_t pid = fork();
284 if (pid < 0) {
285 kernel_printf("Failed to fork process");
286 }
287 return pid;
288}
289
290static void kernel_create_thread(pthread_t *thread, void *(*start_routine)(void *), void *arg) {
291 int err = pthread_create(thread, NULL, start_routine, arg);
292 if (err != 0) {
293 kernel_printf("Failed to create thread");
294 }
295}
296
297static void kernel_join_thread(pthread_t thread) {
298 int err = pthread_join(thread, NULL);
299 if (err != 0) {
300 safe_kernel_printf("Failed to join thread");
301 kernel_errExit("Failed to join thread");
302 } else {
303 safe_kernel_printf("Thread joined successfully\n");
304 }
305}
306
307static void kernel_socket_communication(int sock_fd, const char *message, char *response, size_t response_size) {
308 if (write(sock_fd, message, strlen(message)) == -1) {
309 kernel_printf("Failed to send message through socket");
310 }
311
312 ssize_t bytes_read = read(sock_fd, response, response_size - 1);
313 if (bytes_read == -1) {
314 kernel_printf("Failed to receive message from socket");
315 }
316 response[bytes_read] = '\0';
317}
318
319static void kernel_wait_for_process(pid_t pid) {
320 int status;
321 if (waitpid(pid, &status, 0) < 0) {
322 safe_kernel_printf("Failed to wait for process");
323 kernel_errExit("Failed to wait for process");
324 } else {
325 safe_kernel_printf("Child process exited with status %d\n", status);
326 }
327}
328
329// Remaining functions (like semaphore_thread, mutex_thread, etc.) should be defined as before
330
331
332// 스마트 포인터 테스트 함수
333static void test_smart_pointer() {
334 safe_kernel_printf("스마트 포인터 테스트 시작\n");
335
336 // 스마트 포인터 생성
337 SmartPtr sp = create_smart_ptr(100);
338 safe_kernel_printf("스마트 포인터 생성, 참조 카운트: 1\n");
339
340 // 참조 카운트 증가
341 retain(&sp);
342 safe_kernel_printf("스마트 포인터 참조 증가, 참조 카운트: 2\n");
343
344 // 참조 카운트 감소
345 release(&sp);
346 safe_kernel_printf("스마트 포인터 참조 감소, 참조 카운트: 1\n");
347
348 // 마지막 참조 해제
349 release(&sp);
350 safe_kernel_printf("스마트 포인터 참조 해제, 메모리 해제됨\n");
351
352 safe_kernel_printf("스마트 포인터 테스트 종료\n");
353}
354
355// 파일 내용을 읽어 출력하는 함수 예제
356static void test_file_reading() {
357 FILE *file = fopen("non_existent_file.txt", "r");
358 if (!file) {
359 safe_kernel_printf("파일 열기 실패: non_existent_file.txt\n");
360 return;
361 }
362
363 safe_kernel_printf("파일 열기 성공: non_existent_file.txt\n");
364
365 char buffer[256];
366 while (fgets(buffer, sizeof(buffer), file) != NULL) {
367 safe_kernel_printf("파일 내용: %s", buffer);
368 }
369
370 fclose(file);
371}
372
373// 멀티스레드 테스트 함수
374static void test_multithreading() {
375 safe_kernel_printf("멀티스레드 테스트 시작\n");
376
377 int thread_ids[NUM_THREADS] = {1, 2, 3};
378 pthread_t threads[NUM_THREADS];
379
380 for (int i = 0; i < NUM_THREADS; i++) {
381 pthread_create(&threads[i], NULL, thread_function, &thread_ids[i]);
382 }
383
384 for (int i = 0; i < NUM_THREADS; i++) {
385 pthread_join(threads[i], NULL);
386 }
387
388 safe_kernel_printf("멀티스레드 테스트 종료\n");
389}
390
391// 프로세스 함수 예제
392static void process_function() {
393 pid_t pid = getpid();
394 safe_kernel_printf("Process %d: 시작\n", pid);
395 sleep(2); // 작업을 모방하기 위한 대기 시간
396 safe_kernel_printf("Process %d: 종료\n", pid);
397}
398
399// 멀티프로세스 테스트 함수
400static void test_multiprocessing() {
401 safe_kernel_printf("멀티프로세스 테스트 시작\n");
402
403 create_multi_processes(NUM_PROCESSES, process_function, process_function);
404
405 safe_kernel_printf("멀티프로세스 테스트 종료\n");
406}
407
408// 동기화 테스트 함수
409static void test_synchronization() {
410 safe_kernel_printf("동기화 테스트 시작\n");
411
412 sem_t* semaphore = init_semaphore(1);
413 pthread_mutex_t* mutex = init_mutex();
414
415 pthread_t sem_threads[2];
416 pthread_t mutex_threads[2];
417
418 // 세마포어 테스트
419 for (int i = 0; i < 2; i++) {
420 pthread_create(&sem_threads[i], NULL, semaphore_thread, semaphore);
421 }
422
423 for (int i = 0; i < 2; i++) {
424 pthread_join(sem_threads[i], NULL);
425 }
426
427 // 뮤텍스 테스트
428 for (int i = 0; i < 2; i++) {
429 pthread_create(&mutex_threads[i], NULL, mutex_thread, mutex);
430 }
431
432 for (int i = 0; i < 2; i++) {
433 pthread_join(mutex_threads[i], NULL);
434 }
435
436#ifdef __APPLE__
437 // macOS의 경우, sem_destroy를 호출하지 않음
438#else
439 sem_destroy(semaphore); // 다른 플랫폼에서는 호출
440#endif
441
442 pthread_mutex_destroy(mutex);
443
444 safe_kernel_printf("동기화 테스트 종료\n");
445}
446
447// 모든 테스트를 실행하는 함수
448static void run_all_tests() {
449 test_smart_pointer();
450 test_file_reading();
451 test_multithreading();
452 test_multiprocessing();
453 test_synchronization();
454}
void kernel_chat(int num_args,...)
네트워크와 클라이언트 간의 채팅 처리 함수
sem_t * init_semaphore(int value)
세마포어 초기화 함수 선언
void kernel_errExit(const char *format,...)
커널 오류 종료 함수 선언
void create_multi_processes(int num_processes,...)
다중 프로세스 생성 함수 선언
void kernel_errMsg(const char *format,...)
커널 오류 메시지 출력 함수 선언
void safe_kernel_printf(const char *format,...)
스레드 안전한 출력 함수 선언
pthread_mutex_t * init_mutex()
뮤텍스 초기화 함수 선언
SmartPtr create_smart_ptr(size_t size,...)
스마트 포인터를 생성하는 함수 (가변 인자 사용)
kernel_printf("5-4 = %d\n", 1)
스마트 포인터 구조체
void run_multithreading(int num_threads, int use_semaphore,...)
멀티스레드 실행 함수 (쓰레드 수 및 동기화 방법을 입력받음)
void * semaphore_thread(void *arg)
세마포어를 사용하는 스레드 작업 함수
#define NUM_PROCESSES
int main(int argc __attribute__((unused)), char **argv __attribute__((unused)))
void * thread_function(void *arg)
#define NUM_THREADS
void * mutex_thread(void *arg)
뮤텍스를 사용하는 스레드 작업 함수
#define DEFAULT_TCP_PORT