지난이야기)스레드
스레드는 프로세스를 구성하는 단위다.
지금까지 우리는 실행 흐름이 하나뿐인 프로세스를 상정해왔으나, 많은 프로그램들은 실행 흐름이 여럿이다.
각 스레드는 실행에 필요한 최소한의 정보, 예로 레지스터 값, 프로그램 카운터, 스레드 id등을 갖고 있다.
하나의 프로세스 안의 스레드들은 자원을 공유하며 이루어지기 때문에 비교적 자원의 효율적 사용, 협력과 통신이 용이해진다.
리눅스 개발진은 스레드와 프로세스의 구분을 엄격히 하는 것을 거부했다는 것이 흥미로웠다.
CPU가 제조사마다 다르고 그 언어도 다르듯이 운영체제도 조금씩 다르게 굴러가고 개념이 잡혀있다는 것이 흥미로웠다.
비록 무궁무진한 응용 프로그램들의 작동 토대가 되어주는 운영체제이지만 어떤 방식이 더 효율적이고 좋은지에 있어서 의견 차이, 그로인한 플랫폼의 차이가 나타나는 점이 흥미로웠다.
11) CPU스케줄링
실행되기를 원하는 프로세스가 굉장히 많기에 이것들의 우선순위를 결정하고 자원을 분배하는 것이 중요하다.
가령 입출력 장치 집중 프로세스는 어차피 입출력 장치를 사용하는 동안에는 대기 상태로 쉬고 있어야 되기 때문에, 일반적으로 cpu집중 프로세스보다 우선순위가 높게 책정되고 실행된다. 또한 cpu, 메모리, 입출력 장치를 쓰고 싶어하는 프로세스가 여러 개일 수 있기에 그 프로세스들 간에 우선순위를 부여하는 것이 필요한데 그 기능을 하는 것이 스케줄링 큐이다.
대기 큐의 경우 입출력 장치 별로 그 종류가 나뉘어 있다고 한다.
스케줄링은 어떤 원리, 방식으로 이루어질까? 어떻게 각 프로세스를 운영하고 우선순위를 부여해야 전체적인 효율과 각 프로세스의 중요도를 확보할 수 있을까?
이 스케줄링 알고리즘은 여러 가지가 있으며 동영상 강의에서 소개하고 있는 것 외에도 여러 가지가 있다고 한다. 아이디어에 집중해서 각 알고리즘의 방식, 장단점을 알아보고자 노력하였다.
- 최단작업 우선 스케줄링: 짧은 작업 시간을 요구하는 프로세스부터 처리한다.
- 라운드 로빈 스케줄링: 한 프로세스를 다 끝내고난 다음에 다른 프로세스를 처리하는 것이 아니라 각 프로세스를 일정 시간씩만 쪼개서 실행하는 방식을 사용한다. 한 프로세스가 너무 실행이 미루어지는 문제를 처리할 수 있다.
- 최소잔여 우선 스케줄링: 최단작업 우선 스케줄링과 라운드 로빈 스케줄링을 합쳤다.
- 우선순위 스케줄링: 앞서 말했듯이 cpu집중 스케줄링 등을 우선순위를 낮게 주는 편이기에 이러한 우선순위를 반영하여 순서를 부여하여 프로세스들ㅇ르 처리하는 방식이다. 문제는 우선순위가 낮은 프로세스들은 너무 실행이 늦어진다는 것이다. 이러한 문제를 해결하기 위해 에이징 기법이 사용된다고 한다. 오래기다릴 수록 우선순위를 높여주는 것이다.
- 다단계 큐 스케줄링: 우선순위를 기준으로 프로세스들을 큐에 다시 분배하여 프로세스를 처리하는데 각 큐별로 타임 슬라이스 등의 설정을 달리 할 수 있어 우선순위 높은 프로세스, 낮은 프로세스 별로 구분된 실행 방식을 가질 수 있다.
12) 프로세스 동기화
프로세스, 동기화가 번갈아 진행되거나 동시에 실행되어 갈때
우리는 이 프로세스들이 같이 진행하면서 생기게 될 여러 문제들을 만날 수 있다고 한다!
1. 실행 순서 문제: 올바른 실행 순서로 프로세스들끼리 합을 맞춰야 되는데 순서가 엊갈려 생기는 문제
2. 공유 자원 문제: 두 프로세스가 하나의 자원에 동시에 접근하면서 생기는 문제, 두 프로세스 모두 자원에 접근, 쓰거나 읽는 과정을 거치게 될 텐데 이러한 과정들이 운이 안 좋게 겹쳐버리면 오류가 날 것이라는 것이다.
이전에 프로그래밍을 하면서 몇 번 마주친 적이 있는 문제였기에 특히 공유 자원 문제는 공감이 갔고 운영체제에서 어떻게 문제를 해결해나갈 수 있을지 궁금증을 가지게 되었다. 운영체제에서는 이 문제를 해결하기 위해 임계 구역을 설정한다고 한다. 임계 구역에 하나의 프로세스가 진입해 있다면 그 프로세스가 나갈 때까지 다른 프로세스들은 대기해야 한다고 한다.
이러한 프로세스 동기화 기법에는 무엇이 있을까?
뮤텍스 락은 실제 탈의실의 락, 자물쇠와 비슷하다는 비유가 인상깊었다. 전역변수를 이용해서 현재 사용하고 싶은 자원이 임계구역으로서 사용 불가능한, 다른 프로세스가 사용중인 상태인지를 확인한다고 한다.
세마포는 뮤텍스락과 큰 틀에서 원리는 비슷하게 느껴졌지만 비지 웨이팅, 계속해서 전역 변수의 참거짓 여부를 확인해야 하는 문제를 해결하기 위해 그냥 프로세스 자체가 대기 상태로 들어갔다가 임계 구역이 비었을때 다시 실행 상태로 재개하는 방법이 활용한다는 차이가 있음을 알 수 있었다.
13) 교착 상태
프로세스 간의 순서를 맞춰주고 서로 자원을 침범하는 문제를 해결하기만 한다면 모든 문제가 해결될까?
아니였다. 이렇게 잘 작동되기 때문에 오히려 생길 수 있는 문제가 바로 교착상태라는 것인데,
동영상 강의에서 들은 밥먹는 철학자 문제가 재미도 있고해서 기억에 잘 남는 비유인 것 같다.
자원 할당이 되길 기다리면서 상대방이 기다리고 있는 자원을 내가 가지고 있어버리면 영원히 대기 상태가 끝나지않게 되는 것이다.
이러한 교착 상태의 조건은 다음 4가지로 정리가 가능하다.
1. 상호배제: 한 프로세스가 사용하는 자원을 다른 프로세스가 사용할 수 없는 상태
2. 점유와 대기: 자원을 할당 받은 상태에서 다른 자원을 할당 받기를 기다리는 상태
3. 비선점: 어떤 프로세스도 다른 프로세스의 자원을 강제로 빼앗지 못하는 상태
4. 원형 대기: 프로세스들이 원의 형태로 자원을 대기하는 상태
문제를 해결하기 위해서는 어떤 조건을 방지해야 할까?
상호배제를 막는 것, 점유와 대기를 막는 것이 가져올 문제를 지적하며 보류하는 것이 인상깊었다. 점유와 대기를 포기하도록 하면 자원의 활용도가 떨어지는 문제가 발생할 수 있다는 것이다.
원형 대기 조건을 해제하기 위해서 오름차순으로 자원을 할당하는 방식이 있다는 것, 그리고 물론 이 또한 자원의 활용도가 떨어지는 문제가 있을 수 있다는 것을 알 수 있었다.
숙제)
363p 1번 정답은... 4번!!!!!!!!!!!!
세마포를 쓰더라도 프로세스가 대기 상태로 바뀌고 임계구역이 비면 다시 실행 상태로 바꾸는 방식을 통해 비지 웨이팅을 막을 수 있기 때문이다.