线程

定义
线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。在Unix System V及SunOS中也被称为轻量进程(lightweight processes),但轻量进程更多指内核线程(kernel thread),而把用户线程(user thread)称为线程。

线程的几种状态
1、TASK_RUNNING:
进程当前正在运行,或者正在运行队列中等待调度。
2、TASK_INTERRUPTIBLE:
进程处于睡眠状态,正在等待某些事件发生。进程可以被信号中断。接收到信号或被显式的唤醒呼叫唤醒之后,进程将转变为 TASK_RUNNING 状态。
3、TASK_UNINTERRUPTIBLE:
此进程状态类似于 TASK_INTERRUPTIBLE,只是它不会处理信号。中断处于这种状态的进程是不合适的,因为它可能正在完成某些重要的任务。 当它所等待的事件发生时,进程将被显式的唤醒呼叫唤醒。
4、TASK_STOPPED:
进程已中止执行,它没有运行,并且不能运行。接收到 SIGSTOP 和 SIGTSTP 等信号时,进程将进入这种状态。接收到 SIGCONT 信号之后,进程将再次变得可运行。
5、TASK_TRACED:
正被调试程序等其他进程监控时,进程将进入这种状态。
6、EXIT_ZOMBIE:
进程已终止,它正等待其父进程收集关于它的一些统计信息。
7、EXIT_DEAD:
最终状态(正如其名)。将进程从系统中删除时,它将进入此状态,因为其父进程已经通过 wait4() 或 waitpid() 调用收集了所有统计信息。
8、TASK_KILLABLE:
Linux® kernel 2.6.25 引入了这种进程状态,用于将进程置为睡眠状态,它可以替代有效但可能无法终止的 TASK_UNINTERRUPTIBLE 进程状态,以及易于唤醒但更加安全的 TASK_INTERRUPTIBLE 进程状态。
摘自:https://www.169it.com/tech-qa-linux/article-12299116443665996948.html

线程间通信
信号
Linux 用 pthread_kill 对线程发信号。
互斥锁
互斥锁,是一种信号量,常用来防止两个进程或线程在同一时刻访问相同的共享资源。
需要的头文件:pthread.h
互斥锁标识符:pthread_mutex_t
条件变量
需要的头文件:pthread.h
条件变量标识符:pthread_cond_t
信号量
信号量其实就是一个计数器,也是一个整数。 每一次调用 wait 操作将会使 semaphore 值减一,而如果 semaphore 值已经为 0,则 wait 操作将会阻塞。 每一次调用post操作将会使semaphore值加一。
需要的头文件:semaphore.h
信号量标识符:sem_t
主要函数:
sem_init
功能: 用于创建一个信号量,并初始化信号量的值。
摘自:https://www.cnblogs.com/wuyepeng/p/9749956.html

线程调度
SCHED_OTHER:非实时调度,分时调度。通过pthread_create创建,但属性参数传递NULL创建的线程默认以SCHED_OTHER方式创建。使用CFS调度器(Linux2.6.23引入作为默认用户进程分时调度器),时间片是动态的,使用红黑树取代了传统运行队列来管理任务,使CPU消耗比较小的进程相比CPU消耗比较高的进程更容易找到,提供了交互和I/O消耗性负载的性能。
SCHED_FIFO :实时调度,即操作系统教材中描述的FCFS,先到先服务。需要明确指定。当一个任务就绪时,添加到就绪队列的尾部,当CPU空闲时,首先分配给就绪队列的头部的任务,直到运行任务完成(除非有若干特别的情况发生,如任务主动让出cpu、发生阻塞进入等待队列、更高优先级的任务出现(多核CPU场景))。一般策略代码简单,但平均等待时间比较长,一个任务可能保持CPU时间过长。
SCHED_RR :实时调度,基于时间片轮转,即操作系统教材中描述的Round robin。需要明确指定。类似FCFS,使用时间片,CPU运行了就绪队列头部的任务一个时间片的时长后,将此任务放到就绪队列的尾部,调度就绪队列头部的新任务就行运行,直到时间片结束,按此循环。其中新产生的任务被添加到就绪队列的尾部。一般这种调度策略平均等待时间比较长。
设置线程调度策略优先级步骤
1 pthread_attr_init初始化线程属性结构体
2 pthread_attr_setschedpolicy 设置调度策略
3 pthread_attr_setschedparam设置优先级
4 pthread_attr_setinheritsched设定线程调度策略的继承属性
5 pthread_attr_destroy
摘自:https://blog.csdn.net/skytering/article/details/97655313

线程数量与cpu核数关系
可以假设一个cpu核运算效率是100,那么N核就是N00,然后根据线程的任务执行和等待时间占比,估算执行态所占用的时间,如果无阻塞就是100,有阻塞的话,打log确定一下占比,比如M0,那么就能得出最大线程数为N00/M0。
实际情况下,还要考虑其他进程的执行效率,所以以上计算只是计算一个理论值。
同时,如果是计算密集型的实例,为了避免频繁在cpu核上切换,线程数量最好小于cpu核数。

题外话
单核cpu执行多线程一样存在线程安全问题。
单核cpu下,虽然指令是串行执行,但却是交叉运行的,如果他们同时操作同一块资源,那么结果必然异常。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值