10操作系统——线程的相关属性(代码片段)

weixin_45981798 weixin_45981798     2023-04-01     691

关键词:

目录

一、线程调度

1、三种调度算法

(1)SCHED_FIFO(先进先出的排队方式调度)

(2)SCHED_RR实时调度策略,时间片轮转

(3)SCHED_OTHER 分时调度策略(linux默认)

 2、pthread_attr_setschedpolicy/pthread_attr_getschedpolicy(获取、设置线程的调度策略)

 二、线程栈合警戒区

1、pthread_attr_setstacksize/pthread_attr_getstacksize(获取、设置线程栈大小、警戒区大小)

 2、各个线程相对独立的栈

三、线程退出

1、pthread_exit(线程自己退出)​编辑

         2、pthread_cancel(线程取消)(请线程退出)

3、创建一个线程,在1s后发送取消线程的请求,线程终止

一、线程调度

1、三种调度算法

(1)SCHED_FIFO(先进先出的排队方式调度)

静态优先级设置为1-99,则线程如果处于就绪态,就能立即抢占静态优先级为0的普通线程。

a、就绪态时,放入优先级队列的队尾位置

b、被更高优先级的线程抢占之后,会被放入优先级队列的队头位置,当所有优先级比他高的线程不再运行后,就恢复运行

c、调用sched_yield()后,会被在优先级队列的队尾位置

总结:该线程会一直运行直到发送I/O请求,或者被更高优先级线程抢占,或者调用sched_yield()主动让出CPU

(2)SCHED_RR实时调度策略,时间片轮转

与SCHED_FIFO类似,区别在于设置了时间片,当时间片耗光时,会被在优先级队列的队尾位置,可以用sched_rr_get_interval( )来获得时间片的具体数值。

(3)SCHED_OTHER 分时调度策略(linux默认)

静态优先级必须设置为0

处于 0 优先级别的这些线程按照所谓的动态优先级被调度,而动态优先级起始于线程的 nice 值,且每当一个线程已处于就绪 态但被调度器调度无视时,其动态优先级会自动增加一个单位,这样能保证这些线程竞争 CPU 的公平性。

 2、pthread_attr_setschedpolicy/pthread_attr_getschedpolicy(获取、设置线程的调度策略)

 二、线程栈合警戒区

1、pthread_attr_setstacksize/pthread_attr_getstacksize(获取、设置线程栈大小、警戒区大小)

 2、各个线程相对独立的栈

线程的栈可能溢出,需要增大栈空间,因为有警戒区,故不需要这么做,警戒区是没有任何访问权限的内存,用来保护相邻的两条线程的栈空间不被彼此践踏。

三、线程退出

1、pthread_exit(线程自己退出)

 2、pthread_cancel(线程取消)(请线程退出)

 某个时刻不能等某个线程“自然死亡”(例如在while(1)中),需要令其马上结束,可以给线程发送一个取消请求,让其中断执行退出。

而当线程收到一个取消请求时,他将会如何表现取决于两个东西:

一是当前的取消状态:

         PTHREAD_CANCEL_ENABLE 使能 (允许取消。默认值)         PTHREAD_CANCEL_DISABLE 失能 (不允许取消)

二是当前的取消类型:

        延时响应 等待线程遇到取消点时响应取消的请求

        立即响应

3、创建一个线程,在1s后发送取消线程的请求,线程终止

#include <stdio.h>
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <stdlib.h>
#include <string.h>

void * func (void * arg)

    int * p = calloc(1,4);
    while(1)
    
        printf("这里是func线程,线程ID :%ld \\n" , pthread_self() );
        sleep(1);
    

    *p = 1024 ;
    // 退出本线程并设置返回值的地址(返回了num 的地址)
    pthread_exit((void *)p); //返回的内存地址应该时一个堆空间


int main(int argc, char const *argv[])

    
    // 创建线程
    pthread_t t_id  = -1 ;
        
    pthread_create( &t_id , //新线程ID号
                    NULL , // 线程属性, NULL 默认属性
                    func,  // 线程需要执行的例程(新线程需要执行的任务《函数》) 
                    NULL ); // 线程的参数

    printf("t_id : %ld\\n" , t_id) ;

    printf("这里是主函数,线程ID :%ld \\n" , pthread_self() );

    int * retval ;
    int ret_val = 0 ;

    sleep(1);
    pthread_cancel( t_id );

    // 阻塞等待接合线程
    printf("等待 function 线程退出:\\n");
    if( ret_val = pthread_join( t_id , (void*)&retval))
    
        fprintf(stderr , "接合失败:%s\\n" , strerror(ret_val));
    
    printf("结合线程成功, 退出值为:%d\\n" , *retval);

    // 尝试接合线程  (非阻塞)
    // int ret_val = 0 ;
    // if( ret_val = pthread_tryjoin_np( t_id , (void*)&retval))
    // 
    //     fprintf(stderr , "接合失败:%s\\n" , strerror(ret_val));
    // 

    return 0;

上述例子可以取消线程,但是没办法结合线程的退出值

复习多线程相关知识(代码片段)

多线程操作系统相关冯诺依曼体系结构进程概念进程的组成进程状态时间片并发与并行内核态与用户态线程概念线程优势共享资源进程vs线程线程的创建方式线程的构造函数常见属性常用方法线程终止线程状态图线程安全问题导... 查看详情

