03 프로세스 ~ 04 스레드

3단원

 

    프로세스 (Process)

  • 3.1 프로세스 개념

    비공식적으로, 프로세스란 실행 중인 프로그램이다. 메모리 상의 프로세스 스택 - 함수 매개변수, 복귀주소, 지역변수 힙 - 실행중에 동적할당 데이터 - 전역변수 텍스트 - 프로그램 코드 프로그램은 수동적 개체, 프로세스는 능동적 개체 프로그램은 메모리로 로드되어 실행중인 파일이 될때 프로세스가 된다. 하나의 프로그램은 여러개의 프로세스로 작동될 수 있다. 프로세스가 실행될때, 상태(state)가 변한다. new : 프로세스 생성중 running : 명령어들이 실행되고 있다. waiting : 프로세스가 어떤 사건(입출력 완료나 신호의 수신 같은)이 일어나기를 기다린다 ready : 프로세스가 처리기에 할당되기를 기다린다 terminated : 프로세스의 실행이 종료되었다. ex)잡큐, 레디큐,I/O큐 프로세스 제어 블록(Process Control Block) 각 프로세스는 운영체제에서 프로세스 제어 블록에 의해 표현된다.
  • 3.2 프로세스 스케줄링

    다중 프로그래밍의 목적은 CPU 이용을 최대화하기 위하여 항상 어떤 프로세스가 실행되도록 하는데 있다. 시분할의 목적은 각 프로그램이 실행되는 동안 사용자가 상호 작용할 수 있도록 프로세스들 사이에서 CPU를 빈번하게 교체하는 것이다. 이 목적을 달성하기 위해 프로세스 스케줄러는 CPU에서 실행 가능한 여러 프로세스들 중에서 하나의 프로세스를 선택한다. -스케줄링 큐 프로세스가 시스템에 들어오면, 이들은 잡 큐에 놓인다. 이 큐는 시스템 안의 모든 프로세스로 구성된다. 주 메모리에 존재하며, 준비 완료 상태에서 실행을 대기하는 프로세스들은 실행을 대기하는 프로세스들은 레디 큐라 불리는 리스트 상에 유지된다. 특정 입출력 장치를 대기하는 프로세스들의 리스트를 장치 큐라고한다. 각 장치는 그 자신의 장치 큐를 가진다. 새로운 프로세스는 처음에 준비 완료 큐에 놓인다. 프로세스는 실행을 위하여 선택 될 때, CPU를 디스패치 할때까지 준비 완료 큐에서 대기한다. 입출력요청과, fork 의 경우 프로세스는 대기 상태에서 준비 완료 상태로 전환되고, 다시 준비 완료 큐에 넣어지게 된다. 프로세스는 이 주기를 반복하며, 종료되면 모든 큐에서 삭제, 그 자신의 PCB와 자원을 반납한다. -스케줄러 장기 스케줄러(또는 잡 스케줄러)는 이 풀에서 프로세스들은 선택하여 실행 하기 위해 메모리로 적재한다. 단기 스케줄러(CPU 스케줄러)는 실행 준비가 완료되어 있는 프로세스들 중에서 선택하여, 이들 중 하나에게 CPU를 할당한다. 이들 두 스케줄러의 차이는 실행 빈도이다. 단기 스케줄러는 CPU를 위해 반드시 자주 새로운 프로세스를 선택해야 한다.(ex IO의 경우 스케줄링에 시간낭비) 장기 스케줄러는 실행 빈도수가 훨씬 적다. 다중 프로그램의 정도(메모리에 있는 프로세스들의 수)를 제어 대부분의 프로세스들은 IO중심 또는 CPU중심으로 표현되어진다. IO중심 프로세스는 연산보다는 입출력실행에, CPU중심프로세는 연산에 시간을 더 소요한다. 단기 스케줄러 : 빠른알고리즘사용해야함, 레디큐에서 실행으로 장기 스케줄러 : 어떤작업을 메인메모리에 올릴지 , 잡큐에서 레디큐로 중기 스케줄러 핵심 아이디어 : 메모리에서(CPU를 위해 적극적으로 경쟁하는) 프로세스들을 제거함으로써 다중 프로그래밍의 정도를 완화 차후에 다시 프로세스를 메모리로 불러와서 중단되었던 지점부터 실행을 재개한다. 이러한 기법을 스와핑(swapping) 이라한다. 프로세스는 중기 스케줄러에 의하여 스왑되어 나가고 후에 다시 스왑되어 들어온다. 문맥 교환(Context Switch) 인터럽트가 발생하면 시스템은 인터럽트 처리가 끝난 후에 문맥을 복구할 수 있도록 현재 실행중인 프로세스의 현재 문맥을 저장할 필요가 있다. 문맥은 프로세스의 PCB에 표현된다. 문맥은 CPU레지스터값,프로세스상태,메모리관리 정보 등을 포함 일반적으로 커널,사용자모드 둘다 CPU의 현재 상태를 저장하는 작업을 수행(state save)하고 나중에 연산을 재개하기 위하여 상태 복구 작업을 수행한다(state restore) CPU를 다른 프로세스로 교환하려면 이전의 프로세스의 상태를 보관하고 새로운 프로세스의 보관된 상태를 복구하는 작업이 필요하다. 이 작업은 문맥 교환(context switch)이라 한다. 문맥 교환이 일어나면, 커널은 과거 프로세스의 문맥을 PCB에 저장하고, 실행이 스케줄된 새로운 프로세스의 저장된 문맥을 복구한다. 문맥 교환이 진행될 동안 시스템이 아무런 유용한 일을 못하기 때문에 문맥 교환 시간은 순수한 오버헤드이다. 따라서 상호적으로 타임쉐어링을통해서 사용자 입장에서 response time을 줄여야한다.
  • 3.3 프로세스에 대한 연산

    대부분 시스템 내의 프로세스들은 병행 실행될 수 있으며, 반드시 동적으로 생성 및 제거되어야 한다. -생성 생성하는 프로세스를 부모 프로세스라고 부르고, 새로운 프로세스는 자식 프로세스라고 부른다. 이 새로운 프로세스들은 각각 다시 다른 프로세스들으 생성할 수 있으며, 그 결과 프로세스의 트리를 형성한다. 유닉스,리눅스,윈도우 같은 대부분 OS에서 유일한 프로세스 식별자(pid)를 사용하여 프로세스 구분 (커널이 유지하는 속성에 접근하기 위한 인덱스로 사용됨) 리눅스의 경우 pid가 1인 init 프로세스가 모든 사용자 프로세스의 루트 부모 프로세스 역할을 수행한다. 일반적으로 프로세스가 자식 프로세스를 생성 할때, 그 자식 프로세스는 자신의 임무를 달성하기 위하여 어떤 자원(CPU 시간,메모리,파일,입출력장치 등)이 필요하다 OS로부터 얻거나, 부모가 부분을 제공하거나, 부모와 자식 서로 공유하지않는 총 3가지가 있다. 프로세스가 새로운 프로세스를 생성할때, 두 프로세스를 실행시키는 데 두 가지 가능한 방법이 존재한다 1. 부모는 자식과 병행하게 실행을 계속한다 2. 부모는 일부 또는 모든 자식이 실행을 종료할 때까지 기다린다 유닉스에서 새로운 프로세스는 fork()시스템 호출로 생성된다. 새로운 프로세스는 원래 프로세스의 주소 공간의 복사본으로 구성된다. 이 기법은 부모 프로세스가 쉽게 자식 프로세스와 통신할수 있게한다. 두개의 프로세스 즉 부모와 자식은 fork()후의 명령어에서부터 실행을 계속하며, 이 때 한 가지 다른점은 fork()의 복귀 코드가 서로 다르다는 것이다. fork() 함수는 부모프로세스에게 자식 pid 를 반환하고 , 자식에게는 0을 반환한다. fokr() 시스템 호출 다음에는 두 프로세스 중 한 프로세스가 exec() 시스템 호출을 사용하여 자신의 메모리 공간을 새로운 프로그램을 교체한다. 자식이 실행하는 동안 부모는 할일이 없으면 자식이 종료될때까지 준비 완료 큐에서 자신을 제거하기 위해 wait()시스템 호출을 한다. exec()을 호출하면 프로세스의 주소 공간을 새 프로그램으로 덮어 쓰기 때문에 exec()시스템 호출은 오류가 발생하지 않는 한 제어를 반환하지 않는다. 윈도우에서는 Windows API의 CreateProcess() 함수를 이용하여 생성되는데 이 함수는 부모 프로세스가 새로운 자식 프로세스를 생성한다는 점에서 fork()와 유사하다. 포크와의 차이점은 포크는 부모에게 주소 공간을 상속받는 자식을 만드는 반면 윈도우에선 프로세스가 생성될때 주소 공간에 명시된 프로그램을 적재한다. wait()과 유사한 것은 WaitForSingleObjects()이고 이 함수는 자식 프로세스의 핸들을 전달받고, 이 프로세스가 종료되기를 기다린다. 자식 프로세스가 종료하면 제어는 부모 프로세스의 WaitForSingleObjects()에서 반환된다. -프로세스 종료 프로세스가 마지막 문장의 실행을 끝내고, exit 시스템 호출을 사용하여 운영체제에게 자신의 삭제를 요청하면 종료한다. 이 시점에서 프로세스는 자신의 부모 프로세스에게 상태 값을 반환할수 있다. 물리 메모리와 가상 메모리, 버퍼 등 프로세스의 모든 자원이 운영체제로 반납된다. 부모는 자식의 실행을 종료할수 있다. (자식이 자원을 초과사용할때, 자식에게 할당된 태스크가 필요없을때, 등) 부모 프로세스가 종료한 이후에 자식프로세스가 존재할수없다. 그래서 프로세스가 종료되면 비롯된 모든 자식들도 종료되어야한다(=연쇄식종료 cascading termination) wait()시스템 호출은 부모가 자식의 종료 상태를 얻어낼수있도록 하나의 인자를 전달받는다. 이 시스템 호출은 부모가 어느 자식이 종료되었는지 구별할 수 얻어낼수있도록 종료된 자식의 프로세스 식별자를 반환한다.
  • 3.4 프로세스 간 통신 (IPC = Interprocess Communication)

    • 메시지 전달(message passing) 충돌을 회피할 필요가 없기 때문에 적은 양의 데이터를 교환하는데 유용하다. 또한 분산 시스템에서 공유메모리 보다 구현하기가 쉽다. 메시지 전달 시스템은 통상 시스템 호출을 사용하여 구현되므로 커널 간섭 등의 부가적인 시간 소비 작업들이 필요하기 때문에 공유 메모리 모델이 메시지 전달보다 빠르다. 다중 코어에서는 메시지 전달이 공유 메모리보다 빠르다. 동일한 주소 공간을 공유하지 않고도 프로세스들이 통신을 하고, 그들의 동작을 동기화 할 수 있도록 허용하는 기법 서로 통신을 원하는 프로세스 두개가 통신연결(communication link)설정 -직접통신시에 수신자 또는 송신자의 이름을 명시 (주소방식에서 대칭성을 보임) 프로세스 이름 변경을 일일이 사용자가 체크해야함. 이러한 하드 코딩 기법은 바람직하지않음 -간접통신에서 메시지들은 메일박스 또는 포트로 송신되고, 그것으로부터 수신된다. -동기화 메시지 전달은 봉쇄형이거나 비봉쇄형방식이다. (각각 동기식 비동기식) 봉쇄형 보내기 : 송신하는 프로세스는 메시지가 수신 프로세스 또는 메일 박스에 의해 수신될 때까지 봉쇄한다. 비봉쇄형 보내기 : 송신하는 프로세스가 메시지를 보내고 작업을 재시작한다. 봉쇄형 받기 : 메시지가 이용 가능할때까지 수신 프로세스가 봉쇄된다. 비봉쇄형 받기 : 수신하는 프로세스가 유요한 메시지 또는 널(null)을 받는다 -버퍼링 통신이 직접이든 간접이든 통신하는 프로세스들에 의해 교환되는 메시지는 임시 큐에 들어 있다. 기본적으로 이러한 큐를 구현하는 방식은 세 가지가 있다. 무용량 : 큐의 최대 길이가 0 유한 용량 : 큐는 유한한 길이 n을 가진다 무한 용량 : 큐는 잠재적으로 무한한 길이를 가진다. 따라서 메시지들이 얼마든지 큐안에서 대기할수 있다. 송신자는 결코 봉쇄되지 않는다
    • 공유 메모리 공유 메모리 영역을 구축할때만 시스템 호출이 필요함 모든 접근은 일반적인 메모리 접근으로 취급되어 커널의 도움이 필요 없다. 공유 메모리는 공유데이터가 여러 캐시 사이에서 이주하기 때문에 발생하는 캐시 일관성 문제로 인하여 성능 저하 발생 시스템의 처리 코어의 수가 증가하면 할수록 IPC로 메시지 전달이 더 선호된다. 생산자 소비자문제 - 생산자 프로세스는 정보를 생산하고 소비자 프로세스는 정보를 소비(공유메모리를 사용하는것) 버퍼가 생산자와 소비자가 공유하는 메모리 영역에 존재. 서로 동기화되어야함! 무한버퍼와 유한버퍼 원형배열로 구현하여서 in==out 일때 empty , ((in+1)% BUFFER_SIZE) == out) 일땐 full
  • 3.5 IPC 시스템의 사례

    POSIX 공유 메모리는 메모리-사상 파일을 사용하여 구현된다. 프로세스는 먼저 shm_open()시스템 호출을 사용하여 공유 메모리 객체를 생성해야 한다. 객체가 설정되면 ftruncate()함수를 사용하여 객체의 크기를 바이트 단위로 설정한다. 마지막으로 mmap() 함수가 공유 메모리 객체를 포함하는 메모리-사상 파일을 구축한다. shm_unlink() 함수 호출하여 접근이 끝난 공유 메모리를 제거한다. Mach Mac OS X 운영체제의 일부인 Mach 마크 대부분의 통신은 메시지에 의해 실행된다. 메시지는 메일박스를 통하여 전송하고 수신되는데, Mach에서는 이를 포트(port)라고 한다. port_allocate() 시스템 호출은 새로운 메일박스를 생성하고, 그 메일박스의 메시지큐를 위한 공간을 할당한다. Windows 다중 운영 환경 또는 서브시스템을 지원하며, 응용 프로그램은 메시지 전달 기법을 통해 이들과 통신한다.
  • 3.6 클라이언트 서버 환경에서의 통신

    1. 소켓(Socket) 소켓은 통신의 극점을 뜻한다. 두 프로세스가 네트워크상에서 통신을 하려면 양 프로세스마다 하나씩, 총 두개의 소켓이 필요하다. 각 소켓은 IP주소와 포트 번호 두 가지를 접합해서 구별한다.
    2. 원격 프로시저 호출(Remote Procedure Calls, RPC) RPC는 네트워크에 연결되어 있는 두 시스템 사이의 통신을 프로시저 호출을 추상화하기 위한 방편으로 설계되었다. 프로세스들이 서로 다른 시스템위에서 돌아가기 때문에 원격 서비스를 제공하기 위해서는 메시지 기반 통신해야함
    3. 파이프(pipes) 파이프는 두 프로세스가 통신할 수 있게 하는 전달자로서 동작한다. 파이프는 초기 유닉스 시스템에서 제공하는 IPC 기법 중의 하나였다. 파이프는 통산 프로세스들 간에 통신하는 더 간단한 방법 중의 하나이지만 통신할때 여러 제약을 가진다. 1. 파이프가 단방향 통신 또는 양방향 통신을 허용하는지 2. 양방향 통신이 허용된다면 반이중 방식인가, 전이중 방식인가(반이중은 한 순간에 한 방향 전송만 가능,전이중은 동시에 양항뱡 전송가능) 3. 통신하는 두 프로세스 간에 부모-자식과 같은 특정 관계가 존재하는지 4. 파이프는 네트워크를 통하여 통신이 가능한지, 아니면 동일한 기계 안에 존재하는 두 프로세스끼리만 통신이 가능한지 -일반파이프는 생산자-소비자 형태로 두 프로세스 간의 통신을 허용한다. 생산자는 파이프의 한종단에 쓰고 , 소비자는 다른 종단에서 읽는다 유닉스와 윈도우시스템 모두에서 통신하는 두 프로세스는 부모-자식 관계를 가져야 한다. -Named pipe 좀 더 강력한 통신 도구를 제공한다. 통신은 양방향으로 가능하며 부모-자식 관계도 필요로 하지 않는다. 지명 파이프가 구축되면 여러 프로세스들이 이를 사용하여 통신할 수 있다
  • 3.7 요약(Summary)

    프로세스는 실행중인 프로그램이다. 프로세스는 실행되면서 상태를 변경한다. 프로세스의 상태는 프로세스의 현재 활동에 의해 정의된다. 각 프로세스의 상태는 new ready running waiting terminated 상태 중 하나이다. 각 프로세스는 운영체제 내에서 자신의 프로세스 제어 블록(PCB)에 의해 표현된다. 한 프로세스는 실행되지 않을 때는 적절한 대기 큐에 놓이게 된다. 운영체제에는 크게 두 가지 부류의 큐가 존재하는데, 하나는 입출력 요청 큐이며, 다른 하나는 준비 완료 큐이다. 준비 완료 큐는 실행할 준비가 완료되어 CPU를 기다리고 있는 모든 프로세스를 가지고 있다. 각 프로세스는 PCB로 나타낸다. OS는 다양한 스케줄링 큐로부터 프로세스들을 선택해야 한다. 장기 스케줄링이란 CPU를 차지하기 위해 경쟁하도록 허용하기 위해 프로세스를 선택하는 일이다. 통상적으로 장기 스케줄링은 자원 할당 고려 사항, 특히 주 메모리 관리에 의해 많은 영향을 받는다. 단기 스케줄링은 준비 완료 큐로부터 하나의 프로세스를 선택하는 일이다. 부모 자식 프로세스가 병행하게 실행될 때 정보공유, 계산속도증가, 모듈성, 편의성 등의 장점이 생김 협력적인 프로세스는 서로 통신하기 위한 프로세스 간 통신 기법을 필요로 한다. 주로 두 가지 방법이 있다. 1)공유메모리 2)메시지 전달이다. 클라이언트 서버 시스템에서의 통신은 1)소켓 2)원격프로시저호출 3)파이프 를 사용한다

