본문 바로가기
코스웨어/13년 스마트컨트롤러

130830 금 정리 조유진

by 알 수 없는 사용자 2013. 8. 30.
728x90
반응형

유닉스

커널 패닉 : UNIX에서 운영체제가 뻗은 상태

파일을 지울 때 : 데이터를 지우는게 아닌, iNode를 삭제하여 찾지 못하게 한다.

Close해야하는 이유 : close를 하지 않으면 v노드 포인터가 회수되지 않는다. 각 프로세스마다 오프셋이 달라질 수 있으므로(접근중인 위치 등) 테이블이 따로 분리되어 있어야 한다.


lseek와 O_APPEND의 차이

lseek : 두 프로세스가 함께 접근시 덮어써버릴 수 있다는 문제가 있다

예시) 10byte 크기의 파일이 존재하고, 프로세스 A와 B가 서로 끝을 향하고 있다. 이 상황에서 둘다 쓴다면 마지막에 쓴 프로세스의 내용이 기록된다.

O_APPEND : 파일을 열 때 옵션으로 넣어주는 것. 쓸 때 자동으로 끝을 향해 주므로 두 프로세스가 함께 쓰더라도 원자적으로 수행이 가능하다.


원자적 수행 : 전부 수행되거나, 전부 수행되지 않거나의 두가지만 존재한다. (일부만 수행되지 않는 것이 보장되어야 한다)

pread와 pwrite도 원자적 수행이 가능하지만 도중에 소프트웨어 인터럽트가 걸리지 않고 위치 갱신이 안된다는 차이가 있음


dup함수 : 기존 파일 서술자(stdin, stdout 등)를 복제할 때 이용된다.

fork함수와 유사하게 서술자 번호로 구분이 가능하다.(사용 가능한 서술자 중 제일 작은 값을 가져간다.)

예시) stdout을 복제한 파일 서술자의 값은 3이며, write함수로 파일 서술자에 무언가를 출력하면 stdout을 썼을 때와 똑같이 동작한다.


#include <stdio.h>
#include <unistd.h>

int main()
{
  int iFd;  // 임시 파일 서술자

  write( 1"TEST\n"5 );  // 1(STDOUT)에 "TEST\n"를 출력
  iFd = dup( 1 );        // 1(STDOUT)을 복사하여 iFd에 넣음
  
  printf( "Value of iFd : %d\n", iFd );  // 복사한 iFd의 값을 출력
                      // 사용 가능한 파일 서술자 중 제일 값이 작은 곳에 들어감

  write( iFd, "iFd Test!\n"10 );    // iFd에 "iFd Test!\n"를 출력.
                      // STDOUT에 출력한 것과 똑같은 결과

  return 0;
}


지연된 쓰기 : 쓰기 작업 시, 버퍼에 복사하여 대기열에 등록하고 적당한 시점이 되면(버퍼가 다 찼을 때, 등) 등록한다.


sync, fsync, fdatasync파일 시스템과 버퍼 캐시 내용 간 일치를 보장한다.


fsync : 블로킹 함수이며, 디스크 쓰기들이 완료될 때 까지 기다렸다 반환한다.

수정한 블록들이 디스크에 실제로 기록되었음을 보장할 필요가 있을 때 활용된다.

fdatasync와 차이 : fdatasync는 파일의 자료 부분만 적용하되 fsync는 파일의 특성도 갱신한다.


chmode : 권한을 바꿀 수 있다.(소유자/그룹/기타)


유닉스의 파생형들

Sun - Solaris

IBM - AIX

HP - HP-UX

Compaq - True64

FreeBSD


리눅스와 유닉스의 차이

유닉스 : 70년대 초 AT&T에서 기존에 만들던 '멀틱스'가 실패하고, 이후 해당 프로젝트에 소속된 개발자들이 우주전쟁이라는 게임을 실행하기 위하여 제작한 운영체제라고 합니다. 오락을 위해 만들었다는 게 농담인 줄 알았는데 진짜였네요.

리눅스 : 당시 한창 진행중이던 GNU프로젝트(유닉스의 모든 시스템을 프리 소프트웨어로 구성하는 것)가 있었으나, 커널은 제대로 제작되지 못한 상태였습니다(당시 유닉스 커널은 클로즈드 소스로, 공개된 소스가 아니었다고 합니다.) 그 때 나온 오픈소스 커널입니다. 대학원생이던 리누스 토발즈가 1991년 취미로 개발한 커널이라고 합니다.


어셈블리

idiv와 div의 차이 : div는 양수 나눗셈에 사용되며, idiv는 정수 나눗셈에 사용된다.


idiv로 나눌 때 2byte를 나누려면 4byte가 필요하다. AX를 나누면 추가로 DX가 들어가는데(용량을 다른데서 확장함) 올바른 계산을 하려면 DX에 0이 채워져 있어야 한다.


음수의 수를 더 큰 용량에 저장할 때(1byte -> 4byte 등) 앞에 FF(전부1)로 채워넣는다.(어차피 2의 보수를 해줄 때 1은 0이 되어 값에 영향을 주지 않음)


ax나 dx에 값을 대입하면 반만 들어가고 나머지는 유지되는 것을 볼 수 있다.

ax에 0FE01h를 넣고 bl에 0E0h를 넣고 idiv하면 E10Fh의 값이 나온다.(상위비트인 0F가 몫이며 하위비트인 E1이 나머지)


나누는 도중 여러 오류가 유발될 수 있지만 그 중 확실한 이유 중 하나는 0으로 나눌 때 일어남

-> 컴파일 도중 에러가 나거나 디버깅 모드로 튕김

728x90

'코스웨어 > 13년 스마트컨트롤러' 카테고리의 다른 글

어셈블리 숙제 0902 임기준  (0) 2013.09.02
어셈블리 과제2 - 손초롱  (0) 2013.09.02
20130902과제 - 전영기  (0) 2013.09.02
130902 - 월요일 정리 문예진  (0) 2013.09.02
옵티머스 드라군(중간프로젝트)  (0) 2013.08.30
apue.h  (0) 2013.08.29
어셈블리어 과제 - 진종영  (0) 2013.08.29
어셈블리 과제 - 문남경  (0) 2013.08.29