Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Задача по системным вызовам 
V
    Опции темы
Flashdown
Дата 1.6.2006, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 27.5.2006
Где: Москва

Репутация: нет
Всего: нет



Рассмотрим очень простую операционную систему, состоящую из главного процесса М, работающего с центральным процессором, читающего процесса R, который работает с читающим каналом, и печатающего процесса Р, который работает с печатающим каналом. Запрограммируйте эти три процесса так, чтобы процесс R читал данные и передавал их процессу М, который обрабатывал бы эти данные и передавал процессу Р для выдачи на печать. Запрограммируйте процессы М, R и Р для случаев, когда имеются (a) два буферных пула, содержащие по К буферов;(b) один буферный пул, содержащий К. буферов.

Подскажите, как это сделать! 
PM MAIL ICQ   Вверх
bsa
Дата 1.6.2006, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 16
Всего: 196



Причем здесь юникс?
Что за буферные пулы и между какими процессами они находятся? Я, например, эту часть вообще не понял.
Это многопоточная программа или как? 
PM   Вверх
GrayCardinal
Дата 3.6.2006, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 8
Всего: 58



Flashdown, 
Можно через сокеты, можно через IPC, можно тупо через файловую систему, да мало ли.

$ man 2 ipc 


--------------------
PM MAIL WWW   Вверх
Flashdown
Дата 4.6.2006, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 27.5.2006
Где: Москва

Репутация: нет
Всего: нет



вот надо через IPC 
PM MAIL ICQ   Вверх
GrayCardinal
Дата 5.6.2006, 05:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 8
Всего: 58



Flashdown, 
Через IPC ?Да не вопрос. smile 
Код самих процессов -то есть ? R и P ? Это тупая работа, так что увольте smile 
Еще пулы будешь сам делать, как один буфер сварганить покажу, дальше по аналогии... Будут проблемы - обращайся.

