3178

Программа реализующая параллельную работу процессов

Курсовая

Информатика, кибернетика и программирование

Задание. Необходимо написать программу, реализующую параллельную работу нескольких процессов. Каждый процесс может состоять из одного или нескольких потоков. Любой из потоков, работающих в составе этих процессов, может быть приостановлен и вновь зап...

Русский

2012-10-26

178 KB

15 чел.

Задание.

Необходимо написать программу, реализующую параллельную работу нескольких процессов. Каждый процесс может состоять из одного или нескольких потоков. Любой из потоков, работающих в составе этих процессов, может быть приостановлен и вновь запущен некоторой определенной клавишей (можно использовать буквенные или цифровые клавиши). Нажатия клавиш обрабатывать с помощью прерывания от клавиатуры (по материалам лаб. работы №1).

Окончание работы программы должно происходить при приостановке всех потоков их ключевыми клавишами либо при нажатии клавиши ESC. При окончании работы необходимо выполнить корректное завершение, т.е. “дочитать” всю информацию из буфера каждого процесса (при его наличии), закрыть все открытые файлы и т.п. – по материалам лаб. работы №4.

Те потоки, которые выводят информацию на экран, должны использовать для этого каждый свое отдельное окно, обрамленное рамкой – экран визуально делится на несколько окон, в каждом из которых отображается один процесс.

Дополнительное информационное окно должно содержать описание управляющих клавиш и краткое сообщение о тех действиях, которые выполняются в программе: номер потока, его статус в текущий момент времени (активен, приостановлен, ожидает), другую информацию (указание величины выделенного потоку кванта времени, процент заполненности буфера и т.п.) в зависимости от конкретного потока.

Программа должна работать устойчиво, без “зависаний” и непредвиденных зрительных эффектов. В случае необходимости указания параметров при запуске программы необходимо предусмотреть и обработать все возможные ошибки (с выводом диагностики на экран).

Задача 3 предполагает наличие управляющего блока, который, используя прерывания таймера, случайным образом определяет очередной активный поток и выделяет ему кванты времени (возможно, в рамках большего кванта, выделенного всему процессу). Кванты времени – как для процесса в целом, так и для его потоков – изначально задавать некоторой фиксированной величины, но предусмотреть возможность её изменения во время работы путем нажатия некоторых ключевых клавиш (для каждого из потоков предусмотреть свою клавишу) – т.е. можно, например, увеличить или уменьшить квант только потока-пpоизводителя. При этом допустимы разные варианты реализации – “общий” квант может либо меняться, либо оставаться постоянным (тогда при ускорении одного потока другой автоматически замедлится, т.к. величина его кванта уменьшится).

Потоки этого класса задач могут иметь три статуса: “активен”, “ожидает” или “приостановлен”. В процессе работы может возникнуть, например, следующая ситуация. Поток-потребитель приостановлен своей ключевой клавишей, следовательно, буфер не освобождается. Поток-производитель активен, он заполнит буфер информацией и перейдёт в состояние ожидания. Из этого состояния он сможет выйти только после того, как будет возобновлена (нажатием клавиши) работа потока-потребителя, который освободит место в буфере для помещения новой информации. В случае приостановки производителя возникнет аналогичная ситуация, только с пустым буфером. Приостановка/возобновление потока возможны в любом его состоянии – как в активном, так и в состоянии ожидания.

Задачи 2, 4, 7 должны выполняться равномерно, независимо от степени загрузки системы. Для этого каждой из них необходимо получать управление через фиксированное количество “тиков” системного таймера, во время которого они выполнят какое-то свое элементарное действие (“бегущая строка” или “летающий объект” сместится на одну позицию, сменится нота в музыке…). При такой реализации скорость каждого потока будет определяться количеством “тиков” таймера между его запусками. Для уменьшения скорости такого потока достаточно после нажатия ключевой клавиши предоставлять ему управление реже, через большее число “тиков”, соответственно для ускорения такого потока – опять же после нажатия ключевой клавиши – ему предоставляется управление чаще, в пределе – на каждом “тике”. Так, “бегущая строка” должна двигаться равномерно с постоянной скоростью (если она не приостановлена ключевой клавишей) независимо от количества активных процессов в системе, музыка – тоже играть равномерно… Потоки этого класса задач могут иметь два статуса: “активен” и “приостановлен”.

 

