20135205信息安全系统设计第十二周学习总结
并发编程
一、基于进程的并发编程
构造并发进程最简单的方法是用进程,使用像fork,exec和waitpid等函数。
例:一个构造并发服务器的自然方法就是在父进程中接受客户端连接请求,然后创建一个新的子进程来为每个新客户端提供服务。
1、 通常服务器运行很长的时间,所以我们必须要包括一个SIGCHLD处理程序,来回收僵死子进程的资源。
2、 其次父进程必须关闭他们各自的connfd拷贝。
3、 最后,因为套接字的文件表选项中的引用计数,直到父子进程的connfd都关闭了,到客户端的连接才会终止。
二、基于I/O多路复用的并发进程
基本的思路就是使用select函数,要求内核挂起进程,只有在一个或多个I/O事件发生后,才将控制返回给应用程序。
Select函数处理类型为fd_set的集合,也叫做描述符集合。逻辑上,我们将描述符集合看成一个大小为n的位向量
I/O多路复用可以用作并发事件驱动程序的基础,在事件驱动程序中,流是因为某种事件而前进的。一般概念是将逻辑流模型转换为状态机。
状态机:就是一组状态、输入事件和转移。
三、基于线程的并发编程
线程就是运行在进程上下文中的逻辑流。
多线程的执行模型在某些方面和多进程的执行模型是相似的。
每个进程开始生命周期时都是单一线程,这个线程为主线程。在某一时刻,主线程创建一个对等线程,从这个时间点开始,两个线程就并发地与运行。
Posix线程是在C程序中处理线程的一个标准接口。
终止进程:
1、 当顶层的线程例程返回时,线程会隐式地终止
2、 通过调用pthread_exit函数,线程会显示地终止。
3、 某个对等线程调用Unix的exit函数,该函数终止进程以及所有与该进程相关的线程
4、 另一个对等线程通过以当前线程ID作为参数调用pthread_cancle函数来终止当前线程
四、多线程程序中的共享变量
一组并发线程运行在一个进程的上下文中。每个线程都有它自己独立的线程上下文,包括线程ID、栈、栈指针、程序计数器、条件码和通用目的寄存器值。每个进程和其他进程一起分享线程上下文的剩余部分。
将变量映射到存储器:
线程化的C程序中变量根据它们的存储类型被映射到虚拟存储器:全局变量、本地自动变量和本地静态变量。
----------------------------------------------------------------------------------
参考资料:
深入理解计算机系统