시스템프로그래밍

Study/시스템프로그래밍

[시스템프로그래밍] 임계구역과 세마포어에 관하여

Critical Sections(임계 구역) 상호 배타적으로 실행되어야 하는 코드 세그먼트 공유 장치(Shared devices)는 한 번에 한 프로세스에서 액세스해야 하므로 배타적 자원(exclusive resources)이라고 불림. 코드의 중요한 부분들 Entry Section(진입 구역) 공유 변수 또는 다른 자원을 수정할 권한을 요청하는 코드를 포함한다. Critical Section(임계 구역) 공유 자원에 액세스하거나 재진입할 수 없는 코드를 실행하는 코드를 포함한다. Exit Section(나가는 구역) Entry Section이 다음 실행 쓰레드가 임계 구역에 들어갈 수 있음을 알 수 있어야 해서 필요 Remainder Section(나머지 구역) 액세스를 해제한 후, 스레드는 실행할 다..

Study/시스템프로그래밍

[시스템프로그래밍] 조건 변수와 시그널, Reader-Writer problem에 관하여

Busy waiting while( x != y ); Non-busy waiting 해결책 Mutex를 잠그기 조건 x == y를 테스트 참이면 mutex를 잠금 해제하고 루프를 종료 거짓이면 스레드를 일시 중단하고 mutex를 잠금 해제 Mutex는 데이터에 대한 스레드 액세스를 제어하여 동기화를 구현하지만 조건 변수는 실제 데이터 값에 기반하여 스레드를 동기화할 수 있게 함. 만약 조건 변수가 없다면, 프로그래머는 계속해서 조건이 충족되었는지 확인하기 위해 스레드를 폴링(가능하면 임계 구역에서) 이는 스레드가 이 활동에 계속해서 바쁘게 차지되어 매우 자원 소모적일 수 있음. 조건 변수는 폴링 없이 동일한 목표를 달성하기 위한 방법 조건 변수는 항상 Mutex 락과 함께 사용 조건 변수 : 임의의 조건..

Study/시스템프로그래밍

[시스템프로그래밍] Mutex에 관하여

Mutex는 스레드 동기화를 구현하고 여러 쓰기가 발생할 때 공유 데이터를 보호하는 주요 수단 공유 데이터 리소스에 대한 액세스를 보호하는 잠금 역할 한 번에 하나의 스레드만 mutex 변수를 잠그거나 소유할 수 있다. 따라서 여러 스레드가 mutex를 잠그려고 해도 하나의 스레드만 성공 소유한 스레드가 해당 mutex를 잠금 해제할 때까지 다른 스레드는 해당 mutex 소유 불가능 스레드는 보호된 데이터에 번갈아가며 액세스해야 Mutex는 race condition을 방지하는 데 사용 Mutex 소유 → 전역 변수 업데이트 업데이트되는 변수 → critical section에 속함 Mutex를 사용하는 것은 프로그래머의 책임! Mutex 실행 순서 Mutex 변수 생성 후 초기화 여러 스레드가 mute..

Study/시스템프로그래밍

[시스템프로그래밍] 스레드

스레드의 장점 비동기 이벤트를 효율적으로 처리할 수 있다. 공유 메모리 다중프로세서에서 병렬 성능을 얻을 수 있다. 각 스레드는 스택과 CPU 상태(즉, 레지스터)로 구성된 실행 단위 Multiple 스레드는 Multiple 프로세스와 유사하지만, 작업 내의 여러 스레드는 동일한 코드, 전역 변수 및 힙을 사용. Unix에서 두 개의 프로세스는 운영 체제를 통해서만 통신 가능 (예: 파일, 파이프, 소켓) 그러나 작업 내의 두 스레드는 메모리를 통해 통신 가능 스레드를 사용하여 프로그램을 작성할 때, 이들이 동시에 실행된다고 가정한다. 각 스레드가 자체 CPU에서 실행되는 것처럼 보여야 하며, 모든 스레드가 동일한 메모리를 공유하는 것처럼 보여야 한다. 멀티태스킹 단일 프로세서에서 멀티스레딩은 일반적으로..

Study/시스템프로그래밍

[시스템프로그래밍] 시간과 타이머

POSIX Times 시스템은 Epoch 이후로 경과한 시간을 초 단위로 유지해야 Epoch은 세계 표준시 (Coordinated Universal Time, UTC, Greenwich Mean Time 또는 GMT로 불리기도 함) 기준으로 1970년 1월 1일 자정 00:00으로 정의됨 POSIX는 구현이 시스템 시간을 실제 시간과 날짜에 어떻게 정렬해야 하는지 명시 X #include time_t time(time_t *tloc); 시스템 시간에 접근한다 (Epoch 이후로 경과한 시간을 초 단위로 표현). tloc: NULL이 아닌 경우, 함수는 시간을 *tloc에 저장 time_t: long 형식 성공한 경우, Epoch 이후로 경과한 초의 수 반환 실패한 경우, (time_t)-1 반환 → 필수..