ЗАДАЧИ:

2. Музыкальное сопровождение – как минимум несколько нот различной длительности, образующие мелодию. Во включённом состоянии мелодия должна играть в фоновом режиме (по материалам лаб. работы №2).

3. Два потока: один выполняет поиск всех последовательных простых чисел и заносит их в буфер, второй осуществляет их вывод из буфера на экран (по материалам лаб. работы №4).

4. Вывод заголовка работы (фамилия и имя автора и название работы) постоянно меняющегося цвета. Место вывода (верхняя или нижняя строка экрана) задавать в качестве параметра командной строки.

7. Движущийся объект (в простейшем случае, например, летающий и отражающийся от границ окна шарик). Движение может осуществляться свободно или при управлении с клавиатуры (по материалам лаб. работы №5).


Параметры командной строки.

Согласно условию программа имеет один параметр командной строки – положение заголовка. Для размещения заголовка в верхней строке экрана, следует указывать в качестве параметра «a», в нижней – «b» (без кавычек). Также можно запускать программу без параметров, тогда заголовок будет отображаться в верхней строке экрана.

Описание основных алгоритмов, используемых в программе.

Поток-производитель производит поиск простых чисел и заносит их в LIFO-буфер. Проверку на простоту числа осуществляет функция Is_Prime. Последнее полученное простое число хранится в переменной Current_Prime_Number. Следующее число получается из числа, записанного в Current_Prime_Number прибавлением единицы до тех пор, пока функция Is_Prime не вернёт значение True. Поток продолжает свою работу до тех пор, пока не истечёт выделенное ему программой время, а также добавленное пользователем с помощью ключевых клавиш время. После каждого добавления числа в буфер вызывается процедура Refresh, которая обновляет на экране показание заполненности буфера.

Поток-потребитель извлекает число из вершины LIFO-буфера и выводит его на экран в соответствующее окно. После каждого извлечения числа из буфера происходит вызов процедуры Refresh.

Обновление состояний буфера производит процедура Update_State, которая принимает в два аргумента – St – состояние потока, N – номер потока (для того, чтобы знать, в какой строке писать).

Движение квадрата реализовано с помощью процедуры Go. Используется прямой доступ к видеопамяти. Квадрат занимает четыре «клетки». Вначале программа запоминает в массивы tmp_symbol и tmp_attr текущее состояние видеостраницы. Потом в этом месте программа рисует квадрат. При следующем движении квадрата прежнее состояние экрана восстанавливается по массивам tmp_symbol и tmp_attr. Скорость движения квадрата изменяется с помощью соответствующих ключевых клавиш.

Музыка играет в фоновом режиме. Новая нота и её длительность выбираются с помощью генератора случайных чисел.

Процедура Print производит вывод строки в указанное место экрана с указанным цветом. Используется прямой доступ к видеопамяти.

Описание основных переменных, констант и типов.

В программе описано два типа:

State – перечислимый тип, используется для обозначения состояния процессов.

Video – массив, используемый для прямого доступа к видеопамяти.

В программе описано две константы:

LIFO_Size – размер буфера.

The_Title – заголовок работы.

В программе описаны следующие глобальные переменные:

LIFO – собственно LIFO-буфер.

Top – вершина буфера.

SaveInt8, _SaveInt8, SaveInt9 – переменные типа Procedure, используемые при обработке прерываний.

Producer_State, Consumer_State, Music_State, Title_State, Square_State – состояния потоков.

Assigned_Time – время, которое выделяется потоку-производителю и потоку-потребителю.

Time, M_Time, T_Time, C_Ctime, S_Time – время для соответствующих процессов, считаемое обработчиком прерываний таймера.

Music_Refresh_Time, Title_Refresh_Time – частоты смены нот музыки и изменения цвета заголовка.

CX, CY, TX, TY, SX, SY – координаты свободного места на экране при печати простых чисел, координаты заголовка, координаты летающего квадрата.

dx, dy – изменение положения летающего квадрата.

S_Speed – скорость движения квадрата.

ScrM – прямой доступ к видеопамяти.

