信息安全系统第十三周学习总结 20135218 姬梦馨

第十二章 并发编程

12.1 基于进程的并发编程

构造并发程序最简单的方法——用进程

常用函数如下:

  • fork
  • exec
  • waitpid

【基于进程的并发服务器】

  • 使用SIGCHLD处理程序来回收僵死子进程的资源。
  • 父进程必须关闭他们各自的connfd拷贝(已连接的描述符),避免存储器泄露。
  • 因为套接字的文件表表项中的引用计数,直到父子进程的connfd都关闭了,到客户端的连接才会终止。

【基于I/O多路复用的并发编程】

使用select函数,要求内核挂起进程,只有在一个或多个I/O事件发生后,才将控制返回给应用程序。

int select(int n,fd_set *fdset,NULL,NULL,NULL);
                            返回已经准备好的描述符的非0的个数,若出错则为-1。

  

【基于I/O多路复用的并发事件驱动服务器】

状态机:一组状态、输入事件、输出事件和转移。

自循环:同一输入和输出状态之间的转移。

I/O多路复用技术的优劣

相比基于进程的设计给了程序员更多的对进程行为的控制,运行在单一进程上下文中,每个逻辑流都能访问全部的地址空间,在流之间共享数据很容易。

编码复杂,随着并发粒度的减小,复杂性还会上升。粒度:每个逻辑流每个时间片执行的指令数量。

12.3 基于线程的并发编程

Posix线程

Posix线程是C语言中处理线程的一个标准接口,允许程序创建、杀死和回收线程,与对等线程安全的共享数据。

线程的代码和本地数据被封装在一个线程例程中,

创建线程

线程通过调用pthread_create来创建其他线程。

int pthread_create(pthread_t *tid,pthread_attr_t *attr,func *f,void *arg);
                                                    成功则返回0,出错则为非零

  

当函数返回时,参数tid包含新创建的线程的ID,新线程可以通过调用pthread_self函数来获得自己的线程ID。

pthread_t pthread_self(void);返回调用者的线程ID。

  

终止线程

当顶层的线程例程返回时,线程会隐式地终止。通过调用pthread_exit函数,线程会显式地终止

void pthread_exit(void *thread_return);

  

回收已终止的线程资源

线程通过调用pthread_join函数等待其他线程终止。

int pthread_join(pthread_t tid,void **thread_return);
                                               成功则返回0,出错则为非零

  

分离线程

在任何一个时间点上,线程是可结合或可分离的。一个可结合的线程能够被其他线程收回其资源和杀死,在被回收之前,它的存储器资源是没有被释放的。分离的线程则相反,资源在其终止时自动释放。

int pthread_deacth(pthread_t tid);
                                            成功则返回0,出错则为非零

  

初始化线程

pthread_once允许初始化与线程例程相关的状态。

pthread_once_t once_control=PTHREAD_ONCE_INIT;
int pthread_once(pthread_once_t *once_control,void (*init_routine)(void));
                                                        总是返回0

  

12.4 多线程程序中的共享变量

【线程存储器模型】

每个线程都有自己独立的线程上下文,包括一个唯一的整数线程ID,栈、栈指针、程序计数器、通用目的寄存器和条件码。

【将变量映射到存储器】

  • 全局变量:定义在函数之外的变量
  • 本地自动变量:定义在函数内部但是没有static属性的变量。
  • 本地静态变量:定义在函数内部并有static属性的变量。

【共享变量】

当且仅当变量的一个实例被一个以上的线程引用时,就说变量是共享的。

12.5用信号量同步线程

【进度图】

将n个并发线程的执行模型化为一条n维笛卡尔空间中的轨迹线,将指令模型化为从一种状态到另一种状态的转换。

转换规则:

  • 合法的转换是向右或者向上,即某一个线程中的一条指令完成
  • 两条指令不能在同一时刻完成,即不允许出现对角线
  • 程序不能反向运行,即不能出现向下或向左

