test.dat ??

mherrmann
Mausschubser
Mausschubser
Beiträge: 49
Registriert: 12. Nov 2005 10:10

test.dat ??

Beitrag von mherrmann »

Hallo zusammen!

Wenn ich das richtig verstanden habe, dann ist die Datei "test.dat" dazu da den zu implementierenden Cache zu testen. Man läd die Datei und macht dann die komplexen Dateioperationen.

Code: Alles auswählen

	char ch = 0;


	if (!file_open("test.dat")) {

		printf("Datei konnte nicht geoeffnet werden!\n");

		return 1;

	}


	for (i=0;i<1035;i++) {
		file_read_byte(&ch, i);
		printf("%c", ch);	
	}

Das sollte ja die ersten 1035 Byte der Datei ausgeben, oder? Bei mir werden aber nur die ersten 1024 Byte ausgegeben. Das sind genau alle Zahlen am Anfang der Datei "test.dat", danach fangen ja die Buchstaben an ...0123ZRPHJLB.... Die werden aber nicht ausgegeben.

Wenn ich nun eine neue Datei "test2.dat" mit 1035 Byte anlege mit 1024 Byte Zahlen (wie in "test.dat") und danach Buchstaben, dann wird alles ohne Probleme ausgegeben.

Ich hoffe mein Problem ist klar geworden.

Außerdem müsste im gegeben Codegerüst in der Funktion main

Code: Alles auswählen

	if (i * 2 < FILE_SIZE - FILE_XOR_BLOCK) {

		cache_hits += cache_read_byte(&a, i + FILE_XOR_BLOCK);

		cache_hits += cache_read_byte(&c, i % FILE_XOR_BLOCK);

		a ^= c;

		cache_hits += cache_write_byte(&a, i + FILE_XOR_BLOCK);

	}
nicht noch ein bytes_read_written += 3; gehören.

Grüße

Christoph-D
Computerversteher
Computerversteher
Beiträge: 325
Registriert: 11. Dez 2005 13:14
Wohnort: Darmstadt

Beitrag von Christoph-D »

Bei solchen Problemen ist es gut, anstelle von Bruchstücken ein vollständiges, lauffähiges Beispiel zu posten. Dieser Code funktioniert bei einwandfrei und gibt alle Zahlen und die ersten paar Buchstaben von test.dat aus:

Code: Alles auswählen

#include <stdio.h>

FILE* file_pointer;

int file_open(char *filename) {
	return (file_pointer = fopen(filename,"rb+")) != NULL;
}
int file_close() {
	return fclose(file_pointer) == 0;
}

int file_read_byte(char* buf, int n) {
	fseek(file_pointer, n, SEEK_SET);
	return fread(buf, 1, 1, file_pointer) == 1;
}

int main() {
	char ch;
	int  i;

	if (!file_open("test.dat")) {
		printf("Datei konnte nicht geoeffnet werden!\n");
		return 1;
	}
	
	for (i = 0; i < 1035; ++i) {
		file_read_byte(&ch, i);
		printf("%c", ch);
	}
	return 0;
}

Zum Cache allgemein:

Entweder sitze ich gerade einem Missverständnis auf oder die vorgegebene Cache-Größe ist ein wenig zu groß.

1024 Cache-Blöcke zu je 1024 Bytes macht schonmal 1MB Cache-Größe. 2-fach-mengenassoziativ macht daraus insgesamt 2MB an Cache. Die gegebene Datei von 2 MB passt da nun aber genau rein, und sogar völlig unabhängig von der Ersetzungsstrategie. Denn die kommt nie zur Geltung, weil die untersten 20 Bits einer Byte-Position in der Datei den Cache-Platz eineindeutig bestimmen. Das oberste Bit bewirkt, dass zwei verschiedene Bytes auf denselben Cache-Platz abgebildet werden, aber die 2-fach-Mengenassoziativität erlaubt gerade zwei Cache-Einträge nebeneinander pro Adresse.

Also müsste man sowohl mit FIFO als auch mit LRU exakt 2048 Cache-Misses haben (genau so viele, bis die Datei komplett im Cache liegt). Oder ich hab irgendeinen Punkt beim Cache-Management falsch verstanden.
"I believe in the fundamental interconnectedness of all things." (Dirk Gently)

Johannes Dorn
Mausschubser
Mausschubser
Beiträge: 43
Registriert: 8. Nov 2005 19:38
Kontaktdaten:

Beitrag von Johannes Dorn »

Soll die test.dat eigentlich irgendetwas darstellen?
Beim runterladen interpretieren unsere Browser das als mpeg Datei. Aber darstellen lässt sich weder vor, noch nach der Dateioperation etwas.

Christoph-D
Computerversteher
Computerversteher
Beiträge: 325
Registriert: 11. Dez 2005 13:14
Wohnort: Darmstadt

Beitrag von Christoph-D »