4단원

>

    스레드 (Threads)

  • 4.1 개요

    Pthreads API나 Windows, Java 스레드 라이브러리를 포함한 다중 스레드 시스템과 관련된 여러 가지 개념들을 소개한다. 스레드는 CPU 이용의 기본단위이다. 스레드는 스레드 ID, 프로그램 카운터, 레지스터 집합, 그리고 스택으로 구성된다. 프로세스를 만드는 것보다 스레드를 만들기 쉬움 새 프로세스가 해야할일이 원래 프로세스가 할일과 동일하다면 오버헤드를 감수하면서 프로세스를 만드는 것보다 그 프로세스안에 스레드을 만들어 나가는 것이 효율적 스레드는 원격 프로시저 호출(RPC)에서도 매우 중요한 역할을 담당한다. RPC는 IPC를 마치 일반적인 함수나 프로시저 호출을 하듯 할 수 있게 해준다.
      다중 스레드 프로그래밍의 장점
    1. 응답성(Responsiveness) 프로세스의 일부가 차단 된 경우 계속 실행 가능 사용자에 대한 응답성을 증가 시킨다. UI에 중요함
    2. 자원 공유(Resource sharing) 공유 메모리 또는 메시지 전달보다 스레드가 프로세스의 자원을 공유한다. 한 응용 프로그램이 같은 주소 공간 내에 여러 개의 다른 작업을 하는 스레드를 가질 수 있다.
    3. 경제성(Economy) 프로세스 생성을 위해 메모리와 자원을 할당하는 것은 비용이 많이 든다. 스레드는 자신히 속한 프로세스의 자원들을 공유하기 때문에, 스레드를 생성하고 문맥 교환하는 것이 보다 더 경제적
    4. 규모 적응성(Scalability) 다중 스레드의 이점은 다중 처리기 구조에서 더욱 증가할 수 있다. 다중 처리기 구조에서는 각각의 스레드가 다른 처리기에서 병렬로 수행될 수 있기 때문
  • 4.2 다중코어 프로그래밍

    극복해야할 5가지 테스크인식 균형 데이터 분리 데이터 종속성 시험 및 디버깅
  • 4.3 다중 스레드 모델(Multithreading Models)

    • 4.3.1 다대일 모델(Many-to-One Model) 많은 사용자 수준 스레드를 하나의 커널 스레드로 사상한다. 스레드 관리는 사용자 공간의 스레드 라이브러리에 의해 행해진다. 하지만 한 스레드가 봉쇄형 시스템 콜을 할 경우, 전체 프로세스가 봉쇄된다. 또한 한번에 하나의 스레드만이 커널에 접근 할 수 있기 때문에, 다중 스레드가 다중코어 시스템에서 병렬로 실행 될 수 없다.
    • 4.3.2 일대일 모델(One-to-One Model) 각 사용자 스레드를 각각 하나의 커널 스레드로 사상한다. 이 모델은 하나의 스레드가 봉쇄적 시스템 콜을 호출하더라도 다른 스레드가 실행될 수 있기 때문에 다대일 모델보다 더 많은 병렬성을 제공한다. 이 모델의 단 하나의 단점은 사용자 수준 스레드를 생성할 때 그에 따른 커널 스레드를 생성해야 한다는 점 커널 스레드를 생성하는 오버헤드가 응용 프로그램의 성능을 저하시킬 수 있으므로, 이 모델의 대부분의 구현은 시스템에 의해 지원되는 스레드의 수를 제한한다. Windows 계열의 OS들과 Linux가 일대일 모델을 구현하고 있다.
    • 4.3.3 다대다 모델(Many-to-Many Model) 다대다 모델은 여러 개의 사용자 수준 스레드를 그보다 작은 수 혹은, 같은 수의 스레드로 멀티플렉스 한다. OS가 충분한 수의 커널 스레드를 생성할 수 있게 합니다. 개발자는 필요한 만큼 많은 사용자 수준 스레드를 생성할 수 있다. 그리고 상응하는 커널 스레드가 다중 처리기에서 병렬로 수행될 수 있다. 또한 스레드가 봉쇄형 시스템 콜을 발생시켰을 때, 커널이 다른 스레드의 수행을 스케줄 할 수 있다.
  • 4.4 스레드 라이브러리(Threads Library)

    스레드 라이브러리는 프로그래머에게 스레드를 생성하고 관리하기 위한 API를 제공한다. 두 가지 방법이 있는데 첫번째방법은 커널의 지원 없이 완전히 사용자 공간에서만 라이브러리를 제공하는 것이다. 라이브러리를 위한 모든 코드와 자료 구조는 사용자 공간에 존재한다. 라이브러리 함수를 호출하는 것은 시스템 호출이 아니라 사용자 공간의 지역 함수를 호출하게 된다는 것을 의미한다. 두번째방법은 운영체제에 의해 지원되는 커널 수준 라이브러리를 구현하는 것이다. 이 경우 라이브러리를 위한 코드와 자료 구조는 커널 공간에 존재한다. 라이브러리 API를 호출하는 것은 커널 시스템 호출을 부르는 결과를 낳는다.
      POSIX나 Windows 스레드의 경우, 전역 변수로 선언된 데이터, 즉 함수 외부에 선언된 데이터는 같은 프로세스에 속한 모든 스레드가 공유한다. Java는 전역 데이터의 개념이 없기 때문에 공유 데이터에 대한 접근이 스레드 사이에 명시적으로 조정되어야 한다. 함수에 국한된 지역 변수로 선언된 데이터는 통상 스택에 저장된다. 각 스레드는 자신의 스택을 가지고 있으므로 자신만의 지역 데이터의 복사본을 가진다. 비동기 스레딩 - 부모가 자식 스레드를 생성한 후 부모는 자신의 실행을 재개하여 부모와 자식 스레드가 병행하게 실행된다. 각 스레드는 모두 독립적으로 실행하고 부모 스레드는 자식의 종료를 알 필요가 없다. 스레드가 독립적이기 때문에 스레드 사이의 데이터 공유는 거의 없다. 동기 스레딩 - 부모 스레드가 하나 이상의 자식 스레드를 생성하고 자식 스레드 모두가 종료할 때까지 기다렸다가 자신의 실행을 재개하는 방식을 말한다. 이 방식은 소위 포크-조인(fork-join)전략이라고 불린다. 여기서 부모가 생성한 스레드는 병행하게 실행되지만 부모는 자식들의 작업이 끝날 때까지 실행을 계속할 수 없다. 부모 스레드는 오직 모든 자식 스레드가 조인한 후에야 실행을 재개할 수 있다. 통상 동기 스레딩은 스레드 사이의 상당한 양의 데이터 공유를 수반한다.
    1. Pthreads pthread.h 헤더 파일을 포함하여야 함 사용자 또는 커널 수준 라이브러리로서 제공될 수 있다. 쓰레드 생성과 동기화를 위한 POSIX표준 Pthreads는 POSIX가 스레드 생성과 동기화를 위해 제정한 표준 API이다. Pthreads_t tid 우리가 생성할 스레드를 위한 식별자 Pthreads_attr_t attr 스레드를 위한 속성, 스택의 크기와 스케쥴링 정보를 포함한 속성의 집합을 갖는다. Pthreads_attr_init(&attr) 함수에서 속성 지정 Pthreads_create() 스레드 생성, 스레드 식별자와 스레드의 속성 뿐 아니라 새로운 스레드가 실행을 시작할 함수의 이름도 전달한다(여기선 runner()함수) Pthreads프로그램에서 별도의 스레드는 지정된 함수에서 실행을 시작한다. 그림 4.9에서는 이 함수가 runner()함수이다. 이 프로그램이 실행을 시작하면 하나의 제어 스레드가 main()함수에서 시작한다. 약간의 초기화 후에 main()은 runner() 함수에서 실행을 시작하는 두 번째 스레드를 생성한다. 두 스레드는 전역 변수 sum 을 공유한다. 명령어 라인 상에 제공된 정수 매개변수 argv[1]을 전달 여기서 프로그램은 main()함수의 최초 스레드와 runner() 함수에서 합을 계산하는 합 스레드의 두 개의 스레드를 가진다. 포크-조인 전략을 사용한다. 합 스레드를 생성한 후에 Pthreads_join()함수를 호출하여 runner()스레드가 종료하기를 부모 스레드는 기다린다. runner()스레드는 Pthreads_exit() 함수를 호출하여 종료하게 된다. 자식 스레드가 여러 개일때
      
            #define NUM_THREADS 10
            pthread_t workers[NUM_THREADS];
      
            for(int i=0; i<NUM_THREADS; i++)
                pthread_join(workers[i],NULL);  여러개가 끝날때까지 기다린다
            
    2. Window 스레드 라이브러리 Windows 시스템에서 사용 가능한 커널 수준 라이브러리 windows.h 헤더 파일을 포함하여야 함 별도의 스레드에서 수행될 Summation() 함수도 정의한다. 이 함수는 void 형을 가리키는 포인터 변수를 인자로 전달받는다. Windows API에서 스레드는 CreateThread() 함수에 의해 생성되고 Pthreads와 마찬가지로 이 함수에서 스레드를 위한 속성의 집합이 전달된다. WaitForSingleObjects()함수는 pthread_jon()문을 이용하여 부모 스레드가 합 스레드가 종료될 때까지 기다리게 한것과 동일한 작업을 한다. 이 함수는 합 스레드가 종료될 때까지 생성 스레드가 봉쇄되도록 한다. 여러 스레드의 종료를 기다려야 한다면 WaitForMultipleObjects() 함수가 사용된다. 4개의 매개변수를 받는데, 1. 기다려야 하는 객체의 개수 2. 객체 배열을 가리키는 포인터 3. 모든 객체가 신호를 보내왔는지를 나타내는 플래그 4. 대기해야 하는 타임아웃 시간(또는 INFINITE) ex) WaitForMultipleObjects(N, Thandles, TURE, INFINITE);
    3. Java 스레드 API Java 프로그램에서 직접 스레드 생성과 관리를 가능하게 한다. 그러나 대부분의 JVM 구현은 호스트 OS에서 실행되기 때문에 Java스레드 API는 통상 호스트 시스템에서 사용 가능한 스레드 라이브러리를 이용하여 구현된다. 윈도우에서 Java 스레드는 윈도우즈 API 사용 유닉스나 리눅스에서 Java 스레드는 Pthreads 사용 Java 프로그램에서 스레드 생성 기법에는 두 가지가 있다. 1. Thread 클래스로부터 파생된 새로운 클래스를 생성하고, Thread 클래시의 run()메서드를 무효화(override)하는 것 2. 흔히 사용되는 방법으로서 Runnable인터페이스를 구현하는 클래스를 정희하는 것이다.
      ex)
            public interface Runnalbe
            {
                public abstract void run();
            }
      클래스가 Runnable을 구현할 때, run()메서드를 구현해야 한다. run()메서드를 구현하는 코드는 별도의 스레드로서 실행된다. Java의 join()메서드가 pthread_join()과 유사한 기능을 제공한다.
  • 4.5 암묵적 스레딩(Implicit Threading)

    다중코어 처리의 지속적 성장에 따라 수백 또는 심지어 수천 개의 스레드를 가진 응용이 등장하게 되었다. [테스크 인식, 균형, 데이터 분리, 데이터 종속성, 시험 및 디버깅] 이러한 것들을 극복하고 다중 스레드 응용의 설계를 도와주는 한 가지 방법은 스레딩의 생성과 관리 책임을 응용 개발자로부터 컴파일러와 실행시간 라이브러리에게 넘겨주는 것이다. 암묵적 스레딩이라고 불린다.
    1. 스레드 풀(Thread Pools) 다중 스레드 서버는 여러 문제가 있다. 첫번째 문제는 서비스할때마다 스레드를 생성하는데 소요되는 시간 두번째 문제는 모든 요청마다 새 스레드를 만들어서 서비스해 준다면 시스템에서 동시에 실행할 수 있는 최대 스레드 수가 몇 개까지 가능할 수 있는 것인지 한계를 정해야 한다. 스레드를 무한정 만들면 언젠가는 CPU 시간, 메모리 공간 같은 시스템 자원이 고갈된다. 이러한 문제를 해결해 줄 수있는 방법 중 하나가 스레드 풀이다. 기본 아이디어 : 프로세스를 시작할 때 아예 일정한 수의 스레드를 미리 풀로 만들어 두는 것. 평소에는 하는 일 없이 일감을 기다리게 됨 그러다가 한개의 요청이 들어오면 이 풀에서 한 스레드에게 그것을 할당한다. 요청을 다 서비스해 주었으면 그 스레드는 다시 풀로 돌아가 다음 작업을 기다린다. 요청을 다 서비스 해 주었으면 그 스레드는 다시 풀로 돌아가 다음 작업을 기다린다. 이렇게 하다가 풀에 남아 있는 스레드가 바닥나면 서버는 가용(free) 스레드가 하나 생길 때까지 기다려야 한다. 장점 : 1. 새 스레드를 만들어 주기보다 기존 스레드로 서비스해 주는 것이 더 빠르다 2. 스레드 풀은 임의 시작에 존재할 스레드 개수에 제한을 둔다. 이러한 제한은 많은 수의 스레드를 병렬 처리할 수 없는 시스템에 도움이 된다. 3. 태스크를 생성하는 방법을 태스크로부터 분리하면 태스크를 실행을 다르게 할 수 있다. ex)태스크를 일정 시간 후에 실행되도록 스케쥴하거나 혹은 주기적으로 실행시킬 수 있다.
            DWORD WINAPI PoolFunction(AVOID Param){
              /* this function runs as a separate thread. */
            }
    2. OpenMP OpenMP는 C,C++ 또는 포트란으로 작성된 API와 컴파일러 디렉티브의 집합이다. 공유 메모리 환경에서 병렬 프로그래밍 지원 OpenMP는 병렬로 실행될 수 있는 코드블록을 찾아 병렬 영역(parallel regions)이라고 부른다.
      #pragma opm parallel
      위와 같은 컴파일러 디렉티브를 만나게 되면 시스템의 코어 개수만큼 스레드를 생성한다. 개발자는 또한 데이터를 스레드들이 공유할 것인지 혹은 특정 스레드만 사용할 것인지도 정할 수 있다.
    3. Grand Central Dispatch GCD는 Mac OS X 및 iOS 운영 체제 용 Apple 기술 C, C ++ 언어, API 및 런타임 라이브러리에 대한 확장하여 조합한 기술 C와 C++언어를 확장한 블록(block)이라는 것을 식별한다. GCD는 블록을 디스패치 큐에 넣어서 실행될 수 있도록 스케줄, 큐에서 블록을 제거할 때 관리하고 있는 스레드 풀에서 가용 스레드를 선택하여 할당 직렬(serial), 병렬(concurrent) 두 가지 유형의 디스패치 대기열 : 직렬 블록은 FIFO 순서로 제거되고, 블록은 큐에서 제거되면 다른 블록이 제거되기 전에 실행을 반드시 완료해야 한다. 각 프로세스는 각자 직렬 큐를 가진다(메인큐) 병행 큐에 넣어진 큐는 마찬가지로 FIFO 순서로 제거되었지만 한 번에 여러 개가 제거 될 수 있음 우선 순위에따른 세가지 큐가 있다.
  • 4.6 스레드와 관련된 문제들(Threading Issues)

    1. Fork() 및 Exec() 시스템 호출 한 프로그램의 스레드가 fork()를 호출하면 새로운 프로세스는 모든 스레드를 복제해야하는지 한개의 스레드만 복제해야하는지 결정해야한다. 몇몇 UNIX 기종은 이 두가지 fork()를 다 제공한다. fork()를 부르자마자 exec를 부른다면 모든 스레드를 복제해서 만들어주는 것은 불필요하다 왜냐하면 exec에서 지정한 프로그램이 곧 모든 것을 다시 대체할 것이기 때문 -> fork()시스템 콜을 호출한 스레드만 복사해주는 것이 적절 그러나 새 프로세스가 fork()후 exec를 하지 않는다면 새 프로세스는 모든 스레드들을 복제해야 한다.
    2. 신호 처리(Signal Handling) 신호는 UNIX 시스템에서 특정 이벤트가 발생했음을 프로세스에 알리기 위해 사용 신호 처리기는 신호를 처리하는 데 사용 신호는 특정 이벤트에 의해 생성 생성된 신호가 프로세스로 전달 모든 신호는 둘 중 하나의 처리기에 의해 처리된다. 1) 디폴트 신호 처리기 - 모든 신호마다 커널이 실행됨. 사용자 정의 처리기에 의해 대체될 수 있다. 2) 사용자 정의 신호 처리기 단일스레드 프로그램에서의 신호 처리는 간단하다. 신호는 항상 프로세스에게 전달된다. 멀티스레드는 복잡하다. 다음과 같은 선택이 존재 1. 신호가 적용될 스레드에게 전달 2. 모든 스레드에게 전달 3. 몇몇 스레드에게만 선택적 전달 4. 특정 스레드가 모든 신호를 전달받도록 지정 동기식 신호는 그 신호를 야기한 스레드에게 전달되어야 하고 다른 스레드에게 전달되면 안된다. 신호를 전달하는데 사용되는 표준 UNIX 함수는
      kill(pid_t pid, int signal);
      대부분의 다중 스레드 UNIX는 스레드에게 받아들일 신호와 봉쇄할 신호를 지정할 수 있는 선택권을 준다. 따라서 어떤 경우에는 비동기식 신호를 봉쇄하지 않고 있는 스레드들에게만 신호를 전달해야 할 수 있다. 하지만 신호는 오직 한 번만 처리되어야 하기 때문에 그 신호를 봉쇄하지 않고 있는 첫 번째 스레드에게만 신호가 전달된다. POSIX Pthreads는 tid로 지정된 스레드에게만 전달이 되도록 허용하는 다음과 같은 함수를 제공한다.
      pthread_kill(pthread_t tid, int signal)
      Windows는 신호를 명시적으로 지원하지는 않지만 비동기식 프로시저 호출(Asynchronous Procedure Calls, APC)이라는 것을 사용해서 이를 대리 실행 할 수 있다. APC는 사용자 스레드들이 특정 사건의 발생을 전달받았을 때 호출될 함수를 지정할 수 있게 해준다. UNIX의 비동기식 신호와 유사 그러나 UNIX에서는 다중 스레드 환경에서 신호를 어떻게 처리해야 될지를 고민해야 하지만 APC는 프로세스에게 전달되는 것이 아니라 특정 스레드에게 전달되기 때문에 좀 더 간단하다.
    3. 취소(Cancellation) 스레드 취소는 스레드가 끝나기 전에 그것을 강제 종료시키는 작업을 일컫는다. 취소되어야 할 스레드를 목적 스레드(traget thread)라고 부른다. 목적 스레드의 취소는 두 가지 방식이다 1. 비동기식 취소(Asynchronous cancellation) : 한 스레드가 즉시 목적 스레드를 강제 종료시킨다(언제든지, 준비없이 일어날 수 있음) 2. 지연 취소(Deferred cancellation) : 목적 스레드가 주기적으로 자신이 강제 종료되어야 할지를 점검한다. 이 경우 목적 스레드가 질서정연하게 강제 종료될 수 있는 기회가 만들어진다. 스레드 취소를 어렵게 만드는 것은 취소 스레드들에게 할당된 자원 문제이다. 비동기식 취소의 경우 모든 시스템 자원을 다 회수하지 못하는 경우가 있다. 반대로 지연 취소의 경우에는 스레드 자신이 취소되어도 안전하다고 판단되는 시점에서 취소 여부를 검사할 수 있다. Pthreads에서는 pthread_cancel() 함수를 사용해서 스레드를 취소할 수 있다. 목적 스레드의 식별자가 이 함수의 매개변수로 전달된다. Pthreads는 3가지 취소 모드를 지원한다.
          모드          상태          유형
      
          Off          사용불가능     -
          지연          사용가능      지연
          비동기식       사용가능      비동기식
      default값은 지연 이 유형에서 취소는 스레드가 취소점(cancellation point)에 도달했을 때에만 취소 작업이 일어나게 된다. 취소점을 만드는 한 가지 방법은 pthread_testcancel() 함수를 호출하는 것이다. 취소 요청이 대기 중이라는 것이 발견되면, 정리 처리기(cleanup handler)라고 알려진 함수가 호출된다. 이 함수는 스레드가 획득한 모든 자원을 스레드가 종료되기 전에 반환하게 만든다. Pthreads는 비동기식 취소를 권장하지 않는다.(신호를 통해서 처리된다) 레디큐가 더블링크드리스트로 이루어져 있음
    4. 스레드 국지 저장소(Thread-Local Storage) 스레드 국지 저장소 이하 TLS 각 스레드가 자체 데이터 복사본을 가질 수 있음 지역 변수와는 다르다. 지역 변수는 하나의 함수가 호출되는 동안에만 보이는 반면에 TLS는 전체 함수 호출에 걸쳐 보인다. 어떤면에서는 정적 데이터와 유사하다. 차이점은 TLS 데이터는 각 스레드의 고유한 정보를 저장한다는 것이다. (ex 쓰레드 번호, 사용자 질의) 스레드가 프로세스와 공유 다른 스레드와 레지스터값 공유x - PC,함수호출(stack,커널및유저스택) code,global data는 공유
    5. 스케줄러 액티베이션(Scheduler Activations) M:M 및 Two-level models 모델 모두 응용 프로그램에 할당 된 적절한 수의 커널 스레드를 유지하기위한 통신이 필요하다. 다대다 또는 두 수준 모델(Two-level models)을 구현하는 많은 시스템들은 사용자와 커널 스레드 사이에 중간 자료 구조를 둔다. 이 자료 구조는 통상 경량 프로세스 or LWP라고 불린다. 사용자 스레드 라이브러리에게 LWP 방식은 응용이 사용자 스레드를 수행하기 위하여 스케줄 할 가상 처리기 처럼 보인다. 각 LWP는 하나의 커널 스레드에 부속되어 있으며 물리 처리기에서 스케줄 하는 대상은 바로 이 커널 스레드이다. 입출력이 완료되기를 기다리는 동안 같이 커널 스레드가 봉쇄되면 LWP도 같이 봉쇄된다. 이 연관을 따라 LWP에 부속된 사용자 수준 스레드도 역시 봉쇄된다. 사용자 스레드 라이브러리와 커널 스레드 간의 통신 방법 중의 하나는 스케줄러 액티베이션이라고 알려진 방법이다. 커널은 응용에게 특정 사건에 대해 알려줘야 한다. 이 프로시저를 upcall이라고 부른다. 스케줄러 활성화는 업 콜 (upcalls) - 커널에서 스레드 라이브러리의 upcall 처리기까지의 통신 메커니즘을 제공 이 통신을 사용하면 응용 프로그램이 올바른 수의 커널 스레드를 유지 관리 가능
  • 4.7 운영체제 사례(OS Examples)

    1. Windows 스레드 커널 수준의 일대일 매핑을 구현 스레드는 스레드 ID, 레지스터 집합, 사용자 스택, 커널 스택, 런타임 라이브러리와 동적 링크라이브러리(DLL)에서 사용하는 개별 데이터 저장영역을 가진다 레지스터 집합, 스택, 개별 데이터 저장영역들은 그 스레드의 문맥으로 불린다 ETHREAD (executive thread block) - 커널 공간에서 스레드가 속한 프로세스 및 KTHREAD에 대한 포인터를 포함 KTHREAD (kernel thread block) - 커널 공간에서의 스케줄링 및 동기화 정보, 커널 모드 스택, TEB에 대한 포인터를 포함 TEB (thread environment block) - 사용자 공간의 스레드 ID, 사용자 모드 스택, 스레드 로컬 저장소 ETHREAD,KTHREAD 는 모두 커널 안에 존재, 커널만이 접근 가능 TEB는 사용자 모드에서 실행될 때 접근되는 사용자 공간 자료구조
    2. Linux 스레드 프로세스를 복제하는 기능을 가진 fork() 시스템 호출을 제공 Linux는 clone() 시스템 호출을 이용하여 스레드를 생성할 수 있는 기능도 제공 clone()는 둘다 생성가능 프로세스는 fork 스레드는 Pthreads_create

