본문 바로가기
운영체제

운영체제 6장 - 프로세스 관리(3) : 쓰레드 및 프로세스 동기화 -

by ChocoPeanut 2017. 4. 17.

운영체제 6

- 프로세스 관리(3) : 쓰레드 및 프로세스 동기화 -

 

쓰레드라고 하는 것은 프로그램 내부에 흐르는 맥, 흐름이라고 한다. 우리가 상위 언어 예를 들어 자바나 C로 프로그램을 작성할 때 메인 함수를 통해 각종 표현식이 돌아 프로그램이 끝이 나는 것을 맥이 흐른다.”라고 한다. 기본적으로는 한 프로그램에 맥이 하나 흐른다. 하지만 한 프로그램에 2개 이상의 맥이 흐를 수 있는데 이것을 다중 쓰레드라고 한다. 하지만 다중 쓰레드는 실제로 맥이 빠른 시간 간격으로 스위칭을 진행하는 것이 여러 가지 맥이 동시에 진행되는 것이 아니다. 시간 간격이 매우 짧아 동시에 맥이 흐르는 것처럼 보이는 것이다.


현재 대부분의 프로그램은 다중 쓰레드이다. 예를 들어 웹 브라우저를 들면 화면을 출력을 시켜주는 프로그램 쓰레드가 있고 데이터를 읽어오는 쓰레드가 따로 존재한다. 두 가지의 쓰레드가 같이 돌고 있으므로 우리가 동시에 할 수 있는 것이다.


한 프로세스 내의 다중 쓰레드는 프로세스의 메모리 공간을 공유(code, data)하고 자원도 공유(file, I/O)를 한다. 하지만 개별적인 PCSP, stack을 공유하지 않는다.




컴퓨터 내에서는 앞장에서 말한 프로세스 단위의 스위칭이 아니라 쓰레드 단위의 스위칭이 일어난다. 위에서 설명했듯이 다중 쓰레드를 지원할 경우 CPU가 할당되는 단위는 쓰레드가 기준이 되어 할당받게 된다.


모든 프로그램은 기본적으로 하나의 쓰레드는 가지고 있다. 이 쓰레드는 메인 쓰레드(main 함수에 관련되어 있다.)이다. 이외에 쓰레드를 가지는 하위 클래스를 만들고 치환을 시킨 후 코드를 입력해 주면 새로운 다른 쓰레드를 만들 수 있다.


자바 코드를 이용하여 예시를 들어보자. 글자 AB를 동시에 화면에 출력하는 프로그램을 만들고자 한다. 처음 프로그램이 시작하면 메인부터 시작을 한다. 메인함수로부터 새로운 쓰레드를 하나 만든다. 메인 함수에 의해 만들어지는 쓰레드는 무한 루프를 돌면서 A를 화면에 출력한다. 메인 함수 안에 MyThread를 통해 B를 출력하는 새로운 쓰레드가 같이 돌게 된다. 따라서 화면에는 AB가 동시에 계속 찍혀져 나올 것이다.

 

class Test {

  public static void main(String[] args) {

MyThread th = new MyThread();

th.start();

while(true)

System.out.print(“A”);

  }

}

 

class MyThread extends Thread{

  public void run(){ # public void run() : 새로운 맥이 흐르는 곳이다.

while(true)

System.out.print(“B”);

  }

}

 

프로세스 관리에 중요한 역할은 스케줄링동기화이다.

프로세스는 Independent 프로세스와 Cooperating 프로세스로 나눌 수 있다. Cooperating 프로세스는 다른 프로세스에 의해 영향을 주고받을 수 있는 프로세스이다. 일반적으로 Cooperating 프로세스가 많이 존재한다. 예를 들면 통신을 하는 전자우편이나 파일 전송에 관련된 프로세스는 서로 주고받아야 하기 때문에 Cooperating이고 자원을 공유하는 데이터베이스나 메모리상의 자료들을 공유하는 프로세스는 Cooperating 프로세스이다


서로간의 프로세스가 접속을 가능할 수 있게 되어 공유하는 데이터에 동시에 접근하면 문제점이 발생할 수 있다. 이런 문제를 해결하기 위한 것이 프로세스의 동기화이다. 서로 Cooperating하는 프로세스 간에 문제가 발생하지 않도록 일관성을 유지시키는 것이 프로세스 동기화이다.


예시로 은행계좌 문제를 들어보자. 부모님과 학생이 있는데 부모님은 은행계좌에 입금을 하고 학생은 출금을 한다고 가정을 하자. 부모님과 학생은 언제든지 자신의 활동을 할 수 있다. 동일한 계좌에 접근을 하므로 부모님과 학생은 Cooperating 관계를 가진다. 그런데 만약 같은 시간에 접근하여 활동을 할 경우 문제가 발생할 수 있다. 이를 예방하기 위한 프로세스 동기화가 필요하다. 한 번에 하나의 쓰레드만 업데이트 하도록 작업을 수행해서 문제를 해결한다. 이에 대한 문제 해결 방법은 다음 장에서 설명할 것이다.