首页 > 其他分享 >《信息安全系统设计与实现》第八次学习笔记

《信息安全系统设计与实现》第八次学习笔记

时间:2023-10-29 17:33:41浏览次数:33  
标签:attr int void 信息安全 笔记 第八次 线程 pthread 执行

第四章:并发编程

并行计算导论

顺序算法与并行算法

  • 顺序算法:所有步骤通过单个任务依次执行,每次执行一个步骤,当所有步骤执行完成时,算法结束。
  • 并行算法:cobegin-coend代码块来指定独立任务,所有任务都是并行执行的,紧接着cobegin-coend代码块的下一个步骤将只在所有这些任务完成之后执行。

并行性与并发性

  • 在理想情况下,并行算法中的所有任务都应该同时实时执行。
  • 真正的并行执行只能在有多个处理组件的系统中实现,比如多处理器或多核系统。
  • 在单CPU系统中,一次只能执行一个任务。在这种情况下,不同的任务只能并发执行,即在逻辑上并行执行。

线程

线程的原理

  • 线程是某进程同一地址空间上的独立执行单元。创建某个进程就是在一个唯一地址空间创建一个主线程。当某进程开始时,就会执行该进程的主线程。

线程的优点

  • 线程创建和切换速度更快
  • 线程的响应速度更快
  • 线程更适合并行运算

线程的缺点

  • 由于地址空间共享,线程需要来自用户的明确同步
  • 许多库函数可能对线程不安全
  • 在单CPU系统上,使用线程解决问题实际上要比使用顺序程序慢

线程操作

  • 线程的执行轨迹与进程类似,线程可在内核模式或用户模式下执行。
  • 在用户模式下,线程在进程的相同地址空间中执行,但每个线程都有自己的执行堆栈。

线程管理函数

创建线程

  • 使用pthread_create()创建线程函数
    int pthread_create(pthread_t *pthread_id,pthread_attr_t *attr,void *(*func)(void*),void *arg)
    • pthread_id是指向pthread_t类型变量的指针
    • attr是指向另一种不透明数据类型的指针,attr如果是NULL,将使用默认属性创建线程
    • func是要执行的新线程函数的入口地址
  • attr 参数的使用步骤
    • (1)定义一个pthread属性变量pthread attr tattr。
    • (2)用pthread attrinit (&attr)初始化属性变量。
    • (3)设置属性变量并在pthread create0)调用中使用。
    • (4)必要时,通过pthread attr destroy (&attr)释放attr 资源。

线程ID

  • 线程ID是一种不透明的数据类型,取决于现实情况
    int pthread_equal(pthread_t t1,pthread_t t2);
  • 如果是不同的线程,返回0,否则返回非0

线程终止

  • 线程函数结束后,线程即终止
    int pthread_exit(void *status);
  • 进行显式终止,其中状态是线程的退出状态。0退出值表示正常终止,非0表示异常

线程连接

  • int pthread_join(pthread_t thread,void **status_ptr)
  • 终止线程的退出状态以status_ptr返回。

线程同步

互斥量

  • 最简单的同步工具是锁,它允许执行实体仅在有锁的情况下才能继续执行。在 Pthread中,锁被称为互斥量,意思是相互排斥。
  • 初始化互斥量
    • 静态方法
    • 动态方法,使用pthread_mutex_init()函数,可通过attr参数设置互斥属性
pthread_mutex_lock(&m);
access shared data object;
pthread_mutex_unlock(&m);

死锁预防

  • 互斥量使用封锁协议。
  • 在任何封锁协议中,误用加锁可能会产生一些问题。
  • 死锁是一个状态,在这种状态下,许多执行实体相互等待,无法继续进行下去.

条件变量

  • 静态方法初始化
  • 动态方法初始化

生产者——消费者问题

  • 共享全局变量
int buf[NBUF];
int head,tail;
int data;
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define NBUF 5
#define N	10
// shared global variables 
int buf[NBUF];	// circular buffers
int head, tail;	// indices
int data;	// number of full buffers
pthread_mutex_t mutex; 
pthread_cond_t empty, full;

int init()
{
    head = tail = data = 0; 
    pthread_mutex_init(&mutex, NULL); 
    pthread_cond_init(&full, NULL); 
    pthread_cond_init(&empty, NULL);
}

void *producer() 
{
    int i;
    pthread_t me = pthread_self();
    for (i=0; i<N; i++) // try to put N items into buf[]
    {
        pthread_mutex_lock(&mutex);	// lock mutex
        if (data == NBUF)
        {
            printf ("producer %lu: all bufs FULL: wait\n", me);
            pthread_cond_wait(&empty, &mutex); // wait
        }
        buf[head++] = i+1;
        head %= NBUF;
        data++;
        printf("producer %lu: data=%d value=%d\n", me, data, i+1);
        pthread_mutex_unlock (&mutex); 
        pthread_cond_signal(&full);
    }
    printf("producer %lu: exit\n", me);
}

void *consumer()
{
    int i, c;
    pthread_t me = pthread_self();
    for (i=0; i<N; i++)
    {
        pthread_mutex_lock(&mutex);	// lock mutex
        if (data == 0)
        {
            printf ("consumer %lu: all bufs EMPTY: wait\n", me); 
            pthread_cond_wait(&full, &mutex); // wait
        }
        c = buf[tail++];	// get an item
        tail %= NBUF;
        data--;	// dec data by 1
        printf("consumer %lu: value=%d\n", me, c); 
        pthread_mutex_unlock(&mutex);	// unlock mutex
        pthread_cond_signal(&empty);	// unblock a producer, if any
    }
    printf("consumer %lu: exit\n", me);
}