01장 ~ 02장


  COTS = commercial off The-shelf => package Software
  LOC : Liene Of code
  MM : Man-Month (=PM)
  FP : function Point (기능이 몇개냐에 따라 소프트웨어 크기를 결정)
  Saas : software as a service(설치를 하지 않아도 됨 ex-아마존 로켓 클라우드)
  IEEE : 전기 전자 기술자 협회
  SQuaRE : Software product Quality Requirements and Evaluation
  CMM : Capability Maturity Model(회사의 능력)
  SQA : Software Quality Assurance
  SWEBOK : Software engineering body of knowledge - IEEE & ACM
  SDLC : software development life cycle
  Stakeholder : 프로젝트에 관여하는 모든 사람
  ISO26262 : 자동차 소프트웨어의 표준
  TDD : Test-Driven-Development
  Pair Programming : 함수 A를 짤때 두사람이 같이 코딩한다. 서로 회의하면서

1. Introduction to Software Engineering

>
  • 1.1 Software

    소프트웨어란 무엇인가 ? Code : 함수안의 문장 Program : 프로그램 Software : 프로그램 + 문서(.java, javac..) *소프트웨어의 특징 1 비가시성 - 눈에보이지 않는다(invisibility) -> 버그가 눈에 보이지 않음 2 복잡성, 복합성(Complexity) - 소프트웨어에서만 이 특성을 가지는 것은 아니다. 더욱 소프트웨어분야서 복잡 3 순응(Conformity) - 요구 사항에 따라 수정이 가능 4 Changeability - 복제하기 쉬움 5 닳지 않는다 Type of software 300~1000 : LOC / MM - custom software - package software - Embedded software
  • 1.2 Why Software Engineering?

    소프트웨어공학의 필요성 high cost (고비용) 소프트웨어 개발의 일반적인 생산성 300~1000 LOC/MM 소프트웨어 비용이 하드웨어비용보다 훨씬 비싸다. project delay(개발 지연) x축의 FP 갯수가 높을수록 개발이 지연된다. 제시간에 개발된것이 매우 적음 Low reliability(낮은 신뢰도) Maintenance(유지보수) 유지보수비용은 개발비용보다 훨씬 높습니다. [Software Crisis] Fred Brooks, The Mythical Man Month Silver bullet 소프트웨어 공학이라는 용어는 1968년과 1969년 NATO 회의에서 소프트웨어 위기를 논하기 위해 처음 제안했다. 소프트웨어 위기는 1960년대 크고 복잡한 시스템을 개발할 때 겪었던 어려움에 대한 이름이었습니다. SW 개발에 대한 엔지니어링 방식의 채택은 SW 개발 비용을 줄이고 보다 안정적인 SW로 이어질 것이라고 제안되었습니다. ex) 소프트웨어 버그에 의해서 발생한 사고 : 64비트 정수를 16비트 부호있는 정수로 변환하면서 오버플로우가 발생 -> 아리안 5의 폭발 ex) Therac -25 사건 -> 치사량의 방사선을 쏴서 사람을 사망에 이르게 함
  • 1.3 소프트웨어 공학이란?

    소프트웨어 개발,운영, 유지보수, 소멸에 대한 체계적인 접근 방법이라고 정의하고 있다. by IEEE (전기 전자 기술자 협회) 엔지니어링, 과학 및 수학 원리와 방법을 경제적 인 품질의 소프트웨어 생산에 적용하는 법적인 적용 -와트 험프리 소프트웨어 문제 1 Scale 더 큰 SW프로젝트는 보다 공식적인 프로젝트 관리 및 개발 방법을 요구합니다. SW 프로젝트 규모 (KLOC) Small(≤10) / Medium(10~100) / Large(100~1,000 ) / Very large(≥ 1,000) 2 Quality and Productivity ISO 9126, ISO/IEC 25010 에 따른 품질 속성 기능, 신뢰성, 유용성, 효율성, 유지 보수성, 이식성, 보안성, 호환성 SQuaRE = Software product Quality Requirements and Evaluation) 생산성은 LOC / MM 에 의함 ex) HWP 파일은 열리지 않는다 // Libre office(오픈소스)MS word는 열린다 호환성이 있다. 3 Consistency & Reproducibility(일관성 및 재현성) 많은 소프트웨어 프로젝트에 일관되게 그리고 반복적으로 적용 가능한 소프트웨어 공학 기술 cf) ISO 9001, CMM(Capability Maturity Model) 프로젝트 전체에 반복 적용되어 생산된 소프트웨어의 품질에 일관성이 있어야한다. CMM - 일관성 위해 방법론 사용 권장 4 Changes 불가피한 변경 사항에 대한 적합성
  • 1.4 How SE tackles the problems

    1 소프트웨어 개발 프로세스 2 소프트웨어 품질보증(Verification, Validation, Testing) SW회사 기획팀 - 선행팀 - 개발팀 - SQA팀 - 출시 3 프로젝트 관리 측정 항목 : 제품 측정 항목, 프로세스 측정 항목
  • 1.5 SWEBOK

    SWEBOK : Software engineering body of knowledge - IEEE & ACM

