コード例 #1
0
//-----------------------------------------------------------------------------
int main(int argc, char *argv[]) {

    int SharedMemoryKey;
    int NumberOfPages;
    int OSPID;
    int SegmentID;
    page_table_pointer PageTable;
    int RSIndex;
    int Mode;
    int Page;

    /*
        SharedMemoryKey = arg terakhir
        NumberOfPages = arg pertama
    */
    if (argc < 2 || (OSPID = SharedMemoryKey = atoi(argv[argc-1])) == 0  || (NumberOfPages = atoi(argv[1])) == 0) {
        printf("Usage:");
        exit(EXIT_FAILURE);
    }

    printf("SharedMemoryKey = %d | NumberOfPages = %d\n", SharedMemoryKey, NumberOfPages);
    //----Create the page table
    if ((SegmentID = shmget(SharedMemoryKey, NumberOfPages * sizeof(page_table_entry), 0)) == -1
     || (PageTable = (page_table_pointer) shmat(SegmentID,NULL,0)) == NULL){
        printf("SegmentID : %d\n", SegmentID);
        perror("ERROR: Could not get page table");
        exit(EXIT_FAILURE);
    }

    //----Handler for page fault
    if (signal(SIGCONT,ContinueHandler) == SIG_ERR) {
        printf("ERROR: Could not initialize continue handler\n");
        exit(EXIT_FAILURE);
    }

    printf("Initialized page table:\n");
    PrintPageTable(PageTable,NumberOfPages);
    printf("\n");
    //----Deal with the page requests
    for (RSIndex = 2;RSIndex < argc-1;RSIndex++) {
        Mode = argv[RSIndex][0];
        Page = atoi(&argv[RSIndex][1]);
        //----Check that it's within the process
        if (Page >= NumberOfPages) {
            printf("ERROR: That page number in %c%d is outside the process\n", Mode,Page);
        } else {
            printf("Request for page %d in %c mode\n",Page,Mode);
            //----Check if in memory

            //# 1. Mengecek apakah page ada dalam memori fisik
            if (!PageTable[Page].Valid) {

                //# 2. Jika tidak, MMU akan menuliskan PID ke field ​Requested untuk page tersebut. 
                printf("It's not in RAM - page fault\n");

                //# Page
                PageTable[Page].Requested = getpid();
                //----Sleep a bit to allow OS to get ready for another signal
                sleep(1);

                //# 3. Mengirimkan sinyal ​SIGUSR1 ke proses OS.
                //# mengirim sinyal SIGUSR1 ke program OS dgn PID = OSPID
                if (kill(OSPID,SIGUSR1) == -1) {
                    perror("Kill to OS");
                    exit(EXIT_FAILURE);
                }

                //# 4. Blocking, sampai mendapatkan sinyal SIGCONT dari proses OS yang menyatakan bahwa page telah dimuat ke memori fisik
                /*
                    > Deskripsi pause()
                    > pause() causes the calling process (or thread) to sleep until a signal is
                      delivered that either terminates the process or causes the invocation of
                      a signal-catching function.
                    > Sumber: man pause
                */
                pause();

                if (!PageTable[Page].Valid) {
                    printf("Bugger, something wrong\n");
                }
            } else {
                printf("It's in RAM\n");
            }

            //# 5. Jika proses ini merupakan proses penulisan, melakukan update pada ​Dirty ​menjadi true
            //----If write mode, set the dirty bit
            if (Mode == 'W') {
                printf("Set the dirty bit for page %d\n",Page);
                PageTable[Page].Dirty = 1;
            }
            PrintPageTable(PageTable,NumberOfPages);
            printf("\n");
        }
    }

    //----Free the shared memory
    if (shmdt(PageTable) == -1) {
        perror("ERROR: Error detaching segment");
        exit(EXIT_FAILURE);
    }

    //----Alert OS
    printf("Tell OS that I'm finished\n");
    //----Sleep a bit to allow OS to get ready for another signal
    sleep(1);

    if (kill(OSPID,SIGUSR1) == -1) {
        perror("Kill to OS");
        exit(EXIT_FAILURE);
    }

    return(EXIT_SUCCESS);
}
コード例 #2
0
int main(int argc, char *argv[]){

	if(argc < 3){
		printf("> Kesalahan: argumen Page(arg1) dan Frame(arg2) tidak boleh kosong\n");
		printf("> Gunakan perintah:\n\n");
		printf("    %s <banyak page> <banyak frame>\n\n", argv[0]);
		printf("    contoh: ");
		printf("%s 5 2\n\n", argv[0]);
		return 0;
	}

	banyakPage = atoi(argv[1]);
	banyakFrame = atoi(argv[2]);

	/*
	printf("> Alokasi Shared Memory :\n");
	printf("  Page  : %d\n", banyakPage);
	printf("  Frame : %d\n", banyakFrame);
	printf("\n");
	printf("> Status :\n");
	*/
	int idSharedMemory = alokasiSharedMemory(getpid(), banyakPage * sizeof(page_table_entry));
	if(idSharedMemory == -1){
		printf("Alokasi Shared Memory Gagal\n");
		printf("Program Berhenti.\n");
		return 0;
	}else{
		/*
		printf("  Alokasi berhasil!\n");
		printf("+----------------------+---------------+\n");
		printf("| Shared Memory Key    | %13d |\n", getpid());
		printf("+----------------------+---------------+\n");
		printf("| Shared Memory ID     | %13d |\n", idSharedMemory);
		printf("+----------------------+---------------+\n");
		printf("| Process ID (PID)     | %13d |\n", getpid());
		printf("+----------------------+---------------+\n");
		*/
	}

	/*
	printf("\n");
	printf("+->->->->->->->->->->-+\n");
	printf("$ PROSES BERLANGSUNG! $\n");
	printf("+-<-<-<-<-<-<-<-<-<-<-+\n");
	printf("\n");
	*/
	/*
		Pada bagian ini, Simulator OS (OS.c) bekerja dengan menunggu sinyal SIGUSR1 dari program MMU (MMU.c)
	*/

	// menangani interup ctrl-c dari keyboard
	signal(SIGINT, penangananCtrlC);

	//# 1, 2, 3, 4, 5, 6, 7, 8
	signal(SIGUSR1, penangananSIGUSR1);

	//# 9. Jika tidak ditemukan field Requested dengan nilai bukan nol, berhenti.
	while(statusOS != -1)
		pause();

	// OS Selesai
	printf("The MMU has finished\n");
	PrintPageTable(dataPage, banyakPage);
	printf("%d disk accesses required\n\n", aksesDisk);


	if(dealokasiSharedMemory(idSharedMemory) == -1){
		//printf("Dealokasi Shared Memory Gagal\n");
	}else{
		//printf("Dealokasi Shared Memory Berhasil\n");
	}

	//printf("OS Selesai\n");

	return 0;
}
コード例 #3
0
ファイル: OS.c プロジェクト: afp260695/mmu-simulations
int main() {

	int page; //atoi(argv[1]);
	int frame; //atoi(argv[2]);
	int SegmentID;
	//coba coba
	page_table_pointer PageTable;
	int OSPID = getpid();
	int SharedMemoryKey = OSPID;
	char arguments[255], charPID[10];
	pid_t pidFork;
	const char* command = "./MMU";

	//input page and frame
	printf("> OS ");
	scanf("%d %d", &page, &frame); getchar();

	printf("The shared memory key (PID) is %d\n", OSPID);
	
	//initialing page_table_entry
	SegmentID = shmget(SharedMemoryKey,page*sizeof(page_table_entry), IPC_CREAT | S_IRUSR | S_IWUSR);
	PageTable = (page_table_pointer)shmat(SegmentID,NULL,0);
	//printf("Segment = %d\n", SegmentID);
	printf("Initialized page table\n");
	for (int i=0; i<page; i++) {
	//page_table_entry page_table[page];
		PageTable[i].Valid = 0;
		PageTable[i].Frame = -1;
		PageTable[i].Dirty = 0;
		PageTable[i].Requested = 0;	
	}
	PrintPageTable(PageTable, page);
	

	///get argument
	printf("> MMU ");
  	fgets(arguments, sizeof(arguments), stdin);
  	size_t len = strlen(arguments);
  	if (arguments[len - 1] == '\n') {  // FAILS when len == 0
    	arguments[len -1] = '\0';
  	}

  	strcat(arguments, " ");
  	snprintf(charPID, sizeof(charPID), "%d", OSPID);
  	strcat(arguments, charPID);
  	puts(arguments);

  
  	if (pidFork = fork() < 0) {
  		puts("ERROR");
  		exit(EXIT_FAILURE);
  	} else if (pidFork == 0) {
  		printf("I'm children\n");
  		//execvp(command, arguments);
  		printf("Uh oh! If this prints, execvp() must have failed\n");
		//exit(EXIT_FAILURE);
  	} else {
  		puts ("This is a message from the parent");
	}

	return 0;
}