【信号量】

  • P(s):如果s是非零的,那么P将s减一,并且立即返回。如果s为零,那么就挂起这个线程,直到s变为非零。
  • V(s):将s加一,如果有任何线程阻塞在P操作等待s变为非零,那么V操作会重启线程中的一个,然后该线程将s减一,完成他的P操作。

12.6 使用线程来提高并行性

并行程序的加速比通常定义为:

其中,p为处理器核的数量,T为在p个核上的运行时间。

12.7 其他并发问题

【线程安全】

四个不相交的线程不安全函数类以及应对措施:

  • 不保护共享变量的函数——用P和V这样的同步操作保护共享变量
  • 保持跨越多个调用的状态的函数——重写,不用任何static数据。
  • 返回指向静态变量的指针的函数——重写;使用加锁-拷贝技术。
  • 调用线程不安全函数的函数——参考之前三种

【竞争】

当一个程序的正确性依赖于一个线程要在另一个线程到达y点之前到达他的控制流x点时,就会发生竞争。

为消除竞争,我么可以动态地为每个整数ID分配一个独立的块,并且传递给线程例程一个指向这个块的指针。

【死锁】

死锁:一组线程被阻塞了,等待一个永远也不会为真的条件。

  • 程序员使用P和V操作顺序不当,以至于两个信号量的禁止区域重叠。
  • 重叠的禁止区域引起了一组称为死锁区域的状态。
  • 死锁是一个相当难的问题,因为它是不可预测的。

互斥锁加锁顺序规则:如果对于程序中每对互斥锁(s,t),给所有的锁分配一个全序,每个线程按照这个顺序来请求锁,并且按照逆序来释放,这个程序就是无死锁的。

解决死锁的方法

不让死锁发生:
  • 静态策略:设计合适的资源分配算法,不让死锁发生---死锁预防
  • 动态策略:进程在申请资源时,系统审查是否会产生死锁,若会产生死锁则不分配---死锁避免
让死锁发生:

进程申请资源时不进行限制,系统定期或者不定期检测是否有死锁发生,当检测到时解决死锁----死锁检测与解除

时间: 2024-07-31 19:55:54

信息安全系统第十三周学习总结 20135218 姬梦馨的相关文章

信息安全系统第十周学习总结 20135218 姬梦馨

1:Who命令 who 读取想要的信息到存储器中,再用标准输出函数打印到屏幕上,关闭文件. 查看登录前的用户 -who am i: 列出登录的用户 -who或-w. 2: Unix系统中的错误处理 a:Unix风格的处理错误 遇到错误后返回-1,并且将全局变量errno设置为指明错误原因的错误代码:如果成功完成,就返回有用的结果. b:Posix风格的处理错误 返回0表示成功,返回非0表示失败:有用的结果在传进来的函数参数中. c:DNS风格的处理错误 有两个函数,gethostbyname和g

20135223何伟钦—信息安全系统设计基础第九周学习总结

学习目的: 1. 掌握系统编程和系统调用的概念 2. 掌握系统编程错误处理的方式 3. 掌握Unix/Linux系统级I/O(open close read write seek stat) 4. 掌握RIO 5. 掌握I/O重定向的方法 一.Unix I/O Unix I/O定义:所有的I/O设备都被模型化为文件,所有的输入和输出都被当作 对相应文件的读和写来执行.这种将设备影射为文件的方式,称为Unix I/O (一)打开文件 (1)文件描述符:一个应用程序通过要求内核打开相应的文件,来宣告

20135219洪韶武-信息安全系统设计基础第九周学习总结

第九周学习总结 一.课本内容 1.每个unix文件都是一个m字节的序列:所有I/O设备如网络.磁盘和终端都被模型化为文件,而输入和输出就是对这些文件的读写操作. 2.unix系统中输入输出的操作: 打开文件:一个应用程序通过要求内核打开相应的文件,来宣告它想要访问一个I/O设备,内核返回一个小的非负整数,叫做描述符.unix系统创建每个进程的时候都有三个打开的文件:标准输入:标准输出,标准错误. 改变当前的文件位置.对于每个打开的文件,内核保持着一个文件位置k(从文件开头起始的字节偏移量). 读

