第十二章 并发编程

第十二章 并发编程

三种基本的构造并发程序

进程:每个逻辑控制流是一个进程,由内核进行调度,进程有独立的虚拟地址空间
I/O多路复用:逻辑流被模型化为状态机,所有流共享同一个地址空间
线程:运行在单一进程上下文中的逻辑流,由内核进行调度,共享同一个虚拟地址空间

常用函数:

  • fork
  • exec
  • waitpid

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

事件驱动程序:将逻辑流模型化为状态机。

状态机:

  • 状态
  • 输入事件
  • 转移

对于状态机的理解,参考EDA课程中学习的状态转换图的画法和状态机。

整体的流程是:

  • select函数检测到输入事件
  • add_client函数创建新状态机
  • check_clients函数执行状态转移(在课本的例题中是回送输入行),并且完成时删除该状态机。

函数:

  • init_pool:初始化客户端池
  • add_client:添加一个新的客户端到活动客户端池中
  • check_clients:回送来自每个准备好的已连接描述符的一个文本行

Posix线程

  • 线程的代码和本地数据被封装在一个线程例程
  • 每个线程例程都以一个通用指针为输入,并返回一个通用指针。

常用函数:

万能函数:void *xx(*xx)

三、创建线程

1.创建线程:pthread_create函数

#include <pthread.h>
typedef void *(func)(void *);

int pthread_create(pthread_t *tid, pthread_attr_t *attr, func *f, void *arg);

成功返回0,出错返回非0

创建一个新的线程,带着一个输入变量arg,在新线程的上下文运行线程例程f

attr默认为NULL

参数tid中包含新创建线程的ID

2.查看线程ID——pthread_self函数

#include <pthread.h>

pthread_t pthread_self(void);

返回调用者的线程ID(TID)

终止线程

pthread_exit函数

#include <pthread.h>

void pthread_exit(void *thread_return);

若成功返回0,出错为非0

pthread_cancle函数

#include <pthread.h>

void pthread_cancle(pthread_t tid);

若成功返回0,出错为非0

死锁:

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

解决死锁的方法

不让死锁发生:

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

让死锁发生:

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

参考资料:

闫佳歆

课本

总结

本章内容多半属于理解性内容,很多东西都是概念化的描述,但却可以推动我们对计算机的理解,加深我们对系统进程的调用的理解,但计算模式也是概念化的,很多过程也只能通过自己的理解区实现没有达到真正掌握的目的,在这一方面还需要加强努力

时间: 2024-12-28 15:13:10

第十二章 并发编程的相关文章

[CSAPP笔记][第十二章并发编程]

第十二章 并发编程 如果逻辑控制流在时间上是重叠,那么它们就是并发的(concurrent).这种常见的现象称为并发(concurrency). 硬件异常处理程序,进程和Unix信号处理程序都是大家熟悉的例子. 我们主要将并发看做是一种操作系统内核用来运行多个应用程序的机制. 但是,并发不仅仅局限于内核.它也可以在应用程序中扮演重要的角色. 例如 Unix信号处理程序如何允许应用响应异步事件 例如:用户键入ctrl-c 程序访问虚拟存储器的一个未定义的区域 其他情况 访问慢速I/O设备 当一个应

第十二章 并发编程 学习笔记

第十二章 并发编程 进程是程序级并发,线程是函数级并发. 三种基本的构造并发程序的方法: 进程:每个逻辑控制流是个一个进程,由内核进行调度和维护. I/O多路复用:应用程序在一个进程的上下文中显式地调度他们自己的逻辑流. 线程:运行在单一进程上下文中的逻辑流,由内核进行调度. 12.1 基于进程的并发编程 构造并发程序最简单的方法就是用进程. 使用大家都很熟悉的函数例如: fork exec waitpid 关于在父.子进程间共享状态信息:共享文件表,但不共享用户地址空间. 进程又独立的地址空间

深入理解计算机系统 第十二章 并发编程

