什么是线程
Linux线程是一类特殊的进程,拥有各自的task_struct,内核并没有特别的调度算法和数据结构来表征线程,而仅仅是作为一个普通的进程,只是和其他进程共享进程空间。也就是说,如果程序运行于多线程环境,编写程序时必须检查一下项目:
- 是否使用了不可重入的系统函数,例如字符串分割函数::strtok();
- 是否已经对全局变量或静态变量进行了加锁;
- 第三方库是否支持多线程。
注:想要从核心获取线程id,应当使用current->pid。在核心里pid对进程而言是进程号,对于线程是线程号。同一进程的不同线程的pid是不同的,但同一进程的不同线程有统一的tgid,所以像getpid(),kill()等这种系统调用返回的都是tgid的值。
线程的调度
如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,它只能把CPU运行时间划分成若干个时间片,再将时间片分配给各个线程执行,在一个时间片的线程代码运行时,其它线程处于挂起状态,这种方式称之为并发(Concurrent)。
因为I/O操作速度远远慢于CPU处理速度,键鼠输入、硬盘读写、网络传输等速度远慢于内存读写速度,而内存速度又远慢于CPU缓存速度,所以有效的利用I/O操作间隙时的CPU,成为早期单核并发机制的来由。在并发环境下,CPU以”挂起->执