_Close – флаг завершения работы программы.

Producer_Extra_Time, Consumer_Extra_Time – дополнительное время для потоков.

Proc_Delay – Задержка, для просмотра работы процесса «Производитель-Потребитель» в замедленном режиме.

Current_Prime_Number – текущее найденное простое число.

tmp_symbol – символы, которые в данный момент закрыл летающий квадрат.

tmp_attr – цвета закрытых символов.

Описание основных процедур и функций.

Int_Proc, Producer_Consumer_Int_Proc – процедуры обработки прерываний таймера для соответствующих процессов.

Int_Proc_Keyboard – процедура обработки прерываний клавиатуры.

Initialize – процедура, инициализирующая переменные перед запуском основных процедур.

Producer, Consumer – процедуры, реализующие потоки производителя и потребителя.

Refresh – процедура для обновления уровня заполненности буфера на экране.

Update_State – процедура для обновления состояния процесса на экране.

Go – процедура, сдвигающая «летающий квадрат».

Close – процедура для корректного завершения работы программы.

Скриншоты в различных ситуациях.

Неверное задание параметров командной строки.

Отсутствие параметров командной строки.

«Нормальный» запуск программы.


Исходный код программы.

program work;

{$M $1000, 0, 0}

uses

 Crt, Dos;

type

 State = (Active, Waits, Stopped);     { Состояние потока }

 Video = Array[1..25, 1..80] of Record { Прямой доступ к видеопамяти }

   Symbol: Char;

   Attr: Byte;

 end;

const

 LIFO_Size = 100; { Размер буфера }

 The_Title: String[50] = 'Курсовая работа';  { Заголовок работы }

var

 LIFO: Array[1..LIFO_Size] of Longint; { LIFO-Буфер }

 Top: Integer; { Вершина буфера }

 SaveInt8, _SaveInt8, SaveInt9: Procedure; { Для обработки прерываний }

 Producer_State, Consumer_State, Music_State, Title_State, Square_State: State; { Состояния потоков }

 Assigned_Time, Time, M_Time, T_Time, C_Ctime, S_Time: Word; {Отсчет времени таймера}

 Music_Refresh_Time, Title_Refresh_Time: Word;   { Частоты смены нот музыки и изменения цвета заголовка }

 CX, CY, TX, TY, SX, SY: Byte;    { Координаты свободного места на экране при печати простых чисел, координаты заголовка, координаты летающего квадрата }

 dx, dy: Integer;  { Изменение положения летающего квадрата }

 S_Speed: Byte;    { Скорость движения квадрата }

 ScrM: Video Absolute $B800:$0000;

 _Close: Boolean;     { Флаг завершения работы программы }

 Producer_Extra_Time, Consumer_Extra_Time: Integer; { Дополнительное время для потоков }

 Proc_Delay: Integer; { Задержка, для просмотра в замедленном режиме }

 Current_Prime_Number: Longint; { Текущее найденное простое число }

 tmp_symbol: Array[0..1, 0..1] of Char; { Символы, которые в данный момент закрыл летающий квадрат }

 tmp_attr: Array[0..1, 0..1] of Byte;   { Цвета закрытых символов }

{ Вывод строки Str на экран начиная с положения заданного

 координатами (X; Y) и цветом Color. Использует прямой доступ к видеопамяти  }

procedure Print(const Str: String; const X, Y: Integer; const Color: Integer);

var

 CurPos: Integer;

 ScrM: Video Absolute $B800:$0000;

begin

 CurPos := X;

 while (CurPos <= 80) and (CurPos - X + 1 <= Length(Str)) do

 begin

   ScrM[Y, CurPos].Attr := Color;

   ScrM[Y, CurPos].Symbol := Str[CurPos - X + 1];

   Inc(CurPos);

 end;

end;

{ Процедура обработки прерываний для процесса "Производитель-Потребитель" }

{$F+}

procedure Producer_Consumer_Int_Proc;

Interrupt;

begin

 Inc(Time);

 Inline($9C);

 _SaveInt8;

end;

{$F-}

{ Обновляет показание состояния потока на экране }

procedure Update_State(const St: State; const N: Byte);

var

 Y: Byte;

