process ~= Task
HDD -> 메모리에 로드 후 OS가 관리하는 단위
(소스코드,등등)
멀티쓰레딩 : 리눅스 -> 메모장 + vi에디터 + ..
Task(process)의 속성을 담은 구조체 -> task_struct
Thread : user 가 생성한 가벼운 process
: context switching (Task 전환) 시간 down
: 소속 process 내에 주소공간 ( 전역변수,파일 등)을 공유
<> Kernel 에서는.. 쓰레드, process 동등하게 관리
> task_struct 에서 thread 그룹인지 정도만 확인
명령어 ps : 터미널 내 process 확인 // PID : process ID
ps -ejH : process 계층구조 // sshd: d(demon) // bash : 명령어 입력가능상태
init_task(구조체) : process 들의 연결리스트(포인터)
kthread : kernel 안에서만 돌아가는 process들
PID
0: swapper
1: init // systemd (라파4)
2: kthread
OS 도 결국 HDD,SDD 에 저장되어있는 Program
> 메모리에 올려서 사용
> C/C++ : 메모리 접근 O -> OS(kernel)의 주소를 잘못 건들면 disaster !
>>
level 로 구분
User : Kernel level 접근 x
> systemCall : kernel 내 함수 사용 // 미리 kernel 내에서 정의 (sys.c)
Kernel : All 메모리 접근 // 주의
process 생성
ALL process는 kernel 에서 생성
> kernel_clone() : 생성 및 초기화
> 메모리 복사(복제)
// 새로 똑같이 생성시에는 시간 소모큼
// ~= (메모리 할당) 자주쓰는 구조체는 미리 만들고 주소로 넘겨서 빠른 접근
level 별 kernel_clone() call 하는 process
user : init process
kernel : kthread process
USER : glibc ( GNU 제공 프로세스 생성 lib) -> 커널에게 process 생성 요청 (systemcall)
>
fork() -> sys_fork (요새는 sys_clone)
clone() -> sys_clone
vfork() -> sys_vfork
Kernel_thread ( KERNEL)
>> do _fork() -> copy_process -> kernel_clone()
1. fork(), clone(),vfork() 까지만 USER LEVEL -> 나머지는 다 kernel
2. sys_clone() : 다양한 flag 사용하여 프로세스 생성 가능 -> #ifdef 문 여러개 -> sys_clone !
> ifdef 문 너무 많아서 걸러내기
> 프로세스를 만들거나 쓰레드를 만들 수도 있음
> process : 부모와 독립된 메모리공간
<> thread : 부모와 공유된 메모리공간
> USER level 에서는 주로 fork()를 사용
// STM32 RTOS : Task() , thread() 로 user level 에서 process , thread 생성,실행 > RTOS kernel 에서 관리
/*
1 :전처리 파일 pwd 로 디렉터리 확인
2 : ./build_prepross.sh 전처리할 파일
3. /out/kernel/fork.i 에서 확인
> 정렬은 gpt가..