1. Trang chủ
  2. » Luận Văn - Báo Cáo

báo cáo bài tập nhập môn hệ điều hành lab 4

20 0 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Báo Cáo Bài Tập Nhập Môn Hệ Điều Hành Lab 4
Tác giả Nguyễn Ngô Đăng Khoa
Trường học Trường Đại Học Tôn Đức Thắng
Chuyên ngành Khoa Công Nghệ Thông Tin
Thể loại Báo cáo bài tập
Năm xuất bản 2022
Định dạng
Số trang 20
Dung lượng 3 MB

Nội dung

Viết chương trình đa luồng để xuất ra số nguyên tố.. Người dùng chạy chương trình và nhập vào một số nguyên thông qua đối số tại dòng lệnh.. Chương trình sau đó sẽ tạo ra một tiến trình

Trang 1

TRƯỜNG ĐẠI HỌC TÔN ĐỨC THẮNG

KHOA CÔNG NGHỆ THÔNG TIN

BÁO CÁO BÀI TẬP NMHĐH

HK2, 2021-2022 Lab 4 Thành Viên: Nguyễn Ngô Đăng Khoa (521H0084)

Mục lục

A PHẦN THỰC HÀNH 3

Ví Dụ 1: Biên dịch và chạy thử nếu bỏ sleep(1) thì như thế nào ? 3

Ví Dụ 2: 4

Ví Dụ 3: 5

Ví Dụ 3: 6

B PHẦN BÀI TẬP 9

1 Viết chương trình đa luồng tính toán các giá trị thống kê khác nhau từ một danh sách các số được truyền vào thông qua đối số của dòng lệnh Chương trình sau đó sẽ tạo ba tiểu trình tính toán riêng biệt Một tiểu trình sẽ xác định trung bình cộng của các số, tiểu trình thứ hai sẽ xác định giá trị lớn nhất và tiểu trình thứ ba sẽ xác định giá trị nhỏ nhất 9

2 Viết chương trình đa luồng để xuất ra số nguyên tố Người dùng chạy chương trình và nhập vào một số nguyên thông qua đối số tại dòng lệnh Chương trình sau đó sẽ tạo ra một tiến trình riêng biệt xuất ra tất cả các số nguyên tố nhỏ hơn hoặc bằng số được nhập bởi người dùng 12

Trang 2

3 Chỉnh sửa lại bài 1 sao cho thay vì xuất kết quả ra màn hình thì kết quả sẽ được ghi vào tập tin result.txt ở cùng thư mục với chương trình chạy 15

4 Viết chương trình để sao chép dữ liệu từ file nguồn vào file đích Với tên file nguồn và file đích là đối số đầu vào Đếm số kí tự đã sao chép Giả sử chương trình chỉ chạy trên tập tin text 17 KẾT LUẬN 20

Trang 3

A PHẦN THỰC HÀNH

Ví Dụ 1: Biên dịch và chạy thử nếu bỏ sleep(1) thì như thế nào ?

A: Code Chương Trình

#include <pthread.h>

#include <stdio.h>

#include <stdlib.h> // atoi

#include <unistd.h> // sleep

void*thr1(void*ar)

{

printf("This is thread %d\n", * int*(( ) ar));

sleep( );2

}

intmain( intargc, char*argv[])

{

i;int

num int = atoi(argv[1]);

pthread_t tid[num];

for =(i ; i num; i0 < ++)

pthread_create(&tid[i], NULL thr1, , (void* &tid[i]);) sleep( );1 N u b dòng này ch ng trình s không hi n khi

run

return ;0

}

B: Kết Quả Demo

Trang 4

Ví Dụ 2:

A: Code Chương trình

#include <pthread.h>

#include <stdio.h>

#include <stdlib.h>

#include <sys/types.h>

#include <unistd.h>

struct arr

{

n;int

a[int 10];

};

void*thr1(void*ar)

{

count;int

structarr * =ap (struct arr*) ;ar

for(count=0; count ap n; count< -> ++) printf("%d\t",ap a[count]);->

printf("\n");

}

Trang 5

intmain( intargc, char*argv[])

