.a (아카이브) - object 파일들을 묶어서 library로 제공(.so와 동일한 성격) - 정적 라이브러리 .so (Shared Object) - 공유 라이브러리 정적 라이브러리 vs 공유 라이브러리 정적 라이브러리는 로직이 변경되면 해당 라이브러리를 호출해서 사용하는 프로그램들을 모두 재컴파일 해야한다. 반면, 공유 라이브러리는 재컴파일 없이 프로그램 재기동시 바로 반영이 된다. 또한, 정해진 디렉토리에 해당 라이브러리들이 있어야 한다. (LIBPATH, LD_LIBRARY_PATH 등) 실행속도는 정적라이브러리가 공유라이브러리 보다 빠르다는 장점을 가지고 있다. 로직이 변경될때 관련 프로그램을 재기동 해야한다는 공유 라이브러리의 단점을 개선한것이 동적 라이브러리다. dlopen()과 같은 시스..
웹서버 - 클라이언트가 서버에 요청을 하면 요청을 받아서 정적인 컨텐츠들을 제공하는 서버 정적인 컨텐츠(html,png,css등등) - 클라이언트에서 요청시 가장 먼저 요청에 대한 처리를 한다. - 웹서버에서 처리를 못할시 was에게 넘김 was - 동적 컨텐츠를 제공하기 위해 만들어진 서버 동적 컨텐츠(DB조회, 로직을 포함한 컨텐츠 등) - JSP와 서블릿 구동 환경을 제공. - JSP및 서블릿을 실행 시킬수 있는 소프트웨어를 컨테이너라고 함. 동작 프로세스 1. 웹서버로부터 요청이 오면 컨테이너가 받아서 처리 2. 컨테이너는 web.xml을 참조하여 해당 서블릿에 대한 쓰레드 생성. 이후, httpServletRequest와 httpServletResponse 객체를 생성하여 전달. 3. 컨테이너는..
u2l => Unix 시스템을 Linux 환경으로 마이그레이션 유닉스 - 상용 소프트웨어 리눅스 - 공개 소프트웨어 리눅스의 장점: 무료 라이선스, 도입비용 절감, TCO절감의 장점을 가지고 있다. (TCO = Total Cost of Ownership) 여러 벤더 제품에 종속성이 크지 않아 다양한 HW/SW 선택이 가능하다. (호환성 양호) 이기종 시스템간 호환성 및 클라우드에 적합한 환경 -> 오픈 플랫폼이 증가 쓰레드 구조가 단순하고 java환경에 탁월한 장점을 지니고 있다. 커널의 독립성으로 유연성있게 특정 하드웨어에만 지원되지 않는다. 제일 중요한점은, 다양한 cpu를 지원하고 다양한 플랫폼을 통해 하드웨어의 성능을 최대치로 끌어올릴 수가 있다.
공유메모리 보통은 프로세스에서 사용하는 메모리 영역은 해당 프로세스만 사용할 수 있다. 하지만, 프로프레임 영역에서는 한 서비스와 연동되는 기타 서비스들 모두가 함께 쓰는 영역이 필요할 때가 있다. 이러한 일들이 공유메모리가 가능케 해준다 모든 프로세스는 업무를 처리하기 위한 공간을 가지게 된다. 이런 공간에 들어가는 내용들은 커널 명령어, 초기화된 데이터, 함수호출시 필요한 정보, 동적할당이 이뤄지는 데이터등이 있다. 메모리 공간을 얻기 위해선 커널에 요구를 해야한다. 그 뒤, 만들어진 공간은 요청한 프로세스만 접근이 가능하다. 요청한 프로세스뿐 아닌, 다른 여러 프로세스가 이러한 공간접근이 필요할 경우, 공유 메모리를 사용한다. 공유메모리는 IPC중에서 가장 빠른 수행속도를 보여준다. -> IPC :..
#include #include #define SZ 7 int queue[SZ]; int front = 0; int rear = 0; int isEmpty() { return (rear == front); } int isFull() { return ((rear + 1) % SZ == front); } int deque() { if (isEmpty() == 1) { return -999; } int temp = queue[front]; front = (front + 1) % SZ; return temp; } void enque(int n) { int if100 = 0; if (isFull() == 1) { return; } if (n == 100) { while (isEmpty() == 0) { if100..
#include #include #define SZ 100 int stack[SZ]; int top = -1; int isEmpty() { return (top == -1); } int isFull() { return (top == (SZ - 1)); } int pop() { if (isEmpty() == 1) { return -999; } int temp; temp = stack[top--]; return temp; } void push(int n) { int if100 = 0; int popped = 0; if (isFull() == 1) { return; } if (n == 100) { while (isEmpty() == 0) { popped = pop(); if100 = if100 + popped..
#include #include #define SZ 5 int queue[SZ]; int front = 0; int rear = 0; int isEmpty() { return (rear == front); } int isFull() { return ((rear + 1) % SZ == front); } void enque(int n) { if (isFull() == 1) { return; } queue[rear] = n; rear = (rear + 1) % SZ; return; } int deque() { if (isEmpty() == 1) { return -999; } int temp = queue[front]; front = (front + 1) % SZ; return temp; } int main(v..
#include #include #define SZ 5 int stack[SZ]; int top = -1; int isEmpty() { return (top == -1); } int isFull() { return (top == (SZ - 1)); } void push(int n) { if (isFull() == 1) { return; } stack[++top] = n; return; } int pop() { if (isEmpty() == 1) { return -999; } int temp; temp = stack[top--]; return temp; } int main(void) { int n, data; scanf("%d", &n); for (int i = 0; i < n; i++) { scanf("..