Study/시스템프로그래밍

[시스템프로그래밍] Signals

signal은 이벤트가 일어났을 때 발생했다는 사실을 프로세스에게 전달해주는 software notification다. 명령어 kill을 주면 목적지로 시그널을 준다. -l option은 available symbolic signal names의 list들을 준다. 프로세스는 도착한 시그널에 대해서 처리를 해줘야한다. → 시그널이 왔을 때 프로세스가 취해줘야 되는 default action이 있다. 터미널에서 ctrl+c → interrupt signal이 발생해서 지금 돌고 있는 프로세스에게 전달이 된다. 그러면 프로세스는 하던 작업을 멈추고 default action을 수행한다.(여기서는 강제 종료) Generating Signals #include int kill(pid_t pid, int sig)..

Study/시스템프로그래밍

[시스템프로그래밍] pipe에 관하여

pipe()를 호출하면 파이프를 만들고 두 개의 file descriptor table을 생성한다. → 읽기용 descriptor table(fd[0])과 쓰기용 descriptor table(fd[1]) 생성 부모와 자식이 pipe로 소통을 한다. 부모가 pipe 호출 파일 디스크립터 테이블 2개 생성 커널 안에 파이프 객체 생성 fd[1]을 가지고 작성, fd[0]으로 읽음 fork를 해서 자식 프로세스 생성 자식 프로세스는 대부분의 정보를 복사한다.→ 파일 디스크립터 내용 또한 복사됨 같은 파이프에 쓰고 읽을 수 있다. read한 데이터는 파이프에 저장되지 않고, 없어진다. 파이프 안에 read할 데이터가 있는데 read한 경우 → 그냥 read가 됨 파이프 안이 비어있는데 read한 경우 지금은 ..

Study/시스템프로그래밍

[시스템프로그래밍] 디렉토리 엔트리, hard/symbolic link, stat에 관하여

디렉토리 엔트리 디렉토리 엔트리 쌍: 파일명과 inode 번호 파일 정보는 inode에 있다 -> 포인터 정보들 (inode 안에 실제로 파일 내용들이 있는 것이 아니라, 이 포인터를 쫓아가야 파일 내용들이 있다. → 실제 파일들의 크기는 다른데 inode들의 크기는 같다.) 디렉토리 관련 명령어 chdir로 작업 디렉토리를 변경할 수 있다. 현재 작업디렉토리의 정보를 알아오는 시스템콜 → getcwd 디렉토리도 파일이다.(특별한 타입의) 모든 디렉토리 안에는 디렉토리 엔트리들이 있다. 디렉토리도 접근하려면 open을 해야한다. 디렉토리 오픈 → opendir 시스템 콜 사용 DIR *opendir (const char *dirname); dirname → 우리가 열고 싶은 디렉토리의 이름 DIR : d..

Study/시스템프로그래밍

[시스템프로그래밍] 프로그램, 프로세스, 스레드에 관하여

Asynchronous operation 비동기식 operation. 사용자가 키보드를 누를 때 등.. 사용자가 하는 일은 Asynchronous operation unpredictable time(예측할 수 없는 시간에 일어난다) Concurrency 스레드: 하나의 실행 흐름 스레드를 하나 띄울 때마다 스레드가 할 일을 구현해야하는데 그 일을 함수가 한다. 2개의 스레드가 돌고 있다. → 2개의 독립적인 실행 흐름이 있다. concurrent와 비슷한 말: simultaneous(뜻은 둘 다 동시에) 어떻게 두 개가 동시에 돌리는 것처럼 보이게 만들 수 있을까 → 매우 빠르게 번갈아가면서 실행한다. Multiprogramming 프로세스가 생성이 되면 메모리에 위치하게 된다. 그 위치는 ready q..

Study/시스템프로그래밍

[시스템프로그래밍] 리눅스 터미널과 명령어 요약 - 2

chmod 사용자 권한을 바꿀 수 있다. -rw-r—-r— 첫 번째: owner에게 주어진 권한 두 번째: 이 파일의 그룹 사용자에게 주어진 권한 세 번째: 그 외의 사람들에게 주어진 권한 문법: chmod [user/group/others/all] +(-)[permission].[file(s)] ex) 모두한테 실행 권한을 준다. 예시) chmod a+x test.txt touch touch test.txt → test.txt 생성 ps ps : 지금 running되는 process를 볼 수 있다. kill kill: process를 죽이고자 할 때 사용한다. ex) kill -9(시그널) 1255(프로세스ID) input/output redirection (”piping”) program_a | pr..

퀵차분
'시스템프로그래밍' 태그의 글 목록