//----------------------------------------------------------------------------- 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); }
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; }
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; }