2. 프로세스와 방법론

  소프트웨어 3가지 -> 사람, 기술, 절차
  소프트웨어 코드 수정 -> 소프트웨어 프로세스라고 할 수 없음

 
  • 2.1 소프트웨어 프로세스

    소프트웨어 프로세스 : 소프트웨어 시스템을 개발하는 데 필요한 일련의 구조화 된 집합 소프트웨어 프로세스와 소프트웨어 개발 프로세스 구분 Software development process(소트프웨어 개발 프로세스) Software development model(소프트웨어 개발 모델) Software development life cycle (SDLC) (소프트웨어 개발 수명주기) 위 3개는 같은말 소프트웨어 개발 프로세스 : 일련의 단계 소프트웨어가 계획 단계에서부터 제공 단계까지 단계적으로 진행됩니다. 소프트웨어 프로젝트의 성격에 따라 선택 왜? 서로 다른 활동의 순서를 분명히 하기 위해 순서를 정해야함 # 요구 분석과 정의 - 시스템 설계 - 프로그램 설계 - 프로그램의 작성(코딩)- 테스팅(단위테스팅,통합테스팅,시스템테스팅) - 시스템 설치 - 유지 보수 전통적 소프트웨어 액티비티 -Requirement engineering 추출 분석과모델링 명세 검증 변경추적관리 -Design(시스템의 내부구조 및 조직 설계) 아키텍쳐 인터페이스 모듈상세설계 사용자인터페이스 데이터베이스 -Implementation 누구나 코드를 쉽게 이해하고 사용하도록, 테스트하기 쉬운 구조 내부:코딩표준//외부:의료/자동차 규격 ex)ISO26262 Verification & Validation Verification : 확인(설계대로 잘 만들었는지. 주로 개발자가 함) Validation : 검증(주문한 사람이 원하는 대로 만들었는지. 개발자,사용자,주문자 다함) # System testing(Verification) =비슷 Acceptance testing(Validation) -Maintenance 버그리포트 기능요청 오류수정 새기능추가 새로운환경에이식
  • 2.2 바람직한 프로세스의 특징

    1. Predictability 예전의 프로세스 경험에 의해 예측 가능함, 데이터 축적이 매우 중요 그래프를 보면 변수가 일정하게 유지된다는 것을 예측가능
    2. Easy to test & Easy to maintain 테스트 및 유지보수 단계에서 비용절감(테스팅이 50프로)
    3. Coping with Change(변경용이성) 변경은 항상 일어나므로 변경을 쉽게 다룰 수 있는 프로세스가 요망된다.
    4. Low cost ing Defect Correction(결함제거용이성) 일찍오류가 발생할수록 비용이 적다. 가능하면 Defect를 초기단계에 잡아야함 모든 단계에서 모니터링 결함이 필요함
  • 2.3 소프트웨어 개발 프로세스

    1~6번은 폭포수 모델 7번은 에자일 모델
    1. 폭포수 모델 Code and fix와 차이점, 충분히 앞단계에서 준비시간이 많음(1950년 코드앤픽스 시절엔 혁신) 요구분석,설계,구현,테스팅 등의 작업을 순서대로 쭉 해나가는 프로세스이다. 병행되어 진행되거나 거슬러 반복 진행되는 경우가 없다 첫번째 단계에서 product 요구사항 문서, 두번째 단계 소프트웨어 아키텍쳐, 세번째 단계 소프트웨어 장점 1. 각 단계가 끝난 후에 나와야 할 결과물(deliveralbe)을 명확히 정의하여야 한다. 결과물을 정확히 정의하여 구조가 표준화되어 있다면 품질의 향상에 크게 도움이 된다. 2. 작업이 일렬로 나열되어 있어 직능 중심의 프로젝트 조직이 가능하다는 점 순차적이고 , 원샷(one-shot) 소프트웨어 개별 프로세스 모델 3. 크고 복잡한 오래 지속되는 프로젝트에 적합하다. 단점 1. 설계와 코딩 및 테스팅 지연시킬 우려 처음 단계들이 지나치게 강조되므로 불필요한 문서들을 작성하는데 노력 소모 과도한 문서 작업 2. 각 단계와 일정이 엄격하여 요구 변경을 수용하기 어려움 시스템의 요구가 설계단계로 가기전에 동결되기 때문에 중간 단게에 요구사항이 계속 변경되는 것은 대응하기 어렵다 융통성이 없다 정리하자면 전통적인 폭포수 모형을 따를 경우 재사용의 기회가 줄어드는 단점이 있고, 시스템을 한번의 계획과 실행으로 완성시키기때문에 결과를 정비하고 개선시키는 기회가 없다. 일정에 융통성이 없으며 이전 단계로의 회귀, 반복이 계속 된다면 소요 자원이 계속 증가 무엇보다 중요한 단점은 최종 단계까지 가 보아야 결과가 나온다는 점 결론적으로 이 모델은 요구사항을 이미 잘 알고 있는 문제나 연구 중심의 문제를 다루는 소프트웨어 개발에 적합하다. 또한 생명주기 전반에 걸쳐 변경이나 진화가 예상되지 않는 비교적 위험이 적은 프로젝트에 적합하다. (요구 분석이 명확한 규모가 큰 소프트웨어에 적합)
    2. 프로토타이핑 모델(Rapid Prototyping Model) 프로토타입(시스템의 일부 혹은 시스템의 모형이 될 만한 것을 만드는 과정) Rapid Prototyping Model(사용자와 개발자의 소통) -> 피드백을 받음, 사용자 요구가 불투명 할 때 , 혁신적인 기술이 사용시 적합 진화적 프로토타입 (프로토 타입을 발전시켜 정한 수준까지 만들어 나감) 요구사항 파악 프로토타입 (단점은 다 개발된것으로 생각 할 수 있는 오해) 쓰고버리는 장점 : 프로토 타입은 발주자나 개발자에게 공동의 참조 모델을 제공 단점 : 발주자가 프로토타입이 최종결과라 믿고 곧 소프트웨어 개발이 완성되리라고 오해
    3. 진화적 모델(Evolutionary Model) - 탐구적인 프로젝트에 적합 기본적인 아이디어는 사용자에게 시스템을 조기에 경험하게 하고 출시를 빠르게 하기 위하여 조금씩 점증적으로 개발하는 것, 시스템을 여러 번 나누어 릴리스 하는 방법 점증적방법 : 기능을 추가 반복적방법 : 같은 기능이지만 성능을 향상한다든지 기능을 개선 유전자 배열과 같이 아직 알려지지 않은 것을 발견하려는 목적의 연구를 위한 소포트웨어에 적합 지능형시스템,임베디드 시스템에 적합 반면에 일정이 정확히 예측되어야 하는 프로젝트에는 부적합 프로토타입/진화적 모델의 장점 : 피드백을 즉시 할 수 있다. 단점 : 계획하기가 어렵다 (ex)내부사이클 반복횟수나, 릴리스 횟수)
    4. 나선형 모델 위험 관리를 위한 독특한 프로세스이다. 계획수립 - 위험분석 - 개발 - 평가 대규모 시스템의 소프트웨어를 개발하는데 가장 적합한 방법. 특히 개발자나 사용자가 각 확장 단계에서 발생될 위험에 대한 이해와 대책이 가능하다. 장점 : 위험 감소, 기능이 추가될 수 있음, 비선형적이며 반복적이여서 강인성이 높음 단점 : 프로세스의 전체 성공은 위험 분석에 달려있다.
    5. V 모델 폭포수 모델에 시스템 검증과 테스트 작업을 강조한 것이다. 세부적인 테스팅 프로세스로 구성되어 신뢰도 높은 시스템을 개발하는데 효과적인 것으로 알려져 있다. 참고) 슈어소프트테크 - 소프트웨어 테스크 전문기업 ... ISO26262 - 자동차 소프트웨어의 표준 V모델의 장점은 모든 단계에 검증과 확인 과정이 있어 오류를 줄일 수 있다는 것이다. 무엇보다도 높은 신뢰성이 필요한 응용분야, 예를 들면 의료 제어 시스템이나 원전 제어 시스템의 개발 같은 곳에 적합하다. 단점은 생명주기의 반복을 허용하지 않아 번경을 다루기가 쉽지 않다. 작업이 종료되고 리뷰 후에는 관련된 결과물이 동결된다.
    6. Unified 프로세스 The (Rational) Unified Process (RUP) 반복적이고 점증적인 UML 기반 프로세스 plan and document 모델들 1~6 - 공통점 : 주의 깊은 계획, 요구사항분석 및 테스트 문서화 철저히, 계획과 진행과정을 잘 설계
    7. Agile Process(에자일 프로세스) 프로그램 및 사용자와의 커뮤니케이션 중점 문서 말고 동작하는 소프트웨어로 하자 계약 베이스로 협상하지말고 계속 만나서 이야기하자 주기적으로 plan을 재계획, 짧은 주기, 자주 출시 Kent Beck(켄트백) - TDD : Test Driven Development 테스트 중심 개발 Martin Fowler(마틴 파울러) : REfactoring 1. 절차와 도구보다 개인과 소통을 중요시 한다. 2. 잘 쓴 문서보다는 실행되는 소프트웨어에 더 가치를 둔다. 3. 계약 절충보다는 고객 협력을 더 중요하게 여긴다. 4. 계획을 따라 하는 것보다 변경에 잘 대응하는 것을 중요하게 여긴다. 가장 중요한 원리는 사용자가 적극적으로 프로젝트에 참여한다는 점 변동 가능성 있는요구 / 점증적 계획 / 지속적인 사용자와의 커뮤니케이션 / 지속적인 리뷰와 테스팅 / 설치 가능한 프로덕트
    적절한 모델을 선택하면 프로젝트의 성공을 보장할 수 있다. 적절한 모델을 선택하는 요소에는 요구사항에 대한 이해 수준 ex 잘이해되는건 전통적모델, 덜이해되면 에자일 고객과의 상호 작용 가능여부, 프로젝트의 예상 수명/일정 제약, 관련된 사람들의 전문성 수준
  • 2.4 지원 프로세스(Umbrella Process)
  • 2.5.1 구조적 방법론 구조 분석 및 설계 방법 데이터 흐름도 (DFD)
  • 2.5.2 객체지향 방법론 객체 지향 분석 및 설계 방법 UML (Unified Modeling Language)
  • 2.5.3 에자일 방법론 애자일 방법은 진화적 모델이나 나선형 모델처럼 반복적이고 점증적인 프로세스를 채택한다. 애자일 프로세스는 짧은 반복 주기를 반복하며 점증적으로 자주 출시한다. 반복 주기 안에서 각 단계에 대한 이름은 다르지만 요구분석,설계,구현,통합,테스팅,설치 작업까지 거치게 된다. 완벽한 문서 작성보다는 실행되는 소프트웨어에 더 가치를 둔다. Agile methods
    1. XP(extreme programming) 소규모 개발 조직이 불확실하고 변경이 많은 요구를 접하였을때 적절한 에자일 방법이다. TDD (test-driven development) : 소프트웨어가 있다고 가정하고, test코드 작성하다가 컴파일 에러가 나면 그때 내가 만들 함수를 개발 Pair programming : 함수 A를 구현할때 두사람이 회의하면서 같이 코딩함 CI (Continuous integration) : integration 보다는 build라고 이해 기능 하나만 만들때에 그것을 추가하고 build, 매 기능 추가시 build 원래 전통적인 프로세스에서는 모든 기능 개발을 마치고 build(빌드를 처음부터 계속하기때문에 오류를 일찍 발견 가능함)
    2. Scrum 에자일 방법론의 필수요소로서 약속된 시간에 서서 어제는 무슨일을 했는지 오늘은 무슨일을 할 것인지 각자 이야기하고 이를 바탕으로 마지막에 스크럼 마스터가 전체적인 진행상황을 점검, 서로의 작업 상황을 최소 단위로 공유하면서 일을 효율적으로 진행하기 위함 스크럼 용어 Scrum(팀/방법론) : (the smallest) team Sprint(주기) : a cycle of SW development Product backlog(할 일 목록) A catalogue of requirements (or called stories) with priorities, described in customer’s terminologies Sprint backlog(진행 목록) : Work status board Daily scrum(일일 미팅) : daily meeting Sprint demo(SW데모) : the end of a sprint Sprint retrospective(회고) Slack time between sprints(휴식) Methods and tools in Android App development 요구사항명세서에 요구사항ID를 적어 세부화시킴 [ Android component-level Architecture Diagram ] 인트라앱 - 인터앱 - 인트라 컴포넌트 - 인터 컴포넌트 순서