{

structarr ar;

ar.n ;=5

i;int

for =(i 0;i ar.n;i++)

ar.a[i]=i+1;

pthread_t tid;

pthread_create( tid,& NULL thr1,& , ar);& sleep( );2

return ;0

}

B: Kết Quả Demo

Ví Dụ 3:

A: Code Chương trình

#include <pthread.h>

#include <stdio.h>

#include <stdlib.h>

#include <sys/types.h>

#include <unistd.h>

void*thr1(void*ar)

{

count;int

printf("This is thread %d\n",* int*(( ) ));ar

sleep( );2

}

intmain ( intargc, char*argv[])

{

i;int

Trang 6

pthread_t tid[3];

status, pstatus int * = &status;

for =(i 0;i 3;i++)

pthread_create( tid[i],& NULL thr1, ,(void* &tid[i]);) for =(i 0;i 3;i++)

{

if(pthread_join(tid[i],(void**) pstatus) )>0

printf("pthread_join for thread %d failure\n", (int)tid[i]);

printf("pthread_waited of %d OK, return code: %d\n", (int)tid[i], status);

sleep( );1

}

sleep( );1

return ;0

}

B: Kết Quả Demo

Ví Dụ 3:

A: Code Chương trình

Trang 7

#include <pthread.h>

#include <stdio.h>

#include <stdlib.h>

#include <sys/types.h>

#include <unistd.h>

struct arr

{

n;int

a[int 10];

};

struct file

{

structarr ar;

char* filename;

};

static int sum =0;

void*thr1(void*ar)

{

structarr *ap (= structarr*) ;ar

ap->n=3; i ;int =0

for =(i 0;i ap n;i-> ++)

ap a[i] i ;-> = +1

}

void*thr2(void*ar)

{

structarr *ap (= structarr*) ;ar

i, s ;int =0

for =(i 0;i ap n;i-> ++)

s s ap= + ->a[i];

sum=s;

}

void*thr3 (void*ar)

{

structfile * = structfi ( file*) ;ar

FILE *out; count;int

out= fopen(fi filename,-> "wb");

Trang 8

fprintf(out,"number element or array: %d\n", fi->ar.n); for(count=0; count< ->fi ar.n; count++)

fprintf(out,"%d\t",fi ar.a[count]);->

fprintf(out," "\n);

fprintf(out,"sum = %d\n",sum);

printf("tong: %d\n",sum);

fclose(out);

}

intmain ( intargc,char * argv[])

{

i;int

pthread_t tid[3];

structarr ar;

status, int *pstatus= &status;

pthread_create( tid[ ],& 0 NULL thr1, ,(void* &ar);) sleep( );1

if(pthread_join(tid[ ],(0 void**) pstatus)==0)

{

pthread_create( tid[ ],& 1 NULL thr2, ,(void* &ar);) if(pthread_create(&tid[ ],1 NULL thr2, , (void* &ar)) ==0) {

structfile arf;

arf.ar=ar;

arf.filename=argv[ ];1

pthread_create( tid[ ],& 2 NULL thr3, ,(void* &arf);) }

}

sleep( );2

return ;0

}

Trang 9

B: Kết Quả Demo

B PHẦN BÀI TẬP

1 Viết chương trình đa luồng tính toán các giá trị thống kê khác nhau từ một

danh sách các số được truyền vào thông qua đối số của dòng lệnh Chương trình sau đó sẽ tạo ba tiểu trình tính toán riêng biệt Một tiểu trình sẽ xác định trung bình cộng của các số, tiểu trình thứ hai sẽ xác định giá trị lớn nhất và tiểu trình thứ ba sẽ xác định giá trị nhỏ nhất

A Code chương trình:

#include <pthread.h>

#include <stdlib.h>

#include <stdio.h>

typedef struct data{

int* arr;

n_arr;int

} data;

void*average(void*p){

data ptr (data ) p;* = *

// Declare sum dynamically to return to join:

float* avr (= float*) calloc(1, sizeof float( ));

avr[ ] ;0 =0

size ptr n_arr ;int = ->

for(int = i 0; i size; i< ++){

avr[ ] avr[ ] ptr0 = 0 + ->arr[i];

Trang 10

}

avr[ ] avr[0 = 0]*1.0/(size);

pthread_exit(avr);

}