如果逻辑控制流在时间上重叠,那么它们就是并发的(concurrent) 这种常见的现象称为并发(concurrency),出现在计算机系统的许多不同层面上. 并发不仅仅局限于内核,它也可以在应用程序中扮演重要角色. 应用级并发在以下情况中都是很有用的: 1.访问慢速 I/O 设备 当一个应用正在等待来自慢速 I/O 设备(例如磁盘)的数据到达时,内核会运行其它进程,使 CPU 保持繁忙.每个应用都可以按照类似的方式,通过交替执行 I/O 请求和其他有用的工作来利用并发. 2.与人交互 和计算机交

深入理解计算机系统 第十二章 并发编程 (1)

现代操作系统提供了三种基本的构造并发程序的方法: 进程.用这种方法,每个逻辑控制流都是一个进程,由内核来调度和维护,因为进程有独立的虚拟地址空间,想要和其他流通信,控制流必须使用某种显式的进程间通信(interprocess communication,IPC)机制. I/O多路复用.在这种形式的并发编程中,应用程序在一个进程的上下文中显式的调度它们自己的逻辑流.逻辑流被模型化为状态机,数据到达文件描述符后,主程序显式的从一个状态转换到另一个状态.因为程序是一个单独的进程,所以所有的流都共享同一

深入理解计算机系统 第十二章 并发编程 part1 第二遍

三种构造并发程序的方法及其优缺点 1.进程 用这种方法,每个逻辑控制流都是一个进程,由内核来调度和维护.因为进程有独立的虚拟地址空间,想要和其他流通信,控制流必须使用某种显式的进程间通信机制. 优点: 由于进程有独立的地址空间,所以一个进程不可能不小心覆盖另一个进程的虚拟内存,这就消除了许多令人迷惑的错误 缺点: (1)还是由于进程有独立的地址空间,使得进程共享状态信息变得更加困难.为了共享信息,它们必须使用显式的 IPC(进程间通信)机制. (2)由于进程控制和 IPC 的开销很高,所以这种方

第十五章 并发编程

1.操作系统的发展史 参考:http://www.cnblogs.com/Eva-J/articles/8253521.html 知识点 输入输出 -- 大部分时间都不会占用CPU,但会降低你程序的效率 操作系统的三种基本类型:多道批处理系统.分时系统.实时系统. 现在操作系统 基于多道批处理系统和分时系统 多个程序.作业在遇到IO操作的时候,操作系统会帮助你进行切换 让CPU的利用率得到最大的提高 2.进程 初识进程 进程: 运行中的程序 操作系统 只负责管理调度进程 进程是操作系统中资源分配

第十二章-网络编程

1 TCP/IP IP协议赋值吧数据从一台计算机通过网络发送到另一台计算机. 数据是被分割成一个个小块, 然后通过IP包发送出去的. 其中如何在负载的网络链路中传送的是通过路由器进行转发达到最终的目的地 TCP协议是建立在IP协议之上的, TCP协议负责在两台计算机之间建立可靠连接, 而且保证数据包按照顺序到达, 主要是依靠握手协议和对数据包进行编号, 确保数据被对方收到 应用成的HTTP和SMTP等协议都是基于TCP协议的 IP包的组成: 源IP地址, 目的IP地址, 源端口, 目的端口, 数

Java学习笔记—第十二章 Java网络编程入门

第十二章  Java网络编程入门 Java提供的三大类网络功能: (1)URL和URLConnection:三大类中最高级的一种,通过URL网络资源表达方式,可以很容易确定网络上数据的位置.利用URL的表示和建立,Java程序可以直接读入网络上所放的数据,或把自己的数据传送到网络的另一端. (2)Socket:又称"套接字",用于描述IP地址和端口(在Internet中,网络中的每台主机都有一个唯一的IP地址,而每台主机又通过提供多个不同端口来提供多种服务).在客户/服务器网络中,当客

疯狂JAVA讲义---第十二章:Swing编程(五)进度条和滑动条

http://blog.csdn.net/terryzero/article/details/3797782 疯狂JAVA讲义---第十二章:Swing编程(五)进度条和滑动条 标签: swing编程java任务timerstring 2009-01-16 21:12 6722人阅读 评论(0) 收藏 举报  分类: J2SE(63)  版权声明:本文为博主原创文章,未经博主允许不得转载. 前几天讲了Swing基本的控件,今天开始讲特殊控件.一天讲2个吧,首先讲用JProgressBar,Pro