Есть такая фиговина, называется семафоры (mutex). Код (из новой dlib-ы, которую я на днях выложу... наверно. http://sf.net/projects/silenbob)

Код

/*
 * (c) Oleg Puchinin 2006
 * [email protected]
 *
 */

/* 2006-05-26 */
R
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <errno.h>
#include "dlib.h"

inline int __semset (struct sembuf * action, int num, int op) 
{
    action->sem_flg = SEM_UNDO;
    action->sem_num = num;
    action->sem_op = op;
}

enum {
    hold_read = 0,
    hold_write = 1,
};

inline void __sem_zero (int sem, int num = 0)
{
    semctl (sem, num, SETVAL, 0);
}

int __sem_try_key (int *KEY, int count = 1) 
{
    int key = 9900;
    int id;

    while (key < 10000) {
        id = semget (key, count, (0600|IPC_CREAT|IPC_EXCL)); 
        if (id < 0) {
            key++;
            continue;
        }
        
        if (KEY)
            *KEY = key;

        return id;
    }

    return -1;
}

int __sem_init_one (int key, int count = 1)
{
    int id;
    id = semget (key, 1, (0600|IPC_CREAT|IPC_EXCL));
    if (id > 0) 
        __sem_zero (id);
    return id;        
}

int sem_init (int * KEY) 
{
    int key = 9900;
    int id;

    /*
     * Try *KEY or any random key if *KEY is 0
     */

    if (KEY && *KEY) 
        id = __sem_init_one (*KEY);
    else
        id = __sem_try_key (&key);
    
    if (id < 0)
        return id;

    __sem_zero (id);
    if (KEY)
        *KEY = key;
    return id;    
}

int down (int sem)
{
    struct sembuf actions[2];

    __semset (&actions[0], 0, 0);
    __semset (&actions[1], 0, +1);
    semop (sem, actions, 2);

    return errno;    
}

int up (int sem)
{
    struct sembuf actions[1];
    __semset (&actions[0], 0, -1);
    return semop (sem, actions, 1);
}

int sem_init_rw (int * KEY)
{
    int id;
    int key;

    if (KEY && *KEY)  
        id = __sem_init_one (*KEY, 2);
    else 
        id = __sem_try_key (KEY, 2);

    if (id < 0)
        return id;

    __sem_zero (id, hold_read);
    __sem_zero (id, hold_write);
}

int down_read (int sem)
{
    struct sembuf actions[2];

    __semset (&actions[0], hold_write, 0);
    __semset (&actions[1], hold_read, +1);

    return semop (sem, actions, 2);

}

int up_read (int sem) 
{
    struct sembuf actions[1];
    __semset (&actions[0], hold_read, -1);
    return semop (sem, actions, 1);
}

int down_write (int sem)
{
    struct sembuf actions[3];
    
    __semset (&actions[0], hold_read, 0);
    __semset (&actions[1], hold_write, 0);
    __semset (&actions[2], hold_write, +1);

    semop (sem, actions, 3);

    return errno;
}

int up_write (int sem)
{
    struct sembuf actions[2];
    __semset (&actions[0], hold_write, -1);
    return semop (sem, actions, 1);
}


Вот этим можно решать траблы с блокировкой. Сервак делает sem_init c "ключом" KEY (вообще туда адрес передается на int переменную в которой будет ключ). Клиентура - semget (KEY...)
$ man 2 semget
Если надо пользовать ID, который дал semget(2) (не sem_init), просто результат в переменную загоняешь (int) и можно все преведенные функции пользовать. Т.е. 
1. Клиент делает down_write, пишет данные, делает up_write когда закончит.
2. Сервер делает down_read, читает данные, делает up_read когда закончит.
Можно заменить на "простые" down/up, суть не меняется.
И все работает без косяков. (в "догонялки" никто не играет). Скорее всего понадобится один для каждого буфера, но это не проблема - там их 
 9999 свободных если не ошибаюсь, и никто не пользует... В общем код глянь и RTFM. Там основная идея - что все операции (sigactions) - атомарные. Вообще по IPC неплохо справочник иметь под ручками...

Вторая проблема - сам буфер(ы) (для процесса M)
Тут вообще просто
#include <ipc.h>
int size = 4096;
char * ptr;
ptr = (char *) shmget (KEY, size, IPC_CREAT);
На серваке (M), без IPC_CREAT на клиентуре ®. Еще на сервере можно настроечки выставить $ man 2 shmctl
Ключи выбирай "от фанаря", главное чтоб во всех процессах совпадали.

На счет того, чтоб сообщить процессу M что данные типа есть, лично я бы для данного случая тупо включил таймер 
$ man 2 alarm
$ man 2 signal
И не парился. Но можно попробовать через
$ man 2 msgget
Чтоб мессаги кидать. Сам не пользовался, рассказать не могу... Но вроде ничего сложного.








 


--------------------
PM MAIL WWW   Вверх
GrayCardinal
Дата 5.6.2006, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 8
Всего: 58



Все, отбил желание задачку решать ?
smile 


--------------------
PM MAIL WWW   Вверх
bilbobagginz
Дата 6.6.2006, 00:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: 4
Всего: 317



мне кажется ему задание неполное дали: для решения требуется знать какие средства есть в этой 'очь просто оперативной системе', под которую у него задание.
также обычно в домашках ограничивают: это можно а это низзя.

он наверное за второй и третьей страничкой домашки поехал... 


--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
GrayCardinal
Дата 6.6.2006, 03:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 8
Всего: 58



bilbobagginz, 
Цитата

он наверное за второй и третьей страничкой домашки поехал...  

Бывает smile 


--------------------
PM MAIL WWW   Вверх
Flashdown
Дата 6.6.2006, 19:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 27.5.2006
Где: Москва

Репутация: нет
Всего: нет



а помоему условие нормальное... 
использовать можно семафоры, сигналы, разд. память, и очереди сообщ.....
ну вобщем я это уже сделал..
graycardinal , спасибо 
PM MAIL ICQ   Вверх
regis
Дата 24.7.2006, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 232
Регистрация: 12.12.2005
Где: Москва, Россия

Репутация: нет
Всего: 7



Судя по формулировке задачи ("...состоящую из главного процесса М, работающего с центральным процессором..."), ОС вообще имеет микроядерную архитектуру.   smile 

 
--------------------
В. В чем разница между hardware и software?О. В отличие от второго, по первому можно двинуть кулаком или пнуть ногой.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0553 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.