La aceasta adresa puteti vizualiza 44 de tutoriale video Silverlight, de la folosirea gridurilor pana la animatii, storyboards, folosirea socketilor, etc...
Enjoy,
preview Hello World
Mult mai multe clipuri AICI !!!
De asemenea, nici aceasta adresa nu este de neglijat.
29 aprilie 2011
Mini-problema labirintului
In memoria principala este definita o matrice ce descrie calea de la intrarea într-un labirint pana la o comoara. Drumul spre comoara este encodat în matrice ca un set de salturi de la niste coordonate la altele (un nod din drum contine ca informatie urmatorul nod la care trebuie sa se sara). Stim ca am ajuns la comoara cand trebuie sa sarim la nodul (0, 0). In programul din PPU se scrie drumul în labirint si trimite SPU-ului adresa catre începutul matricii. SPU-ul va trebui sa gaseasca coordonatele comorii si sa le scrie în prima celula a labirintului (0, 0). In PPU la sfarsit se va verifica daca in celula (0, 0) se gasesc coordonatele comorii.
Rezolvare: http://dl.dropbox.com/u/24465060/labXcell.zip
----
Un program care utilizeaza sofware caching trebuie sa includa fisierul header “cache-api.h” si poate contine la inceputul sau definitii pentru:
Rezolvare: http://dl.dropbox.com/u/24465060/labXcell.zip
----
| Instructiune | Descriere |
|---|---|
| cache_rd(name, eaddr) | Copiaza valoarea stocata la adresa eaddr in cache. Returneaza valoarea. |
| cache_wr(name, eaddr, val) | Scrie in cache valoarea val. |
| cache_touch(name, eaddr) | Aduce in cache valoarea stocata la adresa eaddr. Functia este non-blocanta. Functia intoarce adresa din spatiul de adrese al LS, unde va fi stocata valoarea la incheierea tranferului. |
| cache_wait(name, lsa) | Asteapta terminarea unui transfer non-blocant, care intoarce date la adresa lsa din spatiul LS-ului. |
| cache_rw(name, eaddr) | Copiaza in cache valoarea stocata la adresa eaddr, transmitand sistemului de cache faptul ca valoarea ar putea fi modificata. Functia este blocanta si va intoarce adresa din spatiul LS unde va fi stocata valoarea. Linia de cache este marcata dirty la scrierea datelor. |
| cache_lock(name, lsa) | Blocheaza datele de la adresa lsa din cache. |
| cache_unlock(name, lsa) | Deblocheaza date de la adresa lsa din cache. |
| cache_flush(name) | |
| cache_rd_x4(name, eaddr4) | Citeste un vector care contine 4 valori unsigned int. |
| e_pr_stats(name) | Afiseaza statistici despre cache. |
'CACHE_NAME' - un nume unic ce va identifica cache-ul.'CACHED_TYPE' - tipul elementelor stocate in cadrul cache-ului. Poate fi orice tip de date valid in limbajul C.'CACHELINE_LOG2SIZE' - log2 (dimensiunea unei linii de cache).'CACHE_LOG2NWAY' - specifica asociativitatea cache-ului. Exista 2 valori posibile: 0 si 2 (2 fiind valoarea implicita).'CACHE_LOG2NSETS' - log2 (numarul de seturi dintr-un cache). Valorile posibile sunt cuprinse intre 0 si 12. Valoarea implicita este 6 (26 = 64 seturi).'CACHE_TYPE' - tipul de acces la cache: read-only (0) sau read-write (1 - implicit)'CACHE_SET_TAGID(set)' - specifica tag-ID-ul unui anumit set. Valorile posibile sunt cuprinse intre 0 si 31. Implicit se defineste ca set mod 32.
14 aprilie 2011
Primul virus
Virusul a fost creat de niste pakistanezi in 1986 si s-a raspandit prin intermediul floppy disk -ului.
06 aprilie 2011
Exemplu de folosire memorie virtuala
Implementarea comenzii cp din Linux, folosind mmap :
int main (int argc, char *argv[])
{
int fdin, fdout, rc;
char *src, *dst;
struct stat statbuf;
DIE(argc != 3, "Usage: ./mycp ");
/* Open input and output files */
fdin = open (argv[1], O_RDONLY);
DIE(fdin == -1, "open fdin");
/* Open/create the output file */
fdout = open (argv[2], O_RDWR | O_CREAT | O_TRUNC, 0644);
DIE(fdout == -1, "open fdout");
/* truncate the output file to the input file size */
rc = fstat(fdin, &statbuf);
DIE(rc == -1, "fstat");
double size = (double)statbuf.st_size;
rc = ftruncate(fdout, size);
DIE(rc == -1, "ftruncate");
/* mmap the input and output file */
src = mmap (0, size, PROT_READ, MAP_SHARED, fdin, 0);
DIE( rc==-1, "mmap");
dst = mmap (0, size, PROT_WRITE, MAP_SHARED, fdout, 0); // la MAP_PRIVATE , rezultatul ramane doar in memorie
DIE( rc==-1, "mmap");
/* copy the input file to the output file */
memcpy(dst, src, size);
/* clean up */
rc = munmap(src, size);
DIE(rc == -1, "munmap");
rc = munmap(dst, size);
DIE(rc == -1, "munmap");
/* Close files */
rc = close(fdin);
DIE(rc == -1, "close source");
rc = close(fdout);
DIE(rc == -1, "close destination");
return 0;
}
int main (int argc, char *argv[])
{
int fdin, fdout, rc;
char *src, *dst;
struct stat statbuf;
DIE(argc != 3, "Usage: ./mycp
/* Open input and output files */
fdin = open (argv[1], O_RDONLY);
DIE(fdin == -1, "open fdin");
/* Open/create the output file */
fdout = open (argv[2], O_RDWR | O_CREAT | O_TRUNC, 0644);
DIE(fdout == -1, "open fdout");
/* truncate the output file to the input file size */
rc = fstat(fdin, &statbuf);
DIE(rc == -1, "fstat");
double size = (double)statbuf.st_size;
rc = ftruncate(fdout, size);
DIE(rc == -1, "ftruncate");
/* mmap the input and output file */
src = mmap (0, size, PROT_READ, MAP_SHARED, fdin, 0);
DIE( rc==-1, "mmap");
dst = mmap (0, size, PROT_WRITE, MAP_SHARED, fdout, 0); // la MAP_PRIVATE , rezultatul ramane doar in memorie
DIE( rc==-1, "mmap");
/* copy the input file to the output file */
memcpy(dst, src, size);
/* clean up */
rc = munmap(src, size);
DIE(rc == -1, "munmap");
rc = munmap(dst, size);
DIE(rc == -1, "munmap");
/* Close files */
rc = close(fdin);
DIE(rc == -1, "close source");
rc = close(fdout);
DIE(rc == -1, "close destination");
return 0;
}
30 martie 2011
Exemple cu semnale - Linux
1. Urmatorul program trateaza semnale intre 20 (SIGTSTP) si 25 (SIGXFSZ), afisand pentru fiecare cate un caracter. Intr-un alt terminal se va tasta pgrep hitme , apoi kill -x pid , unde x este semnalul dorit, iar pid id-ul procesului aflat cu pgrep.
#include "stdio.h"
#include "string.h"
#include "signal.h"
#include "unistd.h"
#include "utils.h"
int must_leave = 0;
static void sig_handler(int signum)
{
switch(signum) {
case SIGTSTP:
printf("H");
break;
case SIGTTIN:
printf("e");
break;
case SIGTTOU:
printf("l");
break;
case SIGURG:
printf("l");
break;
case SIGXCPU:
printf("o");
break;
case SIGXFSZ:
printf("\n");
must_leave = 1;
break;
default:
printf("Go back and send the following signals: 20, 21, 22, 23, 24");
must_leave = 1;
}
fflush(stdout);
}
int main(void)
{
struct sigaction signals;
sigset_t mask;
int rc;
sigemptyset(&mask);
memset(&signals, 0, sizeof(struct sigaction));
signals.sa_flags = 0;
signals.sa_mask = mask;
signals.sa_handler = sig_handler;
rc = sigaction(SIGTSTP, &signals, NULL);
DIE(rc == -1, "sigaction");
rc = sigaction(SIGTTIN, &signals, NULL);
DIE(rc == -1, "sigaction");
rc = sigaction(SIGTTOU, &signals, NULL);
DIE(rc == -1, "sigaction");
rc = sigaction(SIGURG, &signals, NULL);
DIE(rc == -1, "sigaction");
rc = sigaction(SIGXCPU, &signals, NULL);
DIE(rc == -1, "sigaction");
rc = sigaction(SIGXFSZ, &signals, NULL);
DIE(rc == -1, "sigaction");
while(!must_leave) sleep(1);
return 0;
}
2. Urmatorul program face busy waiting, afisand la consola numere consecutive. Intercepteaza semnale generate de CTRL+\, CTRL+C, SIGUSR1. Fiecare semnal are asociat handler-ul ask_handler, iar pentru fiecare semnal primit programul va intreba daca este cazul sa se termine sau nu.
#define MY_MAX 32
#define TIMEOUT 1
static void print_next(void)
{
static int n = 1;
printf("n = %d\n", n);
n = (n + 1) % MY_MAX;
}
/* signal handler */
static void ask_handler(int signo)
{
char buffer[128];
printf("Got %d - Stop program? [Y/n] ", signo);
fflush(stdout);
fgets(buffer, 128, stdin);
buffer[strlen(buffer)-1] = '\0';
if (buffer[0] == 'y' || buffer[0] == 'Y')
exit(EXIT_SUCCESS);
}
/* configure handlers */
static void set_signals(void)
{
struct sigaction sa;
int rc;
/* set handler in struct sigaction sa */
sigset_t mask;
sigemptyset(&mask);
memset(&sa, 0, sizeof(struct sigaction));
sa.sa_flags = 0; //
sa.sa_mask = mask;
sa.sa_handler = ask_handler;
/* handle SIGINT, SIGQUIT and SIGUSR1 signals */
sigaction(SIGINT, &sa, NULL);
sigaction(SIGQUIT, &sa, NULL);
sigaction(SIGUSR1, &sa, NULL);
}
int main(void)
{
set_signals();
while (1) {
print_next();
sleep(TIMEOUT);
}
return 0;
}
3. Urmatorul exemplu simuleaza comanda nohup. Programul primeste ca parametru numele comenzii de executat si parametrii comenzii respective, si nu trebuie sa se termine la inchiderea terminalului din care a fost pornit.
Pentru asta, trebuie sa ignore semnalul SIGHUP pe care i-l livreaza shell-ul. Daca outputul programului (stdout) era legat la terminal, acesta va fi redirectat catre un fisier.
/* configure handlers */
static void set_signals(void)
{
struct sigaction sa;
int rc;
memset(&sa, 0, sizeof(sa));
/* ignore SIGHUP */
sa.sa_handler = SIG_IGN;
sigaction(SIGHUP, &sa, NULL);
}
/* execute a new program */
static void exec_func(int argc, char **argv)
{
int rc;
set_signals(); /* ignore SIGHUP */
/* if stdout is a terminal redirect output to NOHUP_OUT_FILE */
if (isatty(STDOUT_FILENO)) {
int new_fd = open ("nohup_out_file", O_CREAT | O_WRONLY, 0644);
rc = dup2 (new_fd, STDOUT_FILENO);
if(rc<0) {
printf("error\n");
exit(0);
}
}
/* replace image of process */
rc = execvp(argv[1], argv+1);
if (rc<0) {
printf("error\n");
exit(0);
}
}
int main(int argc, char **argv)
{
if (argc <= 1) {
fprintf(stderr, "Usage: %s command_and_arguments\n", argv[0]);
exit(EXIT_FAILURE);
}
exec_func(argc, argv);
return 0;
}
4 . In exemplele de mai jos, fiecare proces va crea cate un proces-copil care doar apeleaza exit.
Primul exemplu este de proces zombie, deoarece dupa crearea copilului, parintele nu face wait pe el; deci, intrarea copilului va ramane in tabela de procese, el nemaiexistand practic pentru ca a dat exit.
#define TIMEOUT 20
int main(void)
{
pid_t pid;
int status;
/* create child process without waiting */
pid = fork ();
switch (pid) {
case -1:
exit(-1);
break;
case 0:
exit(0);
default:
sleep(TIMEOUT);
break;
}
return 0;
}
In urmatorul exemplu, parintele creeaza copilul si de asemenea nu ii da wait. Insa nu mai avem de-a face cu un copil zombie pentru ca parintele ignora semnalul de tip SIGCHLD. Pe scurt, daca parintele ignora SIGCHLD prin setarea handler-ului la SIG_IGN, toate informatiile de exit status ale copiilor nu vor fi luate in considerare, si nu se vor lasa procese zombie.
/* configure signal handler */
static void set_signals(void)
{
struct sigaction sa;
memset(&sa, 0, sizeof(sa));
/* ignore SIGCHLD */
sa.sa_handler = SIG_IGN;
sigaction(SIGCHLD, &sa, NULL);
}
int main(void)
{
pid_t pid;
set_signals();
/* create child process without waiting */
pid = fork();
switch (pid) {
case -1:
exit(-1);
break;
case 0:
exit(0);
default:
sleep(TIMEOUT);
break;
}
// fara wait
return 0;
}
Abonați-vă la:
Postări (Atom)