Файл: Отчет о выполнении лабораторной работы 1 по дисциплине Информатика Преподаватель Бусыгин К. Н.docx

ВУЗ: Не указан

Категория: Отчет по практике

Дисциплина: Не указана

Добавлен: 23.11.2023

Просмотров: 23

Скачиваний: 4

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Министерство образования и науки Российской Федерации

федеральное государственное бюджетное образовательное учреждение

высшего образования

«Санкт-Петербургский государственный университет промышленных технологий и дизайна»

Институт информационных технологий и автоматизации

Кафедра: Интеллектуальных систем и защиты информации

Направление подготовки: 10.03.01 Информационная безопасность

Профиль подготовки: Информационная безопасность в коммерческих структурах

ОТЧЕТ

о выполнении лабораторной работы №1

по дисциплине: «Информатика»

Преподаватель: Бусыгин К. Н.

Обучающийся: Голубева А.П., Шимпф Д.Д.

Курс: 1 Учебная группа: МДА-7,9

Санкт-Петербург

2020

  1. Породить 10 потоков, каждый из которых выводит в консоль сообщение «hello from thread N», где N – номер потока (номер потока передать ему через конструктор). Посмотреть, что будет, если перед выходом из главного потока не ожидать завершения порожденных потоков, и если ожидать.

Код Java:


Пример работы:




  1. Породить 10 потоков, каждый из которых каждую секунду (Thread.sleep()) выводит в консоль свой номер и время, прошедшее с момента его запуска в секундах.

Код Java:




  1. Для потоков из п. 2 отменить все потоки через 5 секунд из главного потока через разделяемую память.

Код Java:




Пример работы:




  1. Реализовать программу, моделирующую задачу производителей-потребителей с десятью производителями и десятью потребителями без использования средств синхронизации. Какие ошибки здесь могут быть?

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


  1. Модифицировать программу из п. 4 с использованием синхронизации с помощью семафоров.

Код Java:








  1. Модифицировать программу из п. 4 с использованием синхронизации с помощью блокировок.

Код Java:










  1. Вычислить число p с точностью 10–9 с помощью формулы Лейбница, пользуясь пятью потоками.

Код Java:




Пример работы:





  1. Разобрать задачу обедающих философов (Таненбаум). Реализовать ее для 7 философов с использованием блокировок.

Код Java:









  1. Разобрать задачу читателей и писателей (Таненбаум). Реализовать ее для 5 писателей и 10 читателей с помощью блокировок.

Код Java:

import java.util.concurrent.locks.*;
import java.util.Random;

public class n8 {
static int written = 0;
static int read = 0;
public static void main(String[] args)throws InterruptedException{
ReadWriteLock lock = new ReentrantReadWriteLock();
Writer[] writer = new Writer[5];
Reader[] reader = new Reader[10];
for(int i = 0; i < 5; i++)
writer[i] = new Writer(lock, "Writer " + i);
for(int i = 0; i < 10; i++)
reader[i] = new Reader(lock, "Reader " + i);
for(int i = 0; i < 5; i++)
writer[i].start();
for(int i = 0; i < 10; i++)
reader[i].start();
for(int i = 0; i < 5; i++)
writer[i].join();
for(int i = 0; i < 10; i++)
reader[i].join();
System.out.println("control: " + (written - read));
}
}
class Book{
static int content;
}
class Writer extends Thread{
ReadWriteLock l;
String name;
int written = 0;
Writer(ReadWriteLock l, String name){
this.l = l;
this.name = name;
}
public void run(){
int n = 0;
Random r = new Random(100);
while(n < 10000){
l.writeLock().lock();
writing(r);
l.writeLock().unlock();
n++;
written++;
}
n8.written += written;
}
private void writing(Random r) {
Book.content = r.nextInt(100);
for (int i = 0; i < 10000; i++)
for (int j = 0; j < 10000; j++) {}
}
}
class Reader extends Thread{
ReadWriteLock l;
String name;
int c;
int read = 0;
Reader(ReadWriteLock l, String name){
this.l = l;
this.name = name;
}
public void run(){
int n = 0;
while(n < 5000){
l.readLock().lock();
reading();
l.readLock().unlock();
n++;
read++;
}
n8.read += read;
}
private void reading(){
c = Book.content;
for(int i = 0; i < 10000; i++)
for(int j = 0; j < 10000; j++){}
}
}


  1. Предположим, что некий университет в США решил продемонстрировать свою политкорректность, применив известную доктрину Верховного суда США «Отделенный, но равный – по сути неравный» не только к расовой, но и к половой принадлежности, положив конец устоявшейся практике раздельных душевых для мужчин и женщин в своем кампусе. Но уступая традиции, университет вынес решение, что если в душевой находится женщина, то туда может зайти другая женщина, но не мужчина, и наоборот. Символ на сдвижном индикаторе на двери душевой показывает три возможных состояния:

