构造并发程序最简单的方法就是用进程。如 fork()、exec()、waitpid。
直到父子进程的connfd都关闭,客户端的连接才会终止。
父子进程间共享信息,(共享文件表),但不共享地址空间。进程有独立的地址空间既是优点也是缺点。此外,独立的地址空间使得进程共享状态信息变得困难。
状态机: 状态、输入事件、转移
优点:
1. 比基于进程的设计给了程序员更对的对程序行为的控制
2. 每个逻辑流都能访问该进程的全部地址空间
缺点:
1. 编码复杂
2. 不能充分利用多核处理器
线程 就是运行在上下文中的逻辑流。每个线程都有自己的线程上下文。
主线程、对等线程
池、对等池
Posix线程是在C程序中处理线程的一个标准接口。
#includu <pthread.h>
typedef void * (func)(void *);
int pthread_create(pthread_t *tid, pthread_attr_r *attr, func *f,void *arg);
返回:若成功则返回0,若出错则为非零。
#include <pthread.h>
pthread_t pthread_self(void);
返回:返回调用者的线程ID
#include <pthread.h>
void pthread_exit(void *thread_return);
返回:若成功则返回0,若出错则为非零。
#include <pthread.h>
int pthread_join(pthread_t tid,void **thread_return);
返回:若成功则返回0,若出错则为非零。
#include <pthread.h>
int pthread_join(pthread_t tid,void **thread_return);
返回:若成功则返回0,若出错则为非零。
#include <pthread.h>
pthread_once_t once_control = PTHREAD_ONCE_INIT;
int pthread_once(pthread_once_t *once_control,void (*init_routine)(void));
总是返回0.
将变量映射到存储器
P V
二元信号量
互斥锁
加锁
解锁
计数信号量
禁止区
四个不安全函数类:
死锁状态、死锁区域
避免死锁的规则:
如果对于程序中每对互斥锁(s,t),给所有的锁分配一个全序,每个线程按照这个顺序来请求锁,并且按照逆序来释放,那么这个程序就是无死锁的。
参考资料: 《深入理解计算机系统》
问题:这周内容较多,目前12.4之后的内容都还来不及细看。下周继续看完。