复习多线程相关知识(代码片段)

多线程操作系统相关冯诺依曼体系结构进程概念进程的组成进程状态时间片并发与并行内核态与用户态线程概念线程优势共享资源进程vs线程线程的创建方式线程的构造函数常见属性常用方法线程终止线程状态图线程安全问题导... 查看详情

java知识回顾(10)线程(代码片段)

...里定义和线程相关的另一个术语-进程:一个进程包括由操作系统分配的内存空间,包含一个或多个线程。一个线程不能独立的存在,它 查看详情

gdb再学习(10):线程调试相关(代码片段)

文章目录1介绍2代码准备3指令介绍3.1线程启动相关打印信息3.2查询指定id线程或全部线程信息infothreads[id]3.3切换当前线程threadthread-id3.4为当前线程设置一个名称threadname[name]3.5查找与regexp匹配的线程信息threadfind[regexp]3.6在location指... 查看详情

gdb再学习(10):线程调试相关(代码片段)

文章目录1介绍2代码准备3指令介绍3.1线程启动相关打印信息3.2查询指定id线程或全部线程信息infothreads[id]3.3切换当前线程threadthread-id3.4为当前线程设置一个名称threadname[name]3.5查找与regexp匹配的线程信息threadfind[regexp]3.6在location指... 查看详情

进程和线程相关(代码片段)

一、操作系统/应用程序1、硬件硬件包括硬盘、cpu、主板、显卡、内存、电源........2、系统系统就是由程序员写出来的软件,该软件用于控制计算机的硬件,让他们相互配合工作3、安装软件(安装应用程序)二、线程和进程应用... 查看详情

android总结随笔(代码片段)

********************************线程并发线程锁原子操作********************************触摸事件分发机制********************************ListView的缓存机制********************************自定义动画********************************IPC的过程********************************A... 查看详情

复习多线程相关知识(代码片段)

多线程操作系统相关冯诺依曼体系结构进程概念进程的组成进程状态时间片并发与并行内核态与用户态线程概念线程优势共享资源进程vs线程线程的创建方式线程的构造函数常见属性常用方法线程终止线程状态图线程安全问题导... 查看详情

线程池相关知识点(代码片段)

线程池的作用:  线程池作用就是限制系统中执行线程的数量。  根据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果;少了浪费了系统资源,多了造成系统拥挤效率不高。用线程池控制线程数量,其... 查看详情

线程八大基础核心六(线程属性)(代码片段)

1.引子在java多线程并发编程中,有八大基础核心。考考你:看看都有哪八大基础核心呢?它们分别是:1.创建线程的方式2.线程启动3.线程停止4.线程生命周期5.线程相关的方法6.线程相关的属性7.线程异常处理8.线程安全今天我们... 查看详情

ios——多线程之pthreadnsthread(代码片段)

...;pthread使用方法pthread其他相关方法2.NSThread创建,启动线程线程相关用法线程相关用法线程状态控制方法线程之间的通信NSThread线程安全和线程同步NSThread非线程安全NSThread线程安全线程的状态转换NSThread线程属性name属性:... 查看详情

操作系统进程与线程(代码片段)

目录1.进程基础1.1相关知识1.2进程定义与特征1.3进程的状态以及转换2.进程控制2.1进程执行模式2.2进程切换2.3进程创建2.4进程撤销2.5进程的阻塞与唤醒3.线程3.1线程的引入3.2与进程的区别与联系4.进程与线程其他内容4.1相关技术1.... 查看详情

jquery相关方法5----表单相关(代码片段)

一、value属性在表单的相关操作-----val()方法<scriptsrc="http://libs.baidu.com/jquery/1.10.2/jquery.min.js"></script><script>$(function()//1.获取和设置按钮的value属性console.log($("#btn").val());//按钮框$("#btn 查看详情

进程相关(代码片段)

一.进程和线程的区别 或者GIL锁  1.进程是cpu资源分配的最小单元   线程是cpu计算的最小单元  2.一个进程中可以有多个线程  3.对于python来说他的进程和线程和其他语言有差异, 是有GIL锁.   GIL锁保证一个进... 查看详情

juc相关知识点总结(代码片段)

...f;怎么保证线程安全?线程和进程的区别:进程是操作系统进行资源分配的最小单元。线程是操作系统进行任务分配的最小单元,线程隶属于进程。线程和进程切换上下文区别:如何开启线程?1、继承Thread类&#... 查看详情

linux线程操作以及相关知识(代码片段)

1线程◼与进程(process)类似,线程(thread)是允许应用程序并发执行多个任务的一种机制。一个进程可以包含多个线程。同一个程序中的所有线程均会独立执行相同程序,且共享同一份全局内存区域,... 查看详情

bom相关对象的属性与方法(代码片段)

...bjectModel(浏览器对象模型),BOM主要用于操作与管理浏览器相关状态。BOM由以window对象为主以及其他常用对象如navigator、location、history、screen、document等等功能各异的对象组成。BOM相关对象提供了很多方法与属性以便于操作浏览器... 查看详情

javascript高级对象相关:对象属性属性描述符(数据属性,存取属性)(代码片段)

文章目录对象属性的操作定义属性描述符数据属性描述符存取属性描述符同时定义多个属性其他对象方法(了解)参考对象属性的操作定义我们可以使用属性描述符对一个属性进行比较精准的操作控制:通过属性描述... 查看详情