а) свободно;

б) душевая занята женщинами;

в) душевая занята мужчинами.

Спроектируйте и реализуйте класс ShowerRoom на 10 душевых мест, в котором есть методы: для женщины, желающей войти, – womanWantsToEnter; для мужчины, желающего войти, – manWantsToEnter; для женщины, выходящей из душевой, – womanLeaves; для мужчины, выходящего из душевой, – manLeaves. Синхронизация с помощью блокировок. Проверить работу программы для душевой
, 20-ти мужчин и 20-ти женщин, где мужчины и женщины представлены в виде потоков, которые некоторое время заняты своими делами, затем хотят в течение некоторого времени помыться в одной на всех душевой, и так в бесконечном цикле.

Код Java:

import java.util.concurrent.locks.*;
import java.util.*;
import java.util.Random;

public class n9 {
static int[] menItog = new int[20];
static int[] womenItog = new int[20];
static int persIn = 0;
static boolean Full = (persIn == 10);
static boolean wshow = false;
static boolean mshow = false;
public static void main(String[] args)throws InterruptedException{
ReentrantLock lock = new ReentrantLock(true);
Condition men = lock.newCondition();
Condition women = lock.newCondition();
Arrays.fill(menItog, 0);
Arrays.fill(womenItog, 0);
Man[] man = new Man[20];
Woman[] woman = new Woman[20];
for(int i = 0; i < 20; i++)
man[i] = new Man(i, lock, men, women, Full, wshow, mshow);
for(int i = 0; i < 20; i++)
woman[i] = new Woman(i, lock, men, women, Full, wshow, mshow);
for(int i = 0; i < 20; i++)
man[i].start();
for(int i = 0; i < 20; i++)
woman[i].start();
for(int i = 0; i < 20; i++)
man[i].join();
for(int i = 0; i < 20; i++)
woman[i].join();
System.out.println(Arrays.toString(menItog) + " muzhchin");
System.out.println(Arrays.toString(womenItog) + " zhenshchin");
}
}
class Shower{
static Stack showerStack = new Stack<>();
}
class Man extends Thread{
int n;
ReentrantLock lock;
Condition men;
Condition women;
boolean Full;
boolean wshow;
boolean mshow;
Man(int n, ReentrantLock lock, Condition men, Condition women, boolean Full, boolean wshow, boolean mshow){
this.n = n;
this.lock = lock;
this.men = men;
this.women = women;
this.Full = Full;
this.wshow = wshow;
this.mshow = mshow;
}
public void run(){
int b = 0;
try{
while (b < 10000){
Thread.sleep(10);
Random r = new Random();
lock.lock();
while(Full || wshow)
women.await();
if(mshow == false)
mshow = true;
Shower.showerStack.push(r.nextInt(100));
n9.persIn++;
lock.unlock();
lock.lock();
n9.menItog[n]++;
Shower.showerStack.pop();
if(Shower.showerStack.empty()){
mshow = false;
men.signalAll();
}
lock.unlock();
System.out.println(Arrays.toString(n9.menItog)+ " muzhchin");
b++;
}
}
catch(InterruptedException e){}
}
}
class Woman extends Thread{
int n;
ReentrantLock lock;
Condition men;
Condition women;
boolean Full;
boolean wshow;
boolean mshow;
Woman(int n, ReentrantLock lock, Condition men, Condition women, boolean Full, boolean wshow, boolean mshow){
this.n = n;
this.lock = lock;
this.men = men;
this.women = women;
this.Full = Full;
this.wshow = wshow;
this.mshow = mshow;
}
public void run(){
int b = 0;
try{
while (b < 10000){
Thread.sleep(10);
Random rnd = new Random();
lock.lock();
while(Full || mshow)
men.await();
if(wshow == false)
wshow = true;
Shower.showerStack.push(rnd.nextInt(100));
n9.persIn++;
lock.unlock();
lock.lock();
n9.womenItog[n]++;
Shower.showerStack.pop();
if(Shower.showerStack.empty()){
wshow = false;
women.signalAll();
}
lock.unlock();
System.out.println(Arrays.toString(n9.womenItog)+ " zhenshchin");
b++;
}
}
catch(InterruptedException e){}
}
}