begin

 case St of

   Active:  Print('Активен    ', 21, N + 4, LightGreen);

   Waits:   Print('Ожидает    ', 21, N + 4, Yellow);

   Stopped: Print('Остановлен ', 21, N + 4, LightRed);

 end;

end;

{ Обновляет процент заполненности буфера на экране }

procedure Refresh;

var

 S: String;

begin

 Str(Top * 100 div LIFO_Size, S);

 Print('Заполненность буфера: ' + S + ' %   ', 3, 13, White);

end;

{ Возвращает True, если X - простое число }

function Is_Prime(const X: Longint): Boolean;

var

 i: Integer;

begin

 Is_Prime := False;

 if X < 2 then Exit;

 for i := 2 to Trunc(Sqrt(X)) do

   if X mod i = 0 then Exit;

 Is_Prime := True;

end;

{ Производитель }

procedure Producer;

begin

 Update_State(Producer_State, 1);

 if (Producer_State = Stopped) or (Producer_State = Waits ) and (Top >= LIFO_Size) then Exit;

 GetIntVec($8, @_SaveInt8);

 SetIntVec($8, Addr(Producer_Consumer_Int_Proc));

 Time := 0;

 while Time <= Assigned_Time + Producer_Extra_Time do

 begin

   if Top >= LIFO_Size then

   begin

     Producer_State := Waits;

     Update_State(Producer_State, 1);

     Break;

   end;

   if Producer_State = Waits then

   begin

     Producer_State := Active;

     Update_State(Producer_State, 1);

   end;

   repeat

     Inc(Current_Prime_Number);

   until Is_Prime(Current_Prime_Number) or (Current_Prime_Number = MaxLongint);

   if not Is_Prime(Current_Prime_Number) then

   begin

     Current_Prime_Number := 1;

     Continue;

   end;

   Inc(Top);

   LIFO[Top] := Current_Prime_Number;

   Refresh;

   Delay(Proc_Delay);

 end;

 Print('Время вышло', 21, 5, LightGray);

 SetIntVec($8, Addr(_SaveInt8));

end;

{ Потребитель }

procedure Consumer;

var

 tmp: String;

begin

 Update_State(Consumer_State, 2);

 if (Consumer_State = Stopped) or (Consumer_State = Waits) and (Top <= 0) then Exit;

 GetIntVec($8, @_SaveInt8);

 SetIntVec($8, Addr(Producer_Consumer_Int_proc));

 Time := 0;

 while Time <= Assigned_Time + Consumer_Extra_Time do

 begin

   if Top <= 0 then

   begin

     Consumer_State := Waits;

     Update_State(Consumer_State, 1);

     Break;

   end;

   if Consumer_State = Waits then

   begin

     Consumer_State := Active;

     Update_State(Consumer_State, 2);

   end;

   Str(LIFO[Top], tmp);

   Dec(Top);

   { Если число не помещается в текущей строке - переходим на следующую }

   if CX + Length(tmp) + 1 > 34 then

   begin

     CX := 1; { И пишем с начала строки }

     Inc(CY);

   end;

   { Если следующей строки нет - очищаем область окна и пишем по новому }

   if CY > 13 then

   begin

     CY := 5;

     Window(41, 5, 78, 13);

     TextBackGround(Black);

     ClrScr;

   end;

   Print(tmp + ' ', 40 + CX, CY, White);

   CX := CX + Length(tmp) + 1;

   Refresh;

   Delay(Proc_Delay);

 end;

 Print('Время вышло', 21, 6, LightGray);

 SetIntVec($8, Addr(_SaveInt8));

end;

{ Сдвигает летающий квадрат }

procedure Go;

var

 i, j: Integer;

