OS 라는것은 하나의 모듈로 생각했을때
끊임없이
저장장치로부터 input을 받아오고 출력장치 및 저장장치에 다시 output을 보낸다
우리가 처음 C언어를 배우고
이걸로 어떻게 게임을 만들지?
백준은 풀수 있다고... 근데 앱을 어떻게 만들지?
라는 생각이 드는 이유는
input과 ouput에는 주목을 하지만 내부데이터에 주목을 못했기 때문이다.
캡슐화의 관점에서 함수는 데이터의 input과 ouput만이 중요하다
들어가기 전의 상태와
들어간 후의 상태가 중요하다는것이며
나는 해당 루틴을 진행시킨 후의
상황을 가정한다.
내부데이터는 transient한 공간으로, 일시적으로 사용하다가 폐기되었음을 가정한 것이다.
허나, OS를 보자
이새끼를 in out 만 따지게 되면
ouput이 뭐냐고 했을때, 연산중입니다.
근데 이새끼 좀 병신같습니다! 데이터를 계속 잘못보냈다는것마냥, 같은공간에 계속 값을 바꿔서 내보냅니다!!
이런 어처구니 없는 해석이 되어버려.
즉,
루틴의 내부변수에도 주목을 해야돼.
나는 이걸 "런타임"이라고 불러.
다른 말로는 상태머신이고
우리는 해당 상태머신의 특정순간의 특정모습을 관찰하고 싶어해.
그리고 우리는 해당 루틴, 즉 "런타임"은 input ouput 뿐만 아니라 내부데이터에도 주목하게되고,
해당 루틴은 instaneous개념이 아니라, 시간적으로 점유를 하는, 길이가 존재하는 개념이 되는거지.
시간을 점유한다.
시간이 겹친다
그 시간이 동시적이다.
동시에 여러가지 상태머신이 작동하며,
해당 상태머신들 뿐 아니라 여러가지 in out 루틴들이 반복해서 일어난다
즉,
런타임 루틴이건(내부데이터를 중시), 함수형(in out을 중시) 루틴이건
우리는 루틴의 중첩에 살고 있다.
루틴들이 비동기에 의해서건, 멀티쓰레딩에 의해서건 시간적 겹침이 발생하는데,
사실 여기까지 내 말에 공감한다면
프로그래밍의 기본철학은 비동기라는것을 알 수 있다.
콜스택이라는거 자체가 비동기이기 때문임.
여하튼
컨커런씨란 결국
여러 상태머신들이 같은 시간에 존재하며 내부데이터가 공유되기에 발생하는 일이다.
또한,
OS만이 런타임이 아니다.
컨커런트프로그래밍을 하는 경우 언제나 내부 변수에도 주목을 해야하고,
데이터의 이동 흐름을 전부 규명지어줄 필요가 있다.
데이터의 이동 흐름을 규명짓는관점에서
변수들은 노드가 될거고
각 노드들을 방향그래프로 연결해줄 수 있다.
런타임이냐 함수냐 하는것도 정도의 문제이다.
함수형 루틴들도 짧지만 실행시간이 존재하기 때문이며,
하드웨어특성상
함수형 루틴또한 멀티쓰레딩에 의해 시간겹침이 일어나고,
운영체제특성상
인터럽트에의해 비정상적으로 오랜 기간동안 지속될수가 있다
여하튼
섭모듈들을 연결해서
전체 로 생각했을때
우리가 규명지어야할것은
루틴의 전체의 수명,
내부 변수들간의 이동그래프,
input 과 output
그것의 섭모듈을 들여다보면 다시
메인모듈기준으로 전부 내부변수였던 영역도
섭모듈을 기준으로
인풋 아웃풋 내부변수가 나뉘어지며
내부변수들간의 이동그래프였던것이
다시 그들중 일부는
인풋 아웃풋처리가 된다.
섭모듈들의 수명의 최댓값이
메인모듈의 수명이 된다.
세줄요약 : 우리는 OS를, 컴퓨터를 켜서 디스크의 정보를 바꾸기 위해 가동하지 않아. OS가 작동중인 시간중의 상태를 끊임없이 받아오려고 하는거지, 디스크넣고 디스크조작하고 끝! 이게 아니야
즉 나는 인라인어셈블리는 최고의 함수형 루틴 정의방법이라고 생각하는데 모든 루틴을 하나의 상태머신으로 규명지어야한다고 보는중임
인라인어셈블리의 방식도 살짝 모자라니까 한단계 더 진행해서 생각하고싶다는뜻