소프트웨어의 특징: 복잡성,순응성,변화성,비가시성 소프트웨어공학에서 해결하려고 하는문제 : 고비용, 개발지연, 낮은 신뢰도, 유지보수 소프트웨어공학이란 용어는 NATO회의에서 소프트웨어 위기를 논의하기 위해 처음 제안했다 소프트웨어 위기는 1960년대 크고 복잡한 시스템을 개발할 때 겪었던 어려움에 대한 이름이다. 소프트웨어 공학 이란 ? 소프트웨어 개발, 운영, 유지 보수 및 폐기에 대한 체계적인 접근 방식 소프트웨어 문제 : 크기, 품질 및 생산성, 일관성 및 재현성, 변경 SWEBOK = software engineering body of knowledge 소프트웨어 프로세스가 아닌것: 정해진 절차없이 code and fix를 반복하는것 소프트웨어 프로세스 정의: 소프트웨어 시스템을 구축하기 위하여 수행되는 작업 단계, 각 단계별 잘 정의된 작업 수행 바람직한 프로세스 특징 : 예측가능성, 테스팅 및 유지보수 편이성, 변경 용이성, 결함 제거 용이성 폭포수, 프로토타입, 진화적, 나선형, V모델, unified모델, 에자일 모델 에자일 모델의 특징 : 절차와 도구보다 개인과의 소통 중시 잘 쓴 문서보다 실행되는 소프트웨어에 가치를 둔다 계약 절충보다 고객협력을 중시 계획을 따라하는 것보다 변경대응하는 것을 중시 에자일방법 5가지 Scrum XP TDD Pair Programming CI