20135218 信息安全系统设计基础第二周学习总结

深入理解计算机系 Linux基础 一.实验说明 环境登录  无需密码自动登录,系统用户名shiyanlou,密码shiyanlou 二.实验步骤 三种知识: 元知识:这门课程思考问题框架是什么?遇到老问题,它会怎样分析?遇到新问题,它会怎样分析? 硬知识:这门课程的主要知识点是什么?适合用思维导图组织吗? 软知识:这门课程的哪些知识点需要哪些实践环节来强化理解和记忆? 1. Linux命令 Linux学习应用的一个特点是通过命令行进行使用. 登录Linux后,我们就可以在#或$符后面去输入命令,

信息安全系统设计基础第二周学习总结

学习目标 1. 熟悉Linux系统下的开发环境    2. 熟悉vi的基本操作    3. 熟悉gcc编译器的基本原理    4. 熟练使用gcc编译器的常用选项    5 .熟练使用gdb调试技术    6. 熟悉makefile基本原理及语法规范    7. 掌握静态库和动态库的生成 内容一:vim编辑器的使用 1.vim编辑器的三种模式 Ⅰ正常模式:(按Esc或Ctrl+[进入) 左下角显示文件名或为空 Ⅱ插入模式:(按i键进入) 左下角显示--INSERT-- Ⅲ可视模式:左下角显示—V

信息安全系统设计基础第二周学习总结(一)

Linux下C语言编程基础实验报告 学习任务 1. 熟悉Linux系统下的开发环境 2. 熟悉vi的基本操作 3. 熟悉gcc编译器的基本原理 4. 熟练使用gcc编译器的常用选项 5 .熟练使用gdb调试技术 6. 熟悉makefile基本原理及语法规范 7. 掌握静态库和动态库的生成 学习内容 1. 快捷键 2. vim 3. gcc 4. gdb 5. make与makefile 学习过程记录 第一部分 第一讲第一节:移动光标 H左.j下.k上.l右 第一讲第二节:VIM的进入和退出 <E

信息安全系统设计基础第一周学习总结

第一节 Linux系统 1:Linux系统      登录Linux后,我们就可以在#或$符后面去输入命令,有的时候命令后面还会跟着选项(options)或参数(arguments).       即Linux中命令格式为:command[options][arguments].但有些命令也不需要跟着选项或参数.   选项是调整命令执行行为的开关,选项不同决定了命令的显示结果不同.   参数是指命令的作用对象.  2 :man命令       1是普通的Linux命令(用户命令帮助)      

20135304刘世鹏——信息安全系统设计基础第二周学习总结

第一节.Linux基础 1.Linux命令 Linux中命令格式为:command [options] [arguments] 选项:是调整命令执行行为的开关,选项不同决定了命令的显示结果不同 参数:决定了命令的显示结果不同 例如:ls .中.为参数:ls -a中-a为选项 2.man命令 1 Executable programs or shell commands(普通的Linux命令) 2 System calls (系统调用,操作系统的提供的服务接口) 3 Library calls (

20135220谈愈敏--信息安全系统设计基础第二周学习总结

<深入理解计算机系统>实验一 在我的理解中: 元知识:思考问题的能力 硬知识:可见的知识点 软知识:实践中的经验 后面的常用命令是老师上课中讲到的. 一边看提供的材料一边在实验楼里实践,我的实验顺序如下: vim编辑器实验1234 普通模式(Normal mode):在普通模式中,用的编辑器命令,比如移动光标,删除文本等等.这也是Vim启动后的默认模式. Vim强大的编辑能来自于其普通模式命令.普通模式命令往往需要一个操作符结尾.例如普通模式命令dd删除当前行,但是第一个"d&quo