1 Востаннє редагувалося Rolana (12.04.2014 16:35:15)

Тема: Канали (Операційні системи)

Терміново потрібно написати мовою С дві задачки до 17.04. Я увлення не маю, як це робити.

1) Написати програму "Пінг-Понг". Дано 2 потоки. Перший генерує випадковим чином число від 0 до 10, надсилає це число другому потоку. Другий поток додає двійку до даного числа і повертає першому потоку. Перший додає трійку і повертає другому потоку. Процеси завершують роботу, якщо число більше 100. Розв'язати з використанням каналу.

2) Дано цілочисельний файл FILE_TO_SORT.DAT розміром 5 GB. Відсортувати файл. Запропонувати оптимальний розв’язок для 2-х ядерного ПК з Windows 7 (32 bit).

Буд дуже вдячна за допомогу!

2 Востаннє редагувалося 0xDADA11C7 (12.04.2014 16:47:39)

Re: Канали (Операційні системи)

Шановна Rolana, якщо ви хочете щоб вам підказали, це одне, а якщо зробили - пишіть в розділ "пропоную роботу". Я вам можу лише запропонувати покроково вирішити це питання.
По першому завданню - погляньте на WinAPI функції CreateThread, яка створює потоки в межах одного процесу і CreatePipe, яка створює неназвані(анонімні) канали
По другому завданню - Шукайте багатопотоковий алгоритм сортування.

3

Re: Канали (Операційні системи)

Якщо ви протягом 24 годин не покажете що самі зробили , або не скажете ціну, тема буде перенесена в кошик для сміття.
P.S. я сьогодні добрий тому, щодо 2: Алгоритм швидкого сортування легко "рознести" по потоках.

4 Востаннє редагувалося Rolana (13.04.2014 14:28:05)

Re: Канали (Операційні системи)

#include "stdafx.h"
#include "process.h"
#include "windows.h"

FILE *f,*f1,*f2,*f3,*f4,*f5;
int filesize;

int bubbles(int* mas, int count)
{
    int temp;
    for (int k=0; k<count; k++)
        for (int q=0; q<count-1; q++)
            if (mas[q]>mas[q+1]) {temp=mas[q]; mas[q]=mas[q+1]; mas[q+1]=temp;}
    return 0;
}

unsigned int WINAPI Thread1 (void *num)
{
    int filesize1=50/5;
    int mas1[2000];
    int i=0;
    while (filesize1>0)
    {    
        fscanf_s(f,"%d ", &mas1[i]);
        filesize1-=sizeof(mas1[i]);
        i++;
    }
    bubbles(mas1, i);
        fopen_s(&f1,"temp1.dat","wt");
        for(int k=0; k<i; k++)
            fprintf(f1,"%d ",mas1[k]);
    return 0;
}
unsigned int WINAPI Thread2 (void *num)
{

    return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
    HANDLE hThreads[5];  
    unsigned int IDThread0, IDThread1, IDThread2, IDThread3, IDThread4;

    hThreads[0] = (HANDLE) _beginthreadex(NULL, 0, Thread1, (void*)2, 0, &IDThread0);
 //   hThreads[1] = (HANDLE) _beginthreadex(NULL, 0, Thread2, (void*)3, 0, &IDThread1);
    //hThreads[2] = (HANDLE) _beginthreadex(NULL, 0, Thread3, (void*)4, 0, &IDThread2);
    //hThreads[3] = (HANDLE) _beginthreadex(NULL, 0, Thread4, (void*)5, 0, &IDThread3);
    //hThreads[4] = (HANDLE) _beginthreadex(NULL, 0, Thread5, (void*)6, 0, &IDThread4);
    fopen_s(&f,"FILE_TO_SORT.DAT", "rt");
    fseek(f,0,SEEK_END);
    filesize=ftell(f);
    printf("\n%d\n",filesize);
    fseek(f,0,SEEK_SET);
    WaitForSingleObject(hThreads[0],INFINITE);
    //WaitForMultipleObjects(2, hThreads, TRUE, INFINITE);
    CloseHandle(hThreads);
    return 0;
}

Поки що роблю бульбашкою і з одним потоком, щоб хоч трохи розібратися.
Вискакує глюк у

fscanf_s(f,"%d ", &mas1[i]);

5

Re: Канали (Операційні системи)

Поради:
1. Раджу зразу сортувати швидким алгоритмом.
2. Краще не робити 5 потоків. Краще зробіть стільки потоків скільки ядер, а в випадку якщо проц підтримує Hyper-Threading то в 2 рази більше ніж ядер.

Моя пропозиція щодо алгоритму така:
1. Визначення опорного елементу;
2. Пересортовування масиву на більші і менші елементи (відносно опорного);
3. Ліву половину масиву віддати 1 потоку, праву частину 2 потоку;
4. Далі кожен потік або закінчує сортування сам (якщо досягнута максимальна кількість потоків), або виконує п2, 3.

6

Re: Канали (Операційні системи)

Натякаю: у вас не вийде 5GB в пам'ять завантажити. Ще натякаю: файл .DAT, швидше за все, не текстовий.

7

Re: Канали (Операційні системи)

koala написав:

Натякаю: у вас не вийде 5GB в пам'ять завантажити. Ще натякаю: файл .DAT, швидше за все, не текстовий.

+
Але якщо змінити ОС на 64-бітну і поставити достатньо памяті то вийде :)

8

Re: Канали (Операційні системи)

drWoZD написав:
koala написав:

Натякаю: у вас не вийде 5GB в пам'ять завантажити. Ще натякаю: файл .DAT, швидше за все, не текстовий.

+
Але якщо змінити ОС на 64-бітну і поставити достатньо памяті то вийде :)

А якщо замінити умову на Hello World, то й потоки не знадобляться. Але в умові сказано про систему, так що не вийде.

9

Re: Канали (Операційні системи)

Та хто ті умови дивиться :)