01 서론 ~ 02 시스템 구조

1단원

 
    POSIX : Portable Operating System Interface 시스템의 관점에서 OS는 하드웨어와 가장 밀접하게 연관된 프로그래밍 OS를 자원할당자(resource allocator), 제어프로그램(control program) <- 특히 IO부분 무어의 법칙(Moore's Laws) : 집적회로의 트랜지스터 수가 매 18개월마다 배가할 것이라고 예측 OS의 존재이유 - 유용한 컴퓨터 시스템을 만드는 과정에서 발생하는 문제점을 해결하기 위한 적절한 방법 -> 자원을 제어하고 할당하는 공통기능을 하나의 소프트웨어로 통한것이 운영체제 일반적인 정의로 운영체제는 컴퓨터에서 항상 수행되는 프로그램을 일반적으로 커널이라 불린다. (커널과 함께 다른 두 유형의 프로그램이 있다. 시스템 프로그램은 운영체제와 연관되어 있으며 커널의 일부분은 아니고, 응용프로그램은 시스템의 운영과 관계없는 모든 프로그램을 포함한다.) 미들웨어 - 응용 개발자에게 추가서비스를 제공하는 소프트웨어 프레임워크 집합
  • 1.2 컴퓨터 시스템의 구성

    컴퓨터가 구동을 시작하기 위해, 수행할 초기 프로그램 필요 = 부트스트랩 프로그램 이것은 보통 펌웨어라고 알려져있고 ROM 이나 EEPROM에 저장됨, CPU 레지스터로부터 장치 제어기, 메모리 내용 등을 포함한 시스템의 모든 면을 초기화한다. 또한 이것은 OS를 적재하는 방법 및 수행을 시작하는 방법을 알아야 함 부트스트랩 프로그램은 OS의 커널을 찾아 메모리에 적재 소프트웨어는 시스템 호출(system call)이라 불리는 특별한 연산을 실행하여 인터럽트를 발생시킬 수 있음
  • 1.3 단일 처리기 시스템

    다중 처리기 시스템은 단일 처리기 시스템보다 좋은 3가지 장점이 있다. 1. 증가된 처리량 2. 규모의 경제 3. 증가된 신뢰성 비대칭적 다중처리 - 하나의 주 처리기가 시스템을 제어한다. 이러한 기법은 주종 관계를 정의한다. 대칭적 다중처리 - 모든 처리기가 대등. 처리기 간에는 주종 관계가 없다.(SMP)

    OS가 하는 일

  • 1.4

    다중 프로그래밍 : CPU가 수행할 작업을 항상 하나 가지도록 작업을 구성함으로써 CPU이용률 증가 시분할은 다중 프로그래밍의 논리적 확장 (대화식 컴퓨터시스템을 필요로함) 실행되고 있는 프로그램 : 프로세스
  • 1.5

    작업이 영원히 서로를 기다린다 : deadlock(교착 상태) OS 는 인터럽트 구동식(interrupt driven) 사용자 모드와 커널 모드를 모드 비트를 통해서 구별한다 악영향을 끼칠 수 있는 일부명령(특권명령) : 입출력제어, 타이머관리
  • 1.6 프로세스 관리

    모드 비트 : 커널모드(0) 사용자모드(1) 모드 비트의 사용으로 OS를 위해 실행되는 작업과 사용자를 위해 실행되는 작업을 구분할 수 있게 됨 사용자 모드(User Mode) : 사용자를 위해 실행됨 커널 모드(Kernel Mode) : 운영체제를 위해 실행됨 프로세스(Process)는 실행중인 프로그램을 말하며, 하나의 작업이나 하나의 시분할 프로그램으로 생각할 수 있음 Thread : 프로세스가 여러개 실행되면 발생되는 흐름 프로그램은 디스크에 저장된 파일 내용과 같이 수동적 개체(Passive Entity) <-----> 프로세스는 다음 수행할 명령을 지정하는 PC를 가진 능동적 개체(Active Entity)
  • 1.7 메모리 관리

    주기억장치 - CPU가 직접 주소를 지정할 수 있고, 직접 접근할 수 있는 유일한 대량의 메모리 Keeping track, Deciding which process, Allocating and deallocating memory space
  • 1.8 저장장치 관리

    논리적 관점을 제공 저장장치의 물리적 특성을 추상화한 논리적 저장 단위 -> 파일(File) 파일 시스템 관리 컴퓨터의 전체 동작 속도는 디스크 서브시스템과 그것을 조작하는 알고리즘 속도에 의해서 결정될 수 있음 캐시, 캐시 일관성 문제
  • 1.9 보호와 보안

    보호(Protection) : 컴퓨터 시스템이 정의안 자원에 대해 프로그램, 프로세스, 또는 사용자들의 접근을 제어하는 기법 보안(Security) : 시스템 외부 또는 내부의 공격을 방어하는 것 Privilege escalation : 리눅스에서 password 변경할때 setuid비트가 1이 되면서 /bin/passwd 에 euid가 root가 된다. 즉 권한 상승
  • 1.11 계산 환경(Computing Environments)

2단원

  • 2.1 운영체제 서비스

    1. 사용자 인터페이스 명령어 라인 인터페이스(command-line Interface, CLI) 배치 인터페이스(batch Interface) : 명령어와 명령어를 제어하는 디렉티브가 파일 형태로 입력되고 그 파일이 실행됨 그래피컬 사용자 인터페이스(graphical user Interface, GUI)
    2. 프로그램 수행
    3. 입출력 연산
    4. 파일 시스템 조작
    5. 통신 공유 메모리를 통해서 구현 될 수도 있고, 메시지 전달 기법에 의해 구현 될 수도 있음
    6. 오류 탐지
    7. 자원 할당
    8. 회계
    9. 보호(Protection)와 보안(Security) 보호 : 시스템 자원에 대한 모든 접근이 통제되도록 보장하는 것을 포함 보안 : 각 사용자가 자원에 대한 접근을 허용 받기 위해 통상 패스워드를 사용해서 시스템에 자기 자신을 인증하는 것으로부터 시작
  • 2.2 사용자 운영체제 인터페이스

    명령해석기 -어떤 OS는 커널에 명령어 해석기를 포함 -다른 OS는 명령어 해석기를 작업이 시작되거나, 사용자가 처음 로그온 할 때 , 수행되는 특수한 프로그램으로 취급 *선택할 수 있는 여러 명령어 해석기를 제공하는 유닉스 시스템에서는 이 해석기를 ‘쉘(Shell)’이라 함 -명령어 해석기의 주요 기능 : 사용자가 지정한 명령을 가져와서 그것을 수행하는 것 그래피컬 사용자 인터페이스
  • 2.3 시스템 호출(System Calls)

    시스템 호출은 OS에 의해 사용 가능하게 된 서비스에 대한 인터페이스를 제공한다. 대부분의 사용자는 시스템 호출을 직접적으로 사용하기 보다는 응용 프로그램 인터페이스(Application Program Interface; API)를 통한 프로그램에 의해서 접근 응용프로그래머는 실제 호출보다 API에 따라 프로그래밍하는 것을 선호하는 이유 : 프로그램의 호환성을 높일 수 있음, 작업하기가 더 쉬움 OS에 매개변수를 전달하기 위한 3가지 방법 1. 매개 변수를 레지스터 내에 전달 2. 매개변수는 메모리내의 블록이나 테이블에 저장되고, 블록의 주소가 레지스터 내에 매개변수로 전달 3. 매개변수는 프로그램에 의해 스택에 넣어질 수 있고, OS에 의해 꺼내짐(블록이나 스택 방법을 선호 why? 전달되는 매개변수의 개수나 길이를 제한하지 않기 때문)
  • 2.4

    시스템 호출의 유형 : 프로세스제어, 파일조작, 장치조작, 정보유지보수, 통신, 보호 프로그램 문제발생 -> 오류트랩발생
  • 2.6 운영체제 설계 및 구현

    첫 번째 문제점 : 목적과 세부사항을 정의함에 따라 영향을 받음(시스템의 목표와 명세를 정의하는 일) 설계요구조건 -사용자목적 : 시스템이 사용하기 쉽고, 편리하며, 배우기 쉽고, 믿을 수 있고, 안전하고, 신속해야 함 -시스템목적 : OS는 설계, 구현, 유지 보수가 쉬워야 하며, 또한 적응성, 신뢰성, 무결성, 효율성을 가져야 함 설계 시 중요한 원칙 -메커니즘(Mechanism)으로부터 정책(Policy)을 분리하는 것 메커니즘 : 어떤일을 어떻게(How)할 것인가를 결정하는 것 ex)CPU 보호 기법은 Timer로 정책 : 무엇을(what)할 것인가를 결정하는 것 ex)Timer out 시간 결정 -> 정책의 변경에 민감하지 않은 일반적인 메커니즘이 보다 바람직함 => OS 디자인에는 정답이 없다.
  • 2.7 운영체제 구조

    1. 간단한 구조(Simple Structure) 범용 운영체제는 매우 큰 프로그램 범용 운영체제의 구조는 다양한 방법 간단한 구조 : MS-DOS 좀 더 복잡한 : UNIX 계층적 : 추상화 개념 마이크로커널(Microkernel) : Mach *MS-DOS 구조 H/W 한계 때문에 최소의 공간에서 최대의 기능을 제공하도록 작성 모듈로 잘 분할되지 않았음(모놀리식 커널) 커널의 구성요소들은 각 구소요소들간의 보호기능 없이 한곳에 위치, 악의적은 프로그램의 공격을 받기 쉬움
    2. 계층적 접근(Layered Approach) 주된 장점은 모듈화(Modularity) : 강력한 제어, 내부 시스템 변경의 자유로움, 특정 기능 집합의 구현 세부사항에 대한 은폐 방법 OS는 다수의 층으로 분할되고, 각 층은 하위 층 위에서 구축됨(계층적 구성) : 최하위층(Layer 0)은 하드웨어, 최상위측(Layer N)은 사용자 인터페이스 장점 : 시스템 검증과 디버킹 작업을 단순화 단점 : 비효율적, 처리 시간 오버헤드(트랩(trap)의 연속)
    3. 마이크로커널(Microkernel) 중요하지 않은 모든 구성 요소를 커널로부터 제거하고, 시스템 및 사용자 수준 프로그램으로 구현 커널은 보안, IPC, H/W 상호 동작 등의 작은 수준만을 제공 클라이언트 프로그램과 사용자 공간에서 수행되는 서비스간의 통신은 메시지 전달(Message Passing) 사용 장점 : OS의 확장이 용이 - 커널 확장을 위해서 단지, 새로운 서버를 추가하면 됨 모든 새로운 서비스는 사용자 공간에 추가되며, 따라서 커널 변경을 필요로 하지 않음 대부분의 서비스가 커널이 아니라 사용자 프로세스로 수행되기 때문에 또한 보다 높은 보안성과 신뢰성을 제공 단점 : 성능 오버헤드 문제(사용자와 커널 프로세스간의 통신 오버헤드) 대표적 OS Mach
    4. 모듈(Modules) OS 설계하는데 이용되는 최근 기술 중 최선책은 아마도 적재가능 커널 모듈 장점 : 핵심 서비스를 제공할 수 있게 할 뿐 아니라 특정 기능들을 동적으로 구현할 수 있게 해줌 커널의 각 부분이 정의되고, 보호된 인터페이스를 가진다는 점에서 계층적 구조와 유사 모듈이 임의의 다른 모듈을 호출할 수 있다는 점에서 계층적 구조보다 더 유연함
  • 2.8 운영체제 디버깅

    운영체제는 또한 프로세스가 사용하던 메모리를 캡쳐한 코어 덤프(core dump)를 취하고 차후 분석을 위해 파일로 저장한다 커널 장애는 충돌(crash)라고 불린다. 프로세스 장애와 마찬가지로 오류 정보가 로그 파일에 저장되고 메모리의 상태가 충돌 덤프(crash dump)에 저장된다 Dtrace : 실행 중인 시스템, 사용자 프로세스와 커널 모두에 동적으로 탐색점을 추가할 수 있는 설비
  • 2.9 운영체제 생성

    SYSGEN 프로그램 : H/W 시스템의 특정 구성에 대한 정보를 운영자에게 요구하거나, 주어진 파일로부터 읽어 들이거나, 또는 어느 구성 요소가 있는지를 결정하기 위해 H/W를 직텁 테스트함
  • 2.10 시스템 부트

    부팅(Booting) : 커널을 적재하여 컴퓨터를 시동하는 절차 부트스트랩 프로그램(Bootstrap Program) : ROM에 저장된 조그마한 코드로 커널을 찾아 그것을 메모리에 적재하고, 수행을 시작하도록 해줌 ROM에 들어있거나 디스크 0번 세터에 있다. 부트스트랩은 진단 절차를 수행하고 고정된 위치(예를 들면 블록 0)의 디스크 블록 하나를 읽어 메모리에 적재하고 그 위치로부터 실행시킬 수 있는 코드를 가진다. 이 블록을 부트 블록이라고 한다. 부트 블록에 저장된 프로그램은 OS 전부를 메모리에 적재하고 실행을 시작할 수 있을 만큼 복잡할 수 있다. 모든 부트 프로그램이 적재되면 파일 시스템을 탐색하여 OS 커널을 찾아내고 메모리로 적재한 후 실행을 시작한다. 시스템이 실행 중이라고 할 수 있는 시점은 바로 이 시점이다.

