20135203齐岳 信息安全系统设计基础第十三周学习总结
学习计时:8/9共小时(计划/实际)
读书:4/5
代码:1/1
作业:1/1
博客:2/2
如果逻辑控制流在时间上重叠,那么他们就是并发的。应用级并发在以下情况中发挥作用:
使用应用级并发的应用程序称为并发程序。现代操作系统提供了三种基本的构造并发程序的方法:
使用select函数,要求内核挂起进程,只有在一个或多个I/O事件发生后,才将控制返回给应用程序。
int select(int n,fd_set *fdset,NULL,NULL,NULL);
返回已经准备好的描述符的非0的个数,若出错则为-1。
select函数处理类型为fd_set的集合,叫做描述符集合,看做一个大小为n位的向量:
bn-1,......,b1,b0
对描述符集合的处理方法:
I/O多路复用可以用作事件并发驱动程序的基础。
状态机:一组状态、输入事件、输出事件和转移。
自循环:同一输入和输出状态之间的转移。
线程:运行在进程上下文中的逻辑流,由内核自动调度,有自己的线程上下文,包括一个唯一的整数线程ID,栈、栈指针、程序计数器、通用目的寄存器和条件码。所有运行在一个进程里的线程共享该进程的整个虚拟地址空间。
每个进程开始生命周期时都是单一线程(主线程),在某一时刻创建一个对等线程,从此开始并发地运行,最后,因为主线程执行一个慢速系统调用,或者被中断,控制就会通过上下文切换传递到对等线程。
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
一个变量是共享的。当且仅当多个线程引用这个变量的某个实例。
当且仅当变量的一个实例被一个以上的线程引用时,就说变量是共享的。
共享变量的同时引入了同步错误,即没有办法预测操作系统是否为线程选择一个正确的顺序。
将n个并发线程的执行模型化为一条n维笛卡尔空间中的轨迹线,将指令模型化为从一种状态到另一种状态的转换。
信号量不变性:一个正确初始化了的信号量有一个负值。
信号量操作函数:
int sem_init(sem_t *sem,0,unsigned int value);//将信号量初始化为value
int sem_wait(sem_t *s);//P(s)
int sem_post(sem_t *s);//V(s)
二元信号量(互斥锁):将每个共享变量与一个信号量s联系起来,然后用P(s)(加锁)和V(s)(解锁)操作将相应的临界区包围起来。
禁止区:s<0,因为信号量的不变性,没有实际可行的轨迹线能够直接接触不安全区的部分
并行程序的加速比通常定义为:
其中,p为处理器核的数量,T为在p个核上的运行时间。
定义四个(不相交的)线程不安全函数类:
当一个程序的正确性依赖于一个线程要在另一个线程到达y点之前到达他的控制流x点时,就会发生竞争。
为消除竞争,我么可以动态地为每个整数ID分配一个独立的块,并且传递给线程例程一个指向这个块的指针。
死锁:一组线程被阻塞了,等待一个永远也不会为真的条件。
互斥锁加锁顺序规则:如果对于程序中每对互斥锁(s,t),给所有的锁分配一个全序,每个线程按照这个顺序来请求锁,并且按照逆序来释放,这个程序就是无死锁的。
1.《深入理解计算机系统》
2.《计算机操作系统》