begin

 Randomize;

 while (SX + dx > 79) or (SX + dx < 1) or (SY + dy > 24) or (SY + dy < 15) do

 begin

   case Random(4) of

     0: dx := -1;

     1: dx := 1;

     2: dx := 2;

     3: dx := -2;

   end;

   case Random(4) of

     0: dy := -1;

     1: dy := 1;

     2: dy := 2;

     3: dy := -2;

   end;

 end;

 for i := 0 to 1 do

   for j := 0 to 1 do

   begin

     ScrM[SY + j, SX + i].Attr := tmp_attr[j, i];

     ScrM[SY + j, SX + i].Symbol := tmp_symbol[j, i];

   end;

 SX := SX + dx;

 SY := SY + dy;

 for i := 0 to 1 do

   for j := 0 to 1 do

   begin

     tmp_attr[j, i] := ScrM[SY + j, SX + i].Attr;

     tmp_symbol[j, i] := ScrM[SY + j, SX + i].Symbol;

   end;

 for i := 0 to 1 do

   for j := 0 to 1 do

   begin

     ScrM[SY + j, SX + i].Attr := LightGreen;

     ScrM[SY + j, SX + i].Symbol := Chr(219);

   end;

end;

{ Процедура обработки прерываний таймера для музыки, заголовка и летающего квадрата }

{$F+}

procedure IntProc;

Interrupt;

begin

 Update_State(Music_State, 3);

 Update_State(Title_State, 4);

 Update_State(Square_State, 5);

 if Music_State <> Stopped then

 begin

   Inc(M_Time);

   if M_Time = Music_Refresh_Time then

   begin

     M_Time := 0;

     NoSound;

     Sound(1 + Random(500));

     Music_Refresh_Time := 10 + Random(10);

   end;

 end;

 if Title_State <> Stopped then

 begin

   Inc(T_Time);

   if T_Time >=  Title_Refresh_Time then

   begin

     Print(The_Title, TX, TY, 1 + Random(15));

     T_Time := 0;

    end;

 end;

 if Square_State <> Stopped then

 begin

   Inc(S_Time);

   if S_Time > 18 div S_Speed then

   begin

     S_Time := 0;

     Go;

   end;

 end;

 Inline($9C);

 SaveInt8;

end;

{$F-}

{ Инициализация переменных }

procedure Initialize;

var

 i, j: Integer;

begin

 Current_Prime_Number := 1;

 _Close := False;

 Music_State := Active;

 Producer_State := Active;

 Consumer_State := Waits;

 Title_State := Active;

 Square_State := Active;

 M_Time := 0;

 Music_Refresh_Time := 10;

 S_Speed := 12;

 S_Time := 0;

 Top := 0;

 CX := 1;

 CY := 5;

 TX := 40 - Length(The_Title) div 2;

 Title_Refresh_Time := 9;

 Producer_Extra_Time := 35;

 Consumer_Extra_Time := 35;

 Update_State(Producer_State, 1);

 Update_State(Consumer_State, 2);

 SX := 40;

 SY := 15;

 dx := -1;

 dy := 1;

 for i := 0 to 1 do

   for j := 0 to 1 do

   begin

     tmp_attr[j, i] := ScrM[SY + j, SX + i].Attr;

     tmp_symbol[j, i] := ScrM[SY + j, SX + i].Symbol;

   end;

end;

{ Процедура завершения работы программы }

procedure Close;

begin

 Producer_State := Stopped; { Останавливаем поток-производитель }

 Assigned_Time := 0;

 Producer_Extra_Time := 0;

 Consumer_State := Active;

 while Top > 0 do    { Считываем всё оставшееся из буфера }

 begin

   Assigned_Time := 4;

   Consumer;

 end;

 Consumer_State := Stopped;

 Music_State := Stopped;

 Square_State := Stopped;

 NoSound;

 Window(1, 1, 80, 25);

 GotoXY(1, 24);

 Halt(0);

end;

{ Процедура обработки прерываний клавиатуры }

{$F+}

procedure IntProcKeyboard;

Interrupt;