05 Text Editors

Linux

05 Text Editors

 
    원격 쉘을 통해 텍스트 파일을 편집해야할 때 : 일부 서버는 GUI를 제공하지 않음. VI 콘솔 기반 텍스트 편집기 파일이 있는 경우 파일의 권한에 따라 열린다. 파일이 없으면 가상으로 열린다. 나중에 저장할때 파일 생성 가능 vi + filename 마지막줄에 커서 vi +n filename n번째줄에 커서 vi +/pat filename 패턴이 처음 발견되는 라인에 커서 때로는 vi가 중단되어 파일을 제대로 저장할 수 없는 경우가 있다. Swap file이라는게 생기는데 변경한 내용을 저장 같은 디렉토리 내에 .으로 시작하는 숨겨진 파일 vi -r 옵션 // -R 과 확실하게 구분 -R은 read only -r 은 모든 스왑파일 리스트

    vi에는 3가지 모드

    1. Insert mode : Editing text i - just before the current cursor position a - just after the current cursor position o - into a new line below current cursor I - at the beginning of the current line A - at the end of the current line O - into a new line above current cursor
    2. Command mode : Performing special functions, Initial mode :w filename :w! :q :wq :q! ZZ :n :$ 마지막라인로이동 :$= 총 라인 출력 :.= 현재 라인 출력 H 맨 처음 라인으로 G 맨 끝라인으로 M 화면 중간라인으로 u : undo last changes in the last insert mode ^r : redo last changes which were undone. . : repeat the last command x 한문자삭제 dw 현재커서부터 단어끝까지 삭제 v 문자별로 선택하기 V 라인별로 선택하기 C 현재커서부터 라인끝까지 replace S 현재라인 전부 replace
    3. Line mode : Special mode to execute more complicated functions Line mode 에서 input mode 로는 transition이 없음 : / ? Command mode에서 Last Line Mode 로 ^ : caret(캐럿) - 그라인의 처음으로 :[begin,end]s/pattern1/pattern2/flag : flag 가 g이면 모든 경우, c 이면 인터랙티브 % : represent the entire file $ : represent the last line . : represent the first line Without [begin,end], the command is applied in the current line 라인모드에서 텍스트 서칭 /단어 정방향 ?단어 역방향 :1,. w filename 1부터 현재 줄까지 파일네임에 저장 :1,. w >> filename 파일네임 뒤로 추가 라인모드 :r filename //read :e filename //edit :r! tail -1 /etc/passwd 쉘명령어를 수행해서 내용을 파일로가져옴 set list 설정을통해 캐리지리턴 줄바꿈 부분 확인가능 :set tabstop=# (#값에따라 간격 수정가능) ~/.exrc 파일내용에 환경설정을 수정하면 기본값 변경가능 (ex 탭간격)
    과제에 사용되는 명령어 wc print new line, word, and byte counts for each file
    :3 3번째 라인으로 커서 이동 O 현재 커서 위로 새로운 라인추가 j 한 라인 아래로 커서 이동 J 현재 라인과 아래 라인 결합 yy 현재라인 복사 G 마지막 라인으로 이동 p 현재 라인 아래에 붙여넣기 dd 현재라인삭제 :wq 저장하고 나가기 /pigs pigs 단어 검색 (n누르면 마지막 서치 반복) :1,$s/pigs/lambs/g 첫번째라인부터 마지막라인까지 모든경우의 pigs패턴을 lambs패턴으로 replace ZZ 나가기