void*max(void*p){

data ptr (data ) p;* = *

// Declare sum dynamically to return to join: int* max (= int*) calloc(1, sizeof int( )); max[ ] ;0 =0

size ptr n_arr ;int = ->

for(int = i 0; i size; i< ++){

if(max[0] ptr< ->arr[i])

max[ ] ptr0 = ->arr[i];

};

pthread_exit(max);

}

void*min(void*p){

data ptr (data ) p;* = *

//

int* min (= int*) calloc(1, sizeof int( )); min[ ] 0 =10000;

size ptr n_arr ;int = ->

for(int = i 0; i size; i< ++){

if(min[0] ptr> ->arr[i])

min[ ] ptr0 = ->arr[i];

};

pthread_exit(min);

}

Trang 11

intmain( intargc, char*argv[]){

// T o m ng ch a các đ i s đã nh p

int* int_arr (= int*) calloc(argc, sizeof(int));

for(int = i 0; i argc; i< ++){

(i if != 0){

int_arr[i] = atoi(argv[i]);

}

}

size_a ;int =0

for(int = i 0; i argc ; i< -1 ++){

int_arr[i] int_arr[i= +1];

size_a size_a ;= +1

}

// Declare arguments for both threads:

data thread_data[3];

thread_data[ ].arr int_arr;0 =

thread_data[ ].n_arr size_a;0 =

thread_data[ ].arr int_arr;1 =

thread_data[ ].n_arr size_a;1 =

thread_data[ ].arr int_arr;2 =

thread_data[ ].n_arr size_a;2 =

// Declare thread IDs:

pthread_t tid[3];

// Start both threads:

pthread_create( tid[& 0 NULL], , average, &thread_data[ ]);0

pthread_create( tid[& 1 NULL], , max, &thread_data[ ]);1

pthread_create( tid[& 2 NULL], , min, &thread_data[ ]);1

// Declare space for sum:

float* avr;

int* max;

Trang 12

int* min;

// Retrieve sum of threads:

pthread_join(tid[0], (void**)&avr);

pthread_join(tid[1], (void**)&max);

pthread_join(tid[2], (void**)&min);

printf("Gia tri trung binh: %.2f\n", *avr);

printf("Gia tri lon nhat: %i\n", *max);

printf("Gia tri nho nhat: %i\n", *min);

return ;0

}

B: Kết Quả Demo

2 Viết chương trình đa luồng để xuất ra số nguyên tố Người dùng chạy chương trình và nhập vào một số nguyên thông qua đối số tại dòng lệnh Chương trình sau đó sẽ tạo ra một tiến trình riêng biệt xuất ra tất cả các số nguyên tố nhỏ hơn hoặc bằng số được nhập bởi người dùng

A Code chương trình:

#include <pthread.h>

#include <stdlib.h>

#include <stdio.h>

typedef structdata{

int* arr;

Trang 13

number;int

} data;

intisPrime( intn)

{

// Corner case

( if n<= )1

return ;0

// Check from 2 to n-1

for int = ( i 2; i ; i<n ++)

( i if n% == 0)

return ;0

return ;1

}

void*printPrime(void*p){

data* ptr (= data*) ;p

//

int* avr (= int*) calloc(1, sizeof int( ));

count ;int =0

size ptr number ;int = ->

for(int = i 0; i <= size; i++){

if(isPrime(i) == )1

printf("%d ",i);

}

pthread_exit(0);

}

intmain( intargc, char*argv[]){

// T o m ng m i và đ i đ i s đã nh p v ki u d li u s

Trang 14

number int =atoi(argv[ ]);1

count ;int =0

for(int = i 0; i number; i< ++){

if(isPrime(i) == )1

count++;

}

int* int_arr (= int*) calloc(count, sizeof(int));

// Declare arguments for both threads: data thread_data[1];

thread_data[ ].arr int_arr;0 =

thread_data[ ].number number;0 =

// Declare thread IDs:

pthread_t tid[1];

// Start both threads:

pthread_create( tid[& 0], NULL printPrime, ,

&thread_data[ ]);0

// Declare space for sum:

float* avr;

int* max;

int* min;

// Retrieve sum of threads:

pthread_join(tid[0], NULL);

printf("\n");

return ;0

}

