进程控制块用于表示进程状态——每个PCB包括进程的一系列实体:
1、 识别信息:进程自己的PID和父进程PPID
2、 运行时信息:寄存器,虚拟内存地址空间(PTE)打开文件的句柄
3、 账户信息:总CPU使用,最近CPU使用,起始时间,优先级
进程自己其实不做什么
线程:进程最重要的角色其实是作为线程的容器——每个进程开始的时候都从主线程开始执行,即程序中的main函数
线程也有控制块TCB,包括:
1、 识别信息——tid和pid
2、 运行时信息:寄存器,程序计数器和栈指针,县城状态
3、 同进程
进程,线程的五个状态模型:
NEW,READY,RUNNING,BLOCKED,FINISHED
对比:2进程1线程VS 1进程2线程
创建时间2线程更短
当一个线程意外终止时整个进程结束
进程不共享内存空间——因此信息通讯(IPC)需要克服共享内存缺乏问题,而线程要简单得多
进程之间基本什么都不共享,线程之间共享很多东西
pthread_create参数:
#include<pthread.h>
int pthread_create(pthread_t *tidp,const pthread_attr_t *attr,
(void*)(*start_rtn)(void*),void *arg);
第一个参数为指向线程标识符的指针。
第二个参数用来设置线程属性。
第三个参数是线程运行函数的起始地址。(需转化成void)
最后一个参数是运行函数的参数。
pthread_join()
函数,以阻塞的方式等待thread指定的线程结束。当函数返回时,被等待线程的资源被收回。如果线程已经结束,那么该函数会立即返回,并且thread指定的线程必须是joinable的.
参数:
tid
,被等待线程的返回值地址
void **
返回值的地址,必须为void指针,现用现转换
要实现多线程拆分,必须将create和join的过程放在不同的循环中,不然实际上并没有实现拆分。
线程安全——一个函数是线程安全的,当且仅当该函数可以被多个线程同时访问,如果这个函数存储了某些全局变量,那么在没有调度下它就不是线程安全的。
例如strtok
函数:
strtok()
用来将字符串分割成一个个片段——参数s 指向欲分割的字符串,参数delim 则为分割字符串,当strtok()在参数s 的字符串中发现到参数delim 的分割字符时则会将该字符改为\0 字符。在第一次调用时,strtok()必需给予参数s 字符串,往后的调用则将参数s 设置成NULL。每次调用成功则返回下一个分割后的字符串指针。
当系统中供多个进程所共享的资源,不足以同时满足它们的需要时,引起它们对资源的竞争而产生。实际的多线程编程中并不一定会真的遇到资源竞争,但可能会遇到未预期的结果。
多线程加速公式Sp=T1/Tp
P为处理器总数
Sp为给定CPU数的加速幅度
T1为顺序执行的执行时间
Tp为运行在P个处理器上的并行算法执行时间