begin

 case Port[$60] of

   1: { нажата Esc }

     begin

       Time := High(Time); { Время работы потоков. Принудительно завершаем поток. }

       _Close := True; { Устанавливаем флаг выхода }

     end;

   2: if Producer_Extra_Time > 0 then Dec(Producer_Extra_Time);   { нажата 1 }

   3: if Producer_Extra_Time < 100 then Inc(Producer_Extra_Time); { нажата 2 }

   4: if Consumer_Extra_Time > 0 then Dec(Consumer_Extra_Time);   { нажата 3 }

   5: if Consumer_Extra_Time < 100 then Inc(Consumer_Extra_Time); { нажата 4 }

   51: if S_Speed > 1 then Dec(S_Speed);    { нажата < }

   52: if S_Speed < 16 then Inc(S_Speed);   { нажата > }

   59: { нажата F1 }

     if Music_State = Active then

     begin

       NoSound;

       Music_State := Stopped;

     end

     else Music_State := Active;

   60: if Title_State = Active then Title_State := Stopped else Title_State := Active; { нажата F2 }

   61: if Square_State = Active then Square_State := Stopped else Square_State := Active; { нажата F3 }

   62: if Producer_State <> Stopped then Producer_State := Stopped else Producer_State := Active; { нажата F4 }

   63: if Consumer_State <> Stopped then Consumer_State := Stopped else Consumer_State := Active; { нажата F5 }

 end;

 Inline($9C);

 SaveInt9;

end;

var

 Code, i: Integer;

 _T_Pos: String;

begin

 _T_Pos := ParamStr(1);

 if ParamCount = 0 then

 begin

   WriteLn;

   WriteLn('Программа будет запущена с параметрами по умолчанию.');

   WriteLn;

   WriteLn('Нажмите любую клавишу для продолжения...');

   ReadKey;

   _T_Pos := 'A';

   TY := 1;

 end

 else if (ParamCount <> 1) or ((Upcase(_T_Pos[1]) <> 'A') and (Upcase(_T_Pos[1]) <> 'B')) then

 begin

   WriteLn;

   WriteLn('Неверные параметры.');

   WriteLn;

   WriteLn('Правильный формат:');

   WriteLn(' имя_файла T');

   WriteLn('где T - положение заголовка,');

   WriteLn('a - вверху экрана, b - внизу.');

   Halt;

 end;

 if Upcase(_T_Pos[1]) = 'A' then TY := 1 else TY := 25;

 { Заполняем экран начальными данными и окнами }

 TextBackGround(Black);

 ClrScr;

 Window(2, 2, 38, 14);

 TextBackGround(LightGray);

 ClrScr;

 Window(3, 3, 37, 13);

 TextBackGround(Black);

 ClrScr;

 Print('Состояния потоков.', 3, 3, White);

 Print('Производитель: ', 3, 5, White);

 Print('Потребитель: ', 3, 6, White);

 Print('Музыка: ', 3, 7, White);

 Print('Заголовок: ', 3, 8, White);

 Print('Летающий квадрат: ', 3, 9, White);

 Window(40, 2, 79, 14);

 TextBackGround(LightGray);

 ClrScr;

 Window(41, 3, 78, 13);

 TextBackGround(Black);

 ClrScr;

 Print('Вывод информации потоком-потребителем', 41, 3, White);

 Window(2, 16, 79, 24);

 TextBackGround(Black);

 ClrScr;

 WriteLn('Esc - завершение работы программы');

 WriteLn('F1 - запустить/остановить музыку');

 WriteLn('F2 - запустить/остановить заголовок');

 WriteLn('F3 - запустить/остановить летающий квадрат');

 WriteLn('F4 - изменить состояние потока-производителя');

 WriteLn('F5 - изменить состояние потока-потребителя');

 WriteLn('1/2 - уменьшить/увеличить квант времени для потока-производителя');

 WriteLn('3/4 - уменьшить/увеличить квант времени для потока-потребителя');

 Write('</> - уменьшить/увеличить скорость летающего квадрата');

 Proc_Delay := 7000;

 Initialize;

 Randomize;

 GetIntVec($8, @SaveInt8);

 SetIntVec($8, Addr(IntProc));

 GetIntVec($9, @SaveInt9);

 SetIntVec($9, Addr(IntProcKeyboard));

 while True do

 begin

   if _Close then Close;

   Assigned_Time := Random(2) + 1;

   case Random(2) + 1 of

     1: Producer;

     2: Consumer;

   end;

 end;

end.


 

А также другие работы, которые могут Вас заинтересовать