04 AccessControl

Linux

04 Access Control

>
  • Change Ownership $chown owner file/dirname Only root can change the ownership ex) chomod u+x,go+w test.bat 사용자에게 실행권한 추가, 그룹과 others에 write 권한 추가이다.
  • Change Group Ownership $chgrp group file/dirname Only users included in the group or root can change the group ownership
  • Recursive modification -R옵션을 사용하여 서브디렉토리 및 하위 디렉토리및파일의 권한과 소유를 바꿀수 있다. $chgrp -R dsm dsm-work dsm-work디렉토리의 그룹소유가 바뀐다. dsm-work 디렉토리아래에 있는 모든 contents(하위디렉토리및파일)가 바뀐다
  • Recursively modifying permissions of subdirectories 디렉토리의 파일 항목을 읽으려면 디렉토리에 실행 권한과 읽기 권한이 있어야 한다. 그래서 명령어 chmod -R u+x name 을 입력하면 의도치 않게 name 디렉토리 하위에 있는 파일들이 실행권한을 얻게된다. 디렉토리 내에 파일에는 x권한을 주지 않고 디렉토리들에만 x권한을 주고 싶을때 : chmod -R u+X name (X 이다. 대문자 X)
  • Special file permission Setuid : Set user-ID on execution --chmod u+s name Setgid : Set group-ID on execution --chmod g+s group_dir Sticky bit : Restricted deletion flag --chmod o+t temp
  • setuid:special file permission setuid가설정된 파일을 수행하는 프로세스는 파일 소유자의 권한을 얻는다 주로 setuid 는 루트소유 파일에 접근할수 있는 루트권한을 얻기위해서 사용된다. ex)passwd 명령어가 수행되는동안 사용자는 루트권한을 획득한다. SetUID가 설정된 파일을 실행할 때 일시적으로 파일 소유자의 권한을 얻어 실행할 수 있도록 함 가장 대표적인예로 /usr/bin/passwd 파일이다. 이 파일은 계정의 비빌먼호를 변경할 수 있도록 하는 명령어 실행 파일로 /etc/passwd 로 접근하여 비밀번호를 변경하도록 함. 실제 /etc/passwd의 권한은 파일 소유주인 root만이 변경가능하도록 설정되어 있다. 만약에 /usr/bin/passwd 에 setuid가 적용되어있지 않는다면 일반 사용자들은 항상 관리자로 거쳐 자신의 비밀번호를 변경해야하는 번거로움이 생긴다. 그래서 악의적으로 setuid를 사용할 수 있게 된다.(backdoor)
  • setgid:special file permission 디렉토리에 setgid권한이 있으면 디렉토리 내에서 작성된 파일이 디렉토리의 동일한 그룹 소유권을 획득한다.
  • Sticky:special permission /tmp 디렉토리는 모든 사람이 임시 파일을 만들 수 있도록 설정되어야한다. 그러나 이는 일반적으로 누구나 파일을 삭제할 수 있음을 의미한다. 파일의 소유자 또는 디렉토리 소유자 만이 sticky 디렉토리에서 삭제 가능하다. "t"로 표현됨 sticky-bit로 설정된 디렉토리는 모든 사용자가 write가능. 하지만 삭제할수있는권한 root와 해당사용자만 가능
  • umask command 새 디렉토리나 파일을 만들때 초기 사용 권한이 부여된다. 그 값을 umask를 사용하여 초기 사용 권한 설정 666 (rw- rw- rw-) for files 777 (rwx rwx rwx ) for directories # Example : umask 022 – File creation : 666 – 022 = 644 (rw- r-- r--) – Directory creation : 777 – 022 = 755 (rwx r-x r-x)

Pagination