B: Kết Quả Demo

Trang 15

3 Chỉnh sửa lại bài 1 sao cho thay vì xuất kết quả ra màn hình thì kết quả sẽ được ghi vào tập tin result.txt ở cùng thư mục với chương trình chạy

A Code chương trình:

#include <pthread.h>

#include <stdlib.h>

#include <stdio.h>

typedef structdata{

int* arr;

number;int

} data;

intisPrime( intn)

{

// Corner case

( if n<= )1

return ;0

// Check from 2 to n-1

for int = ( i 2; i ; i<n ++)

( i if n% == 0)

return ;0

return ;1

}

void*printPrime(void*p){

data* ptr (= data*) ;p

Trang 16

//

int* avr (= int*) calloc(1, sizeof int( ));

count ;int =0

size ptr number ;int = ->

for(int = i 0; i <= size; i++){

if(isPrime(i) == )1

printf("%d ",i);

}

pthread_exit(0);

}

intmain( intargc, char*argv[]){

// T o m ng m i và đ i đ i s đã nh p v ki u d li u s

number int =atoi(argv[ ]);1

count ;int =0

for(int = i 0; i number; i< ++){

if(isPrime(i) == )1

count++;

}

int* int_arr (= int*) calloc(count, sizeof(int));

// Declare arguments for both threads:

data thread_data[1];

thread_data[ ].arr int_arr;0 =

thread_data[ ].number number;0 =

// Declare thread IDs:

pthread_t tid[1];

// Start both threads:

pthread_create( tid[& 0], NULL printPrime, ,

&thread_data[ ]);0

Trang 17

// Declare space for sum:

float* avr;

int* max;

int* min;

// Retrieve sum of threads:

pthread_join(tid[0], NULL);

printf("\n");

return ;0

}

B: Kết Quả Demo

4 Viết chương trình để sao chép dữ liệu từ file nguồn vào file đích Với tên file nguồn và file đích là đối số đầu vào Đếm số kí

tự đã sao chép Giả sử chương trình chỉ chạy trên tập tin text

A Code chương trình:

#include <pthread.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

typedef struct data{

char* filename1 ;

char* filename2 ;

Trang 18

} data;

void*countCharacters(void*p){

data ptr (data ) p;* = *

char* filename ptr= ->filename1;

FILE fp * = fopen(filename, "r");

int* count (= int*) calloc(1, sizeof(int)); count[ ] 0 = 0;

for char = ( c getc(fp); c EOF; c != =getc(fp)) count[ ] count[ ] ;0 = 0 +1

fclose(fp);

pthread_exit(count);

}

void*copyFile(void*p){

data ptr (data ) p;* = *

FILE fp1 * = fopen(ptr->filename1, " "r); FILE fp2 * = fopen(ptr->filename2, " "w);

printf("%s ",ptr filename1);->

char = c fgetc(fp1);

while (c EOF)!=

{

fputc(c, fp2);

c = fgetc(fp1);

}

fclose(fp1);

fclose(fp2);

pthread_exit(0);

}

Trang 19

intmain( intargc, char*argv[]){

// Declare arguments for both threads:

data thread_data[1];

thread_data[ ].filename1 argv[0 = 1];

thread_data[ ].filename2 argv[0 = 2];

// Declare thread IDs:

pthread_t tid[2];

// Start both threads:

pthread_create( tid[& 0 NULL], , countCharacters,

&thread_data[ ]);0

pthread_create( tid[& 1 NULL], , copyFile, &thread_data[ ]);0

// Declare space for sum:

int* count ;=0

// Retrieve sum of threads:

pthread_join(tid[0], (void**)&count);

pthread_join(tid[1 NULL], );

printf("Da sao chep thanh cong %i ki tu \n",*count); return ;0

}

B: Kết Quả Demo

Trang 20

KẾT LUẬN

Sau khi học và hoàn thành phần lab 2 em thu được kết sau:

- Hoàn thành tất cả phần thực hành

- Hoàn thành 4/6 bài tập

Ngày đăng: 08/05/2024, 16:24

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w