34525. Личностная пробле6матика в американском романе 60-70х гг. Поиск героя (Д.Апдайк, С.Белооу, У.Стайрон, Д.Гарднер и др) 20.93 KB
  Гарднер и др Проза Апдайка относится к числу самой популярной в послевоенное десятилетие. Апдайка Кентавр принадлежит одновременно к мифологическому и вместе с тем растущему из земли искусству. Но упорядочивать роман Апдайка таким способом нельзя:. Но книга Апдайка не ребус рассчитанный лишь на изощренную сообразительность и специальные знания.
34526. «Черный юмор» в литературе США (Д.Хеллер, К.Воннегут, Д,Барт, Данливи и др.) 18.72 KB
  1н из них Билли Пилигрим становится процветающим оптометристом в провинц. Билли совершает путь пилигрима наоборот от главного самого страшного в жизни события все глубже в духовное небытие и дальше на фантастическую планету Тральфамадор где культивируется философия нивочтоневмешательства. Такова структура данного момента отвечают Тральфамадорцы на все почему Билли. Билли в общемто и сам всегда жил по тральфамадорским правилам.
34527. Своеобразие сюжетно-композиционной организации романа Гарднера «Осенний свет» 17.46 KB
  Роман Осенний свет 1976 состоит из двух книг. Лучшее произведение Гарднера роман Осенний свет где автор виртуозно стыкует будничную житейскую историю ссоры между братом и сестрой на вермонтской ферме и сенсационный боевик о кровавом соперничестве двух контрабандистских шаек. И пожалуй что в романе Гарднера Осенний свет отчётливо заявляет о своем присутствии семейная мысль.
34528. Проблематика общества потребления и её воплощение в французской литературе (Ж. Перек) 18.44 KB
  Жорж Перек 1936 1982 стал известен благодаря публикации романа Вещи 1965. Перек сначала написал роман Исчезновение 1969 в котором рассказывается о всевозможных исчезновениях но самым главным остается исчезновение буквы е из текста романа. Вслед за тем появился роман Возвращающиеся 1972 где наряду с другими возвращающимися обнаружилась буква е употребляемая где попало лишнее е и в названии романа. Перека относится к шозизму характерному для 60 х годов французской литературы 20 века рассмотрим концепт романа и его...
34529. Своеобразие драматургии Пиранделло 19.53 KB
  в том же году писатель женится на Антуаньетте Портулато дочери компаньона отца от брака с которой у него было двое сыновей и дочь. Теоретические и эстетические взгляды на искусство писатель изложил в двух книгах 1908 г. писатель работал в основном в жанре романа и новеллы: однако после 1915 г. Писатель срывал со своих персонажей маски освобождал от иллюзий придирчиво исследовал их интеллект и личность.
34530. Литературный процесс 1 половины 20 в. Общие тенденции развития 15.11 KB
  20 века изобилие экспериментов в литературе изобретаются новые формы новые приемы новые религии. Модернизм 20 века вступает в новую стадию которая называется авангардизм. Реализм 20 века отличается тем что использует ранее несовместимые приемы. В литературе складывается концепция человека.
34531. Своеобразие критического реализма первой половины 20 века 16.97 KB
  Литература стремится проникнуть в сферу иррационального подсознания. Массовая литература=паралитература Она не является искусством это популярная коммерческая литература приносящая моментальный доход является удобным средством манипулирования сознанием. Массовая литература оказала сильное влияние на реализм благодаря развитию книгопечатания. Масс литература превратила духовные ценности в массовый товар рассчитана на массовость и примитивность.
34532. Модернизм, его философские и эстетические основы 18 KB
  Термин модернизм присущ только отечественной искусствоведческой школе в западных источниках это термин modern. Так как в русской эстетике модерн означает художественный стиль предшествующий модернизму необходимо различать эти два понятия дабы избежать путаницы. Модернизм как идеологическое явление противопоставляется идеологии традиционного общества основанной вопервых на доминировании традиции над инновацией а вовторых опирающейся на религиозное или мифологическое оправдание этой традиции.
34533. Социалистический реализм 16.34 KB
  Интеллигенция была к ним восприимчива этим и было обусловлено влияние политика на искусство это вело к художественным потерям. Искусство для искусства – требования безответственности ибо искусство не может отстаивать роскошь в мире безмерных страданий не рискуя стать ложью. Искусство соцреализма – искусство пропаганды. Розовая библиотека – искусство не отражает действительность а искажает ее.