20135333苏正生——信息安全系统设计基础第十二周学习总结
2015-12-06 23:11
309 查看
第十二章 并发编程
三种基本概念:1.进程
2.I/O多路复用
3.线程
第一节 基于进程的并发编程
构造并发程序常用函数:fork exec waitpid
独立地址空间
1.优点:防止虚拟存储器被错误覆盖
2.缺点:开销有时会很高,共享状态信息才需要IPC机制
第二节 基于I/O多路复用的并发编程
事件驱动程序:将逻辑流模型化为状态机。状态机:状态、输入事件、转移
流程:
1.select函数检测到输入事件
2.add_client函数创建新状态机
3.check_clients函数执行状态转移,并且完成时删除该状态机。
相关函数:
init_pool() add_client() check_clients()
第三节 基于线程的并发编程
一、线程执行模型
1.主线程2.对等线程
3.主线程切换到对等线程
二、Posix线程
Posix线程是C程序中处理线程的一个标准接口。万能函数:
void func(void parameter) typedef void (uf)(void para)
三、创建线程
1.创建线程:pthread_create函数 #include <pthread.h> typedef void *(func)(void *); int pthread_create(pthread_t *tid, pthread_attr_t *attr, func *f, void *arg);
功能:创建一个新的线程,带着一个输入变量arg,在新线程的上下文运行线程例程f。
2.查看线程ID
pthread_self函数 #include <pthread.h> pthread_t pthread_self(void);
功能:返回调用者的线程ID(TID)
四、终止线程
1.终止线程的方式:隐式终止、显示终止2.pthread_exit函数
#include <pthread.h> void pthread_exit(void *thread_return);
3.pthread_cancle函数
#include <pthread.h> void pthread_cancle(pthread_t tid);
五、回收已终止线程的资源
pthread_join函数:#include <pthread.h> int pthread_join(pthread_t tid,void **thrad_return);
六、分离线程
pthread_detach函数#include <pthread.h> void pthread_detach(pthread_t tid);
功能:分离可结合线程tid。
七、初始化线程:pthread_once函数
#include <pthread.h> pthread_once_t once_control = PTHREAD_ONCE_INIT; int pthread_once(pthread_once_t *once_control, void (*init_routine)(void));
第四节 多线程程序中的共享变量
一、线程存储器模型二、将变量映射到存储器
三、共享变量
第五节 用信号量同步线程
一、进度图
进度图转换规则:合法的转换是向右或者向上,即某一个线程中的一条指令完成
两条指令不能在同一时刻完成,即不允许出现对角线
程序不能反向运行,即不能出现向下或向左
而一个程序的执行历史被模型化为状态空间中的一条轨迹线。
线程循环代码的分解:
H:在循环头部的指令块
L:加载共享变量cnt到线程i中寄存器%eax的指令。
U:更新(增加)%eax的指令
S:将%eax的更新值存回到共享变量cnt的指令
T:循环尾部的指令块
临界区使用原则:有空让进、无空等待、多中择一、让权等待
二、信号量
信号量定义:type semaphore=record count: integer; queue: list of process end; var s:semaphore;
定义对信号量的两个原子操作——P和V
P(wait)
wait(s) s.count :=s.count-1; if s.count<0 then begin 进程阻塞; 进程进入s.queue队列; end;
V(signal)
signal(s) s.count :=s.count+1; if s.count ≤0 then begin 唤醒队首进程; 将进程从s.queue阻塞队列中移出; end;
【每个信号量在使用前必须初始化】
三、使用信号量来实现互斥
详见“《操作系统》第六章”第七节 并发问题
一、线程安全性
四个不相交的线程不安全函数类以及应对措施:不保护共享变量的函数——用P和V这样的同步操作
保持跨越多个调用的状态的函数——重写
返回指向静态变量的指针的函数——①重写;②使用加锁-拷贝技术。
二、可重入性
1.显式可重入的:2.隐式可重入的:
三、竞争
四、死锁
心得总结
本周的学习和操作系统课程的内容有很多是重复的,虽然说在操作系统中花了很多篇幅来描述的内容,在本书里仅仅列了一章来讲解,可以说是一个缩影。但是结合操作系统的课程来说,一个讲了详细的概念,一个给了大量的代码用来实验,相辅相成,互为表里。确实对一些知识的认识和理解程度有所加深,对一些细节的过程有了实践上的感知和理解。相关文章推荐
- 5.1&&5.2字符大小写转换 加密 'A'+13=N,'Z'+13=M
- Ubuntu15.10下安装Nginx,PHP5(及PHP-FPM),MySQL
- ubuntu安装eclipse
- 网站跳转到Apache 2 Test Page powered by CentOS
- 产品经理不得不知的APP数据分析&报表设计基础
- 2把数据保存到手机内存、SharedPreferences、内存卡中
- UVa 10935-卡片游戏
- 最短路径下的Dijkstra算法和Floyd算法
- OC 消息传递机制
- 实验3实验报告
- 为什么 Flask 有那么多的好评?
- Nginx+nagios安装配置
- 递归
- 利用css3动画和border来实现圆形进度条
- 计算机技术领域当前的主流技术及其社会需求调查报告
- java界面的面板重绘
- java的小说展示,下载在查看所有(文件路径找不到,可以修改)
- selenium python (十四)上传文件的处理
- 实验5 实验报告
- POJ1014(多重背包)