Johannes Dorn hat geschrieben:Beim runterladen interpretieren unsere Browser das als mpeg Datei. Aber darstellen lässt sich weder vor, noch nach der Dateioperation etwas.
Mach doch mal "cat test.dat", dann siehst du, was drinsteht. Was die Datei enthält wurde außerdem im ersten Posting schon gesagt. :)
"I believe in the fundamental interconnectedness of all things." (Dirk Gently)

Benutzeravatar
Báka
Windoof-User
Windoof-User
Beiträge: 30
Registriert: 16. Feb 2006 15:47
Wohnort: Odenwald || DA

Beitrag von Báka »

Außerdem müsste im gegeben Codegerüst in der Funktion main.....nicht noch ein bytes_read_written += 3; gehören.
das ist mir allerding auch schon aufgefallen,
ich denke mal schon, dass es dahin gehoert......
[align=center]
Bild
Bild
[/align]

Johannes Dorn
Mausschubser
Mausschubser
Beiträge: 43
Registriert: 8. Nov 2005 19:38
Kontaktdaten:

Beitrag von Johannes Dorn »

Christoph-D hat geschrieben:
Johannes Dorn hat geschrieben:Beim runterladen interpretieren unsere Browser das als mpeg Datei. Aber darstellen lässt sich weder vor, noch nach der Dateioperation etwas.
Mach doch mal "cat test.dat", dann siehst du, was drinsteht. Was die Datei enthält wurde außerdem im ersten Posting schon gesagt. :)
Wie die Datei als Text aussieht war mir klar. Ich wollte wissen, ob nach der Umformung vielleicht irgendne sinnvolle Datei daraus wird. Zum Beispiel ein Bild oder ein Video.

Christoph-D
Computerversteher
Computerversteher
Beiträge: 325
Registriert: 11. Dez 2005 13:14
Wohnort: Darmstadt

Beitrag von Christoph-D »

Johannes Dorn hat geschrieben:Wie die Datei als Text aussieht war mir klar. Ich wollte wissen, ob nach der Umformung vielleicht irgendne sinnvolle Datei daraus wird. Zum Beispiel ein Bild oder ein Video.
Videodaten haben normalerweise eine sehr hohe Entropie. Die vorliegende Datei hat aber eine extrem geringe Entropie. Also ist es für alle praktischen Fälle ausgeschlossen, dass da etwas interpretierbares herauskommt.
"I believe in the fundamental interconnectedness of all things." (Dirk Gently)

Randy
Windoof-User
Windoof-User
Beiträge: 32
Registriert: 21. Okt 2005 15:27

Beitrag von Randy »

Christoph-D hat geschrieben:Also müsste man sowohl mit FIFO als auch mit LRU exakt 2048 Cache-Misses haben (genau so viele, bis die Datei komplett im Cache liegt). Oder ich hab irgendeinen Punkt beim Cache-Management falsch verstanden.
Ja, 2048 Cache-Misses kommen raus bei meiner Implementierung. Damit ist es doch auch schon optimal, denn 2048 Misses * 2^10 Bytes/Block = 2097152 Bytes und das ist genau die Dateigroesse. Wozu dann Aufgabe 3? :/

mherrmann
Mausschubser
Mausschubser
Beiträge: 49
Registriert: 12. Nov 2005 10:10

Beitrag von mherrmann »

Also, wenn ich das Cache Management richtig verstanden habe, dann wird das erste Byte gelesen. Am Anfang ist der Cache natürlich leer, deshalb gibt es ein miss und die Daten werden von der Platte gelesen. Nun wird aber nicht nur das zu lesende Byte übertragen sondern gleich 1024 Byte (eben bis der Cache Block voll ist).
Das nächste zu lesende Byte befindet sich dann schon im Cache und verursacht ein hit.

Das heißt erst einmal auf ein miss folgen 1023 hits.

Das erklärt auch erst einmal warum ihr 2048 Cache-Misses habt. Wozu dann die 3? Keine Ahnung! Vielleicht weil wir ja mit den Assoziatäten experimentieren sollen. Wenn man die auf 1 stellt, dann kommt die Verdrängungsstrategie ja doch zum Einsatz. Oder?

Randy
Windoof-User
Windoof-User
Beiträge: 32
Registriert: 21. Okt 2005 15:27

Beitrag von Randy »

mherrmann hat geschrieben:Das erklärt auch erst einmal warum ihr 2048 Cache-Misses habt. Wozu dann die 3? Keine Ahnung! Vielleicht weil wir ja mit den Assoziatäten experimentieren sollen. Wenn man die auf 1 stellt, dann kommt die Verdrängungsstrategie ja doch zum Einsatz. Oder?
Dann schon, aber dann halbiert sich auch die Groesse des Caches, es sei denn man erhoeht gleichzeitig die CACHE_BITS um 1 um die Sets im Gegenzug zu verdoppeln, dann hat er die urspruengliche Groesse, ist direkt abbildend und man bekommt immer noch 2048 Misses.

Antworten

Zurück zu „Archiv“