int main ()
{
    pthread_t pro, con;
    init();
    printf("main: create producer and consumer threads\n");
    pthread_create(&pro, NULL, producer, NULL);
    pthread_create(&con, NULL, consumer, NULL);
    printf("main: join with threads\n");
    pthread_join(pro, NULL);
    pthread_join(con, NULL);
    printf("main: exit\n");
}

信号量

  • 信号量是进程同步的一般机制。
  • 在使用信号量之前,必须使用一个初始值和一个空等待队列进行初始化。

屏障

  • 线程连接操作允许某线程等待其他线程终止
  • 在pthread中可以采用的机制是屏障以及一系列屏障函数

Linux中的线程

  • Linux不区分进程和线程。
  • 对于Linux内核,线程只是一个与其他进程共享某些资源的进程。
  • 在 Linux 中,进程和线程都是由 clone()系统调用创建的:
    int clone(int (*fn)(void*),void *child_stack,int flags,void *arg)

苏格拉底提问

标签:attr,int,void,信息安全,笔记,第八次,线程,pthread,执行
From: https://www.cnblogs.com/wenxinhe/p/17796088.html

相关文章

  • 2023-2024-1 20211327 信息安全系统设计与实现 学习笔记7
    学习笔记7顺序算法与并行算法线程的原理与优缺点线程管理函数线程同步实践过程顺序算法与并行算法顺序算法(SequentialAlgorithm)原理:顺序算法是一种线性执行的算法,它按照顺序一步一步地解决问题。这意味着每个操作都依赖于前一个操作的结果,只有在前一个操作完成之后才......
  • Unix/Linux系统编程自学笔记-第四章:并发编程
    1、并行计算并行计算并行计算是一种计算方法,通过使用多个执行并行算法的处理器相较串行计算更快地解决问题。现代多核处理器的结构能很好的实现并行计算。计算机的发展未来也是并行计算。顺序算法与并行计算顺序算法一般代码块格式如下,顺序算法的每个代码块可能包含多......
  • Linux shell编程学习笔记16:bash中的关联数组
    上一节我们探讨了普通的数组,即使用数字下标来索引数组中不同的元素的数组,也可以称之为索引数组。相比纯粹的数字,字符串不仅能表明含义,也更便于记忆使用,于是就有了关联数组。一、关联数组概述bash从4.0开始支持关联数组,关联数组可以使用可以使用任意的字符串、或者整数作为下标来......
  • 20211316郭佳昊 《信息安全系统设计与实现(上)》 第八周学习总结
    一、任务要求[1]知识点归纳以及自己最有收获的内容,选择至少2个知识点利用chatgpt等工具进行苏格拉底挑战,并提交过程截图,提示过程参考下面内容(4分)我在学***X知识点,请你以苏格拉底的方式对我进行提问,一次一个问题核心是要求GPT:请你以苏格拉底的方式对我进行提问然后GPT就会......
  • [学习笔记]--信息安全
    信息系统安全属性安全属性属性描述保密性最小授权原则,防暴露,信息加密,物理保密完整性安全协议,校验码,密码校验,数字签名,公证可用性综合保障(IP过滤,业务流程控制,路由选择控制,审计跟踪)不可抵赖性数字签名对称加密与非对称加密对称加密:加密和......
  • 2023/10/29 学习笔记
    学习安装yum源仓库与编译安装Linux中安装软件分三大类:rpm:类似360软件管家红帽公司开发出来的工具编译安装:将源代码编译成可执行文件(二进制包安装)自由度高yum:最后用的还是rpm,它是rpm的升级版本rpm:——查询、安装、卸载查询rpm-q 软件查询h指定软件包是否......
  • python面向对象-学习笔记(三、类方法、实例方法、静态方法)
    方法相关方法的概念描述一个目标的行为动作和函数相似封装了一系列行为动作。比如一个人怎么吃,怎么喝,怎么玩...都可以被调用最主要区别:调用方式方法的划分实例方法:默认第一个参数是一个实例类方法:默认第一个参数是类静态方法:没有默认参数注意划分的依据:方法的第一......
  • python面向对象-学习笔记(四、类相关的补充)
    元类创建类对象的类对象怎么产生的?由类创建出来的。类是不是对象?是所以类对象是不是由另外一个类创建出来的?是,元类创建类对象的另外一种方式#创建类对象的另外一种方式defrun(self):print("run",self)dog=type("Dog",(),{"count":1,"run":run})prin......
  • python面向对象-学习笔记(五、属性相关的补充)
    私有化属性注意python并没有真正支持私有化,但是可以使用下划线完成伪私有的效果类属性(方法)和实例属性(方法)遵循相同的规则公有属性a在类的内部可以访问在子类的内部可以访问在模块其他地方类的属性可以访问子类的属性可以访问类的实例的属性可以访问子类的......
  • python面向对象-学习笔记(二、类&对象的属性)
    如何定义一个类?创建类的格式class类名: pass怎么通过类,创建出一个对象?创建类,并实例化对象classMoney:passone=Money()#打印类print(Money)#打印类的实例print(one)类的别名和打印类的名称classMoney:pass#打印类的名称print(Money.__na......